Balkan Ruby 2024

One engineer company with Ruby on Rails

Radoslav was the CTO of Product Hunt. He recently built Angry Buildings as the single technical person on the team. This talks is about how he did it all by himself.

Balkan Ruby 2024

00:00:07.759 I'm Radoslav. You can find me online as R Stankov pretty much everywhere.
00:00:14.480 I started a newsletter this year because I thought I could use the free time in my life.
00:00:21.080 All my slides are here; I will show a lot of links and information.
00:00:27.480 I noticed that people try to take photos, but I switch slides very quickly.
00:00:33.800 So, if you're missing something you want to capture, the URL is provided here.
00:00:41.320 As engineers, we always say, 'It depends.' Everything depends on context.
00:00:47.039 Let's start with some context. My company is called Angry Buildings, and it's not related to Angry Birds.
00:01:00.160 It is facility management software, specifically accounting software for facility management.
00:01:05.519 Actually, every software evolves into an ERP system if it lasts long enough.
00:01:12.759 We are transforming the ERP system for companies. It started as a side project.
00:01:18.240 Many people ask me how the idea originated. A few friends came to me with a proposal.
00:01:23.960 I initially thought it was a stupid idea. They returned with a much better idea.
00:01:30.960 I suggested what they needed to do, and this is how it came to fruition.
00:01:36.880 The project began three years ago. I held the title of CTO at my previous job.
00:01:42.000 Last year, I realized I was more excited to work on weekends than at my day job.
00:01:48.759 This is our team; most people have short titles.
00:01:54.759 As you can see, there's only one technical person on the team.
00:02:01.880 That's the Bulgarian way of being the only engineer in the company.
00:02:08.319 However, it's not just about that; in a business setting, there are several areas to manage.
00:02:14.280 There are customer pipelines, marketing, sales, and onboarding, especially for business software. You need to provide training and support.
00:02:22.680 These areas are usually not favored by developers.
00:02:29.319 Let's do a little quiz here: what scares us the most?
00:02:35.160 Is it a coffee machine that doesn't work? In my case, it can have too many buttons.
00:02:42.200 Another scary thing is when a PM says, 'This should be easy!' Or when someone calls, expecting you to have all the answers.
00:02:56.159 In those moments, I can’t help but think of a specific scene from a TV show.
00:03:03.400 But the thing is, my team handles these phone calls. They are the ones who speak with businesses that still prefer calling in the 2000s.
00:03:10.280 We move fast and have breakfast.
00:03:16.400 The project officially started on April 1st. Our first commit dates back to then.
00:03:22.680 We kept building, building, and building until we reached some business milestones.
00:03:29.479 Currently, we are in a default alive state, which means if we stop doing anything, the business remains operational.
00:03:35.160 My favorite metric is zero churn so far. We have not lost a single customer, which is fantastic.
00:03:42.880 We usually see a 5000% growth, but that's from one to two customers.
00:03:49.440 Right now, we manage around 30,000 apartments through our software.
00:03:55.160 Our company's lifecycle involved discovering something we call Product-Market Fit.
00:04:04.920 The key is that sales must become repeatable and scalable.
00:04:11.639 In a way, we want to create a formula that can be replicated by more salespeople.
00:04:18.240 However, achieving Product-Market Fit isn’t a one-time event. We find it can vary from one segment to another.
00:04:26.239 When building an MVP, the common advice is often misguided.
00:04:33.000 It's better to start with something that almost works and manually push it out until it's automated.
00:04:40.960 This often involves fixing bugs through the Rails console until the software operates seamlessly.
00:04:47.720 Ultimately, you will want to develop something that is clean and effective.
00:04:53.240 Regarding competition, surprisingly many companies still use pen and paper.
00:04:59.960 Others may utilize Excel or Google Sheets, which almost amounts to the same thing.
00:05:06.879 We also have competitors who seem like they haven't modernized in the last 10 years.
00:05:13.760 Our product journey initially focused on individuals managing their own buildings.
00:05:22.079 Over time, we pivoted to target companies because they have the resources.
00:05:29.960 We focused on what are called non-consumption companies, as these were the only ones talking to us.
00:05:37.040 Non-consumption companies typically used pen and paper and Excel, which meant adding our software was appealing.
00:05:45.239 Even if our software didn't cover all their needs, it still offered them a safer pathway to transition.
00:05:52.160 Our initial focus was on construction companies, given their prevalence in the market.
00:05:59.600 The market shifted, and we also targeted facility management companies that were just starting.
00:06:08.799 This approach allowed us to develop more features tailored to serve them and encouraged them to cancel their Microsoft subscription.
00:06:15.760 We focused on competitors once we believed our software was strong enough.
00:06:23.200 We identified growing companies in the facility management space since many competitors were still outdated.
00:06:30.239 We found that addressing the needs of growing companies was key.
00:06:38.120 However, a significant challenge is convincing stable companies to switch software.
00:06:48.760 Even though we can import their data and offer better features, many still resist change.
00:06:55.600 Mistakes were made during this journey, often resulting from chaotic decision-making.
00:07:01.680 One of my biggest mistakes involved incorrectly named database fields.
00:07:08.640 While fixing code is often straightforward, changing a database name can be challenging.
00:07:15.759 Even when there is a typo spanning a decade, no one seems eager to correct it.
00:07:22.000 Making a decision regarding the user model turned out to be quite technical.
00:07:28.800 On the business front, we tried to launch a service marketplace linked to our mobile application.
00:07:37.000 Every person living in the building is given access to a mobile app, but we lacked the necessary usage.
00:07:44.160 We tried to expand prematurely to Spain, which turned out to be an overcommitment.
00:07:50.640 Many mistakes occurred simply because we attempted things without a solid plan.
00:07:57.680 As one developer, I would often ship a singular pipeline.
00:08:06.160 The product growth is currently on an upward trajectory, moving us toward reaching early majorities.
00:08:12.640 Our next challenge is to convince companies to transition to our software.
00:08:19.440 Some words of wisdom: when starting a product, target businesses that aren't currently using anything.
00:08:25.920 That could mean replacing Excel with something they can easily implement into their workflows.
00:08:33.280 As a developer, you should be involved in sales, support, and onboarding.
00:08:42.080 Some of our biggest customers even have my personal phone number.
00:08:48.200 When you hear 'no' from potential clients, grab that feedback quickly and understand why they aren't interested.
00:08:56.160 One of our significant growth opportunities emerged when we learned about clients holding onto past data.
00:09:07.360 So we created an import feature that facilitated their transition.
00:09:14.680 Receiving precise problems rather than solutions from customers and sales is crucial.
00:09:22.240 This forms the basis of building better products that truly cater to their needs.
00:09:31.040 Having intuition in decision-making is vital for becoming an expert in any domain.
00:09:40.680 This intuition helps determine if a specific feature is applicable to only one client or if it's a broader need.
00:09:46.160 It's easy to get swept up in saying 'yes' to everything when trying to stay afloat.
00:09:54.319 Allow me to share three examples of how we address client needs.
00:10:02.840 Firstly, we have ePay in Bulgaria for paying facility bills like electricity.
00:10:10.160 One of our clients, managing over 200 buildings, requested the ability to import payments from this system.
00:10:15.999 This simplification saved them from spending days in Excel.
00:10:22.000 However, I had to create a straightforward solution despite the varied building names across different systems.
00:10:29.360 Thus, I generated an Excel template for the client to export and upload their data effortlessly.
00:10:36.760 It's about making life easier for them, even if it takes slightly longer.
00:10:43.920 Often, I find myself lacking intuition on how to best serve our customers.
00:10:51.200 I created a module called 'special cases' for unique requirements, allowing customized software adaptations.
00:10:57.560 This offers a quick overview of how many clients desire specific features.
00:11:04.440 Another example links back to our clients wanting to print documents.
00:11:10.960 I grew tired of creating PDFs and opted to let users select their desired settings.
00:11:16.560 This functionality became a favorite, often garnering incredible reactions from potential clients.
00:11:25.000 I realized that helping our customers is essential to ensuring our business's success.
00:11:31.560 Managing priorities as the sole developer necessitated careful organization.
00:11:38.560 The primary focus became reducing churn, followed by gaining new customers.
00:11:45.760 The final point is saving the company money, which often correlates with generating revenue.
00:11:52.960 Another key strategy is the 10-minute fix; small changes are usually highly valued by clients.
00:11:59.920 Additionally, Fridays are my time for bug fixing and technical maintenance.
00:12:07.240 This leads to weekly reviews of all sales, features, and support under a relaxed atmosphere.
00:12:14.600 Now, let's delve into more technical aspects. When I started the project, I faced the challenge of managing everything alone.
00:12:25.159 I had to oversee the management portal and mobile applications for both iOS and Android.
00:12:32.640 Our tech stack consists mainly of Ruby on Rails, with React Native used for mobile apps.
00:12:43.040 The majority of complexity resides in the Rails app, which handles essential business operations.
00:12:50.680 My domain model revolves around accounts, buildings, and apartments.
00:12:56.760 Rails facilitates aggregation; for instance, querying apartments under an account is straightforward.
00:13:03.360 Currently, I have more than 563 routes and 105 Active Record models in the codebase.
00:13:10.760 I've managed to run 2,176 tests in just three minutes, supporting three languages.
00:13:19.560 My focus has been on keeping things simple yet effective, avoiding unnecessary complexity.
00:13:27.560 For automation, I relied on the annotate gem to help track table names and indexes.
00:13:36.240 By minimizing dependencies and sticking to vanilla Rails, I've reduced development friction.
00:13:43.800 One essential component was ensuring internalization was in place from the project's inception.
00:13:51.560 Some features not officially documented in Rails needed custom solutions, which I promptly addressed.
00:13:57.560 I'm particularly fond of the Counter Culture gem for managing smart counter caches.
00:14:05.560 View components have also streamlined our ability to build and manage reusable UI elements.
00:14:13.560 For authorization, I utilize a DSL I built during my time at Product Hunt.
00:14:20.800 Setting permission levels allows us to grant or restrict actions for various user roles.
00:14:28.800 I leverage service objects when making decisions, keeping everything organized.
00:14:35.040 MiniForm is another gem I depend on for creating streamlined form validations.
00:14:42.960 Finally, I employ search objects for effective filtering and data retrieval.
00:14:50.720 Metadata organization keeps everything in its rightful place to avoid confusion.
00:14:57.760 I prefer structured layouts for easy navigation of the project's components.
00:15:04.320 Tests play an essential role in ensuring uptime and reliability.
00:15:11.760 Our end-to-end feature tests provide excellent coverage, ensuring all UI components function correctly.
00:15:18.000 Custom helpers simplify interactions and testing within our framework.
00:15:25.520 Thank you for your time! It's almost time for lunch, and I appreciate your attention.