What's going on everyone? Sam here with Layton Sports Cards. I am ripping 2021-22, Panini Recon Basketball. I'll hobby six bucks. Break number 27. Pick your team. Got the list of the names next to me. Qingxi Huang with the Spurs. Chris S. Bowles. Christian P. Wizards. Clayton F. Bucks. Derek N. Blazers. Jason T. Pelicans. Zhenhao Y. Timberwolves Sixers. G. U. W. Jazz. Joe P. Jordan C. Nuggets. Kato W. Sons. Lawrence S. Thunder. Lionel Edward C. Rockets. Matthew G. Hawks. Michael C. has got the Clippers, Knicks and Kings. Mike Y. with the Grizzlies. Nicholas B. Lakers Hornets. Richard S. Cavs. Sock O. K. Warriors Magic Raptors. Steven Roy S. Mavericks Pistons and Pacers. And Travis C. Nets. Vaughn B. Celtics. Here we go. But the, uh, where did I put the, did I take the knife with me? Oh yeah. I was gonna say, I know you like the whaler's shirt though, for sure. I always gotta rock the whaler's shirt. All right. Recon guys. Here we go. I want Vaughn. Whatever. Red Sox stink. Power through it. Uh, first auto, is this an auto? Rudy Gobert. 9 out of 75 Jazz. I was not expecting to see a Rudy Gobert auto. Nice one there. 9 out of 75. Cratch Jazz. Bertans. Maneuvers. Lamello. That was cool. All right. Uh, I got Bradley Beal. 299. Cole Anthony. Rock the rim. Everybody hated him for a while. I remember that. Uh, James Book Knight. Lebron refractor. Nice. Jalen Green. Recon rookie. You go Rockets. And I went from such easy packs to open to such hard packs to open now. Dude, my fingers were on fire the last time I broke. Paul George. Nice. Jason Williams. Claim to fame to 99. Fancy passes. No passing fancy. For Sacramento's Williams. There you go. Nice white chocolate. There you go. Kings. Richardson. Rudy Gobert. And the all star dude. That was unreal. So sick. Base. That was wild. I remember trying to do that when I was like playing in my driveway and I just like, I put the ball behind my back and had hit it into my back. Norman Powell clippers to 199. Future legend, Shilin Komingo rookie. That was, uh, that was a fun time for sure. Mellow, Maxi Cleaver. Got Skye's the limit. Josh Giddy. There you go. Thunder. Nice one there. Well, is there anybody you're chasing in this? That's buying the Celtics. Like, what's their auto, what are the auto situation look like? Luke Kinard clippers to 299. Bronze. Lebron maneuvers. Lakers. I'm trying to think off the top of my, they probably got some legend autos, no? Uh, Rock the Rim. Giannis. Bucks. Jared Butler. Got Harrison Barnes. Kings. Future Legend. Triple J. Box one. Box two here. Good book. Oh, Tatum. I forgot Tatum was in this. Time Lord. Nice. That'd be a cool one. Glenn Big Davy Davis auto. That'd be sick. Kevin Garnett. Evan Mobley base rookie. Cabs. Bobby Portis. Got Larry Johnson. There you go. Hornets claimed a fame to 99. Hornets rookie. Created buzz during dominant debut season. That's Hornets. That's awesome. Murray. Future Legends. I owe to Sunmu. Yeah, I think so. Jada McDaniels, the 299. Maneuvers. Harden. I was probably alive when he was still in the league. I just don't think I was like a basketball man. Tyler Hero to 99. Heat. Zyra Williams rookie recon. Jock Landell. Rookie true potential auto. Spurs. Another one not under my haul hopefuls, Russell Westbrook. My bingo card there. What's up, Andrew? Aaron Gordon to 299. And Maneuver. Scotty Barnes rookie. Raptors. Obi Toppin. Andrew Wiggins. What's up, Lane? Whoa, Lane. Clay Thompson to 199. There you go. Warriors. Rock the rim and bead. Spencer Dinwiddie. Barkley. Rock the rim. Oh, Rock the rim. Jalen Green. Rookie. Rockets. Box three. Let's see how much time I got on these. 20 minutes basically. That's easy. Another break of recon. Got some prism multi-sello. And then we've got a iMac basketball. And that'll do it for basketball tonight. Pat Bev. Damien Lillard. All systems go. I love these, dude. The all systems go are so cool. Charles Barkley to 199. Sons. And Rock the rim. LeBron. What's up, numbers? One spot left on the contenders break. Breaking soon. Top of the charts. Recon. John Stockton. Cool insert there. Jess. Quentin Grimes. Josh Giddy. Rookie Recon. Thunder. Trayman. Got Russell Westbrook to 299. Future legends. Tyrese Halliburton. Sharon Jackson. Got Jeremiah Robinson Earl. Nice. Recon Rookie. Not numbered. Destined for greatness. There you go, Thunder. Thunder a great team in this. Maneuver's Kyrie. Drew Holiday to 99 bucks. Rock the rim Tatum. There you go, Vaughn. Carter Jr. That is Shaquille O'Neal, numbers. Shaquille O'Neal standing behind me. Desmond Bain, Gary Trent Jr. He's hanging out with us tonight. Oh, yeah. He wanted to watch some breaks. It's all in on the breaks tonight. Shaquille speaking of 299, Lakers and Future Legends Lamello. Do it for box three. On to box four. Thought it was the white. Yeah. Chris Boucher. Got Recon. Rookie review. Joel, that's sick. I love these. Such nice cards. The LeBron one is so cool. Such a clean card. Got Trey Mann. To 25. Two out of 25. True potential purple auto. There you go, Thunder. That's awesome numbers. That's really cool, actually. Got Skye's The Limit, KD. There you go, Nets. Yeah, he's a really good guy for sure. Uh, Santy Aldema and Future Legends Luca. I know, RIP toys are us. Miss it. Got Devante Graham. That looks like a shitty number, but it's not. Rock the Rim, Anthony Simons. T Stiball. Got Clay Thompson. All systems go. LeBron, Lakers. Nice one there. Sam Hausser. True potential rookie Celtics. There you go, Vaughn. Picking up a nice rookie for yourself. Keon Johnson, a 199. And Rock the Rim, Vince Carter. Devin Booker. This is the 299, Bronze. And all pro is Devin Booker. Nice. Two Devin Bookers back to back. Future Legends, Desmond Bain. Grizzlies. Got Paul Pierce to 99. There you go, Vaughn. Nice Celtics hit right there. And Kevin Durant. Closing statements. Cool insert there for the Nets. Couple of nice KD inserts. You talking basketball or football or soccer? Got Clint Capella to 299. Swiss Bank. Rock the Rim, John Collins. I don't know off the top of my head. I know we had him at over 500. Oh, I don't know what they're gonna... I'm not sure yet. Once it releases, we'll probably have them in stock for personals. I'd have to imagine probably like the four, five, six hundred range somewhere in that like area. Probably that Mike Trout, Shohei Otani, Dualotto to five out of definitive. That was probably the best, Andrew. I'm not 100% sure on what they're gonna be, though. Terry Rozier. Scary Terry to 299. Future Legends. There is Garland. Starland. But like football at one point was up at like 550. So I have to imagine it's gonna kind of mimic that. Wagner Cole-Anthony and Tray Mann again. This time true potential to 99. Red. Nice one there. Completely agree with that one, Violet. Got Shaq to 99. Lakers. These are so... like so nice this year. They look so pretty. I'm a new verse, Tray Young. Thanks for a follow there, Bersh. Isaiah Todd. Not number true potential rookie auto wizards. That's wizards. Nice one there. Jay Kidd and Aaron Gordon rocked the rim. Me personally. Pretty much all of them. And Thomas Nicola Jokic. Giannis Antenticumpo. Dude, look at this guy. Skinny Giannis. That's when Giannis was like 67 overall in NBA 2K. He's like the worst player in the entire game. That's it. Congrats, Bucks. That is so cool, man. So cool. Jay Sean's hate. Future Legends. Jaylen Suggs. There you go, Magic. Tyrese Maxi not numbered. Rallonato. Maneuvers. Deer and Fox. Nice swipa. Nice. Rookie Pink. That's James Booknite to 299. Rookie Bronze. Excuse me. James Booknite. There you go, Hornets. And Oshay Berset. Yeah. Those are like your standard ones. And then like the higher end you're looking at like empty, immaculate, flawless, impeccable, like stuff like that too. Hockey. I'd stick to like the Series 1, Series 2, maybe some Black Diamond. And then Baseball. Tops Chrome. Yeah. Top Series 1, Series 2 update. Like even like the Tier 1s and Finest are nice too. There's so many. Jonathan Camingo Rookie. Taylor and Horton Tucker to 99. Lakers. And Future Legends, Evan Mobley. Just depends if you're talking about buying retail. Hobby Boxes. What are you looking for? Exactly. They're on Sharp. Kyle Lowry to 299. Heat. And Yannis Rocklerin. Carter Jr. Got Luca Garza. Pistons. True Potential. Base Auto, not numbered. Rats Pistons. Wayne Washington. Rookie Recon Cade. Pistons. There you go. Nice Pistons pack. Jordan Clarkson to 99. Jazz. And Maneuvers. Nicola Jokic. Nuggets. Future Legends. Triple J. Focus. There we go. Oh yeah? How's it looking? There's a lot in my house. McCall Bridges to 199. Sons. Maneuvers. Lebron. There's a lot. Love it, dude. Recommend for, sorry to let you know you said, prism, optic, mosaic I think are kind of the standards. Covington. Gary Shren. Contenders. Contenders is good. There's so much. I just stick with prism. Miles Bridges. Jalen Green. Optic. Mosaic. Yeah. Contenders. I mean that's like your... Those are the really standard ones. Yeah, especially when you're talking about retail. Oh yeah. Aaron Wiggins. Chuma Okiki to 299. And Dominique Wilkins. Rock the Rim. That will do it for the break guys. We're gonna do a quick recap here of the autos. Got Luca Garza. Pistons. True Potential. Isaiah Todd. Wizards. Not numbered. Trey Mann. That is 8 out of 99. Red. True Potential. Auto. Thunder. Sam Hauser. Auto. Trey Mann. This is purple. True Potential. 2 of 25. Thunder. Trey Mann again. Destin for greatness. Not numbered. Jocelyn Dell. Spurs. Not numbered. Claim to Fame. 70 out of 99. Larry Johnson. Hornets. Claim to Fame. Jason Williams. 37 out of 99. Kings. And Rico Bear. Glorified. 9 out of 75. Jazz. Thanks again for joining everyone. Congrats on everything. Next up, more recon. Sit tight.


In the next 50 minutes or so, I'd like to talk about, I will migrate from one Cloud provider to another. I am Michele Orselli. I work from Italy. And I work for a company which is called Ideato. We are a software agency, basically. So we help our clients turning their ideas into projects and product. These are my contacts. So feel free to get in touch with me after this presentation or by email, Twitter, whatever. So I'll start with a little story about how we took an 80-year-old code base, which started causing a lot of problems and wasting a lot of money for our clients and started showing increasing stability problems and problems. And how we migrated it to a more suitable and stable platform. And in the end, everyone was happy. Let's start from the beginning. As I said before, I'm Italian, so apologies for my bad accent. And if I start moving ends, in that way, that's perfectly fine. I'm fine. Don't worry about that. If I fall asleep or fall unconscious, OK, in that case, I'm not fine. Help me. But what do we Italians like? That's a pretty simple question. Want to try to answer? Spaghetti. Yeah. For sure. La pizza. Yeah. La mamma, mommy, maybe not that particularly warm. But yeah, all of these answers are perfectly fine. But there is another thing we like, we enjoy. Football, OK? You should know who this person is. Yeah? And yeah, our clients basically have a site talking about the transfer market. If the player X is going to play for Napoli, Naples, or Iguain moved from Naples to Juventus, and stuff like that. We got crazy about this stuff, OK? Our government can raise taxes light to us, but we're fine as long as we can watch football. In this particular case, traffic were not really, really big, but there were some important numbers. We experienced some peaks during the year, in particular in January, June, August, when the transfer market is held. And also, we have some spikes during particular matches, big matches, or Champions League matches, and stuff like that. All the infrastructure, all the sites, were hosted on racked space cloud sites. How many of you do you know about that? Have you ever heard about that? OK, a few. Good. Which in the cloud pyramid, we can put it here, OK? It is a platform as a service. What does it mean? Well, it means that you don't have to configure basically anything, almost anything. You push the code into the cloud, and you're done. So from the developer, from the ops point of view, you have a black box, OK? You just put the code. You actually can change a few parameters, but not that much, and you are done. Unfortunately, there are some kind of limitation, like some odd limits or on resource usage, like you cannot have more than 50 database connection, concurrent database connection. You can deploy only through FTP, which, well, in 2006, when we started immigration, was not really fine. And you deploy on a shared NFS folder directly, which also means that sometimes during deploys, the symphony, because I'll show you later, we are talking about all symphony application, the symphony cache got messed for, I don't know, no particular reason, and the site crashed. Good. Also, we didn't have access to real-time logs, like access log, slow query logs from SQL, and stuff like that. And we cannot SSH enter in the machine. Yeah, because, OK, it's a platform as a service. We are not supposed to do that kind of stuff. Also, we were still on PHP 5.3, which, again, was not that good. Let me spend a few words on all the sites that made up the platform. The first one was, is, actually, the website, which contains all the articles, all the categories, all the custom pages for the teams, basically everything, almost everything. And it was also the oldest site developed in symphony one. After that, we have mobile, which is a customized version, is a custom application for mobile devices. And again, we have all article, categories, teams, details in a different format. We didn't have any kind of responsive design, stuff like that. And it was a freestyle project, symphony two components, but no silks, no framework, just components put together.  After that, we have a community site. Well, Vivo per lei in italiano means high live for her, which means for my team. It's a bit exaggerated, maybe, but it gets you the idea. Basically, in this site, people can write their own content. If a team loses the last match, I can write here that I'm angry. And other people can talk with me, complaining and fighting, basically. So use generated content. OK. Again, it's a symphony two application. Then we have some sort of microservices for, well, particular task features. And when I say microservices, I have something like this in mind, micro. Not that micro, to be honest, OK. They were more micro services. The first one is talk. It's a set of API for dealing with comments, votes, ratings, and stuff like that. And it's used through all the application. This is a snapshot of the web application. So we can see here the user comments, votes, the capability to answer a comment or to post a new one. And the same goes for the mobile site. Here, we are seeing the number of the comments, votes, and stuff like that. Then we have ADV, which is a set of API for serving banners, basically. And again, they are used both in mobile site and in the website. Here is the mobile one. And here you have banners served in the website. Last but not least, media. Media is a services used to deal to all the assets, images, both user-generated and editorial images, and to allow to process this kind of images, like cropping, resizing, and doing that kind of operations. OK, again, same furniture. Here is an example of, actually, a picture of how all the parts of this platform interacts together. Basically, here we have the macro services, each with its own database. Then we have a community site, mobile site, and website, which are the public-facing sites. In front of that, we have Amazon CloudFront, which is a distributed cache for those of you who don't know. And yeah, this proxy, basically, is used to allow mobile sites to call these macro services. Mobile doesn't know about these services. Web, in that case, works also as an orchestrator. OK, so here is where we started. The first problem began started with the talk application, in particular. During some big matches or, well, during peaks of traffic, the application started to error. And basically, the user cannot post or read comments. And they started blaming us because they thought they were banning them in some sort of way or moderating them. So we tried to find a quick solution. The first one was, well, tuning the HTTP response headers and caching more endpoints and optimized queries. The first one was the quickest solution we came up. Then using the log from CloudFront, we found what were the most it endpoint, and we started caching. And basically, we started putting snippet of code like this in our application. OK, so this was a temporary solution, but it gave us some time to think about it and how to, well, came up with a more complete solution. And basically, we didn't think too much of a plan, a really detailed plan. But the idea was, yeah, we cannot use this infrastructure anymore. We need to migrate to another one, to another platform. And in particular, we need to migrate from a platform as a service to infrastructure as a service because we need more control on what's happening. So when something goes wrong, we can just try to understand what's wrong and fix it. OK, we evaluated a different solution, and in the end, we decided to migrate to Amazon Web Services because we got good experience with that and also part of the infrastructure was already on AWS, in particular, the Cloud from Distributions. As I said before, the first candidate for migration was the talk application. OK, so we laid out a possible architecture. I'm not sure you can read this, but I'm going to explain it for you. Here we have a Cloud from Distribution for starting a dynamic content caching. Then we have an elastic load balancer which accepts requests and decide to which web servers direct every request. And then we have two front-end servers in two different availability zones. Every front-end web server contains Nginx and PHP. And then we have the database on RDS, which is the relation database service for Amazon, and a main cache hosted on elastic cache. So basically, this was the first architecture we came up with, and we thought it was good enough to allow us to migrate. Moreover, we take this opportunity to bump some version of the packages up. In particular, PHP was migrated from 5.3 to 5.6, MySQL from 5.0 to 5.6, and we switch from Apache to Nginx and PHP FPM. So by doing that, we faced some problems. In particular, when you were trying to switch from one setup when basically you have only one machine because in the previous version or XPACE, well, maybe there were more machine, but everything was shared. So we can treat it only as if we're only one machine. Here, we have two machines. So we have different things to take care about. First one, web servers IP are dynamic because they are hosted on Amazon and they change. We can connect only through a bastion, and then we need to share user sessions between servers. The first one, web servers are dynamic, OK, but we can use AWS SDK to get a description of the servers and to filter that to get the IP. So before every deploy, we just fetch the available servers, which maybe is one, two, three, four, depending on how many are running based on the scaling policy, which I'll show you later. And basically, we're done. So we get the IP, and now we know where on which server we need to deploy. OK, this is a snippet on how to do that with the SDK. In particular, here, we are fetching these group of servers, and here, we are filtering the information in particular private IP address, OK? Make sense? It should be, OK. Please feel free to stop me and ask me a question if I'm not clear enough. OK, we can connect only through bastion host. What does it mean? As a security policy, basically, we didn't give direct access to the production machine, so a developer cannot SSH into the front-end server. But we need to connect to another machine, which is called bastion host, and this particular machine have the rights to connect to the front-end servers, which is OK from the security point of view, but it's not that good, and it can become complicated when you want to deploy new code. We solved that, adding a configuration on SSH. In particular, here, we are saying, OK, that they want to connect to the bastion with this particular IP address, which is a fixed one, using this key, which is pretty simple. After that, here, we are saying that if we want to connect to this pool of IP address, which are the IP of the front-end servers, we don't know exactly what they are, but they are in this range. If I want to connect to one of these IP, I need to proxy through the bastion. OK, so basically, this is the meaning of all this configuration. With this configuration, we can just SSH through the front-end servers once we know when we know the IP, and we don't need to do anything else. OK, last point, share user session. Actually, TOK was a stateless API, is a stateless API. So we didn't deal with that, at that particular moment of the migration. We'll be back on that later. Another thing we implemented was nginx static cache. Basically, nginx can create a static file after responding to a request and can serve this file instead of processing the request again, as would another proxy cache do, like maybe varnish. This is the configuration we used. In particular, this configuration is important. FastGGI cache key, basically, all these different parameters and all the different values that each parameter can have make a key unique. So basically, here we are saying, for every different value of scheme, request method, getPostPutPatch for a different host name and for a different request to cache a different version of the response. OK, in that case, we also want to cache the response for three minutes, which is quite good. And another configuration was to exclude some particular method because, yeah, we don't want to cache post or put method, also delete. And we set this parameter, noCache equals to 1, and we are done. Another case for the talk API, this endpoint, API queue is the moderation queue, where the comments get posted and the way to be moderated by an editor. Also, we don't want to cache this endpoint in order to show the editors always new comments and non-still ones. What else? OK, here we are seeing that the noCache parameter used to bypass the cache in this way. OK, this is pretty standard, I guess. We deployed using the same link trick. Let me call it that way. Basically, every deploy is done in a different directory, and then we have a sim link, which is switched at the end of the deploy procedure in order to have automatic opcache cleared. After each deploy, we use basically this parameter. We set document root to real path root, which means that sim link get resolved. And when we deploy to a new directory and request start arriving in the new directory, a new opcache is created. Again, so there is a little trick to have opcache cleared automatically. OK, so all the setup was done. We took the old logs, which were available, not real time, but available, and we tried to find out which were the most hit-and-point, and we start to load testing them. After that, we created MEI images, snapshot of the machine. We deployed the latest version of the code on the new servers, and after that, we switched DNS. And we were done. More or less, actually, because everything exploded. And we found out that the database were missing a particular index that weren't present in the rack space database. And here, the problem became quite obvious after, like, 10 seconds. So the idea of moving from a platform as a service to infrastructure as a service was good from that point of view. OK, first part of application was migrating. We were wrapping. Woo-hoo, quick win. The platform now runs on two clouds, Rackspace and AWS. Two quick words about backup. Remember, this is our architecture, and we perform the backup of the front-end machines and the database. We create a snapshot every night, and we don't have a multi-region setup. All of this is in a single region. So if the region fail, we are in trouble. But we just copy the snapshot to another region. So that was something we discussed with the client, and we decided it was good enough as a starting point. OK. How can we do that using the AWS API? Here is an example of how to create a snapshot of the database, OK, and how to copy it to another region in this way, RDS, CopyDB Snapshot, and then you specify the source and the target and the region. And you're done. After that, we clean the previously created snapshot, and basically we are done. OK, second application, ADV. Very quick, because it contains only a small database, really, really small. It's, again, stateless. All the infrastructure was already set. The immigration was particularly easy. The only thing we did was to create a new cloud from distribution for dynamic content called edv.cultramarkato.com, OK, in order to benefit from, again, HTTP caching. Done. No particular problems. Mobile. OK, the mobile part of the site, well, had a night impact because almost half of the traffic runs through the mobile site. Now, this was when we started immigration. Today is higher. I think it's 55% of the total traffic runs through mobile. There is no database because it consumes data, APIs, from the other services. We needed to face a new problem, how to deal with static assets, OK? When we deployed the mobile site, we have static assets like background images and stuff like that. And in the previous version, Rackspace, everything was shared through NFS. We decided to use the object storage from Amazon, Amazon S3, defining a bucket in this way. And we created two cloud for distribution, again, one for dynamic content and one for static content, again, for HTTP caching. And when we deploy a new version of the site, using this command, we sync the asset on S3. Here we're saying, just sync the data from this local folder directory to this bucket. And again, we are done. We deployed the mobile site on a sample machine in order to make some tests. Again, we, using the logs, tried to figure out which were the most it pages and performance tested it. We deployed, rebuilt the MEI, and switched to DNS. And everything went smooth. We measured after the deploy things for a bit, like one week, two weeks. And we started to see that there were a lot of requests from CloudFront to S3. It turned out that we missed some header, which can be added to every static asset in this way. Here, basically, we are saying, I add this cache control max age, like one hour, to all these assets, which is nice because this means less request from CloudFront to S3, which means less dollars you spend on that. Again, still makes sense. Another part was community. As I said before, this site allows users to create their own personal blog. I can write some posts, and people can comment and vote my posts and stuff like that. And it's the first app that can be considered complete because it interacts with the database. It uses some APIs and stuff like that. Also, it exposed some APIs for user-related stuff, like single sign-on, or allowed to retrieving user posts and stuff like that. So the problem was kept before, popped back again. We need to share user session between servers. In this case, we used another service from Amazon, Amazon Elastic Cache, which is a main cache as a service. You can use without need to configure it on your own machine. We didn't have to make big changes in the code, just defining a new services, which is main cache, adding the different hosts, and change the session and learn in this way. And automatically, all the session now are saved and retrieved on main cache rather than the local file system. Yeah, exactly. OK, how to deal with user-generated content? We found a way to deal with static assets, and now we need to deal with user-generated content like post-hand images and stuff like that. Again, we created, like before, two particularly cloud-food distribution, one for dynamic content, called VXL, and one for static content, called CDN VXL, both dot-cache-mercato.com. OK, in order to work with user-generated asset, we used GoFret, which is particularly, I guess, famous. How many of you do you know GoFret? A few? OK, it's a file system abstraction layer, which it means that it allows you, once you configure it, to write code in a file system-independent way. It doesn't matter if I want to save a file on S3 or through FTP or in the local file system, the code remains the same. I just say, file system, write this content. And the library takes care of all the work needs to be done underneath to make it happen. Another good library to do that is Fly System. If I remember the name correctly, from the PHP League, also quite good. How do we configure GoFret in symphony? You need to define adapters. An adapter represents basically, well, one file system you want to be able to write a read to. In this case, we are saying, OK, this adapter is called PhotoStorage, and it uses Amazon S3, which the bucket name defined in this parameter and uses this service ID. Then you define a file system called, again, the same way. Maybe it's not really clever name, but here we are saying the PhotoStorage file system who uses this adapter. And we can also call it, in that way, PhotoStorage file system. And the configuration is done. The client, the service we passed before and the configuration is basically an S3 client, which we create using, well, yeah, AWS SDK. Here we are saying, create an S3 client with this key, this secret in this region. The key and the secret and the one you get when you sign up for Amazon Web Services. The code to write and read assets is, as you can see, well, file system independent. Here we are saying, this file system write on this path this content. And we don't know if underneath we are writing on the local file system or on S3 or on FTP, whatever. So this is the important part. And by the way, the photo uploader class is the one we use to deal with user-generated content when a user uploads his own images. Again, we deployed on the sample machine. We performance tested it based, again, on the logs. We deployed the new code, revealed all the images, the MEIs. And we copy all the user assets on S3 and with which DNS. OK, we are at that point at 2 third of immigration. We migrated for services to our left. The next one is web. OK, web was and is, actually, the oldest and biggest code base, Symphony 1, really, a lot of modules applications. And it's a proxy for all the mobile calls, API, actually. And well, as I said before, now this percentage is a little lower, but still, there is a lot of traffic running through that. First issues, well, officially PHP 5.6 is not supported by Symphony 1. We came up with two plans, two different plans. First one, try to upgrade Symphony 1 to support PHP 5.6. And as a backup plan, deploy the web on different machines with and all the PHP version. Fortunately, we found this project, which is basically a fork of the Symphony 1 repository, which is not maintained anymore. This one is actively maintained. And also, there are new features. For instance, dependency injection container and SwithMailer as a default mailer. Actually, we weren't interested in getting new features, so we just picked up the part of the code that enable us to make Symphony 1 PHP 5.6 compatible. It turned out that there were just basically one small change. In particular, this function, pregreplace, doesn't allow this switch slash e anymore. And basically, this is the change you need to do to obtain the same behavior. And that's all. OK, after that, we created another CloudForm distribution for starting content, cdmweb.calcimercata.com. And also, we switched DNS using Route 53 because, well, there is a detailed explanation on why we needed to do that here. The idea is, well, among the other things, it gives us more flexibility in managing DNS in that particular way for this particular application. OK, what else? Nothing more, actually. We deployed again on a sample machine, perform untested, deployed like a cata, repeating the same action again and again and again, repeating the MEI and then switched DNS. nweb was migrated. The last part was media, asset management, cropping, residing, stuff like that. As I said before, Android's image thumbnail league, stuff like that, pretty big archive, 17 gigs. And, yeah, API are stateful in that case because in order to perform this operation, we need to be authenticated. This is an example of how this part of the code works. Basically, the idea is when a site, mobile, web, or community asks for an image through media, media checks if a thumbnail already exists for that particular image. And if it exists, it service directly. Otherwise, it create it and upload it to S3. Basically, what we do here is, let's say we are serving a request for a new thumbnail. Download from File Manager. File Manager is the part of the media API that contains the images, original images. We generate a unique CDN key. We resize the image. We optimize it to save some space. Then we upload it to the CDN. We update some metadata. After that, we delete the temporary files. And, basically, we're done. So these are all the steps involved in creating a new thumbnail for a given image. OK. We needed to transfer all the old images from the Rackspace CDN to S3. As I said before, the only access we got to Rackspace was through FTP. Yay. So we wrote a nice script to copy all the images. Well, it's basically a long, boring task. And sometimes, obviously, the script and or the FTP connection drop. But after a few tries, we made it. And we copied all the images on S3. And we found another little problem. In particular, there is a little difference on how S3 can manage image name. In particular, you need to remove all the strange characters, which in the previous CDN was not a problem, but it was. So with this snippet of code, we created a slug of the image name. And, well, after that, everything went fine. OK. So we migrated all the application. There are a few more things I'd like to discuss. And then, if you have a question, I am available. Monitoring, yeah. Well, because we want to know when things go bad and in order to be able to react timely, we used Amazon CloudWatch to do that. In particular, we traced different metrics like RDS CPU usage, IO operation on the database again, the main cache dimension request, and stuff like that. The number of requests on the instances and the CPU usage and stuff like that. Since there is a two-week retention for this information, we have integrated it with our internal CACTI and Nagios monitoring tools in order to have a longer retention of this data. And also, we integrated it with Slack. So when something goes wrong, we are not defined directly on Slack. Autoscaling. One of the nicer things of using Amazon Web Services is you can decide, based on some rules, when adding or removing more servers. For our use case, we have two autoscaling group in our setup, and we defined three different metrics. CPU usage, response time, and number of requests per second. In particular, we decided that when the CPU usage goes over 70% or when the response time goes over 100 milliseconds or when the number of requests per second goes over 10,000, we spin up a new machine. And when these three metrics come back to normality, we just drop the extra machines. In this way, we can handle, in a nice way, peaks during, let's say, January, August, September, and also peaks during big matches. OK, there is some few things I'd like to say. The fuel migration took us one year. Actually, it wasn't a full-time job, because it was just a client of ours. But yeah, it took one year of time. And it's something we did gradually, so we didn't want to rush this thing. We migrate one part, measure for one week, two weeks how things were going, and then plan and migrate the other part of the application on the infrastructure, sorry. And after some measurements, we found that we have a 50% cost reduction for our particular case, which is, well, quite good. Let me be clear, this talk is not about blaming Rackspace. Simply, it wasn't suitable anymore for our needs. Maybe it was fine when the project started, but at that particular scale with our particular needs, it wasn't suitable anymore. OK, so this is the final architecture. Here we have, today, normally, two front-end web service for different availability zone. And again, RDS, main cache. On top of that, a load balancer and all the cloud from distribution. DNS are managed through Route 53. And all the assets, both user-generated and static assets, are on S3. OK, what else? Macro services helped us a lot, because, well, they were macro, but not big enough to, not big as, let's say, web or community. And it allowed us to migrate in an incremental way. If we, for instance, had only a big monolith, well, probably it would have been much more difficult to migrate. Also, the HTTP cache helped us a lot, giving us time in the beginning, and helping us to saving money, reducing the number of requests from CloudFront to S3, but also from CloudFront to the front-end machine. It's important to try to measure when you do changes to see if your changes are having a good, positive effect or a negative one. Since the migration ended some months ago, we continued on that path. And we, well, started rationalizing the API calls, trying to make less calls in general. For instance, when loading comments in the previous version of the site, four or five requests were issued, if I remember correctly. Now, we have only one. We reorganized some front-end stuff, trying again to download less assets, using Sprite and stuff like that. And we started to get rid of the old Symphony 1 application, trying to migrate it incrementally again in a Symphony 2 one. The next step are upgrading to PHP 7, which is something we actually already started to do. And after that, one thing we might want to try, because it looks promising, is switching the load balancer from ELB to ALB, application load balancer, which supports several new features. One of these is HTTP 2 support, which looks really, really promising from the performance point of view. OK, I'm done. One last thing. If you want to join us in Verona, in May, this is Verona, there is a really, really nice conference, which is PHP Day. And the days before PHP Day, there is also the JavaScript Day. There are two community conference international, actually, so there are a lot of international speakers. Sorry. Sorry about that. Well, if you want to join us, it will be fun. Again, thank you for listening. These are my contacts. This is the talk on joined in. And if you have a question, I'm here. Thank you. Some question? Yeah. It sounds like the talk application was the one with the most volatile data, like users changing it, adding blogs, that kind of stuff. Was that the most difficult one to migrate, because you couldn't control when comments were being added and things like that? How did you ensure that you switched over without losing data? How to switch without losing data? Yeah, the talk one, in particular. Yeah, the talk one. Basically, when we started the migration, we put the API in read-only mode. So for a short period of time, people cannot post new comments, only read. And well, after the immigration, we restored the read-write mode. And basically, we were done. Also, we planned the migration in early in the morning when the traffic is usually low, so we didn't experience a lot of problems. Still, some users got angry, even if we put a message on all the sites, we are going to perform maintenance, but we didn't lose data. Another question? Yeah? OK, so first, thank you for a great presentation. Thank you. And second, you told that you are using CloudTrend. And in CloudTrend, you are able to define different origins, but also something called behaviors. That based on path, you are able to send the traffic to another origin. And when you have two or three behaviors, it's quite easy. But when a number of behaviors increases to, I don't know, 20 or more, it's a hell to deploy the changes. So my question is, do you have some ways of automating CloudTrend deployment, CloudTrend changes in CloudTrend configuration? No. We have some of those behaviors you are mentioning. For instance, for dealing with some path on the mobile site, but they are not that much. If I remember correctly, they are like four or five different behaviors. And no, we don't have an automatic way to change that or to deploy that. Other questions? OK. Thank you, everyone, for listening.


they all realize what's going on right now do you realize the Baltimore Ravens are on a historic playoff run at the present reason being because the Baltimore Ravens obviously have plenty of playoff experience they have plenty of playoff success but right here right now after they beat the Houston Texans in the division around and the Kansas City Chiefs beat the Buffalo Bills in the division around the Baltimore Ravens will be playing their next game at the crib the AFC championship game at M&T Bank Stadium for the first time in history they will be hosting an AFC championship game that is crazy that that's a good kind of crazy that's an amazing kind of crazy and everything that we've talked about from the beginning of this year to this point the Baltimore Ravens have done more than enough to put themselves in this position to where they can say that but i know i'm proud of them i know y'all are proud of them obviously the job's not done and our job personally is not done either because we got plenty more to talk about in this video when it comes to our Baltimore Ravens before we do it let's hear a word from our sponsor this video is sponsored by football battle touchdown more details to come later on in the video they even keep it clean let me introduce you to a new football game that i really enjoy football battle this game puts you in control to where you can customize and build your own Baltimore Ravens team if you choose you can also compete against your friends like you know we love to do oh and by the way there are no ads in this one but what exactly is this game about well let me tell you you start with short simple training exercises and once you build yourself up and you're ready you can compete in some real matches you start your journey by joining a team in the lower division and then you work your way up by proving yourself and the way you can do this is by participating in daily league matches and really helping your team win matches happen at the same time every single day and they are against live teams so you better bring your a game during the season there's multiple tournaments and different bowls that your team can win there's a national bowl there's a champions bowl there's an ultimate bowl the the list just goes on and on and when you win these matches at the end of the season your team gets promoted to an even higher division higher the division the higher the competition so it's going to take real teamwork and real good coordination to make it happen so there's a team bonding aspect in this game too to where you'll have to really strategize for all your opponents and all your matches and do some true game planning so you can become the best team in the world now i know you're wondering well how can i even get this game how much does it cost what do i need to pay well football battle touchdown is available for free on both the google play store and the apple store so hit the field by downloading it on your phone right now so you can start playing and as a special promotion just for watching this video when you create your username and you put engraving in front of it the developers are going to hook you up with a special welcome package so you can't beat that so download football battle touchdown now team keeping clean man it's a real good feeling it's a good feeling that this game will be at the crib in the Baltimore Ravens they've been taking care of their business everything that's been in front of them they've grabbed it took it by the horns and oh i guess that's literally a Texans reference almost but they've handled their business regardless and that's a beautiful thing because there've been plenty of times and past years and previous years where they haven't now somebody who has been handling their business is your team keeping clean and i gotta say i appreciate y'all yesterday uh we were nine subscribers away from 73k y'all blew that out the water and i appreciate y'all i appreciate y'all helping us because it's not me helping us get to 73,000 subscribers so i appreciate it next goal 74,000 let's see how quickly we can get there uh make sure you subscribe to the channel tell your friends your family because i know a lot of y'all already do that anyway but tell your friends and family about the channel subscribe turn your notifications on so when we drop a video you don't miss not a single thing and leave a like on the video because who y'all went crazy yesterday i think yesterday might have been the craziest y'all ever went but i appreciate y'all like crazy because y'all are crazy if y'all deal with my crazy y'all are crazy too but i love y'all seriously man now um somebody else who we love is these Baltimore Ravens and they have a tough task coming up against the Kansas City Chiefs you know what's crazy me personally i actually felt like the Kansas City Chiefs were a more favorable well i gotta put favorable and quotation marks but were more favorable matchup than the Buffalo Beals were now i still feel like Ravens would handle business against either one but i felt like Beals would create more problems than the Chiefs would but both of them going to create their problems both of them create their issues and both of them are going to bring their stresses now real quick speaking about the AFC Championship game um some personal plans a personal personal update uh because plans may have changed with that one i was planning on going to the AFC Championship game but there was a miscommunication from where i usually get the tickets from and those tickets they are going poof they're out of there so it's not looking like we're gonna go we'll still see but either way it's it's fine it's fine i ain't upset about it or i mean it would have been nice to be there but if we just end up streaming from the crit like usual and we just watch what team keep it clean that'll be perfectly fine as well so either way we're good uh but i'll keep y'all posted on that as time goes along and as we get closer because i mean it's already money so we we're gonna see but um i i let y'all know uh but anyway um back to the game the the Chiefs i just felt like they were a bit of a more favorable matchup uh than the Buffalo Beals but it is close it's close because with the Kansas City Chiefs y'all saw that clip of Patrick Mahomes he said he liked to be the villain he loves to be the villain and Patrick Mahomes has been the Baltimore Ravens villain for a while for a while especially against uh well only obviously only against Lamar Jackson because he didn't wasn't here for the Flacco days but he is obviously an amazing quarterback um he uh extremely successful quarterback two-time Super Bowl champion two-time MVP uh Lamar Jackson looking to get that first Super Bowl championship this year but this is like set up perfectly because in order for Lamar Jackson to get his first he got to go through the guy who's currently the best the guy who's currently at the top of the food chain that being Patrick Mahomes and i love it because i see so many Ravens fans this week just show or not even this week but today and or since last night show their respect uh for Patrick Mahomes and the Kansas City Chiefs because you ain't got no choice but to respect it i know we always talk about Patrick Mahomes being like whining and stuff and complaining to the refs and doing all that and that doesn't happen but at the same time they they are the champs they are the current Super Bowl champs and we know that was last but hey they got it that's theirs forever they are two-time Super Bowl Patrick Mahomes a two-time Super Bowl champion and that's that's a big deal right there that's a big deal and he has an opportunity to possibly play in a fourth Super Bowl but sorry Pat well we ain't sorry this is Baltimore Ravens here and it's got to be done but i've seen so many Ravens fans say in order to be the best you have to beat the best and that's exactly what has to go down this game is going to be stressful this game is going to be crazy this game is just it's it's going to have all the feelings man like right now like and this same thing happened to me last week let me know if it happened to y'all too but right now it's it's Monday like when when the chief's first one i was like well could we be driving in the car watching the game on the phone and i was like i said all right let's go i was clapping i was hype i was like hi hey this this is real now man AMC championship is set chief's coming to the crib but now the feeling it kind of went away because now i'm like all right i'm cool i'm chilling right now but as we get closer especially it comes saturday and then sunday morning oh sunday morning we're gonna be going crazy man sunday well like even i remember last week this the game on saturday my stomach was going crazy before that uh Texans game it was going crazy i had in my mind i wanted to eat but i ain't have no appetite i have no kind of appetite because i was just like the anticipation leading up to the game was crazy but anyway um this could be a big week for the Baltimore Ravens they could be getting some key guys back uh one of those is Mark Andrews and it was said last week that the plan was always when Mark Andrews went out the plan was always that he could be back for the afc championship game if the Baltimore Ravens made it that far i remember having conversations with y'all during the season obviously toward the end of the season when once Mark Andrews was already out but i remember having conversations like hey because john hop off said that there was that outside chance that Mark Andrews could come back and i was like hey Ravens let's get to that point to where we have him as an option let's get that far to where Mark Andrews can return so that would be great if they can add Mark Andrews back to the lineup so again he practiced last week and even on their last regular practice he practiced in full so hey it's like okay Mark Andrews must be good right but they said no no no we're gonna wait we're gonna wait and that right there that's how you know this Baltimore Ravens team is extremely confident because they they are extremely confident in who they have and who they are a lot of times it wasn't like that in the past it really wasn't but it says a lot to where one of your best players not on not even one of your best players on offense one of your best players on one of your best players on the team had an opportunity to come back last week but you said no uh-uh you sit down we got this you just chill out we got this that says a lot about these Baltimore Ravens right now it really does so with Mark Andrews we'll see if he ends up coming back this week another guy that was out this weekend has been out for a while he left during that Dolphins game and really throughout the course of the season he's missed a lot of time a lot more time than normal it's been Marlon Humphrey now Marlon Humphrey um I'm not sure what to think about his injury it's interesting because remember coach we when we had coach on here last week and he talked about how tricky calf injuries can be said it could be something that lasts one week or could be something that lasts the whole year depending on the severity of it and what it really is with that calf is it just a calf isn't a kid we don't know I don't know you don't we don't know but with Marlon Humphrey again I guess this week we'll just see we'll have to wait and see if we can have Marlon Humphrey in the lineup hopefully we can but we'll see um it's Monday uh the game is on Sunday so they should start practicing normally they start practicing on Wednesdays I wonder if they'll do it uh earlier I don't know maybe they will do it earlier but usually the when they have games on Sundays they practice they start practicing on Wednesday so we'll see what happens with that but um we just gotta wait for the practice reports and everything I'm sure John Harbaugh gonna have his presser probably today he usually has the pressers of Monday after a win to give us some little updates here and there on different players and whatnot but Marlon Humphrey that's gonna be a big question obviously Mark Andrews gonna be a big question but Marlon Humphrey is gonna be a big question too because he's more of a question mark that then that's crazy to say that Marlon Humphrey at this point of the year at this point of the season he's more of a question mark for this game in my opinion than Mark Andrews is I feel like Mark Andrews it's like oh yeah yeah he's in it but with Marlon Humphrey it's like we don't know so we'll see exactly how that goes well some guys that did return shout out to Devin Duvenay he came back he came through got a little pun return on so welcome back got his kick return on so welcome back Ardarius Washington I um I know he got activated I didn't see him in the game unless I missed something but I don't think we saw him in the game I know Arthur Millette um Arthur Millette has been holding down in the slot and Raven's been doing a lot of mix matching with corners and stuff and oh uh Ronald Darby he was doing his team Brandon Stevens of course uh had a rough start they had a rough start uh Brandon Stevens did and Ronald Darby did they were struggling with Nico Collins and Dolan Schultz but Raven's made adjustments and again what's crazy just another beautiful thing about this season has been the adjustment shout out to Todd Munkin shout out to Mike McDonald but on defense they were struggling early in the game against Nico Collins and Dolan Schultz but the Texans only scored three points throughout the whole game on offense obviously the special teams picked up that punt return for a touchdown but on offense they only got three points three points so even with this that's how we are spoiled man we are spoiled and that's a good thing I love being spoiled by the Ravens but we are spoiled because they were struggling they could not cover Nico Collins for nothing they couldn't cover Dolan Schultz for nothing but the Texans only got three points oh my goodness like this gotta be the year man Raven's got to get this thing done for real and I expect them to um it's again they they got what they need and they're getting even more as the days continue and lead up to this AFC Championship this is special one man this is extremely special uh for the Baltimore Ravens and just for everybody so let's hope that they get the job done


Good morning. Thanks Bruno. Thanks everyone for coming. It's always a pleasure to be here at UX Lisbon. I'm going to talk today about a topic called jobs to be done. There's my Twitter handle if you want to follow me on Twitter at Jim Callback. I am the head of customer success at Mural. Mural is an online whiteboard. I'm very interesting and relevant for designers. If you haven't checked out Mural, please do so. It's mural.co for a free trial. In 2007 I wrote my first book called Designing Web Navigation. Since then I've been looking at more strategic concerns around UX design that culminated in my book Mapping Experiences which came out in 2016, May of last year. That's available for sale upstairs. If you buy a copy I'd be happy to sign it for you. It's a topic in that book that I wanted to expand on. I mentioned jobs to be done briefly in the book but I wanted to talk a lot more about it today with you here. I want to make three points throughout my talk so I'm going to make three big points.  I want to ask the question what is disruption? The word disruption we can see it in many different ways. We can think about disruption as changing the norm or an upheaval of the norm or chaos even. There's also a very specific definition of the word disruption particularly from a business standpoint. I wanted to start by talking about what is disruption from a business standpoint. We can use this chart to explain it. A company and offering progresses over time and the performance of that offering increases. These two lines in the middle represent the low end market demand and the high end market demand. When a company starts out they have an idea that's maybe not ripe. It's a startup and they develop that solution, that offering until it meets the low end of the market demand. It increases in power. You want to be able to charge more money for it. You want to add new features and services. I think mine does work. It gets better and better incrementally. You get 10% better with the feature and you add more and more to it and that justifies a higher price and you eventually reach the high end of market demand. This is normal growth. This is not a bad thing. This is what all companies strive to do. They want to grow in lots of different ways.  What happens is this leaves the incumbent, the existing offering open to low end disruption. What happens is another offering comes in and meets low end market demand. It gets the jobs done for the customers at the low end. It comes in and it's cheaper and it performs less actually lower. It has lower performance but that's not static either and that product gets better and better and better until it starts eroding the market of the incumbent, the offering that had been there for a while. Disruption is really about a competitive response because what happens when this new product is launched, these guys say, yeah but we're a premium product. We have high end customers. We charge a lot. We're a lot more powerful. They're just starting out and that attitude assumes that they're going to stay static but of course that company wants to grow until they eat the lunch of the incumbent. This is in a nutshell, these are the dynamics of disruption. When we say disruption in disruptive technology in a business standpoint, it has a very specific definition and a very specific meaning, the disruptor. Here are some examples of disruption. Encyclopedia is disrupted by Wikipedia, bookstores disrupted by online stores like Amazon, CDs, MP3s, film photography disrupted by digital photography, premium airlines, budget airlines, rental cars from car sharing and telephones by conference systems, voice over IP. It's this last one I want to talk a little bit more about and give an example. I used to work for a company called Go To Meeting. How many people know Go To Meeting?  In 2011, so around 2000 the company got started on this trajectory of improving performance so they can justify their higher price than move upstream, up market. In 2011, this was an article from GigaOM, in 2011 Go To Meeting launches high definition video conferencing, it was called HD Faces. Not only do you have audio and video but you have high definition webcams. They're a little 10% little more so they can justify their $50 a month price. Without kind of regard, this is them looking at their own technology and improving their own technology, almost for technology's sake. Does anybody want that? Does anybody need that? And I want to share a little video that I saw from the new season of Silicon Valley. Does anybody watch Silicon Valley on HBO yet? You guys like that? Okay, go to HBO.com and watch Silicon Valley. If you're in software development, it's absolutely hilarious. So if you know the scene or the setup, there's a company called Piedpiper and they do data compression but they have this video chat application. And in this scene, the CEO is showing the other developers his new compression that gets 10% better video quality. And just take a look at the reaction of everybody else here. So I'm just going to start this video. I hope the sound is good. I started to optimize our code to handle higher traffic. Then it occurred to me, why rewrite our old code when I can build a new encoder that doesn't strip away a ton of channels and metadata. So I extended my compression algorithm to support, get this, 12-bit color. Okay, so our users will be able to experience a 10% increase in image quality with absolutely no increase in server load whatsoever. Just watch this. Before. After. Before. After.  I get it. I get it. After every VC in town to understand, we decided that the best way to stay alive until we got to a million users was to cut server usage. Remember that?  Technically, the reason why we stayed up for two days was to maximize our ability to get a million users. And I just did that because who doesn't want 10% better image quality? Who doesn't want it? Everyone. Everyone doesn't want it. We already have the best video chat. People are using this on their cell phones.  Guys, this is a better product. And I'm the CEO, and I'm going to say this is where we... I'm the CEO. This is where we're going to go. It's a better product. It was a better product. It's 10% better, right? Thinking about an incremental innovation. But the question, who actually needs this and who wants it? Or the fact that they're using their cell phones, their mobile phones, when they're doing this, right? It becomes irrelevant. This is just symptomatic. Now, they're a startup, so it's not actually a disrupted disruption dynamic going on here in particular. But the attitude of making a better product and launching that in the hopes of getting more customers, he wanted to get up to a million users with better high definition video. And for me watching this, it was very comical because that was pretty much the language going on at GoToMeeting at the time. We're going to get more visitors because we have HD webcams. The same time that GoToMeeting was growing up, this started, right? Anybody who knows Skype? Raise your hand if you've ever heard of Skype. Yeah, that's like everybody, right? What was the competitive response from GoToMeeting to Skype when it came out, right? We're a premium product. We have business customers. We're for serious business people, right? Skype is for college kids to call home and chat with their girlfriends, right? That's okay. They can live down there in the low end of the market. They're free. We charge $50 a month. We're way up here. But that assumes that Skype is going to stay static. What happened to Skype? They improved their services and their quality, and they eventually had, in my opinion, better audio than GoToMeeting and most other services. And then what happened around the same time, that article that I just showed in 2011, what happened to Skype? Where did they end up? And what did Microsoft brand them? Skype for business, right? So now, now GoToMeeting and Skype are literally head to head. So disruption is when the competitive response from the high end is, oh, don't take them seriously. That's just the low end. At the heart of this dynamic, though, is this notion of looking at the goals that customers have and what they're trying to get done. And we can call that the job to be done. And that's what Clayton Christensen outlines in his book, The Innovator's Dilemma. It's probably the most famous and most widely read business book out there. If you don't have The Innovator's Dilemma, I do recommend you read it. It is a business book, but it's fascinating reading. In his follow-up book, The Innovator Solution, particularly in chapter four in there, he expounds on this notion of jobs to be done. Basically, what he's saying is that companies get disrupted because they stop focusing on the job that the customer is trying to get done. And a job to be done is not a task. Sometimes the term jobs to be done gets confused with task analysis. It's not. It's actually about a progress towards a goal. It's ultimately about a need. Jobs to be done perspective sees consumers as goal-seeking agents, that we're trying to improve our lives. We're trying to solve a problem. And that act of trying to solve a problem is a job. And we call it a job to be done. It's not about demographics. It's not about solutions either. So one of the kind of principles of jobs to be done thinking is you need to describe the job to be done without describing a technology or a solution. You need to look at what the human being, what the person is trying to get done. And this shows causality. Why people buy products? Why they hire our solutions over other solutions is because of the job to be done. So the first point that I want to make is that at the core of disruption, this very, very important business theory is the realization that opportunity, business opportunity comes from understanding the jobs that people want to get done. So I think for us, you know, the advocacy for understanding our customers and understanding human behavior is kind of feels kind of natural.  So never before in my in my experience, or my opinion, has what business people are talking about in terms of the dynamics of business opportunity overlapped with what we're talking about. And I think part of my message here today is that I think we should be part of this conversation and be involved in what they're talking about when they say jobs to be done. So understanding jobs to be done part of the problem with the theory of jobs to be done is there's not really a codified language or a way to look at jobs to be done. There's a couple of competing perspectives and competing approaches out there. But I offered this practical model for understanding understanding jobs to be done. Again, if the job to be done is a progress towards a goal, we can we can describe it one way along several different dimensions, the functional job. And I made that bigger because typically a job to be done is described by its functional job. That's why it gets confused with task analysis. But we can also talk about the emotional job in a social job that's involved there. And I'll give an example of this coming up. But it's also a contextual is also a job to be done is for a certain context. Notice we're not talking about the psychodemographics of a customer, a persona that doesn't that doesn't drive behavior, but they're context and the job that they need to get done does. Let me just give you an example of those six dimensions or six facets of a job to be done. Let's say you want to hire a keyless lock. They have these locks for your front door that are wireless hooked up to the internet. You can actually open your door with your smartphone. You can see online who's entered your house or not. You can let people in or not. The functional job is you want to control access to your home and that's how you might describe the job to be done. But there's also an emotional job there too, right in this goal that I have. I want to feel safe and secure. Right. So if this solution came out and it met that functional job but didn't meet that emotional job, people might not hire that solution. There's also a social job. It lets visitors in but keeps strangers out. But then we also need to look at the circumstances around this keyless lock. This is for private home owners to let people in during the day when they're at work. And the motivation is to solve the problem of selective access. And then there are these things called desired outcomes. So we have the job to be done, which we can describe by functional, emotional and social. But the desired outcomes are the metrics, the means by which we subjectively judge whether that solution is meeting our job or not. Right. So you have a job to be done and you have a desired outcome. And you can express desired outcomes in a series of statements. So for any one job to be done, there might be a dozen or several dozen desired outcome statements. And it's that last point that I wanted to just expand on because I want to show how you can actually find business opportunities by understanding the job to be done. In particular, the desired outcome portion of a job to be done. And there's a method that had been pioneered by a guy named Tony Olwick that normalizes the statements for the desired outcomes. And the way that you get these statements, by the way, is going out and talking to people, where they are, where they work or where they're playing if that's what you're looking at. You go out and collect all of these desired outcome statements and you put them into a normalized format. And the normalized format begins with a verb that shows direction. Either you're going to move something down or erase it. So you're either going to minimize, reduce, decrease, or lower something, or you're going to maximize, increase, or raise something. The next element is a unit, usually a noun, that shows the thing that you want to move up or down. In this case, it's maximize my ability and then you have a qualifier to allow visitors in during the day. So you do observations of the world, look at the job to be done, and collect these desired outcome statements in a qualitative way. But then you can actually measure opportunity, business opportunity, with a quantitative survey. You can ask a sample of the job executors, the people in your market that are of interest to you. You can ask them two questions for each desired outcome statement. You can ask them how important is that to you? And how satisfied are you currently with getting that solution done? Scale of 1 to 10 on each. So what this gives you is a scale of where that desired outcome fits in a matrix, like this. And where business opportunity happens is right here. Things that are important to people, but aren't satisfied. And that's, by the way, this is where disruption also potentially happens. If you have an existing offering, you need to watch out for these things, because if somebody figures out a cheaper way or a better way to do that, to fulfill those jobs for customers, you may be disrupted. And this is the method pioneered by Tony Olwick. It's quite scientific and very specific in its methodology. But it's using the jobs to be done theory, general jobs to be done theory, which I think overlaps with a lot of our thinking, but comes from the business literature. And he has operationalized the jobs to be done theory to pinpoint where business opportunity is, but from customer needs. In fact, look at the title of the article where he explains this method. Turn customer input into innovation. So these are business folks talking about similar topics that we have, but from a business standpoint. So my second point is that jobs to be done give designers, they give us a way of capturing insight that leverages our skills to help inform business to find help find business opportunities. I think that's I think that's important. And that's pretty cool to there. There's still not one central place or language around this this notion of jobs to be done. And people like Tony Olwick and Clayton Christensen, they tend to consult CEOs of, you know, Fortune 500 companies. They operate way up in the stratosphere. And they're talking about a corporate strategy and corporate innovation, like what markets should you be in, and that those types of things. But I think jobs to be done can actually be applied at a much more practical level and can pervade the organization. So I'm seeing this jobs to be done thinking, again, similar to concepts that we already know around user centered design or human centered design. I see jobs to be done as a lens, as a lens that we can use in lots of different practical ways. And I just wanted to show a couple of practical ways that you can think about using jobs to be done. So I encourage you all, first of all, to go out and read more about jobs to be done. That's kind of my my call to action is I want to make this this topic, this concept known to this community. But I want to give some specific examples of how you can apply it. In discovering value in finding new opportunities, understanding your market, in designing solutions for that market, in packaging and delivering and creating language around your solutions, but then also in innovating and redefining your position in the market. You can use the jobs to be done thinking as a way of seeing to help you do any or all of these. So in terms of discovering value, right, we like to do a lot of qualitative research observations, ethnography, contextual inquiry. And, you know, it's always a challenge. If you've ever done qualitative research, it's a challenge to make sense of all of that data and present it back in a way that makes sense. Here's one way that you can do it. This was a project that I was working on a while back when I was looking at small law lawyers in Germany and how they do new business development. How does a law office in Germany do new business development? And I went out and talked to a dozen lawyers and I listened to them and I was listening for jobs to be done. And what I did is I created a hierarchical description of the things that I heard. So down here, these are individual statements or tasks that I grouped into a cluster that I then grouped up here into a higher level kind of pattern that for me pointed to a value, a higher level driver for the lawyer. I'm going to zoom in on this just so you can see some of the language there. So lawyers were telling me they wrote legal articles. Why would a lawyer write an article? Well, because they need to publish to stay relevant. Well, why would they do that? Because that improves their reputation. And reputation feeds into new business and becoming a successful law firm. So it's almost like the five whys. Do you guys know the five whys? It's about asking the question, well, why do you do that? Why do you do that? And asking the question, why will always expand and get more towards the underlying motivation. Within the jobs to be done framework, if we're looking at this as a process or progress towards a goal, we can we can use this this line of thinking, both questioning the audience, the consumers, but also as a way to describe it back to our internal stakeholders. I can make sense of the jobs to be done and use these models to capture and create a diagram and artifact that we can then talk about internally inside of my team. And this this this method represents or resembles mental model diagrams. Does anybody know mental model diagrams in the Young's book that came out to 2008? Yeah, you create these really long diagrams that are essentially a hierarchical representation of jobs to be done. She doesn't call them jobs to be done. But it's a very similar perspective. So we're kind of doing this already. That's what I said. This feels natural and comfortable to you. I hope that's a good thing. Here's me at a go to meeting. And we did some research where we created a hierarchical model of jobs to be done that people were doing. But look what we called this thing. We didn't say buy go to meeting or get better HD video for your webcams. How do people work? It was really how do people work together because we were looking at collaboration. But how do people work together? That's what we wanted to understand. And we presented this back to the folks that go to meeting. And guess what? High definition video doesn't solve any of these jobs that people have. That's not going to help them try to get what they're trying to get done better. And we had gaps. So the thing, we were missing out on opportunities, but focused on the wrong opportunities because we were focused on the technology for technology's sake. 10% more increase in video quality. So what? And that, by the way, the HD webcams brought almost no revenue back to the company. It didn't really help go to meeting in the way that they hoped that it would. The second thing that you can do is when you're designing a solution, so that's understanding the market. But I can also design for the market as well, too. And there's this notion of job stories. A guy named Alan Clement talking about how user stories are so poorly formulated. As a user, I want to log in. But he wants to log in. That's not what they want to do. They want to access their content. The log in, you're putting a barrier there. That's friction. I don't want to log in. So he suggests that we reformulate the way that we're writing user stories to say, when I'm in this situation, I want to, you know, when I'm on the go, I want to access my content so that I can continue working on a document at work or something like that. Now, job stories are probably aren't going to replace your user stories. Anybody work with user stories and agile and stuff like that? Okay. So you kind of know what user stories are. These probably aren't going to replace your user stories in your backlog. But what you can do, and this is what my colleagues at Mural do, is before they go and design something, so they're designing a new feature set or a new capability, they list all of the job stories up front. And this is a mural. So we have these big canvases. And in the upper left of the canvas, they say, okay, what are the jobs that people are trying to get done in the context of this solution? And they write them out as job stories. The engineers might then use user stories to measure burn down rate after that. But these become then guiding principles to look at. Not what's our technology or what technology are they using, but just what are people trying to get done? What are the jobs that people are trying to get done? And it helps frame the conversation and keep that as reference. So when you're designing that login screen, it doesn't say people want to log in. It says they want to access their content. The third thing that you can do is help the job you don't can help you deliver value. In this case, and I did this too when I was working at Citrix, where we looked at a marketing language, right? So just looking at how you're phrasing things back to the market. This might be a, you know, a slogan or a statement that you see on a brochure. Our conferencing software features high-definition video with the best resolution. That's technology, technology, technology. But what are you trying to get done with that technology? Well, you can connect with your remote colleagues on a more personal level with true-to-life video. That same thought rewritten from a jobs-to-be-done perspective. So we went through that exercise of actually looking at language, speaking to the market from its own perspective. What are you trying to get done? And actually, when you do this, you see, well, you don't actually need that. That doesn't help you get your job to be done. Or at Mural, I'm in charge of the customer support team and we have a help desk where we have articles that describe our functionality and we use that framework that I just showed to actually structure the content of our help articles. So each one of our articles begins with a verb that represents the functional job. So you can paste from a spreadsheet. So that's the functional job. The very first sentence, though, on all of our help articles, is really the desired outcome. Why do you want to do that? It's to increase your ease of working with content across documents. There's no feature, there's no technology mentioned there. You might say document is a technology, but I didn't want to say source because that's a little too abstract. But working with content across documents, that's what you're trying to get done. The spreadsheet is a feature. It's a function that helps you do that. And then we talk about the situation, when and why would you do that? We describe in steps the continuation of the functional job. And then we end with a little bit of emotion there, feeling control of your content. Impress your colleagues, the social job as well too. So this becomes a checklist for us to write help content article. It's not dogmatic. You can, you can, you know, you can go off of this beaten path if it doesn't make sense to do it. But we believe that we're speaking when somebody comes up to this article that this is their frame of mind, that they're trying to get something done and we're trying to speak to them in that way. We know you're trying to get something done and we're going to talk to you as if you are trying to get something done. And then finally, jobs to be done can help us redefine our value and reframe our market and our position and even what it means to be a competitor. Right? We have this notion of markets that are actually artificial boxes that we put ourselves into. We're in the, you know, the tax software market and we compare ourselves to other tax software. Right? But that's not what your customer's doing. Your customer's just trying to get a job done. So Scott Cook founded a company called Intuit in the United States, which is the largest tax software producer. They help you fill your taxes out once a year. And he, he's quoted as saying this, the greatest competitor in tax software was not the industry or other tax software offerings, it was the pencil. The pencil is a tough and resilient substitute. Sorry. Yet the entire industry had overlooked it. Right? So think about it from your perspective somebody trying to fill out taxes. Right? You got a lot of papers, you got a lot of numbers, screens, screen one, screen two, I got to carry a number over from screen one to screen two or do a side calculation. What are you going to do? What are you going to grab as a solution? What are you going to go for to get that job done? A pencil. Right? So he's, he's looking at the job to be done and looking at his market, not just developing a solution, but looking at his market through the eyes of the customer, saying we're tax software, we compete with a pencil. Right? There's a very good book by Alan Clement and the title of the book is When Coffee and Kale Compete. Right? Because what's the, what's the job of coffee in the morning? It's to give you energy. Right? But kale juice might give you energy as well too. So in that context, in, defined in that situation, the job to be done is get energy so coffee and kale compete. Tax software and pencils compete. But this line of thinking then lets you actually expand your market not by finding more customers doing the same thing or buying competitors, but by expanding by adding new jobs to what you cover and looking at how pencils and tax software can compete. So jobs to be done, it offers a practical lens. I think it's a lens, it's a way of seeing. Right? And it's a way of seeing that similar to things that are out there already, but it comes from the business community and I think we should be more involved within these conversations in our organizations. And it allows you to view to view various aspects of your organization. It can pervade the organization. It doesn't just have to be high level strategy like it's positioned in a lot of the business books. You can use jobs to be done thinking to help you organize your own research to design solutions to even write text and copy and things like that. But the overall effect I think is it helps us shift the view from the outside in looking at our industry and our company from the outside, from the inside out rather and be able to look at it from the outside in to see the market as customers and human beings see themselves. So quickly to summarize, you know, at the core of disruption and I think this is really cool at the core of disruption, this very important business theory is this notion of jobs to be done which is a very human very human focused notion. And I think it's relevant to designers and that we can apply it in practical ways. One quick quote before I end and this is kind of where the jobs to be done thinking comes from Theodore Levitt a famous business professor used to tell his students that people don't want to buy a quarter inch drill they want a quarter inch hole. So as manufacturers we're focused on our technology. We sell drills, buy our drill. I'll tell you about the specifications of my drill. The customer just wants a hole in their wall and there might be other ways to do that. But if we think about it from the customer's perspective it flips our view of how we create value discovering value, designing value, delivering value and redefining value. So thank you very much.


What is up everybody, Jason here for jaspyscasebrace.com. We just sold out this filler here that's giving away the last four teams in the quick hit football mixer guys, Pikachu number five, with this 2019 Prison of Football Hobby Pack number 83 random teams guys. So the way this works guys, we'll randomize the 32 names, teams, distribute the hits out of course, and then at the end we're going to randomize the original list and the top four names will match up with a team here from the Texans, Colts, Lions, and Titans. Like I said, the Texans and Colts were both $200 plus teams, Lions I think were $100, and Titans were $50, so pretty good teams in there guys, and then we'll give away those spots and then that'll unlock the four box mixer number five. Now as an added bonus, if it sold out tonight, the filler, we were going to give away 10 free filler spots, so instead of selling 32 spots we only sold 22. So we're going to do that giveaway right now first, pacing the 10 winners, and then we'll randomize the names and teams, and at the end we'll have the original list with the winners, and then we'll get that break sold out there. So let's roll it, and it is a 5 out of 6, 11 times, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Tristan, Tristan, Jeff, Jeff, Tristan, Tana, Tristan, and Nick. There you go, 11 times, 11, top 10. So we're going to have a little character sign there, 3, 4, 5, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 11, 11, Tristan, Tana, Tristan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Saints on the Vikings. Hi guys, no trading. Alright guys, let's do the pack filler. Is that gold? That looks gold. Whoa, gold. Lamar Miller gold. 6 out of 10 for Houston. Pretty sweet. Houston, going to Nick Anderson. Got a little gold prism. Alright, let's switch on over and now let's give away those four teams now guys. So here's the dice roll, here's the customer names with the original list. 1 to 5, 6 times. Here we go, 1, 2, 3, 4, 5, and 6. 6 times, 6, 6, dismissed out Tristan, but you are at number 4. You're at number 3, you're also number 2, and Tana at 1.  There you go, top 4 after 6 times. Alright, so obviously Tana, you got the Texans. Tristan, your free spot got you the Colts, and then your other full spots got you the Lions and Titans. So there you go guys, thank you guys so much. That was the randomizer there. Coming up next is the mixer.


Let's see why Dirac was justified in saying that while we have a mathematical basis for describing the whole of chemistry, in practice the equations are too complex to be solved. Consider the hydrogen molecule, H2. With one electron this is just the hydrogen molecule ion that we considered previously. The Schrodinger equation has three terms for the first electron, representing the kinetic energy and its attraction to each of the protons. The second electron also needs three corresponding terms. Finally, there's a term for the repulsion between the protons and a term for the repulsion between the electrons. Each potential energy term in the Schrodinger equation corresponds to a line in this figure. Now consider the oxygen molecule, O2. With one electron this is similar to the hydrogen molecule ion, except the nuclei have eight protons each. The electron's nuclear attraction terms therefore contain a factor of eight. As we add electrons, each has three corresponding terms. For all sixteen electrons we need forty-eight terms in the Schrodinger equation. We have a single nuclear repulsion term containing a factor of eight times eight equals sixty-four due to the eight protons in each nucleus. Finally, we need a large number of terms that represent repulsion between electrons. There are terms for electron one's repulsion of electron two, three, four, through sixteen. Then terms for electron two's repulsion of electron three, four, five, through sixteen. And so on until repulsion between every possible pair of electrons is represented. For n electrons, there are one-half n times n minus one such terms. For the oxygen molecule with sixteen electrons, this means 120 electron repulsion terms. Even for simple molecules, the number of terms in the Schrodinger equation appears overwhelming. It certainly did to those working in the field more than eighty years ago. But today we have access to massive levels of computing power. An equation with hundreds or thousands, even millions of terms, should not be an insurmountable challenge. Indeed the classical problem of sixteen mutually repulsing electrons moving around two nuclei without radiation is easy to solve numerically. The solution consists of the description of the x, y and z coordinates of each electron through time. So although we can't solve the so-called classical n-body problem with pencil and paper, it's straightforward to generate and visualize numerical solutions, even with large numbers of particles. Unfortunately the same statement cannot be made for the quantum mechanical version of the problem. In quantum mechanics, instead of an electron trajectories, we have to find an an electron wave function. For n equals one, as with the hydrogen atom or hydrogen molecule ion, this is a probability amplitude spread throughout all three-dimensional space. For two electrons, the wave function will depend on the coordinates of both electrons. It's tempting to think that this just means that we need a second wave function for the second electron. Given the probability that electron one is in a first location and electron two is at a second location, it's simply described by the product of a probability factor for electron one times a probability factor for electron two. However, this is true only if the two electrons move independently without interacting. Since electrons do interact, the wave function cannot have this simple factored form. Instead, if we take electron one to be at a particular point in space, there will be some wave function describing the probability amplitude distribution for electron two. If we take electron one to be at some other point in space, the wave function for electron two might be different, in fact it almost certainly will be. In general, for every location of electron one, there is a different probability amplitude distribution, or wave function, for electron two. This is much more complicated than simply finding a wave function for each electron. If we need m samples or parameters to specify a one electron wave function, then in general, we need m to the n samples or parameters to specify an n electron wave function. The complexity of the wave function grows exponentially with the number of electrons. If we're looking for exact solutions, this is a showstopper, even for numerical solutions with massive computing power. An n electron wave function has to provide a probability amplitude for every possible location of electron one, and for each of those locations, for every possible location of electron two, and for each of those combinations, for every possible location of electron three, and so on. An n electron wave function is not a function of the three coordinates of normal space, but a function of the three n coordinates of the electrons. The challenge this presents was summed up by Douglas Hartree as follows. The full specification of a single wave function of neutral iron, which has 26 electrons, is a function of 78 variables. It would be rather crude to restrict to 10 the number of values of each variable at which to tabulate this function, but even so, full tabulation of it would require 10 to the 78th power entries. How big a number is 10 to the 78th power? About a billion times the number of atoms in the Milky Way Galaxy. Vladimir Falk put it this way. Since the wave function sought depends on the great number of variables, namely, there are as many of them as there are degrees of freedom in the n electron system, the exact solution of this problem encounters insuperable difficulties, and consequently, one needs to resort to approximate methods. One of the most important approximation methods in quantum chemistry was presented in 1928 in a two-part paper titled, The Wave Mechanics of an Atom with a Non-Coulomb Central Field, Part 1, Theory and Methods, and Part 2, Some Results and Discussion. Here Douglas Hartree outlined the central field approximation. Applied to the Schrodinger equation, this produced the Hartree equation, which was solved using the method of the self-consistent field. Let's see how, even in a time when numerical calculations had to be performed by hand, Hartree was able to obtain impressively accurate approximations to the wave function of many electron atoms. The central field approximation greatly simplifies the description of electron interactions. In a neutral atom with Z protons, each electron is attracted to the nucleus. This force depends only on the electron's location, but the electron is also repulsed by each of the other electrons. These electron repulsions are complicated because they depend on the locations of both electrons. Hartree's idea was to treat electron repulsion in an average sense. We treat nuclear attraction normally, but we treat the other electrons as if they were spread throughout space as a cloud of electric charge. The density of this charge cloud at a point is proportional to the probability of the electron being at that point, as given by the wave function. If this density is spherically symmetric, then the force it exerts on an electron points radially away from the nucleus, the center of the atom. This is a so-called central field. If the density is not spherically symmetric, then we average the force over all angles to obtain a central field. We do this for all the other electrons to get a total force on the electron of interest and the corresponding total potential energy. The average force exerted by the jth electron at a distance r from the nucleus is an equivalent charge q sub j over r squared. This equivalent charge is simply the probability that electron j is inside a sphere of radius r. In Hartree's theory, this is represented as the sum of the square of a radial density function p sub j over radii from 0 to r. The energy and angular momentum of an electron moving in a central field is conserved. In the central field approximation, therefore, we can treat each electron as being in an orbital with definite energy and angular momentum. The Schrodinger equation for n electrons has a kinetic energy term for each electron, a nuclear attraction term for each electron, and repulsion terms for every pair of electrons, one-half n times n minus one in all. Hartree converted this to an equivalent single electron equation by, roughly speaking, the following steps. Suppose we want an equation for electron one. We assume the distribution of the n minus one other electrons remains frozen. This allows us to subtract the constant kinetic energies of those electrons from both sides of the equation, leading the kinetic energy term for only electron one. Likewise, we assume all but one of the nuclear attraction energies are constant, and subtract these from both sides. Finally, all electron repulsion terms that don't involve electron one are taken to be constant, and subtracted from both sides. This leaves the nuclear attraction term for electron one, and the repulsion term for electron one in each of the n minus one other electrons. The central field approximation converts these latter terms into equivalent potentials, which are combined with a nuclear attraction term to get a total potential for electron one. The n result is a single electron Schrodinger equation, with the energy being that required to bring this electron from rest at infinity into the orbital it occupies in the atom. Consider the assumption that the orbitals of the other electrons remain frozen.