Keynote: 365 Days Later: Moving From Java To RoR And How It Changed Everything


Summarized using AI

Keynote: 365 Days Later: Moving From Java To RoR And How It Changed Everything

John Dewsnap • July 08, 2025 • Philadelphia, PA • Keynote

Overview

This keynote by John Dewsnap at RailsConf 2025 explores Flexcar's ambitious transition from a sprawling Java-based microservices architecture (with around 80 microservices) to a monolithic Ruby on Rails (RoR) application. Dewsnap reflects on the challenges, strategies, outcomes, and lessons learned over the year following this migration.

The Migration Journey

  • Background and Motivation
    • Flexcar's previous tech stack was a chaotic collection of 70-80 Java microservices, making even simple features complex and slow.
    • A pivotal incident—having to build a caching layer just to access key data—triggered the CTO's decision to consider alternative frameworks, ultimately choosing Ruby on Rails for its simplicity and the strength of its community.
  • Team Reaction and Timeline
    • The announcement was met with skepticism and resistance from the engineering team, unfamiliar with RoR and seeing it as outdated.
    • Despite initial doubts, the core team of 4 engineers rebuilt 80-90% of the platform in about 4 months (instead of the planned 3), launching during RailsConf the previous year.
  • Initial Launch and Aftermath
    • The live migration included a stressful, overnight data migration, followed by weeks of fixing production bugs and addressing operations-side feature gaps.

Key Observations and Lessons Learned

  • Go All-In Approach
    • Full commitment to migration—no phased or partial approach—ensured alignment and timely completion.
  • RoR Learning Curve and Support
    • Most engineers were new to RoR; bringing in a full-time RoR expert would have smoothed the process.
  • Development Process Changes
    • Switched from siloed teams owning microservices to smaller, more fluid teams working across the monolith.
    • The codebase became more accessible, enabling broader team ownership and greater knowledge sharing.
  • Accelerated Feature Delivery
    • Project delivery increased from 10–15 per quarter in Java to 25–30 per quarter in RoR, despite a smaller team.
    • Product and design teams needed to adjust to the faster pace and more iterative feature delivery.
  • Technical and Organizational Impacts
    • Team size shrank, enabling dynamic team composition and more cross-functional collaboration.
    • The clean-slate rebuild allowed rethinking architecture and processes, resulting in a cleaner, more maintainable codebase.

Notable Challenges and Solutions

  • Operational and Technical Issues
    • Initial increase in customer support load due to missing or imperfect features post-migration.
    • Struggled with performance pitfalls, such as N+1 queries and authentication complexities between RoR and a separate React frontend.
  • Adoption of AI Tools
    • Relied on AI tools (ChatGPT, Copilot, and notably Cursor) for accelerating the team's RoR learning curve and code production, though early tools sometimes caused confusion.
  • Front-end Evolution
    • Maintained React and React Native for customer-facing applications, later unifying internal tools on Inertia.js and React using Rails as the backend.

Cultural and Company-wide Effects

  • The RoR transition garnered interest and support across the whole company, with improved speed and engineering efficiency being cited positively by both engineers and leadership.
  • Increased opportunities for junior developers to take on significant responsibilities thanks to the more accessible, opinionated RoR framework and supportive team environment.

Main Takeaways

  • A bold, all-in migration strategy can pay off with improved development speed, better team dynamics, and company-wide benefits—but requires clear technical direction and team buy-in.
  • Monolithic RoR architecture, compared with microservices, brought greater accessibility, maintainability, and agility for Flexcar.
  • Openness to learning, leveraging community support, and iterative improvement (including with AI tools) were key to making the transition successful.

Keynote: 365 Days Later: Moving From Java To RoR And How It Changed Everything
John Dewsnap • Philadelphia, PA • Keynote

Date: July 08, 2025
Published: July 23, 2025
Announced: May 07, 2025

Last year at RailsConf Detroit, keynote speaker Irina Nasarova announced that Flexcar was launching on Rails that very day— in the middle of the conference. Now, one year later, I’m here to share the full story of how that transition unfolded, how things played out, and what life has been like for us after a full year on Ruby on Rails.

Flexcar made the bold decision to move from a Java-based architecture with 80 micro-services to a monolithic Ruby on Rails application in just four months. While this transition would have been aggressive to do in four months with an experienced Rails team, our team was brand new to RoR. This shift has had far-reaching effects—not just on our tech stack, but on our workflow, team dynamics, and company culture.

In this talk, I’ll take you through our journey, sharing lessons learned, challenges we overcame, and what I wish I had known before embarking on this path. We’ll dive into how the transition affected our development process, how we gained company-wide support, and the unexpected successes (and a few surprises) that came after the launch.

If you’re an engineering leader considering a similar move or a switch to Ruby on Rails, you’ll leave this session with:

- Insights into managing a successful tech stack migration and avoiding common pitfalls
- Strategies for securing buy-in from leadership, product, and support teams
- How the shift to Rails reshaped our team, processes, and products

Join me for a candid reflection on a year of change, growth, and lessons learned, and take away actionable tips to ensure your own transition is as smooth and successful as possible.

RailsConf 2025

00:00:18.880 FlexCAR. Uh director of engineering with Flexar, not the whole director of Flexar. Um someday so my talk 365 days
00:00:26.960 later. Uh but I think you know kind of with this whole past, present and future vibe that we have the conference this
00:00:32.960 year I actually lied. Uh it's more like 500 days later because I'm going to start a little bit before uh we launched
00:00:40.160 last year. Try to not everybody was here. Not everybody knows our story. Um so I'm going to fix that. Uh so our
00:00:47.120 backstory. So when I first joined Flexcar about 2003, uh we were a Java uh backend with uh not
00:00:55.760 70 80 microservices. Uh thank you very much. And it was total chaos. Um and
00:01:02.800 obviously it didn't start out this way. It grew over time about not that long. You'd probably think like a five or 10
00:01:08.320 year journey. It was more like a year and a half, two years. uh and we got in this state uh where we had all of this
00:01:16.640 um and thing you know we thought things were going along okay you know I just joined get my feet wet um you know
00:01:23.439 things were we're moving I thought things were okay uh and and what happened right so so how did we get here
00:01:30.240 how do we move from Java to Ruby on Rails so we were working on a project uh
00:01:36.880 and we were changing how flex car uh you presented inventory to our customers.
00:01:43.119 Uh, and you'd think, you know, how how hard how hard can that be, right? So, with AD microservices, uh, you know, we
00:01:50.320 sell cars, right? We we sell, uh, you know, leases on cars. So, you want to see a picture of the car, information
00:01:55.520 about the car, you know, what color it is, etc., etc. Each of those was a separate service. Uh, so when we asked
00:02:02.079 to uh, and before flex car, how it used to work, um, we would show a picture of
00:02:07.600 a Toyota Camry, right? and it represented the one to, you know,
00:02:13.520 hundred or so Toyota Camry we had on site. Um, but we didn't show you all those cars. We just showed you a picture
00:02:19.040 of a Toyota Camry. We were changing that to show every Toyota Camry we had on site. So instead of showing like say 12
00:02:26.640 tiles, hundreds of tiles of cars, right? So we wanted you know sub 500
00:02:32.000 millisecond response time. Uh we asked for all this information we were going to put on the site and the answer we got
00:02:37.120 back um from the many stakeholders uh for those microservices was no we can't give that to you. Um so one of my
00:02:44.080 engineers here Dan Dunkers uh built this caching layer. Yeah, props to Dan. Um
00:02:52.319 I don't think this is the nail in the coffin, Dan. Don't worry. uh the he built this thing in about 3 weeks and it
00:02:58.640 was a whole cash and later just to get this data that we should have had on hand right uh our CTO at the time uh Mr.
00:03:05.360 Freedom Dumlow, I'm sure a lot of you guys know him. Um, uh, you know, made the decision I think
00:03:12.319 and you can correct me after this if I'm wrong, but I think because the fact we had to build this caching layer to get
00:03:18.720 core data for our service uh to, you know, our website so people could actually come and get our cars uh made
00:03:26.239 him think we got to do something different, right? Um, I was not involved in this decision. Uh, I will say that uh
00:03:32.879 this was this is Mr. Freedom. uh and and you know his thoughts in in his his working uh but he looked at a few things
00:03:40.640 uh sweet uh Django Nex.js JS uh spelt uh
00:03:47.840 what else? Elixir and of course Ruby on Rails right and he decided you know the
00:03:52.959 one I want to go with um is Ruby on Rails hence you know otherwise I wouldn't be here right so uh freedom
00:04:00.000 brought us all into a room you know sat us down as an engineering group and said I have an announcement you know we're
00:04:06.080 we're going to switch from Java and you know all these microservices to a a Ruby on rail monolith and you know we just
00:04:13.280 went a static it was wait a minute that doesn't not exactly right.
00:04:18.799 No, that's not right at all. Um, we are all pretty livid. Um,
00:04:24.560 possibly myself included. I I believe my quote was I'm sure this will you guys
00:04:29.680 will love this. I think my quote was 2005 called and wants its technology back. Um,
00:04:36.560 I hadn't heard about Ruby on Rails for quite a while at that point. Um and you know, Freedom took it all in and uh
00:04:43.520 decided and rightfully so that he was correct and we were going to go ahead with this anyway. Uh and so we did. Um
00:04:51.680 we had a target of rebuilding our whole entire uh for the most part, let's say
00:04:58.080 90% of our of our uh you know platform in three months. Um pretty aggressive
00:05:04.800 timeline. Uh I would I would argue and trust me that was mumbled throughout engineering for quite a while. Um and so
00:05:11.919 we started and uh we grabbed uh four core engineers. Again, Mr. Dan Dunkers
00:05:18.240 was one of those four core engineers. Um four engineers built I would say a good 80% um of what we have in Ruby on Rails,
00:05:26.800 right? Got us stood up and we didn't do it in three months. We failed. We did it
00:05:32.560 in four. Um, and uh,
00:05:39.919 now notice I said we were planning on doing it in 3 months. That was a month before Railscom last year and we missed
00:05:46.400 that mark. Um, and so we pushed it out, you know, a month. I don't think we we
00:05:51.840 looked at the dates uh, because the the day we were going to release landed on
00:05:57.919 right in the middle of Rails Comp last year. Um, we had, I think, an eject
00:06:03.520 button. If we didn't think things were going to go right, we could have pushed it out a week. No one would have been
00:06:08.639 the wiser, or so I thought. Um, and so, uh, we we attended the, uh, so, so last
00:06:16.000 year, sorry, last year was my first Rails conf. It's a little, um, bizarre that I'm up here now speaking to you all
00:06:21.919 after, you know, last year. Um, by the way, Nadia's talk, opening keynote last year, ridiculously good.
00:06:29.680 Um, so a little bit of pressure on me and then I attended the uh the closing keynote that day uh by Arena, also
00:06:38.240 ridiculously good. Uh, but the more important part of that was uh she talked about Flex Car and told our story and
00:06:45.199 how we were going to, you know, do this migration and mentioned we were going to do it that night. So me and Freedom kind
00:06:50.639 of looked at each other and was like, "There goes our eject button." Um
00:06:56.080 so uh we sat down and decided okay we're we're doing this thing. Uh so you know
00:07:02.479 we woke up that morning attended you know first day of Railscom. Um full day
00:07:07.520 you know went out met people afterwards and we kicked things off uh at about uh
00:07:13.280 11 p.m. So here's me and Freedom probably looking uh the happiest we were going to
00:07:19.680 look during this migration. Um, uh, trust me, it it only it only
00:07:25.280 gets better. Um, and so it started about 11 p.m. We had to do a, you know, whole data migration, right? Because we had
00:07:31.680 customers, uh, that have been with us, you know, since the beginning, we had to move all that data over, uh, make sure
00:07:37.440 that it was going to work, you know, even though we had we had done our testing and staging because everything works flawlessly when you test it and
00:07:43.680 staging and then go to prod. Um, so we tested everything and you know, I think our original estimate was it was going
00:07:49.520 to take two three hours to do the data migration. This was uh me and Freedom uh kind of in
00:07:55.840 the middle of it. Notice 5:00 a.m. That's more than two or three hours. Um, there was also some rumors at this time
00:08:02.560 that snoring was heard over the the Zoom call. Um, I told Freedom like I tell my
00:08:08.400 wife and kids, I don't snore. No matter how many times you tell me this, it's impossible. So don't believe that rumor.
00:08:15.759 Uh it took us to about 3:00 the next day. Uh we had uh already kind
00:08:23.520 of launched by about 11 in the morning I believe. You know timeline kind of gets blurry. Uh we were taking orders and uh
00:08:31.120 we just you know things were actually looking okay. Obviously there were some fires but uh for the most part we were
00:08:36.880 feeling good. Right. So freedom I think, you know, tells me like about five
00:08:41.919 o'clock, we got to get out of this hotel room, our own our separate hotel rooms. We
00:08:47.200 weren't in this one hotel room. Uh as much as I love freedom, that would have been, you know, you know, different. Um
00:08:52.720 so we were, you know, I was like, "Okay, that sounds good." You know, took a shower, you know, changed whatever because we've been up for whatever. And
00:08:59.440 we attended the happy hour at Railscom. And I think I want to hit on what was talked about here, the uh the the
00:09:06.080 community and and you know, I think like all of you guys and just the the uh the positivity that's felt. So, uh, when we
00:09:14.959 got the announcement back, you know, with the the torches slide, um, one of the things that Freedom told me was, you
00:09:20.640 know, one of the reasons not of, you know, you know, I don't think it was like the main reason, but, you know, I think one of the important reasons was
00:09:26.800 when we picked Ruby on Rails was the community and like how supportive everybody is and that and I I don't
00:09:32.800 know, I kind of brushed it off. I was like, "Yeah, yeah, yeah, whatever." Right? And then when we came, you know, to to Rails Conf last year, um, and we
00:09:40.720 went to this happy hour, it really struck me because, uh, because of, uh, Ireina's keynote, um, you know, not
00:09:47.839 putting pressure on us. Um, everybody kind of knew our story. Everybody, you know, knew we were trying to launch. So,
00:09:55.279 a lot of people came up to us and asked us how did it go, right? And you could
00:10:00.320 tell that people wanted to know. They cared. uh they were actually very interested and very very supportive um
00:10:06.800 when we told them that yes we we did go to production and u you know we got it done in four months and people were like
00:10:12.399 ah that's awesome you know so the the community here um is absolutely
00:10:17.519 something special um I I I concur with that it's not something that you find at a typical you know tech conference um it
00:10:25.440 is something uh truly different uh and it's something that I think should be cherished uh and appreciated um and so
00:10:32.240 hence you I wanted to to kind of highlight, you know, we went to Rails, uh, you know, everything was, you know,
00:10:37.279 was a pretty, you know, pretty special time. So, all right. So, I think we can wrap it
00:10:42.959 up. Um, so we moved, everything was perfect, right? Uh, it's, uh, you know,
00:10:48.720 happy ending and all and all. Wait a minute. That Nope. Nope. Um, so once we
00:10:54.240 got back from Railscom, uh, you know, reality kind of kicked in. Um, and you know, how' the how' the next two months
00:11:00.399 go? Um, I spent hours and hours trying to find the right slide for this. Uh, I
00:11:07.360 figured this one did did pretty well. So, uh, we spent the next two months,
00:11:13.360 uh, maybe six weeks, but I, you know, six to eight weeks, somewhere in that time frame, um,
00:11:19.600 fixing production bugs, right? Things things that we didn't quite catch in staging. um features that, you know, we
00:11:26.959 either purposely didn't didn't bring along because of time um or, you know, we we were going to, you know, do it
00:11:32.640 later or we just we just missed. Um now you had, you know, a real customers, you know, hitting our site every day um
00:11:39.600 calling uh our care team. Uh nobody from our care team is here. I wish they were. I would I would give them a big hug. Uh
00:11:46.000 it's not a giant care team. I think it was like five to to to seven people. um
00:11:51.200 their call volume went up I think a factor of like five to six times uh for a good solid like month maybe these two
00:11:58.000 months um god bless each and every one of them for dealing with that. Um and
00:12:03.040 then you also had you know we have our obviously our our customerf facing site where people go and get cars. We have
00:12:08.959 our internal tooling where you know operations people you know take care of cars you know manage the fleet etc etc.
00:12:15.680 Um that probably didn't get as much love during this transition as the uh the
00:12:21.120 consumerf facing site. Uh so there was some issues you know maybe maybe more than one on the uh the operations side.
00:12:27.279 So we spent the next two months um cleaning everything up and I think getting us to a place that um we were
00:12:33.680 very stable, right? And uh now I think you know so that's the that's the past
00:12:38.800 you know that's that's how we got here and and why um and now I can talk about you know some of the things that you
00:12:45.440 know we learned um prior you know like post you know post doing all this and
00:12:50.560 and you know some of some of the uh the benefits right so uh some observations right um I think the first one looking
00:12:58.399 back you know through the process uh couple things from the actual transition I wanted to highlight So, uh, and and
00:13:06.160 kudos to Freedom here. One of the things that I learned watching us go through this and obviously being one of the
00:13:11.760 people holding the torches. Um, if you're going to make a decision like this, you got to go all the way in. You
00:13:18.720 can't just dip your toe in. Because if we had spent, you know, months, ah, we'll we'll do half of it in in Java and
00:13:25.839 we'll do this other little bit in Ruby and eventually we'll migrate everything over, um, we wouldn't be there today.
00:13:32.240 you know we we would probably have like 50 60% you know in in in Ruby um we
00:13:37.760 would not have gone all the way in. So um that is the one thing I you know the one most important thing I think I
00:13:43.839 learned from this was go all in and and you know you can answer people's questions you know freedom let us email
00:13:50.320 them questions about why we're doing this and and he sat down and and and addressed all those questions and said
00:13:56.079 at the end and we're moving to Ruby on rails right so you go all in and you
00:14:01.120 stay committed um especially when you're doing something like this because it's important to get everybody on you know
00:14:06.959 everybody on board you're all marching towards the same goal and you're not tearing, you know, in two different
00:14:12.720 directions because all that's going to do is slow you down, waste time, and we would not be where we are today, which
00:14:18.320 is in a much much better place. Um the the other thing I noticed um so we had
00:14:25.440 zero people in our engineering team minus freedom uh who had ever used Ruby on Rails.
00:14:31.199 And so we told every engineer, you know, now you're going to learn Ruby on Rails.
00:14:36.240 you know, we know a lot of you guys are Java backend developers. That's great. Now, you're going to be Ruby on Rail
00:14:41.680 developers. Uh, which also means we had nobody that knew what they were particularly doing, right? You know, we
00:14:47.199 we look, you know, you could look things up online and and you try to get an understanding for um the best practices.
00:14:54.399 Um, but what you know, what we did was we brought in a consultant. Um, unfortunately, it was only for about 10
00:15:00.720 hours a week. And so we would throw about 8,000 questions at them in those 10 hours. Uh, and God help him, he tried
00:15:07.360 to answer, you know, everyone wanted that he could. Um, but he wasn't, you know, he didn't have full context. He
00:15:12.480 wasn't sitting there writing the code with us every day. Um, so I think one thing, uh, that that would have went,
00:15:17.839 you know, a long way is if we could have brought somebody in who was sitting with us, you know, in those seats. That's not
00:15:23.360 our conference room, thank God. uh in those seats though uh helping us you know build along the way so they
00:15:29.600 understood the context you know they could understand you know you know where we're heading and and why and kind of
00:15:34.959 steer us in the right direction um uh and uh I think that would have been you know pretty pretty beneficial for us so
00:15:42.079 those are some of the things you know I noticed you know again along the way getting us there now that we're there I
00:15:47.120 think this is you know the more maybe more important thing now that you guys know the story um what happened right So
00:15:54.560 back you know in the in the Java days um what would happen is we would get a
00:16:00.160 project and obviously products involved and you know UX design is involved and
00:16:05.600 obviously engineering is involved when we would get the project um not every
00:16:11.519 time would all the requirements be fully scoped out would all the design be fully scoped out and it didn't particularly
00:16:17.199 matter because it took us a pretty long time uh to do these features you know to
00:16:23.120 you know get through these project. So they had time to, you know, would get us going. They would give us like the, you know, the beginning requirements, the
00:16:28.720 beginning design. We could, we could start off and and do our thing and then they could kind of fill in the gaps as,
00:16:34.000 you know, as we went along. That doesn't happen anymore. Um, and in fact, uh, I think we caught a lot of
00:16:41.120 people off guard when we switched to Ruby on Rails. We got through the fires. We put them all out and we started doing
00:16:46.399 new features. Uh, oh, side note, if you tell product not to do anything for like four months when you're building
00:16:52.720 something else, they think of a lot of ideas. Um, so there is no shortage of work from a
00:17:00.240 feature standpoint. Um, and so they had all these ideas and all these features and they were kind of used to the old
00:17:06.720 way, right, where they could they could get those beginning requirements and let us kind of get going. Now, I noticed
00:17:12.079 we're we were pinging them, you know, pretty consistently to be like, "Okay, we're done." Like, can you hand us the
00:17:18.160 next, you know, we notice these edge cases you didn't you didn't catch or how do you want to handle this? Same thing
00:17:23.360 with design. You know, we we would we would reach back and say, "Hey, we need the final design. You know, it's it's
00:17:28.559 not all here where they were, you know, they were not used to this because of how long it would take us before." Um,
00:17:34.160 we sped up uh a pretty a pretty significant factor. uh and I'll go into uh I'll show some some numbers in a
00:17:41.120 second. Um when you have 80 microservices
00:17:46.480 um one of the things that happens is a team becomes responsible for these sets
00:17:53.039 you know these five to 10 services or whatever and only that team you know makes changes right and even if you go
00:18:00.080 and make change to that code you you know they're going to review your PR and sign off on it and so if you get a
00:18:05.280 project um and you need to interface with say three or four of these other teams you need now convince them you
00:18:12.880 know what you should be doing right now instead of all that other work you're doing this project because it's super cool and it's high priority not
00:18:19.039 everybody agrees with that uh so that slows things down and then I think the knowledge transfer suffers as well right
00:18:26.000 because you know this is my little kingdom my little fftom you know I I do this you know you guys do your code I do
00:18:32.559 my code um and so that you know we got rid of all that right the other thing
00:18:37.919 when you have a system like this you you know I could not run Flex Car on my laptop, right? And again, you know,
00:18:45.280 Freedom, Freedom said this to me in the beginning, too, and I didn't really see the power of it as much. Um, it very
00:18:50.400 quickly we did you, you know, you would have pseudo services that kind of stood in the place of it. So, when you did
00:18:56.400 testing, you really weren't fully testing it because you really couldn't run the whole thing on your laptop. When
00:19:01.760 we have a monolith Ruby on Rails app, you can. Um, which is awesome. Um, so
00:19:07.200 the, you know, the thing that really stood out though was, you know, since we tore these kind of these the these, you
00:19:13.120 know, little thief and little kingdoms down and now everybody can look at any part of the system and and make changes.
00:19:18.400 Um, people know a lot more, right? They're they're less afraid. Um, let's say if a billing issue, Dan, if a
00:19:24.720 billing issue comes up, um, it doesn't always have to be uh Dan. I know I've been pointing to him a lot. He's a very
00:19:31.039 important part of our project, our team. Uh, but he was like Mr. billing uh in the Java world. Uh he's ironically still
00:19:38.080 did a lot of billing in the Ruby world, but it doesn't always have to go to Dan. Uh anyone has the ability now to jump in
00:19:44.480 there and take a look if there's a billing issue or they want to add a feature and they have to interface with it. Um that kind of gets spread out,
00:19:51.360 right? So, you know, when we, you know, back in the Java world, we did I went
00:19:56.559 back and tried to get some, you know, some rough numbers here. We did we were doing around 10 to 15 I would say like
00:20:02.000 you know projects you know not like little features but projects a quarter right so 10 to 15 a quarter and our
00:20:08.080 engineering team um was uh larger than it is in in the Ruby on Rails days um we
00:20:16.320 now do 25 to 30 uh projects in a quarter
00:20:21.520 um with a much smaller engineering team uh probably people for people that have been in this this this Ruby on Rails you
00:20:28.240 know system for a while. It's probably not shocking at all. For us, it was kind of shocking. We weren't expecting that kind of speed um and that kind of
00:20:35.120 improvement. Um so that part has been uh awesome. Uh oh, and you know, one thing
00:20:42.400 I would say, and it's not 100% correlation of you can point to this and say this is because of Ruby on Rails. Um
00:20:48.480 but I would say because of the speed, we can try out new features. Right? So before if product had an idea for
00:20:55.440 something and they weren't quite sure if it was going to work um you know now they're looking at the amount of time it
00:21:01.200 takes to build that feature and if it fails the amount of time it takes to build you know the follow on feature
00:21:07.840 right and you're talking months um and so there was definitely hesitation of like should we try some of
00:21:14.159 these things should we not in this Ruby on Rails you know side of
00:21:19.200 the game we can we can try those things out really quickly we're talking, you know, weeks um you know, maybe a really
00:21:25.840 big thing, you know, month, month and a half, but a lot of things we're doing is in the weeks, two or three week uh kind of camp. So now you can try both of
00:21:32.240 those things in a month. You know, the the pressure is way down. Um and so we have been uh really trying things out
00:21:38.799 with product and working, you know, pretty closely with them to to try to, you know, move Flex Car in the right
00:21:44.240 direction. And we have doubled uh membership growth uh just from last year when we shipped, you know, here at at
00:21:50.720 RailsCom. Um again not it's not a oneto one uh you know correlation but I think
00:21:55.840 it uh it is a large part because of the speed and what we can deliver for products so they can try things out and
00:22:02.400 figure out what's working and and you know really what's helping uh and focus in on that. Uh so that's been uh
00:22:08.080 amazing. Thank you.
00:22:14.400 The team size is another I think really big thing and I think this is kind of cool.
00:22:20.159 So we were working in teams you know uh five to eight I would say in the Java
00:22:25.840 world you know nowadays two to three is kind of our norm. Um and what that
00:22:31.360 allows us to do and again because of that whole like feft kingdom thing you know you kind of did one thing and you
00:22:36.400 stood there. Now what it allows us to do is we have two to three teams. We can swap people around, right? So if we
00:22:41.919 want, you know, more of our senior engineers to mentor, you know, some more of our juniors or just this person who
00:22:47.760 knows this part of the system to to work with this person to do that correlation, you know, that that crosspollination, excuse me. Um, very possible, right? And
00:22:55.760 and the small team size um again has been uh not just from an engineering
00:23:01.039 standpoint, I think from a product standpoint um you know, we get to shift things around. So again, more of
00:23:07.600 product, more of design is interacting with more of engineering as a whole, which I think is great. You know, we're
00:23:12.720 not that big of a company. So to to knock those walls down and have people actually, you know, communicating and
00:23:19.120 talking um amongst each other and and you know, kind of meeting each other for the first time even though they probably worked together for like three years, um
00:23:26.000 is kind of a you know, a special thing uh for Flex Car, you know, not just for engineering.
00:23:33.200 So, you know, when we did this whole migration, um, we didn't just take, for the most part, the if you look at some
00:23:39.840 parts of our codebase, uh, and you looked at it, you would go, that's Java code in Rails. Um, but for the most
00:23:47.280 part, we actually started over, right? We we knew some of the warts and the
00:23:52.559 things we had to come, you know, get around in the Java world and not from because of Java, but because of what we
00:23:58.240 were trying to build. So when we did this in Ruby on Rails, it was a great opportunity to rethink everything,
00:24:04.080 right? How are we doing this? How are we approaching this? We know what the end result we, you know, we want. We've been doing this now for a while. Um, let's
00:24:11.440 redo it, you know, and um, I'll get into this in a second. You know, I'm a I'm a front-end guy, you know, I know, boo
00:24:17.200 hiss, but the re, you know, so I'm in React, uh, pretty heavily. And even on the React side, it it was, you know, we
00:24:23.120 could have just, you know, grabbed what we had already built, plop it over. Um, but even that, you know, we we we wanted
00:24:29.120 to clean house and kind of restart and rethink how we're doing. So, it was kind of all over the map. We were, you know,
00:24:35.120 kind of just starting over and rethinking everything. Um, and I think that alone cleared up, you know, some of
00:24:41.760 the stuff we were trying to overcome with, you know, the changes and the pivots. You know, you kind of start over
00:24:47.279 again. Don't worry, we probably have a lot of those back again, you know, in in the years since. You know, tech, as we
00:24:53.360 all know, accumulates the second you hit the button. So, uh, we do have some, you know, cleanup to do, but for the most
00:24:59.760 part, uh, the code base is is so much cleaner. Um, you know, the features we
00:25:05.039 have, you know, work a lot better. Uh, we are putting out way less fires, you know, than we were before. Um, like I
00:25:12.320 just mentioned, we we kept, uh, you know, our React front end. Um, me and Mr. freedom might have had a
00:25:18.240 conversation about um how if we didn't keep our react front end uh several of
00:25:23.760 us including myself maybe you know would have left flexar uh I don't know how how much of that was was reality versus
00:25:29.679 joking but um you know freedom freedom gave us the opportunity and said okay prove to me it's going to work we did um
00:25:35.840 we kept our our react front end for our consumerf facing um applications um uh
00:25:42.240 so like you know our main website and we use react native for our our mobile uh experience
00:25:47.440 So all that but you know bottom line that all works great with Rails right like it's you know um it's not like a
00:25:54.080 you know a tough thing and the performance is is solid um you know it's been and in fact um no offense Dan our
00:26:01.840 front-end devs were the ones who became full stack I think the first right they figured out really quickly like oh I
00:26:08.320 don't have to wait around for for all you backend guys to to build this you know API that I need with the data I can
00:26:14.559 just do it uh and So really our senior front end guys became truly full stack I
00:26:20.159 would say before anyone else. Uh and they're you know at this point uh leading the charge um you know being
00:26:26.080 full stack and being able to do both. Um now for our our internal um uh you know
00:26:33.440 operations side right we were using initially you know ERB turbo stimulus
00:26:38.960 you know that's what we kept um but we recently in the last couple months um
00:26:45.520 decided to uh you know kind of bite the bullet and we're going to use inertia uh
00:26:50.559 and react so we can write on rails. Um, I hugged somebody in the audience because they built this awesome um, uh,
00:26:58.400 read me or, you know, a blog post. Uh, thanks to Evil Martians, uh, Arena in
00:27:03.440 the corner. Thank you. Um, this blog post
00:27:09.279 took us, you know, from, you know, nothing to having inertia up and running
00:27:15.039 and working uh, in our system in 20 minutes, right? Uh, like no joke, 20
00:27:20.320 minutes. Um, and no joke, I hugged the individual who wrote this blog post because, uh, he saved us so much time
00:27:27.440 and it was, you know, it was awesome, right? Uh, so please, you know, uh, follow Evil Martians. They do, you know,
00:27:32.799 amazing stuff. Uh, but for us, you know, the thing that we decided, uh, recently
00:27:38.240 was, you know, we're now asking people to be full stack. you know, they have to know, you know, Ruby on Rails. They have
00:27:43.360 to know React. Um, and they also have to learn, you know, this this, you know, kind of a different shift in thinking,
00:27:48.880 you know, when you do React versus, um, you know, uh, you know, Turbo and Stimulus. If we could just do React
00:27:54.799 everywhere. Um, it kind of lowers the bar for us. You know, we're a small group. Um, and and I think because we're
00:28:01.919 all kind of learning it, none of us were really doing probably if you looked at our code, you would probably want to hurt us uh, or throw things at us
00:28:08.399 because I'm sure it's we're not doing things correctly. So, um, yeah, we're going to we're going to get rid of that,
00:28:13.679 uh, and we're going to focus on one, um, uh, front-end framework, you know, for flexar.
00:28:22.080 So, oh, and yeah, sorry. So, this this kind of goes into that as well is we really wanted to um put uh a kind of a
00:28:29.360 focus. Yeah, I think I wanted a lens for this picture. By the way, if you couldn't tell, all these slides have been from
00:28:36.320 MidJourney. Uh, awesome tool. It's been great. Um, and I kind of think I wanted a lens, but uh, it after about like 20
00:28:44.080 minutes trying to get it to do that, uh, this is the best I could do. So, obviously it took on the, uh, internal
00:28:49.200 tooling and that was the words it picked up on to to come to this slide. Sorry, not related to Ruby Unreal at all. Um,
00:28:56.000 our main focus to this point because we wanted people to, you know, obviously, you know, uh, lease cars from us, right?
00:29:02.240 Because if they don't do that, we don't make money and, you know, we don't have a company. So our main focus for a long time was the external facing site and we
00:29:09.600 had these internal tools for our operations people and our fleet people. Um but we didn't put a lot of attention
00:29:15.120 uh to it until recently. Uh and so because we're going to go Flex Car is going to go into this expansion. Um and
00:29:22.480 you know again we are set up for success here. You know we can scale this thing. There's no issues of you know is Flex
00:29:29.360 Car going to you know you know not be performant because you know we're on Ruby on Rails. There's none of that obviously. Um and the focus is now how
00:29:37.679 do we better support our you know operations folks uh and the people in the field you know actually you know
00:29:43.120 getting these cars into our customers hands and again this is kind of I think why you know we want to do this whole
00:29:48.720 you know shift to inertia and react um we can reuse the you know the components
00:29:53.760 we can already built for our customerf facing site and and make um some very nicel lookinging and easy to use um
00:30:00.640 internal tools. I'm not saying you can't do that with Turbo and Simulus. I'm saying we probably can't do that because of our our lack of knowledge. Uh and is
00:30:07.520 much easier for us to do that with React. Um so our focus going forward is going to be how can we support the um
00:30:14.240 the operations folks you know obviously we're not just going to leave the customer behind. We're going to you know but uh we're doing more for the the
00:30:20.399 operation side as we start to scale um and that becomes more important for flexard.
00:30:27.039 Ah so you know obviously during this whole transition and then you know and then post when we launched um obviously
00:30:33.520 Ruby was talked about amongst engineering the thing that caught me off guard is um I remember you know I was
00:30:40.320 you know getting coffee or something and the COO comes up to me and he's like ah how about that Ruby and I was like what
00:30:47.760 um and you know he was like yeah it's you know obviously freedom has been talking to him about it but he you know
00:30:54.000 people you know in the boardroom people in different departments knew that engineering switched to Ruby and they
00:31:01.120 were saying it in like a positive way, you know, not they weren't, you know, downplaying it. Um, and so it actually
00:31:06.320 got talked about in places you didn't expect like getting coffee with the COO. Um, and to me that kind, you know, I
00:31:13.120 think is a great thing. Um, people are aware that the change in in engineering
00:31:19.600 in our speed and our, you know, how we're doing things and our efficiency um is thanks to you know, Ruby on Rails,
00:31:25.600 right? they it's not just some blackbox thing and yeah engineers do their thing and blah blah blah like everybody in the
00:31:30.720 company is now kind of a part of this uh if they wanted to be or not but they are and they see the value and uh it's yeah
00:31:38.080 you know the heart's up there maybe I'm pushing it but uh it's talked about you know very positively at flexcar and uh
00:31:44.799 you know obviously very supportive of of what we're doing and going ahead
00:31:50.559 so when we started out last year again none of us knew Ruby on rails um my most exper experienced dev again Mr. Dan
00:31:57.519 Dunker is in the corner um is a year and three four months into his Ruby Unreal
00:32:02.559 journey. Um so we were relying very heavily on AI when we were going through this journey last year. Um and what we
00:32:09.679 were using uh was chat GPT and um
00:32:16.159 it's fine. Um and so what would happen is um you know it would hallucinate. We
00:32:22.080 definitely saw that. But the problem is, you know, like nowadays if it did it, you're like, "Yeah, yeah, you you're talking nonsense." At the time, you
00:32:28.240 don't know what you don't know, right? And so, we didn't know that it was sending us bad things. So, we we would waste an hour going down this path and
00:32:35.440 like, "Why won't this thing run?" So, the Sorry, really quick note. The the best thing ever was one of my senior devs sent me his chat with with Chat GTP
00:32:44.480 and it was like, "Hey, the original author of this code missed a few things and you know, but he's like, "That's
00:32:50.880 you. you're the original author of this code, you're yelling at yourself and it was like, oh, my apologies. Um, you
00:32:58.399 know, and so it was helpful in some regards. Uh, uh, we did we did co-pilot,
00:33:04.080 you know, for a while. Um, and that helped, you know, a little bit. Uh, but the real big game changer for us, you
00:33:09.840 know, and and I, uh, probably not surprising is this year, um, we started using cursor, maybe soon to be cloud
00:33:16.559 code, but for right now, you know, we're just trying to get people to use cursor. uh and the change has been night and day
00:33:22.320 right you know under obviously I I don't need to explain why for everybody here but you know the context thing has been
00:33:27.679 you know stellar um I think if we had cursor last year when we were doing the
00:33:33.200 migration wherever freedom is I don't know where he is we might have been able to hit the three months I think if we
00:33:38.799 had uh cursor or cloud code last year it like it is really uh been that
00:33:44.080 beneficial for us you know as we're doing things um takes away a lot of the the boiler plate. So again, I mentioned
00:33:50.080 before I'm a front end guy, right? Uh I uh I ignored this I mean I was I was
00:33:56.000 doing the the React side of this whole Ruby on Rails thing. I ignored the Rails side for a very long time uh until I
00:34:02.640 think I sent Freedom one of my PRs for like a migration. Um was very proud of myself. It was probably to like add one
00:34:09.679 column or something. Um but now because of cursor uh Dan's probably in his seat
00:34:14.960 chuckling because of cursor um I'm you know I've started getting into you know actually writing uh you know rail side
00:34:21.359 right so I've done a few PRs um probably not great but hey you know I'm learning
00:34:26.399 and I think for me the great thing is I can ask it to explain certain things to me you know so to use that you know kind
00:34:31.760 of rubber duck you know thing too of like if I have an idea and and I'm trying to you know talk through it I can you know talk to cursor as sad as that
00:34:38.720 sounds and it you know it really kind helps me, you know, kind of get an idea of, you know, am I going down the right
00:34:43.839 path or am I not? Um, but it's really for me kind of, you know, unlocked the ability for me to jump in there and not
00:34:49.919 feel like I'm I don't know what I'm doing even though I don't know what I'm doing. But I'm learning, you know, I am I am getting better. And I think um what
00:34:56.720 I have noticed is, you know, cursor in the beginning for us, you know, it could write pretty much production ready react
00:35:03.760 code pretty easily. It probably because it's been trained a ton on React. um it
00:35:09.359 struggled a little bit more for you know uh Ruby on Rails. It's getting better and I think you know we're adding
00:35:14.800 certain rules to it and and and you you know people have been great in the community like hey this has been working
00:35:20.240 for me. They put things up you can you can take them you know put it into your rule set uh to get your code to be in a
00:35:25.920 much better place uh than it was. Um so for us you know I think AI obviously is
00:35:30.960 going to continue you know we're just kind of getting started with it. I'm really excited to like where's it going to take us? um you know the speed
00:35:37.839 improvements you know it's it's you know on you know that part's great on the other hand I you know I don't think I'm
00:35:43.680 afraid of anyone you know losing our job at Flex Car because of AI uh we we kind of put those fears to rest um but it
00:35:50.880 really has kind of you know pushed us um you know to get further ahead um you know definitely gets rid of a lot of the
00:35:57.200 boilerplate stuff um you know helps us uh all of us you know from seniors down
00:36:02.880 to juniors um you know PR reviews tests, by the way. Although, uh, yeah, I'll
00:36:08.800 talk about that quick. Um, we chose mini test. Um, yeah, I know. Um, yeah. Uh,
00:36:16.000 which is cool. Uh, I liked, uh, I do want to move to RSpec at some point, only for me because it looks like just
00:36:21.680 or at least to me it feels like Jest, you know, from React. Um, but cursor every once in a while, even though we have like multiple rules, do not write
00:36:28.960 tests in RSpec. Um, it's better because we have like literally like probably three rules for it now. Uh but every
00:36:35.200 once in a while it's like here's your test in ourspec. Um not very helpful. Uh
00:36:40.800 but uh you know we uh we we you know we are very happy where we are in this
00:36:46.640 whole AI journey. Um and we have you know a mile you know miles and miles to go but um it's been it's been great for
00:36:52.800 us. So I think um I kind of alluded to this before. So our
00:36:59.359 our engineering team in the whole Java world was much bigger right? Um and
00:37:04.720 where we are now as an engineering team we are much smaller and I think you know when you when you have a smaller team um
00:37:12.000 there are certain things you need to pay attention to you know like career growth uh and making sure our junior devs and
00:37:17.760 you know mid mid-level you know devs um get the experience the exposure you know to to move up in their career um and I
00:37:25.200 think you know one of the cool things here you know everybody um you know
00:37:30.480 obviously jumped kind of had no choice jumped head first into this whole Ruby on Rails journey we did um you know for
00:37:36.720 you know right or wrong I think our junior devs jumped the hardest if that I don't know if you can jump harder but
00:37:42.720 you know they dove maybe faster into the into the deep end um you know kind of no fear um and it's really you know kind of
00:37:50.800 let them I think we we put a lot of pressure and you and maybe um you know
00:37:57.520 responsibility on our junior devs than maybe we we should but they do great um and I think it's, you know, part of that
00:38:04.000 though is because of Ruby on Rails where um we have a little bit more, I think, leeway, you know, there's, you know,
00:38:10.240 it's opinionated, you know, so like there are certain things they they're not going to be able to do um between
00:38:15.680 that and I think, you know, some of the AI stuff. It really kind of unlocks, you know, their growth, you know, and our
00:38:21.040 growth as an engineering team. Um, and I think, you know, I'm sure, you know, it
00:38:26.160 wasn't just Java alone. I'm not trying to like you know make fun of Java but it was definitely how we were using Java
00:38:31.680 and Flex Carb 4 where I think um it was a much more uh tougher journey I think
00:38:37.119 you know as a as an engineer uh along your career path to to get the experience to get the exposure um versus
00:38:43.760 now you know it's with a small team with Ruby on rails um you're getting exposed
00:38:48.800 to uh quite a lot um so
00:38:54.320 not everything along this journey has been uh you know, you know, unicorns and rainbows, right? Um, you should have
00:39:00.720 seen the midjourney pictures for for that one. Um, so, uh, this is the best I came up with. Um, and so we did struggle
00:39:08.560 with some things, you know, along the way. My water. Um,
00:39:14.000 uh, so yeah, obviously the the the RSpec mini test we already talked about. Um, some of the things that I think caught
00:39:20.320 us um we had to play some catch-up on um, you know, jobs, right? you know,
00:39:25.520 having jobs run. Um, I think we were also like multiple versions behind whoever good solid Q. Uh, and so that
00:39:31.839 wasn't helping anybody. Um, but we had to, you know, start to understand how do we, you know, take care of all these
00:39:38.800 jobs priority, figuring things out, um, you know, kind of, you know, along the
00:39:43.839 way and without knowing we were doing it wrong, uh, to begin with. And so we would kind of figure that out when
00:39:49.359 things started failing at like three in the morning, which is super fun. Um
00:39:56.079 the uh the one thing because I kind of asked the team, you know, hey, I'm doing this presentation, you know, what are
00:40:01.280 some things you want me to highlight for the stuff we struggled with? Uh pretty much every single dev was like it's
00:40:07.280 really easy to write N plus1 queries. Um highlight that a lot. Uh and and that's
00:40:14.400 true. Um uh I think uh so we use Sentry. Anyone from Sentry's here? Yay. Uh we're
00:40:20.960 using Sentry and Sentry has been great because it uh it calls those out for us. Um after they're in production um
00:40:28.160 because our that's not on that's not on Sentry, that's on us uh for how how our staging environment is right now. Um
00:40:34.960 we're going to fix that. I promise. Um but uh you know that I think is you know
00:40:41.119 thankfully I would say even with the N plus1 queries even with our Javaesque uh
00:40:47.839 Rails code um we are still pretty performant right and again I'm sure if a
00:40:53.599 lot of you looked at our codebase there would probably be parts that again you would want to hurt us saying all that
00:40:59.040 you know I think the really cool thing for us though has been we haven't faced that like performance penalty of like oh
00:41:04.480 you guys are a bunch of knuckleheads and now your stuff's really slow. Um it's it's just kind of handled it moved on um
00:41:10.560 and done great. So you know yeah we we do have N plus1 queries. We do try to kind of you know clean them up. Um
00:41:17.280 probably you know sim similar along the line is uh you know uh using scopes. Um
00:41:24.960 we don't use them as much as we should I think and so we try to build these things in memory without realizing it
00:41:30.480 and then uh you know trying to get everybody to kind of learn that along the way. Again, you find out when it's in production. Um, which is super cool.
00:41:37.920 But again, our site still runs, so you know, not not that horrific. Um,
00:41:43.520 uh, authentication, you know, I think, uh, you know, we're using device, I'm not saying deise was hard for us to
00:41:49.520 learn. Um, it was the, uh, maybe you guys will point at me and say, "H, we told you so." But when we had our React
00:41:55.440 separate, uh, you know, code repo in React trying to authenticate it against, you know, our Rails uh, repo, you know,
00:42:02.319 Rails back end. Um, there was some challenges. I'll say there's literally some parts of that codebase that says do
00:42:09.040 not change. I don't know why this works. We'll figure it out later. Um, but uh
00:42:14.800 but so we don't change it. Uh, and it's fine. And you know, it's it's great. Um,
00:42:21.280 so uh man, everyone says when you when you do one of these, you talk way faster. It's very true. I just looked at
00:42:28.400 the time. I was like, oh boy. Um, all right. So the good news is I have a few you can tell me too if you need me to
00:42:34.319 wrap this up anytime to get back that time. I will not be I will not be offended for any of these. So uh what
00:42:41.040 you know what do we go from here right? So now we're going to look at like the future right where are we going? So now
00:42:46.480 that we're here, we have this Ruby on Rails thing, you know, we we kind of have our, you know, front end, back end kind of sorted. You know what, you know,
00:42:53.520 what do we focus on, right? Um, and you know, that's not to say we don't have any things to clean up on like N
00:42:58.800 plus1's, but the really thing I think cool thing is this lets us start to
00:43:04.480 think about like where do we want flex car to go, right? not just like flex car engineering but like what things do we
00:43:10.720 want to unlock for flex car and really start we can start to architect those things you know work more with product
00:43:16.800 um we're not spending as much time you know putting out fires because you know something blew up at like 2 in the
00:43:21.920 morning or something like that uh that part alone has been great um you know it's not like we had a ton of those
00:43:28.560 trying to make it sound like flex car was on fire all the time in the Java world but we definitely had more of those kind of production issues um I'm
00:43:35.440 not trying to jinx anything so I'm actually not going to say anything out loud about how we haven't had that for a while uh now. But
00:43:42.560 when you when you know when you get through all that and you know we don't have to worry about those kind of things you can really start to to focus on like
00:43:49.200 the next layer the next level right and for us it's really this kind of like where do we want to architect you know
00:43:54.560 flex car obviously engineering is going to take us there along with product but you know how do we want flex car in a
00:44:01.599 year to look how do we want flex car in three years to look we know how we can get there right we don't have to worry
00:44:06.880 about like ah but we can't you know I got to write like five more services or you know or the you know we're not going
00:44:12.880 to have the performance to get you know we don't have to worry about any of that. Um, and again, I know it makes
00:44:18.560 sense, but yeah, you know, I think for half a second up there, you guys saw my my cursor window. Like, you know, I'm
00:44:24.079 running Flex Car on my laptop. It's super cool. Um, you know, again, I know that probably sounds weird for everyone
00:44:30.000 that's been using Ruby on Rails, but you know, coming from that AD microser uh world to this uh gamechanging.
00:44:38.480 Um, so, um, uh, Indiana Jones for anyone who doesn't get the reference, the, uh,
00:44:44.400 we do have tech debt and, uh, you know, it does, uh, it does pile up quicker
00:44:49.599 because I'm sure people are thinking, you guys have only been out for like a year. How much tech debt could you have? A lot. Um, I mean, not crazy amounts.
00:44:56.800 I'm not trying to make it sound horrible, but we do have things we need to, you know, clean up and kind of, you
00:45:03.119 know, along the way, you know, refactor, especially that Java code that we have laying around that's in Rails. Uh, and
00:45:09.520 lastly, you know, uh, we just want to keep learning, right? So, see, you know, where this whole Ruby on Rails journey
00:45:15.680 is going to take us. Actually, wait, I add one more. I like I want to use it because it's Ruby on Rails.
00:45:23.040 That's not me. That's midjourney. Don't can't yell at me.
Explore all talks recorded at RailsConf 2025
Manu Janardhanan
Christopher "Aji" Slater
Hartley McGuire
Yasuo Honda
Ben Sheldon
Chad Fowler
John Athayde
Mike Perham
+77