Studies

Insights & Learnings

Notes and reflections.

Contents
Tech Leadership2024

Leading Engineering Teams: From Individual Contributor to Co-founder

Transitioning from writing code to building teams taught me that technical leadership is about enabling others, not being the smartest person in the room.

When I co-founded TechBros in 2019, I thought leadership meant making all the technical decisions. I was wrong.

Empowerment over control became my mantra. The best engineers don't need micromanagement—they need clear goals, the right tools, and trust. I learned to step back and let my team make decisions, even when I thought I knew better.

Technical debt is a leadership problem. As a leader, you're responsible for balancing speed and quality. Shipping fast is important, but so is maintaining code quality. We established code review processes, automated testing requirements, and regular refactoring sprints. The result? Fewer bugs, faster development, and happier engineers.

Communication is everything. Technical teams often struggle with communication, especially with non-technical stakeholders. I learned to translate complex technical concepts into business value. When proposing a new architecture, I explain it in terms of cost savings, reliability improvements, and faster feature delivery.

Building culture matters more than building features. A team that trusts each other, shares knowledge, and celebrates failures as learning opportunities will outperform a team of rockstars working in isolation.

The hardest lesson? Sometimes the best code is code you don't write. As a leader, your job is to say "no" to unnecessary complexity, to simplify systems, and to help your team focus on what actually matters.

Founding Startups2024

Co-founding Three Companies: What I Learned About Building from Scratch

From TechBros to FraudFlow.ai to Buildra Labs—each startup taught me different lessons about product-market fit, team building, and technical execution.

I've co-founded three companies in the past 5 years. Each one taught me something different about what it takes to build something from nothing.

TechBros (2019): My first co-founding experience taught me that execution beats ideas. We had a clear vision, but execution was messy. I learned to prioritize ruthlessly, to say no to features that didn't move the needle, and to focus on solving real problems for real customers.

FraudFlow.ai (2023): This taught me about technical depth. Building an AI platform that processes millions of transactions requires deep technical expertise. I learned to balance innovation with reliability, to build systems that scale, and to never compromise on quality when lives (or money) are at stake.

Buildra Labs (2024): My latest venture taught me about experimentation. As an R&D lab, we have the freedom to explore emerging technologies without the pressure of immediate product-market fit. This taught me the value of learning fast, failing fast, and building prototypes that validate assumptions.

Common lessons across all three:

- Start with the problem, not the solution. Every successful product solves a real problem. Talk to customers, understand their pain points, and build something they'll actually use.

- Team matters more than idea. A great team with a mediocre idea will outperform a mediocre team with a great idea. Hire for culture fit, technical excellence, and growth mindset.

- Technical debt compounds. In startups, you're always moving fast. But ignoring technical debt will slow you down eventually. Balance speed with quality—it's not binary.

- Distribution is harder than building. Building a product is hard, but getting customers is harder. Think about distribution from day one.

The biggest realization? Co-founding isn't about being the smartest person—it's about building the right thing, with the right people, at the right time.

Tech Leadership2024

How Reading Philosophy Helped Me Build Tech and Manage Teams

Stoicism, existentialism, and ancient wisdom aren't just for academics—they're practical tools for making better technical decisions and leading engineering teams.

When I started reading philosophy seriously, I didn't expect it to change how I write code or manage teams. But it did.

Stoicism taught me about control. Marcus Aurelius wrote about focusing on what you can control and accepting what you can't. In tech, this translates perfectly. You can't control production incidents, but you can control how you prepare for them. You can't control team dynamics, but you can control how you communicate and set expectations. This mindset shift reduced my stress and improved my decision-making.

Existentialism gave me clarity on priorities. Sartre's idea that "existence precedes essence" means we define ourselves through our choices. In engineering, every technical decision is a choice that shapes your system's essence. Reading existentialist philosophy made me more intentional about architectural decisions. I started asking: "What does this choice say about what we value?" Is it speed over quality? Innovation over stability? These questions help me make better trade-offs.

Ancient wisdom on systems thinking. Reading about Aristotle's concept of "telos" (purpose) changed how I think about system design. Every component should have a clear purpose. If you can't explain why something exists, it probably shouldn't. This principle has helped me simplify complex systems and remove unnecessary abstractions.

Philosophy and team management. The Socratic method—asking questions rather than giving answers—transformed how I lead. Instead of telling engineers what to do, I ask questions that help them discover solutions. This builds confidence, improves problem-solving skills, and creates a culture of learning.

Ethics in technical decisions. Reading about utilitarianism and deontology made me think more carefully about the ethical implications of technical choices. When building fraud detection systems, we're making decisions that affect real people's lives. Philosophy gave me frameworks to think through these implications more carefully.

The unexpected benefit? Philosophy taught me to think in first principles. When debugging a complex system or designing architecture, I strip away assumptions and build from fundamental truths. This approach has saved me countless hours and led to better solutions.

Reading philosophy isn't about becoming an academic—it's about developing better mental models for thinking through complex problems. And in tech, that's everything.

ML/AI2024

Building Production-Ready AI Systems: Lessons from FraudFlow.ai

When processing millions of transactions in real-time, your ML models need to be fast, reliable, and explainable. Here's what I learned building an AI-powered fraud detection platform.

Building an AI system that works in a lab is one thing. Building one that processes millions of transactions in real-time, maintains 99.9% uptime, and provides explainable decisions is entirely different.

At FraudFlow.ai, we faced the classic challenge: how do you deploy ML models that are both accurate and production-ready? The answer isn't just better algorithms—it's better engineering.

Real-time inference at scale requires careful architecture. We built our pipeline using event-driven microservices, allowing us to scale inference horizontally. Each transaction gets processed through multiple model ensembles, with fallback mechanisms that ensure we never drop a request.

Model explainability became crucial for enterprise clients. When a transaction is flagged, stakeholders need to understand why. We implemented SHAP values and feature importance tracking, making our "black box" models transparent.

Continuous learning is where many AI systems fail. Models drift over time, and fraud patterns evolve. We built automated retraining pipelines that monitor model performance and trigger updates when accuracy drops below thresholds.

The biggest lesson? AI is 20% algorithms and 80% infrastructure. Your model might be state-of-the-art, but if it can't handle production load, it's useless.

DevOps2024

CI/CD That Actually Works: Beyond the Tutorials

After deploying 50+ projects, I've learned that good CI/CD isn't about fancy tools—it's about reliability, speed, and developer experience.

Most CI/CD tutorials show you how to deploy a "Hello World" app. Real-world DevOps is messier, and that's where the real learning happens.

Speed matters, but reliability matters more. A pipeline that fails 5% of the time will waste more developer hours than a slow one that always works. We prioritize deterministic builds, comprehensive testing, and rollback strategies over shaving seconds off deployment time.

Infrastructure as Code isn't optional anymore. At TechBros, we manage everything through Terraform and Ansible. When a server fails at 2 AM, you don't want to be manually configuring replacements. Our infrastructure is version-controlled, tested, and reproducible.

Monitoring and observability separate good DevOps from great DevOps. We use Prometheus, Grafana, and custom dashboards to track everything—from API response times to database connection pools. When something breaks, we know within seconds, not hours.

Developer experience is often overlooked. A good CI/CD pipeline should make developers' lives easier, not harder. Fast feedback loops, clear error messages, and automated rollbacks reduce cognitive load and let engineers focus on building features.

The key insight? DevOps isn't about tools—it's about culture. Automate everything that can be automated, monitor everything that matters, and always have a plan B.

Development2024

Clean Code in Production: Practical Patterns from 9 Years of Engineering

Clean code isn't about following every design pattern—it's about writing code that your future self (and your teammates) will thank you for.

After 9+ years of writing production code, I've seen what works and what doesn't. Here are the patterns that actually matter.

Testability drives good design. When you write tests first (or at least with tests in mind), you naturally create better abstractions. Functions become smaller, dependencies become explicit, and coupling decreases. If a function is hard to test, it's probably poorly designed.

Naming is 80% of readability. A well-named function or variable is self-documenting. `processTransaction()` is better than `doStuff()`. `isFraudulentTransaction()` is better than `check()`. Spend time on names—they're the most important comments you'll write.

DRY, but not too DRY. Don't Repeat Yourself is good advice, but premature abstraction is worse than duplication. If two pieces of code are similar but serve different purposes, duplication might be fine. Abstract when you see a third use case, not before.

Error handling is part of the API. How your code fails is as important as how it succeeds. Use Result types, throw meaningful exceptions, and always log context. When something breaks in production, good error messages save hours of debugging.

Code reviews are learning opportunities. Every review is a chance to share knowledge, catch bugs, and improve code quality. Be constructive, ask questions, and explain your reasoning. The goal isn't to prove you're right—it's to make the codebase better.

The bottom line? Clean code isn't about perfection—it's about maintainability. Write code that's easy to understand, easy to test, and easy to change. Your future self will thank you.

System Architecture2024

Why System Architecture Matters the Most

After building systems that process millions of transactions, I've learned that architecture isn't just about code—it's about everything.

I've seen too many projects fail because of poor architecture. Not because the code was bad, not because the team wasn't talented, but because the system design couldn't handle the requirements.

Architecture determines scalability. You can write the cleanest code in the world, but if your architecture can't scale horizontally, you're stuck. At FraudFlow.ai, we process millions of transactions daily. If we had built a monolithic system, we'd be constantly firefighting. Instead, we built an event-driven microservices architecture that scales independently. Each service can handle its own load, and we can scale what needs scaling without touching the rest.

Architecture determines reliability. A well-architected system fails gracefully. It has circuit breakers, retries, fallbacks, and monitoring. A poorly architected system fails catastrophically. When one component goes down, everything goes down. I've learned this the hard way—architecture is your insurance policy against production incidents.

Architecture determines development speed. Good architecture makes it easy to add features. Bad architecture makes every change a nightmare. When components are loosely coupled and well-defined, engineers can work independently. When everything is tightly coupled, every change requires coordination across the entire team. The difference in development velocity is dramatic.

Architecture determines cost. Poor architecture leads to over-provisioning, inefficient resource usage, and technical debt that compounds over time. Good architecture optimizes for cost from day one. At TechBros, we've saved hundreds of thousands of dollars by choosing the right architecture patterns—event-driven systems that scale to zero when not in use, caching strategies that reduce database load, and data partitioning that keeps queries fast.

Architecture determines team happiness. Engineers hate working with poorly architected systems. It's frustrating, demotivating, and leads to burnout. A well-architected system is a joy to work with. It's predictable, understandable, and makes engineers feel productive. This isn't just about code quality—it's about team retention and morale.

The hardest lesson: You can't fix architecture later. You can refactor code, you can optimize queries, you can add caching. But changing fundamental architecture requires rebuilding the system. That's why I spend so much time on architecture upfront. It's the foundation everything else is built on.

The bottom line? Architecture isn't a nice-to-have—it's the difference between a system that works and a system that doesn't. Get it right, and everything else becomes easier. Get it wrong, and you'll spend years paying for it.