Latest / The Pragmatic Engineer / Building Figma Slides with Noah Finer and Jonathan Kaufman
Transcript
- 0:00SPEAKER_0: And how does it look like to push something out to production?
- 0:03Something that's interesting that I haven't seen at my past jobs that we
- 0:06started doing recently for all of our unit tests and all of our interaction tests,
- 0:10we run the full suite with all the flags off and then with all the flags on.
- 0:15So the same tests are running in both premier and obviously within the test
- 0:20you can specify a different permutation.
- 0:22If you're writing a test that only covers something that requires that flag,
- 0:26obviously you need that flag to be on.
- 0:27Before we were doing this,
- 0:28this was a source of regressions where it's like this flag caused this to break,
- 0:33and I didn't know this until someone went to delete the flag and then that
- 0:37caused tests to fail.
- 0:38SPEAKER_1: So now that we're doing this, it's pretty awesome.
- 0:41FPA created a new product called Figma Slides in less than a year from Idea to
- 0:44launching an in beta in April,
- 0:412024.
- 0:47Since then,
- 0:47users have created more than 4.5 million slide decks,
- 0:50and the product is quickly gaining momentum.
- 0:52SPEAKER_0: But how was it built?
- 0:54I sat down with two engineers who worked on this project from the start,
- 0:57Jonathan Kaufman and Noah Finer.
- 0:59In today's conversation,
- 1:00we cover how Figma slide is built using TypeScript React and a lot of c plus
- 1:05plus code while building a seemingly simple ui.
- 1:08SPEAKER_0: The single slide view is a lot more complicated than it seems.
- 1:12Engineering approaches at Figma,
- 1:13including the NCR process,
- 1:15using a feature flags and running all unit tests twice,
- 1:18once with all the feature flags turned off,
- 1:19and then once with all turned on,
- 1:21and a lot more if you're interested in a behind the scenes look of how the
- 1:25engineering team at FMA does things differently,
- 1:27sometimes by choice,
- 1:28sometimes by necessity.
- 1:30SPEAKER_0: Then this episode is for you.
- 1:31If you enjoy the show,
- 1:32please subscribe to the podcast on any podcast platform and on YouTube.
- 1:36SPEAKER_0: John and Noah, it's great to have you on the podcast.
- 1:39SPEAKER_1: Yeah, happy to be here.
- 1:40SPEAKER_1: Also excited to be here.
- 1:42SPEAKER_0: So how did you start building?
- 1:44SPEAKER_0: What kind of tech stack did you use back then?
- 1:46SPEAKER_0: Did you just have a few scratches?
- 1:50SPEAKER_0: It sounds like a really exciting part of the project, right?
- 1:53SPEAKER_0: And actually it can make or
- 1:56SPEAKER_1: Break a project.
- 1:57So everything about the slide grade and those things were built just sort of
- 2:03on a branch and we kind of hack week style where we wouldn't emerge this to our
- 2:08main branch yet.
- 2:11Would you mind just sharing how Figma slides looks and what the parts are that
- 2:15you're talking about?
- 2:16SPEAKER_0: For example, the slide deck and the grid.
- 2:19SPEAKER_1: So this is Figma slides.
- 2:20When you enter slides,
- 2:23you're presented with what we refer to as single slide view.
- 2:27And this is what people are very familiar with seeing in Google Slides and
- 2:32PowerPoint and Keynote where you have this carousel on the left and you can go
- 2:38through the slides.
- 2:40But what we noticed is that when designers were building slides within Figma design,
- 2:46they would always lay everything out using our infinite canvas.
- 2:52SPEAKER_1: So this is what we refer to as grid view.
- 2:57There were a bunch of annoyances building a deck like this in Figma design,
- 3:03and part of it is if you have all these top level frames on a canvas,
- 3:08if you want to reorder them,
- 3:10they don't just reorder,
- 3:10right?
- 3:11SPEAKER_0: Yeah.
- 3:13So one of the first things that we built was exploring how can we give better
- 3:20reorder behaviors for people who want to build slides and see slides in this way.
- 3:26SPEAKER_1: So as you drag things around, they reorder, you can reorder a whole row.
- 3:34And what was interesting is if you go back to single slide view,
- 3:38those rows correspond to the sections here.
- 3:42So each of these sections are the rows in grid view,
- 3:48and so is this nice one-to-one relationship.
- 3:51SPEAKER_1: And so what this allows
- 3:52SPEAKER_0: Is, hold on just a question.
- 3:55SPEAKER_0: So what about the columns?
- 3:56SPEAKER_0: Is that
- 3:58SPEAKER_1: Yeah, yeah.
- 3:59SPEAKER_1: So see how this Brendan slide is the second slide.
- 4:04If I make that third and then go back to grid,
- 4:06you'll see that this is now in this position.
- 4:08SPEAKER_0: Got it.
- 4:09If I reorder this whole row and then go back to single slide view,
- 4:14that whole row is now second,
- 4:16right?
- 4:17And so what this allows is people who are more familiar and comfortable with
- 4:23the infinite canvas,
- 4:24they can live in grid mode where they're happy.
- 4:28But people who may be less familiar or don't want that view,
- 4:33they can stay in this view on the same file.
- 4:36This episode was brought to you by graphite,
- 4:38the developer productivity platform that helps developers create,
- 4:41review and merge.
- 4:42SPEAKER_0: Smaller code changes stay unblocked and shift faster.
- 4:46SPEAKER_0: Code review is a huge time sink for engineering teams.
- 4:49Most developers spend about a day per week or more reviewing code or blocked
- 4:53waiting for a review.
- 4:55SPEAKER_0: It doesn't have to be this way.
- 4:56Graphite brings Stack Port requests the workflow at the heart of the best in
- 5:00class internal code review tools like companies like Meta and Google to
- 5:03every solver company on GitHub.
- 5:06Graphite also leverages high signal code base aware AI to give the
- 5:09developer's immediate actionable feedback on their pull requests,
- 5:12allowing teams to cut down on review cycles,
- 5:16tens of thousands of developers at top,
- 5:17companies like Asana,
- 5:19ramp Tecton and versa rely on graphite every day.
- 5:22Start stacking with graphite today for free and reduce your time to merge
- 5:26from days to hours.
- 5:27SPEAKER_0: Get started at GT dev slash pragmatic.
- 5:30SPEAKER_0: That is G for graphite, T for technology dev slash pragmatic.
- 5:35SPEAKER_0: This episode is brought to you by Sonar.
- 5:37The creators of Sonar Cube server cloud ID and Community Build Sonar will now
- 5:42offer Sonar Cube advanced security delivering the first fully integrated
- 5:45solution for developers to find and fix code quality and code security issues.
- 5:49In the development phase of the software development lifecycle,
- 5:52SonarCube advanced security enhances sonars core security capabilities
- 5:55with software composition analysis and advanced static application
- 5:59security testing.
- 6:00This enables developers to identify vulnerabilities in third party dependencies,
- 6:04ensure license compliance and generate software bill of materials.
- 6:08Sonar analyzes all code first party AI generated and third party open source
- 6:12resulting in more secure,
- 6:14reliable and maintainable software.
- 6:16Joined over several million developers from organizations like Microsoft,
- 6:20DOD,
- 6:20Barclays and T-Mobile who use sonar prioritize code security and code
- 6:25quality issues at the beginning of the software development lifecycle.
- 6:29SPEAKER_0: Visit sonar source.com/pragmatic security to learn more about Sonar Cube.
- 6:33SPEAKER_0: And then so when you started, it was just a very small team.
- 6:36So one of the first things was coming up with this kind of two-way navigation
- 6:40that would make it unique.
- 6:42I haven't really seen this going from an infinite grid view to the single
- 6:48society we're familiar with,
- 6:50butwasthisoneofthechallengestobuildtheroughprototypeof
- 6:55This became a later challenge,
- 6:58but what's interesting is we actually didn't build single slide view until
- 7:02six or seven months into the project for the first,
- 7:06while slides was exclusively in the grid view.
- 7:10SPEAKER_1: And what we built out was how are you going to manipulate slides here?
- 7:15SPEAKER_1: What's the template system going to look like when you add a slide?
- 7:21SPEAKER_1: How can we pull from an existing deck?
- 7:25SPEAKER_1: What's the theme system going to be?
- 7:28Choosing colors within a theme and then editing the whole theme of a deck.
- 7:32SPEAKER_1: And then lastly, what is the presentation going to be like?
- 7:35Those are the key areas of initial exploration,
- 7:39whereas a single slide view,
- 7:42we felt more confident that we could build.
- 7:44And because of that confidence,
- 7:46we didn't want to prototype it too early where we just wanted to focus on the
- 7:51riskier bits.
- 7:52Yeah,
- 7:52actually I came on around the time that a single slide view was being built,
- 7:56and I remember the first draft of single slide view was something that John
- 8:00cranked out in I think just a couple days.
- 8:03It was just boxes on the left side,
- 8:06and then if you zoomed into a slide or something,
- 8:08it teleported you into single slide view and just showed the left side.
- 8:12SPEAKER_2: And then if you zoomed out, it went away.
- 8:15And a lot of when I first got on was prototyping like,
- 8:19Ooh,
- 8:20how will single slide view work?
- 8:22Are we going to try to make it based on how zoomed in or zoomed out you are of the grid?
- 8:27Or do we want to have buttons and keyboard shortcuts and all this other stuff?
- 8:32And there's a lot still to figure out about what is single side view and how do
- 8:37we make it work.
- 8:38And what we kind of landed on is secretly in this view in single side view,
- 8:44we have zoomed into the canvas and yeah,
- 8:49we've zoomed into the grid,
- 8:50we've hid everything except for just the slide itself.
- 8:53SPEAKER_0: Oh, really?
- 8:54SPEAKER_2: Show some on the left and the right.
- 8:56So yeah,
- 8:57there was a lot of iteration back then to figure out what are we even doing with this.
- 9:03Yeah,
- 9:04it's one of the interesting parts about building on Figma like infinite canvas,
- 9:09right,
- 9:09is because we wanted to preserve the grid view and allow people to still edit
- 9:14in grid view and have their cursors show up as they're editing.
- 9:18If someone's in single slide view,
- 9:20what that means is that the slides are still represented in this two
- 9:24dimensional space.
- 9:26And so all single slide view is,
- 9:28as you toggle through this slides,
- 9:29we just snap the view port for you.
- 9:34SPEAKER_0: That is clever.
- 9:35And just taking a step back just to understand how the project roughly went.
- 9:41So you had the early prototyping phase,
- 9:43you then had those one or two months building a proof of concept,
- 9:49and then what were the phases and what parts did you build until we get to final
- 9:55general availability?
- 9:57SPEAKER_2: Yeah.
- 9:57I think when it was sort of John and just one or two other engineers before the
- 10:03team was fully staffed,
- 10:03there's a lot of focus on the grid view and how are we going to lay out slides in
- 10:09the grid.
- 10:11Then after the team started getting staffed a little bit more,
- 10:13then there were more explorations around how do we lay out things on a slide?
- 10:18And we actually went through a lot of iterations there of do we want to do
- 10:22constrained layouts where users,
- 10:25everything is auto layout and users can add something to the left,
- 10:29add something to the right and stuff like that,
- 10:31or do you want to do something a little bit more freeform?
- 10:35We also did a lot of work on single slide view,
- 10:38nailing,
- 10:39centering the slide in single slide view versus not.
- 10:41That took months of working with designers and sending over prototypes in
- 10:47order to figure out.
- 10:50SPEAKER_2: We also had a big group working on presenting and presenter view.
- 10:56Speaker notes took a,
- 10:58that was one of the first things we wanted to add,
- 11:01and also themes and working to create a system of colors that both come from
- 11:11the template you're using,
- 11:12but also allow you to edit on top of it,
- 11:14which is a whole new concept in Figma world.
- 11:16SPEAKER_2: So those all sort of happened coming up to beta.
- 11:21I think we had the only way to do an end-to-end flow of using a template and
- 11:29presenting it.
- 11:30I think that took until,
- 11:31I dunno if you remember John,
- 11:33but maybe December,
- 11:34January or so.
- 11:35SPEAKER_2: Yeah,
- 11:36SPEAKER_1: It sounds,
- 11:38SPEAKER_2: Yeah.
- 11:38SPEAKER_2: And then is it 2023?
- 11:41SPEAKER_1: Yes.
- 11:41SPEAKER_1: Because we launched in 2024.
- 11:42SPEAKER_1: Yes.
- 11:44SPEAKER_2: Yeah.
- 11:45So 20,
- 11:4524 January,
- 11:46and then it was just a matter of iterating and it was just like we were cranking
- 11:52through bugs for two months going up to config,
- 11:54and that was wild.
- 11:57I remember we had 300 or so P zeros and so many that we added a new stage of P zeros
- 12:05of a P zero,
- 12:06do this now.
- 12:08SPEAKER_0: And then how big was the team in terms of engineers?
- 12:10SPEAKER_0: Designers, roughly?
- 12:13SPEAKER_1: I think at its biggest, we had between 10 and 12 engineers.
- 12:20I want to say two designers and a dedicated person from research and a
- 12:28dedicated someone from UX writing.
- 12:32SPEAKER_0: But you don't have any dedicated testers or QA folks, right?
- 12:36SPEAKER_0: It's engineers doing the testing and testing everything, correct?
- 12:39SPEAKER_0: Yeah.
- 12:42SPEAKER_0: You have the dedicated research person though.
- 12:44SPEAKER_0: Tell me about that.
- 12:46SPEAKER_1: Yeah, it was pretty instrumental in finding the direction of slides.
- 12:52A lot of what we explored is very similar to Fig Jam where it's like we're
- 12:59building for both a non-designer audience and a designer audience.
- 13:04So a lot of what we did was building out prototypes and then putting it in front
- 13:08of both designers and non-designers and seeing what resonated and then
- 13:15using that to better form our POV on direction.
- 13:21Yeah,
- 13:21I think one of the coolest tools that we have internally are these front end
- 13:25commit previews where if you push up a branch,
- 13:31if you push up or make a pull request that's automatically deployed and you
- 13:35can send a link to other people internally to test that out.
- 13:39So a really cool thing we were doing for these user research interviews was
- 13:43making prototypes and then making prototypes internally with
- 13:47non-production code and then shooting those over to research.
- 13:53And then they were chatting with some folks internally and we had them use
- 13:57these prototypes.
- 13:58So basically you just created a poll request with whatever data and then
- 14:03whatever was on your machine,
- 14:04the researchers could show,
- 14:05right?
- 14:07SPEAKER_2: Yeah.
- 14:09SPEAKER_0: Nice.
- 14:09SPEAKER_0: And what is the tech stack behind all of this behind taking the slides?
- 14:14SPEAKER_1: So slides is the same stack as Figma design and Fig Jam.
- 14:19So everything that's in the canvas is rendered using what we refer to as full screen,
- 14:26which is our c plus plus codebase and renderer.
- 14:30And then what that does is it writes to a literal canvas element in the DOM
- 14:38using either WebGL or web GPU,
- 14:41depending on browser support.
- 14:43So that's a lot of our main stack that we work in when building out the UI is in c
- 14:49plus plus everything that's on top of the canvas.
- 14:54So like this left panel,
- 14:56the properties panel,
- 14:57this tool belt,
- 14:59all the file menus,
- 15:01these are all in TypeScript and React.
- 15:04And then we have our own bindings layer that allows us to share state between
- 15:10what's in c plus plus and what's in web.
- 15:15I think reaction types is pretty straightforward,
- 15:17but do you also need to go into c plus plus to do some kind of UI changes or create
- 15:23new core elements,
- 15:25those kinds of things.
- 15:26SPEAKER_0: I feel like
- 15:27All of the teams that work on our editors are either 50 50 or going to be more c
- 15:36plus plus.
- 15:38SPEAKER_0: That's not a conventional UI technology.
- 15:43Did you pick up c plus plus on the go after you joined Figma or did you do it before?
- 15:50There are some people who come in as c plus plus experts,
- 15:54and then there's other people who come in as more web experts.
- 15:59SPEAKER_1: I am one of the people who did not know c plus plus before starting here.
- 16:04SPEAKER_2: I also did not know c plus plus before.
- 16:06Well,
- 16:07I worked with c plus plus a lot in college for operating systems or all these
- 16:12other things,
- 16:13but how you'd use c plus plus for a college project or other things is very
- 16:18different from how we use it at Figma.
- 16:21I feel like Figma is almost designed a game engine almost,
- 16:24but the Figma code base is just,
- 16:29it takes some time to learn how to navigate it and how to find things around it
- 16:34and how to develop for it.
- 16:36So I think there's a learning curve for everybody,
- 16:38but it's a very approachable learning curve.
- 16:40But a really cool thing Figma is doing is they're trying to rewrite parts of
- 16:44the full screen c plus plus code base to actually be in TypeScript.
- 16:50SPEAKER_2: So it's like TypeScript chatting with our c plus plus code base
- 16:55SPEAKER_0: Bindings, right,
- 16:56SPEAKER_2: With this bindings layer, which is really cool.
- 16:59SPEAKER_2: So one example of those is all the little blue lines.
- 17:05If I'm hanging out in grid view,
- 17:08all of these plus buttons and these guys are rendered on the canvas,
- 17:14but they're using,
- 17:16they're written in TypeScript,
- 17:20and then that type script is interacting with the canvas,
- 17:24which is of course being rendered by TypeScript and React.
- 17:30And then one interesting thing that you previously mentioned is that Figma
- 17:34has this pretty cool tool c plus plus web assembly editor to help debug
- 17:39TypeScript as you're building it.
- 17:41SPEAKER_0: What is this tool?
- 17:42SPEAKER_0: And this sounds very, very unique to Figma.
- 17:46There's this Chrome extension called dwarf debugging that we've installed,
- 17:52and what's really crazy is you can debug c plus plus inside of Chrome itself
- 18:01inside of just the inspector panel.
- 18:04And sometimes if I have to figure out a gnarly,
- 18:07gnarly bug between our carousel,
- 18:10which is written in TypeScript and how that's chatting with the editor,
- 18:14which is written inside of c plus plus,
- 18:16I can debug both our web assembly bundle as well as React at the same time,
- 18:22which is really cool,
- 18:23being able to set break points between the two.
- 18:26SPEAKER_0: And this is custom tooling obviously that you built, right?
- 18:30SPEAKER_1: No, no, no.
- 18:32SPEAKER_1: It's like a part of chromium.
- 18:34Oh,
- 18:35so chromium supports debugging custom c plus plus web assembly libraries?
- 18:43SPEAKER_1: Yeah.
- 18:43SPEAKER_1: Yeah.
- 18:43The mental model is very similar to if you're using Compiled or Transpile
- 18:48JavaScript and source maps.
- 18:50SPEAKER_1: It's the analogous mental model.
- 18:53SPEAKER_1: You can make a special web assembly.
- 18:57It's maybe underwhelming to show,
- 18:59which is I think what makes it really cool.
- 19:02So here I just have,
- 19:04you'll notice I have a TypeScript file next to a c plus plus file.
- 19:10SPEAKER_0: Oh,
- 19:11SPEAKER_1: Okay.
- 19:11And then obviously you need to have a debug build for this to work,
- 19:14right?
- 19:15SPEAKER_1: Yeah.
- 19:16So there's a special type of build that you can build that generates dwarf symbols,
- 19:21and then the Chrome extension can consume those symbols and map it to source
- 19:28files on your computer.
- 19:31SPEAKER_1: That is so cool.
- 19:33SPEAKER_1: And things like break points work.
- 19:36Not a hundred percent of things work,
- 19:39but you can inspect different objects and read values of primitive things
- 19:45For sure.
- 19:48I worked with back a very long time ago when I worked on Skype for Xbox One,
- 19:55we had H TM L on JavaScript for whatever reason,
- 19:58and CVOs plus there was a c plus plus bridge,
- 20:01and it was the only way we could debug the c plus plus code is send it over to the
- 20:06Java script,
- 20:07do debug logs,
- 20:08and what I would've not given to have this tooling.
- 20:12SPEAKER_1: Yeah, it's super cool.
- 20:13Yeah,
- 20:14I think before this was supported,
- 20:16it was before I joined Figma,
- 20:19so this has been around for a few years at least.
- 20:23People would build,
- 20:26we have a build that you can run within Xcode that launches Figma,
- 20:32and then you can use Xcode to debug the c plus plus.
- 20:35SPEAKER_1: But now I think most engineers here are using
- 20:41SPEAKER_0: This.
- 20:42Yeah,
- 20:43I think it just comes to show that even when you have a more unique tech stack,
- 20:46it's very how some of these things are standards and they exist,
- 20:49you just need to find them.
- 20:50As you said,
- 20:51I kind of assume that you must've built it yourself,
- 20:53but No,
- 20:54it's a universal Chrome plugin.
- 20:59SPEAKER_2: Yeah.
- 21:00One really cool example of how I used the debugger was there was one time where
- 21:04we had this variable that was getting set inside of our web code base.
- 21:09It was like a configuration variable between are you in UI two or are you in UI three?
- 21:16And we were seeing this really weird bug where you were both in the carousel
- 21:22and the grid at the same time,
- 21:23and we were like,
- 21:24whoa,
- 21:24what's going on?
- 21:25SPEAKER_2: Why can't we repro this?
- 21:27And after a good bit of investigation and using this debugger very
- 21:32specifically to see when some initialization code that set you in the editor
- 21:38to be in grid view or single slide view,
- 21:41I put a break point there,
- 21:42and then I put a break point on this code that was like,
- 21:45are you in UI two or are you in UI three,
- 21:48which is being set in web.
- 21:49And I was able to see we were having a crazy race condition going on,
- 21:54and the only way I could have done that was with this was and debugger.
- 21:58Yeah,
- 21:58now you could debug the two code bases running parallel pretty much.
- 22:02SPEAKER_0: That's awesome.
- 22:04SPEAKER_0: And so what were some unique challenges of building slides?
- 22:10Figma slides compared things that you don't really come across on other projects.
- 22:15I'm assuming you built a bunch of web projects,
- 22:17there's a bunch of usual suspects from UI layouts to build.
- 22:23SPEAKER_0: How are we going to build or what linting are we going to use?
- 22:25But this didn't seem,
- 22:27it sounds like it's not your typical project,
- 22:29this one.
- 22:31SPEAKER_1: Yeah.
- 22:31I think one of the main challenges really was something that we've already
- 22:35touched upon,
- 22:36which was how we built single slide view to be literally just moving the viewport.
- 22:42If you were to build a slides product from scratch,
- 22:46I don't think that's the way that you would approach it where you're like,
- 22:49okay,
- 22:49well what if we had an infinite canvas and slides had XY coordinates on the
- 22:54canvas and then we can zoom in.
- 22:59So that was a unique set of challenges,
- 23:03but what's really cool,
- 23:04not only that it works,
- 23:06but that it allows all of our existing tooling around multiplayer cursors
- 23:14and things like that to kind of just work.
- 23:18SPEAKER_0: And what is multiplayer cursor for those not familiar with Figma lingo?
- 23:23Yeah,
- 23:23so multiplayer cursors are when someone else is editing the same thing,
- 23:27you can see exactly what they are editing.
- 23:31So if Noah makes a selection,
- 23:34we can see that Noah has that node selected.
- 23:38And this works regardless of if I'm in single slide view or if I'm in grid view.
- 23:43SPEAKER_0: And then behind the scenes, how does multiplayer work?
- 23:49There must be some sort of TCP connection open and it must be talking to a server.
- 23:55SPEAKER_0: Is it happening on a server or is it peer to peer?
- 24:00SPEAKER_1: It is happening on a server.
- 24:01SPEAKER_1: Yeah, I could do my best to answer it.
- 24:04Our co-founder,
- 24:06Evan,
- 24:06wrote a great blog post on the Figma engineering blog about multiplayer and
- 24:12definitely much more of a subject matter expert than I am.
- 24:16But at a top level,
- 24:18we have a Russ service running that all edits propagate through and it
- 24:26handles conflict resolution and sends things back down.
- 24:30SPEAKER_1: Each client maintains a web socket connection with it,
- 24:34SPEAKER_0: And basically it's in this library.
- 24:35SPEAKER_0: So as long as you use this c plus plus library, it's built in.
- 24:39So I guess,
- 24:39was this one of the reasons you decided to,
- 24:41all right,
- 24:42let's hack around it,
- 24:44zoom in,
- 24:44keep
- 24:45SPEAKER_1: Using it.
- 24:45Yeah,
- 24:46a lot of it's multiplayer,
- 24:48but I think more broadly,
- 24:50a lot of it's just building on the Figma platform.
- 24:54You can copy anything from Figma Design and paste it into slides and it'll
- 24:58just work.
- 24:59And same with going the other way,
- 25:02and that is really important to us as we're building these new products,
- 25:08like copy paste works between Fig Jam and Design.
- 25:11SPEAKER_1: It works between design and slides.
- 25:13And so now there's this nice,
- 25:16it doesn't matter which editor you start in,
- 25:18you have access to the same things that you created in any of the other files.
- 25:25SPEAKER_1: And that's sort of a second area of complication is we call this interop.
- 25:32But what that means is that Fig Jam has a bunch of node types that were made
- 25:37specific to Fig Jam,
- 25:38like stickies,
- 25:40for example.
- 25:42But because we want interop to feel so seamless,
- 25:45what this means is that if you add a new node type to a specific editor,
- 25:50it has to work everywhere.
- 25:51It would be a little bit of a bummer if you went to copy a sticky and it didn't.
- 25:59And so this ability to bring things between products is really cool for our users,
- 26:08but definitely adds complexity to the code.
- 26:11SPEAKER_0: And as a dev, what does this mean for you to support stickies?
- 26:16I'm assuming there must be some data types somewhere of all the things supported,
- 26:20and then you need to figure out how to visualize it or how to draw it or how it maps.
- 26:26How can we imagine,
- 26:28I feel this is interop is something that most of us don't need to worry about
- 26:34until you do.
- 26:36SPEAKER_1: Yeah, there's something, there's an irony.
- 26:40I feel like as other companies become companies,
- 26:44you kind of do your best to separate the products more,
- 26:49but what we really lean into is the opposite.
- 26:52So with each new product,
- 26:54we really want things to be seamless as far as what the code looks like.
- 27:00A lot of what's in the full screen code base,
- 27:03which is our c plus plus code base,
- 27:06is the same code running regardless of which editor that you're in.
- 27:12SPEAKER_1: A lot of the differences are in the website.
- 27:15So we have a different root react tree for each editor,
- 27:19and that's how things are very visually different.
- 27:23But the code running,
- 27:25the what powers that main canvas is the same wasm bundle for each of the editors.
- 27:32SPEAKER_1: Then of course, there are differences.
- 27:34And so differences are sometimes expressed in a concept that we call mouse behaviors.
- 27:41And so mouse behaviors are,
- 27:45it's sometimes hard not to use the word in a definition.
- 27:48SPEAKER_1: They're the behaviors that run for the mouse.
- 27:52SPEAKER_1: So I'm dragging what happens.
- 27:55And so a lot of what happens in Fig Jam or we like to snap things to different
- 28:03pixel grid so that things like lock in more versus design is more freeform.
- 28:08So for things like that,
- 28:10we can check which editor that you're in and respond accordingly.
- 28:17One example of a different mouse behavior that we have inside of Figma design,
- 28:21if I were to try to drag some things inside of an auto layout container,
- 28:27we have this behavior over here where they'll shuffle around in real time.
- 28:33SPEAKER_2: But if I were to jump into a slides file, let me go share my slides tab.
- 28:39SPEAKER_2: We have our own unique behavior for handling this drag.
- 28:45SPEAKER_2: We have our little previews over here.
- 28:48SPEAKER_2: We have the ability to add new rows down here.
- 28:52SPEAKER_2: All of this is done via our own slide.
- 28:55SPEAKER_2: Specific mouse behaviors?
- 28:58SPEAKER_2: Yeah.
- 28:59SPEAKER_1: Okay.
- 28:59So each editor type can register a unique set of mouse behaviors is how a lot of
- 29:06differences are expressed.
- 29:09This is pretty interesting,
- 29:10and it sounds just very unique to Figma,
- 29:15but I guess if we're to peak in the internals of any company that has a big
- 29:21product that has evolved,
- 29:23we'll probably see something,
- 29:25might see something similar.
- 29:26SPEAKER_0: But this is just fascinating on how
- 29:28SPEAKER_1: Things
- 29:29SPEAKER_0: Become really kind of unique for a good reason and homegrown.
- 29:33This goes back to Noah mentioned that a lot of the Figma code looks like a game engine.
- 29:40I think that mass behavior concept is taken from how a lot of game engines run.
- 29:47SPEAKER_1: So there's a priority list of mass behaviors.
- 29:51SPEAKER_1: If one of them accepts the event, it doesn't go to the next one.
- 29:57So it's like our own sort of delegation pattern that often the browser would
- 30:03handle for you,
- 30:04but because they're running in c plus plus,
- 30:06it'sallwrittenfromscratch
- 30:08SPEAKER_0: And you do have a bit more freedom.
- 30:12I was just recently talking with,
- 30:14well,
- 30:14my brother,
- 30:15the founder of Crap Docs,
- 30:16who decided to build their own ui,
- 30:19not using the system ui.
- 30:20And I mean,
- 30:20it's a lot more work,
- 30:21but then you get a bunch of freedom to do whatever you want to do in terms of animation,
- 30:25what the system might not be able to do or the system element might limit you.
- 30:30SPEAKER_1: Yeah, yeah, for sure.
- 30:31It's one of those with great power comes great responsibility things,
- 30:35because something that we do is we render text ourselves.
- 30:41So we have code that looks at the font and it computes the geometry of the glyphs,
- 30:46and then based on that geometry renders at the pixels.
- 30:51And this is great because it guarantees that regardless of what browser
- 30:55you're using,
- 30:57what OS you're using.
- 30:59If you're looking at a Figma file,
- 31:01we can guarantee that it'll look the same,
- 31:03which is very important when you're making a design tool.
- 31:08SPEAKER_1: But that means that there's a lot that we don't get for free.
- 31:11So we built and launched,
- 31:14I think last year or the year before,
- 31:17spellcheck just the red squiggly that tells you that something is misspelled.
- 31:23And that was a huge undertaking,
- 31:24or we added support for bi-directional fonts,
- 31:28and that was all we had to add it because we couldn't lean on the browser.
- 31:34SPEAKER_0: Hey, developers, we've all been there.
- 31:36It's 3:00 AM and your phone blares jolting you awake,
- 31:40another alert,
- 31:42you scramble to troubleshoot,
- 31:43but the complexity of your microservices environment makes it nearly
- 31:46impossible to pinpoint the problem quickly.
- 31:50That's why Chronosphere is on a mission to help you take back control with
- 31:53differential diagnosis,
- 31:55a new distributed tracing feature that takes the guesswork out of
- 31:58troubleshooting with just one click DDX automatically analyzes all spans
- 32:03eye dimensions related to a service pinpointing the most likely cause of the issue.
- 32:08Don't let troubleshooting drag you into early hours of the morning just DD
- 32:12exit and resolve issues faster.
- 32:14See why chronosphere was named a leader in the 2024 Garner magic quadrant for
- 32:18observability platforms at chronosphere.io/pragmatic.
- 32:23SPEAKER_0: That is chronosphere.io/pragmatic.
- 32:29SPEAKER_0: It is interesting.
- 32:29Now,
- 32:29I remember just one everyday thing that people might come across is just a PDF
- 32:34file is when you open it,
- 32:37it's for editing with anything really.
- 32:40And then you need to have your fonts and those fonts needs to be installed at
- 32:43the always level,
- 32:44and if they're not,
- 32:45you're out of luck and it'll look something weirdly.
- 32:47SPEAKER_0: Different trade-offs everywhere.
- 32:50SPEAKER_1: Yeah, yeah, yeah, for sure.
- 32:52SPEAKER_0: And what are type of things were tricky about this project?
- 32:57Yeah,
- 32:58I could chat a little bit about how single slide view had some really
- 33:01interesting challenges.
- 33:02SPEAKER_0: Oh, I'd love that.
- 33:03SPEAKER_0: This is something I don't think most people would assume.
- 33:07SPEAKER_2: Yeah.
- 33:08SPEAKER_0: How hard could it be?
- 33:11And actually you said earlier,
- 33:12right,
- 33:13that,
- 33:13oh,
- 33:13we knew this would be pretty simple.
- 33:15SPEAKER_0: That's why we left it for later
- 33:18SPEAKER_2: By simple.
- 33:19SPEAKER_2: It's very relative.
- 33:22But yeah,
- 33:22single slide views in this really interesting spot where collapsed state
- 33:29collapsing slides and expanding them.
- 33:31SPEAKER_2: We don't want to save that to your file at all.
- 33:35We'd want to save stuff like the order of slides in the grid to the file,
- 33:39but we don't want to save stuff like are these collapsed or not to the file?
- 33:43So in order to render this carousel over here,
- 33:48we've got a bunch of state that lives inside of web and then a bunch of state
- 33:52that lives inside of the editor inside of full screen,
- 33:56and we got to have a bunch of complicated codes to coalesce those in order to
- 34:01figure out what to render here.
- 34:04On top of that,
- 34:05there's a ton of crazy technical challenges to solve in terms of dragging
- 34:09slides around and making sure that if I were to drag these three slides,
- 34:18which right now they're their own row in the slide grid,
- 34:21if I want to drag this slide out and then move it into this row,
- 34:28we got to make sure this row is still preserved up there.
- 34:32But if I were to drag this entire row and make it sort of a child,
- 34:36we got to delete that first row and then combine this row together.
- 34:40So there's a lot of really interesting algorithm stuff to coalesce sort of
- 34:46changes from the carousel inside of web as well as other users dragging stuff
- 34:53around inside of full screen,
- 34:55maybe across multiple rows or something,
- 34:57and combine those two together in a way that feels safe for multiplayer.
- 35:03SPEAKER_2: So yeah.
- 35:05SPEAKER_1: Yeah, this is a good thing to,
- 35:08SPEAKER_2: Yeah.
- 35:08SPEAKER_2: Yeah.
- 35:10So this intersection of editing and multiplayer is a really interesting
- 35:16part of the Figma stack.
- 35:18SPEAKER_1: Everything is multiplayer first.
- 35:20SPEAKER_1: For things to be local, you have to opt out of it being sent.
- 35:24But what's interesting about reordering stuff in single slide view is we do,
- 35:31there's a bunch of operations that you can do that can move a lot of slides at once,
- 35:38but because we want it to be multiplayer friendly,
- 35:41there's a lot of work under or behind the scene under the hood that's
- 35:47happening to perform the minimum number of mutations possible because the
- 35:52more mutations that you do,
- 35:55the less multiplayer friendly something is more likely it load if you're
- 36:01picturing the slide grid.
- 36:03And if we move the bottom road to the top in a naive way,
- 36:11when you do that mutation,
- 36:14you're changing every single slide's XY coordinate,
- 36:16right?
- 36:17SPEAKER_0: Well, that's the most obvious thing to do, right?
- 36:20SPEAKER_1: And that's how slides worked for a while.
- 36:24But then how we ended up solving this is our ethos was to do the minimum number
- 36:30of mutations,
- 36:32ideally the number of mutations or the number of slides that you drag.
- 36:38And the way that we achieve this under the hood is actually using the auto
- 36:45layout nodes within Figma design.
- 36:49SPEAKER_1: So what I mean by that is each row is in its own node.
- 36:55SPEAKER_1: We call it the slide row node.
- 36:57SPEAKER_1: And then each of those nodes is within a slide grid node.
- 37:04SPEAKER_1: So each slide is now two levels deep.
- 37:08We have an existing construct called parent index,
- 37:10which was made for reordering stuff within frames and reordering stuff
- 37:15within auto layout.
- 37:18And what a parent index is,
- 37:20is it's a UCT that has a reference to the parent's ID as well as an index
- 37:27represented as a float from zero to one.
- 37:30And so by doing it this way,
- 37:32if you reorder just one thing,
- 37:34for example,
- 37:36you only have one mutation,
- 37:39so I change something from the beginning to the end,
- 37:41only that thing's parent index has to change,
- 37:44and then each client is responsible for recomputing the layout.
- 37:49SPEAKER_1: Just to move things around
- 37:50Here,
- 37:50just so I understand that the goal is that you send the mutation to the server
- 37:54saying Here's what changed,
- 37:55and then that server sends it to all the clients and then all the clients
- 37:58execute it as well.
- 38:00And so there's probably low risk that everyone's going to be mass reordering
- 38:05slidesatthesame
- 38:06SPEAKER_0: Time,
- 38:06SPEAKER_1: But there is a higher risk of people lose internet connection.
- 38:10And so what we do is if you're offline and you do a bunch of edits,
- 38:14then when you come back online,
- 38:15there's a lot of resolution that needs to happen.
- 38:19SPEAKER_1: So doing this minimum number of mutations is the goal.
- 38:23SPEAKER_1: So everything's two levels deep.
- 38:25SPEAKER_1: They're all using parent index.
- 38:27And then we wrote code that I imagine looks kind of similar to the react reconciler,
- 38:32where we're like,
- 38:33okay,
- 38:34we have the beginning state of the drag and we have the end state of the drag.
- 38:39SPEAKER_1: What's the minimum number of mutations to get from A to B?
- 38:43SPEAKER_1: And that's what we propagate.
- 38:46I remember before we had all these optimizations to figure out the minimum
- 38:51number of things to recompute,
- 38:54it was pretty gnarly.
- 38:57I remember there was a big all hands that was happening internally,
- 39:02and then we just got a report that,
- 39:04hey,
- 39:05a bunch of slides disappeared or something.
- 39:09SPEAKER_2: And then we were like, oh my goodness, chaos mode.
- 39:12So we had to do a lot of digging to figure out theories as to how this might've happened,
- 39:17because it's really hard to reproduce 10 people being in the same file at once,
- 39:23and then one of them losing connection while they do a big slide reorder.
- 39:26SPEAKER_2: So I mean, it is very
- 39:28SPEAKER_0: Challenging.
- 39:29This sounds like a proper hardcore engineering problem where it's
- 39:33distributed systems like state reconciliation,
- 39:38playback conflicts,
- 39:40howtodealwith
- 39:42SPEAKER_1: Conflicts.
- 39:42While we were working on this,
- 39:43weoftenjokedthiswouldbeareallymeaninterviewquestion
- 39:50SPEAKER_0: Or a really good one.
- 39:51If someone can bring something new to the table,
- 39:53it's like,
- 39:53all right,
- 39:54you need to join,
- 39:58and how do you test all this?
- 40:00So I'm specifically curious of,
- 40:03okay,
- 40:03in traditional CRUD apps,
- 40:06you typically have,
- 40:08obviously you manually test that,
- 40:09does it work?
- 40:10You add your automated tests,
- 40:12unit tests later you might add integration test,
- 40:15and then they're there to guard against regressions and now,
- 40:19and that you feel pretty happy and thumbs up,
- 40:21it'll kind of work,
- 40:22especially when it's a backend heavy thing that doesn't have much ui.
- 40:26SPEAKER_0: How does this work in your case?
- 40:28SPEAKER_1: Yeah, we have all of those.
- 40:31For this case specifically,
- 40:33we do have,
- 40:34I think it's our most unit tested part of slides,
- 40:37this grid reconciliation,
- 40:40and we have every case that has ever caused a bug report that we then assert the
- 40:49mutations that have happened.
- 40:51So we perform the reorder and then we verify on every single slide after the reorder.
- 40:59SPEAKER_1: Are you the same?
- 41:00SPEAKER_1: Has your index changed?
- 41:02I think another interesting part of slides is some of our test cases are vibes
- 41:07in a way to dig into this a little bit,
- 41:11especially when we were originally building the product,
- 41:13and still today we do a lot of testing by seeing how people feel about a subtle change.
- 41:21I remember one of the really interesting things I was iterating on was how
- 41:26does the viewport feel inside of single side view?
- 41:31SPEAKER_2: And it's like, how far can you zoom out?
- 41:34How far can you zoom in as you zoom out when you can see that the slide gets centered?
- 41:39SPEAKER_2: But when do you start recentering this slide?
- 41:43SPEAKER_2: How far are the margins here and here?
- 41:46And to do a lot of this testing,
- 41:49and you can see it also scales with the viewport,
- 41:52but to do a lot of this testing,
- 41:56this was a lot of sending two options over to designers or putting one option
- 42:04in our internal staging environment,
- 42:07and then seeing how people felt about it as they naturally use slides during
- 42:13their day-to-day and Figma.
- 42:16So it was a lot of trying things out,
- 42:19trying one or two different options,
- 42:21and then getting some feedback on those prototypes from designers or
- 42:25product people around the company.
- 42:27And then going for just whichever one people either preferred or whichever
- 42:33one people did not less than the other one.
- 42:38SPEAKER_0: Yeah, that is different, right from your usual development.
- 42:44SPEAKER_1: Yeah.
- 42:44SPEAKER_1: Yeah, for sure.
- 42:45Something that I really love about working at Figma is just how much we use the
- 42:50products that we make.
- 42:52We really live in them,
- 42:56and that really translates to a lot of the deep power user flows that end up in
- 43:01the product or because people want them,
- 43:05and it also translates to an amount of care,
- 43:08I think,
- 43:09right?
- 43:10People notice tiny bugs and they fix them because they're bothered by it,
- 43:16or people will notice a string inconsistency and they'll put up a change to
- 43:21resolve it.
- 43:22And so all these little minute things that may otherwise go unreported by
- 43:27users are always reported internally in a really nice way.
- 43:33We did a deep dive with about Figma with actually Chris Rasmussen,
- 43:39the CTO about a year ago in the pragmatic engineer.
- 43:42And one thing that he told me there is there's this concept of Figma of fixing a
- 43:49lot of,
- 43:50they're having a zero buck policy,
- 43:51especially for new development.
- 43:53So when something is launched for certain amount of time,
- 43:57if it's a bug,
- 43:58you fix it as opposed to what a lot of companies do as well,
- 44:02there's a report,
- 44:02you kind of put it in the backlog eventually you might or might not fix it.
- 44:06SPEAKER_0: Do you still do this?
- 44:07And if so,
- 44:08how are you doing this with slides,
- 44:10which is a new product that's still not ready or Well,
- 44:12it's just ready?
- 44:15SPEAKER_1: Yeah, I definitely resonate with that.
- 44:17We have our on-call shifts work differently than in my past jobs where when
- 44:22you're on call,
- 44:24a lot of what you do is you triage that main feedback channel.
- 44:30If something's a quick fix that someone reported,
- 44:33you can just put the fix up right away,
- 44:35but if not,
- 44:36you go through the act of them prioritizing those things.
- 44:39So we do make sure that everything that's reported internally is either then
- 44:44fixed or planned to be fixed.
- 44:46SPEAKER_1: Nice.
- 44:47SPEAKER_2: Yeah.
- 44:47I will say being in beta did allow a little bit of leeway with bugs to make sure
- 44:55that we had a really solid set of an end-to-end flow ahead of the config launch.
- 45:01So we definitely,
- 45:03one thing I really did respect about Figma is when it came to crunch time,
- 45:08we were really good about prioritization instead of adding more hours onto
- 45:13everyone's workflow.
- 45:14So I think Figma was really good about making sure that we were able to figure
- 45:20out the true blockers that would make beta less successful versus stuff that
- 45:24we could happen in beta that we would want to fix ahead of our bigger launch.
- 45:31SPEAKER_0: And how does it look like to push something out to production?
- 45:35You fix a bug or you add a new feature,
- 45:40do you literally just push it out and it goes out to every single customer?
- 45:43Do you have feature,
- 45:44well,
- 45:44obviously I'm assuming you'll have code review ci,
- 45:48you're just nodding,
- 45:49but not every place has it,
- 45:52but I'm going to assume,
- 45:53correct me if I'm wrong,
- 45:54and then when it goes out,
- 45:55do you have a concept of feature flags?
- 45:57I assume you must have it,
- 45:58but for the most part,
- 45:59does it just go out everyone and then boom,
- 46:02it's there,
- 46:02or is there a little bit more careful release process?
- 46:08I think the answer depends on what the bug is and then the risk of the bug or even
- 46:13just the area,
- 46:15I think.
- 46:18So anything that's going to be touching the core experience of the core editor,
- 46:24if that's a risky bug fix,
- 46:25always gets a flag smart.
- 46:27And we tend to roll those out slowly and watch for reports or any bug fixes in
- 46:33our renderer too.
- 46:35SPEAKER_1: Just these really core areas always, always get a flag.
- 46:39And part of that is we're making this thing that people live in for eight hours
- 46:45a day.
- 46:46People do their full-time jobs in Figma,
- 46:49andsowetendtoprioritizenotbeingrisky
- 46:56SPEAKER_2: In terms of feature flags.
- 46:58SPEAKER_2: Yep, we have feature flags.
- 47:01SPEAKER_1: Yeah, last I checked, we have over 2000, I think over two.
- 47:04SPEAKER_1: Okay,
- 47:05SPEAKER_0: Okay.
- 47:07Then you must have an internal panel,
- 47:09right,
- 47:09for devs to be able to trigger on your local thing,
- 47:13right?
- 47:14SPEAKER_2: Yeah.
- 47:17But in terms of feature flags,
- 47:21since we have our staging environment where we have people like dog feeding
- 47:25stuff all the time,
- 47:26we have a lot of feature flags of the bigger features we're working on,
- 47:31such as some of the ones we're launching for ga,
- 47:33such as slide numbers or components or object animations.
- 47:38We have those on internally in our staging environment,
- 47:43and we get a lot of really good feedback on bugs and just general usability by
- 47:50just having those on within staging.
- 47:53I think that really helps make us feel a lot more confident of when we
- 47:57eventually flip that in prod,
- 47:59justmakingsurethatitfeels
- 48:01SPEAKER_0: Good.
- 48:02Then is staging internal or is it also for a subset of customers who might opt
- 48:07intogivefeedbackorbeonthebleedingedge
- 48:12SPEAKER_2: Internal?
- 48:13SPEAKER_2: Yeah, staging is only internal.
- 48:15I think for slides at least,
- 48:17we had a point where slides was staging only internal only,
- 48:20and then I think it was March,
- 48:152024 or so where we had our first alpha launch where we had a select few
- 48:29customers that we decided to open the feature flags up to inside of prod who we
- 48:34worked really heavily with user researchers to figure out.
- 48:38SPEAKER_2: So we had an alpha period.
- 48:41Something that's interesting that I haven't seen at my past jobs that we
- 48:45started doing recently is for all of our unit tests and all of our interaction tests,
- 48:51we run the full suite with all the flags off and then with all the flags on.
- 48:56So the same tests are running in both premier,
- 49:02and obviously within the tests you can specify a different permutation.
- 49:06If you're writing a test that only covers something that requires that flag,
- 49:11obviously you need that flag to be on.
- 49:14But this has been a huge,
- 49:16because before we were doing this,
- 49:19this was a source of regressions where it's like,
- 49:23Hey,
- 49:24this flag caused this to break,
- 49:27and I didn't know this until someone went to delete the flag,
- 49:31and then that caused tests to fail.
- 49:33So now that we're doing this,
- 49:36it's really,
- 49:36I don't know it,
- 49:38it's pretty awesome.
- 49:38SPEAKER_1: I feel like everyone should do this is my takeaway.
- 49:43One really good example is I was debugging a really deep copy paste test and
- 49:48then a really deep copy paste bug,
- 49:52and then I wrote some tests for it and I was like,
- 49:54okay,
- 49:55let's make sure slide one is the first slide,
- 49:58and then slide two is the second slide.
- 50:01At the same time,
- 50:02John is working on slide numbers,
- 50:04and I don't have the slide numbers feature flag internally on my local environment,
- 50:11but it's on in our staging environment.
- 50:13So one thing I didn't catch is that the slide numbers change renames slides
- 50:20internally from the word slide space one to just one or two,
- 50:26and if I just merged that test,
- 50:31it would break under John's feature flag.
- 50:33But because we have this system where all flags are off,
- 50:38then all flags are on.
- 50:39SPEAKER_2: I was able to catch that test before I merged it in.
- 50:42SPEAKER_0: I haven't heard this, but I'm going to make a note.
- 50:45It just sounds like just a good practice at a lot of places because so many
- 50:52places do have feature flags,
- 50:53but this is smart.
- 50:56I was going to say,
- 50:56getting from where we were to having this setup did take a bit,
- 51:02so each of our flags have their own configuration to be like,
- 51:07am I enabled always?
- 51:09Am I enabled just for,
- 51:11we call them rollout tests,
- 51:14so it's like off in the non rollout test and then on in the rollout test.
- 51:20And so just getting to the point where we could even get a green build in the
- 51:24rollout test was a huge effort.
- 51:28And then one last area that I was curious about is this concept called eng crit.
- 51:34SPEAKER_0: Now, this is something I've not heard before.
- 51:36SPEAKER_0: I think the practice is somewhat familiar, but can you tell me about it?
- 51:39SPEAKER_0: What is a crit?
- 51:41SPEAKER_0: What is even a crit inside of Figma?
- 51:45SPEAKER_2: Yeah, Eng crits are pretty sweet.
- 51:47We actually run them internally using Fig Jam,
- 51:50which is yet another one of our products.
- 51:52But instead of someone sending over a long doc and then people leaving
- 51:57comments in those,
- 51:58we sometimes do these 30 minute eng crits where someone makes a fig jam file,
- 52:05and then for 20 minutes,
- 52:07a ton of other engineers around the company jump in and leave sticky notes and
- 52:13then leave sticky note threads and have all these asy conversations.
- 52:18And then at the end,
- 52:19we have sometimes 10 minutes or so to talk about some of the spiciest sticky threads.
- 52:25I think we have a good engineering blog post about this concept,
- 52:28but for instance,
- 52:30when I was trying to add components into slides,
- 52:33I had a really good eng crit with our design systems team where I made a fig jam.
- 52:40SPEAKER_2: I showed him a prototype that I made.
- 52:43I showed some of the code changes that we'd have to do,
- 52:45and then 20 minutes just tons of sticky notes and spicy feedback and sticky
- 52:53note threads.
- 52:54And then afterwards we had 10 minutes of just chatting about some of the
- 52:58biggest decisions or not.
- 52:59SPEAKER_2: So yeah,
- 53:00So it is basically like a design review,
- 53:03but very figma kind of flavored,
- 53:06right?
- 53:07SPEAKER_2: Yeah, I like it.
- 53:09SPEAKER_2: It does lower the stakes a little bit.
- 53:11SPEAKER_2: Sending out a doc can be a little bit scary, but
- 53:14SPEAKER_0: Yeah, I remember you want it to be good.
- 53:18SPEAKER_0: Well formatted, nice wording, that kind of stuff.
- 53:22Actually,
- 53:22one thing that might be cool to talk about is we have this really cool bisect
- 53:26system internally.
- 53:29We call it web bisect and using sort of our front-end commit previews where
- 53:35any commit that's,
- 53:36or any pull request that's merged into our master branch,
- 53:40we have an image of that deployed.
- 53:44So we have this sweet tool that someone actually made during a maker week
- 53:48where if you see a bug or something and you don't know where it came from,
- 53:54you can actually use this tool to bisect,
- 53:58which commit actually introduced that bug.
- 54:02So you could be like,
- 54:03okay,
- 54:03I saw this bug for the first time last week,
- 54:08and then this internal tool lets you pick,
- 54:11chooses some commit preview right in the middle of that,
- 54:15and then you can test that preview and you be like,
- 54:18oh,
- 54:18the bug is here,
- 54:19or it's not here.
- 54:21And then depending on that,
- 54:22it bisects a little bit more,
- 54:24and then it could be like you could test that again.
- 54:26SPEAKER_2: And then it's like, okay, the bug's here, the bug's not here.
- 54:29And then if you do that 10 times,
- 54:31you can nail down which commit in the last week or so out of thousands of
- 54:35commits like cause this regression.
- 54:37SPEAKER_2: And that's extremely useful.
- 54:39SPEAKER_2: So
- 54:40We'll close up with some rabbit questions if that's all right with you guys.
- 54:44SPEAKER_0: And I'll just ask and you just shoot whatever comes.
- 54:47So what is your favorite language or framework that you really like using?
- 54:53SPEAKER_2: I've got to go with the classic type script.
- 54:56SPEAKER_0: It's becoming too popular.
- 54:58SPEAKER_0: It is a very good language.
- 55:00SPEAKER_1: Yeah, I've become a big next JS fan as far as frameworks go.
- 55:03SPEAKER_0: Oh, nice.
- 55:04SPEAKER_0: What made you convert?
- 55:09I built my personal site using it just to test it out,
- 55:13and I just thought it was really fun.
- 55:16And so since then,
- 55:17all my side projects that I do,
- 55:19I've been using Next js,
- 55:21SPEAKER_0: Who knows if you're going to introduce it to work as well.
- 55:24SPEAKER_0: Now
- 55:27SPEAKER_1: Are stacks too complicated?
- 55:28SPEAKER_1: Yeah.
- 55:29SPEAKER_0: Oh yeah.
- 55:30SPEAKER_0: What's a design resource or a tool that you use?
- 55:34SPEAKER_0: Unlike,
- 55:36Honestly,
- 55:36the first thing that came to mind is I'm an avid hacker news reader.
- 55:40I don't know if that's a hundred percent what you meant by resource,
- 55:44but the resource.
- 55:45SPEAKER_1: I love going through the top voted blog posts there.
- 55:51Yeah,
- 55:51I think for me,
- 55:53just flexing my design muscle a little bit,
- 55:56refactoring UI was really cool just to get rapid fire quick tips of how can I
- 56:01make some engineering mock or some weird website that I'm making on my end,
- 56:07just look slightly better,
- 56:09making sure that my pixels are in factors of four or eight pixels or adding a
- 56:15little bit more white space or keeping a limited set of font size.
- 56:18SPEAKER_0: So refactoring ui, is this the book or is this a tool?
- 56:23SPEAKER_2: Yeah, there's a book.
- 56:26SPEAKER_2: It's like a PDF book that's pretty useful.
- 56:28SPEAKER_2: And there's also, there's a Twitter thread that I think the
- 56:31SPEAKER_0: Author may, this is from the creators of Tailwind, right?
- 56:35SPEAKER_2: I think so.
- 56:36SPEAKER_2: I think so,
- 56:37SPEAKER_0: Yeah.
- 56:37SPEAKER_0: I just found it.
- 56:38SPEAKER_0: It is from add Adam, we and Steve Roeger.
- 56:41SPEAKER_0: Awesome.
- 56:43SPEAKER_0: And what is a book?
- 56:45What is one or two books,
- 56:46fiction or nonfiction that you read and would recommend?
- 56:51SPEAKER_1: I recently read pii, which is, it's pretty short.
- 56:57It's a really captivating it's story,
- 57:00and it's one of those books where after you read it,
- 57:04you really do think about it for every day.
- 57:08Yeah,
- 57:08this one isn't software related,
- 57:09but I'm reading Kurt Schott's Immune book,
- 57:13which is this really cool book about the immune system being written by a very
- 57:19good science communicator.
- 57:21I think it's just cool to visualize my immune system and my body in a whole
- 57:26different way of this whole collaboration of cells working together.
- 57:30SPEAKER_0: Nice.
- 57:31Well,
- 57:32John and Noah,
- 57:33thanks a lot for being here and for giving us a behind the scenes view of how
- 57:38slides is built and how some of the simple user interfaces have a lot of
- 57:42complexity behind them.
- 57:44SPEAKER_0: This was really, really eyeopening for me.
- 57:46SPEAKER_2: Yeah, thanks for having us.
- 57:48SPEAKER_2: Yeah, thanks so much for having us.
- 57:49Isn't it interesting how seemingly simple product or UI can be so complex
- 57:53behind the scenes like the single slide view and Figma slides?
- 57:56Thanks a lot to John and Noah for all these details that they shared with us.
- 58:00You can find both of them on social media as linked in the show notes below.
- 58:03For a more detailed deep dive about the engineering culture at Figma,
- 58:06check out a longer article in the pragmatic engineer titled Insight Figma
- 58:09ISS Engineering Culture,
- 58:11also linked in the show notes.
- 58:12If you enjoy this podcast,
- 58:13please do subscribe on your favorite podcast platform and on YouTube this
- 58:17helps more people discover the podcast.
- 58:19SPEAKER_0: A special thanks if you leave a rating.
- 58:21SPEAKER_0: Thanks and see you in the next one.