Skip to main content
JK

Joel Kenville

Joel Kenville is a co-host of The Bike Shed podcast, where he explores software development practices with a focus on Ruby on Rails and web application architecture. His episodes cover practical engineering topics from HTTP Basic Auth security trade-offs to change management strategies for large-scale application migrations. Kenville brings a thoughtful approach to discussing how software teams can balance technical ideals with real-world constraints.

6episodes
1podcast

Featured On 1 Podcast

All Appearances

6 episodes

AI Summary

→ WHAT IT COVERS Joel and Stephanie examine software rewrite projects, exploring when rewrites make sense versus incremental refactoring, the hidden costs of starting fresh, and strategies for modernizing legacy applications without stopping active development. → KEY INSIGHTS - **Scope rewrites as refactors:** Instead of rewriting entire applications, bound changes to specific subsystems, modules, or classes. This transforms risky rewrites into manageable refactoring work that maintains existing behavior while improving internals, allowing teams to continue shipping features without disruption. - **The 90% done trap:** Development work represents roughly 30% of total effort, while 70% involves handling real user interactions, fixing unexpected bugs, and addressing edge cases discovered in production. Avoid demoing unmerged work or mocked features that create false impressions of progress. - **Prototype window opportunity:** Rewrites make sense for prototypes or proof-of-concept code with no test coverage, corrupted data models, or fundamental architectural flaws. Once real users depend on the application, rewrite costs increase exponentially while business justification decreases proportionally with user base growth. - **Change in place incrementally:** Introduce new architectural components gradually rather than stopping all development for a complete rewrite. Structure changes so each piece delivers immediate value—like making one section faster this week, another next week—rather than requiring full completion before seeing benefits. → NOTABLE MOMENT Joel shares his one regret about arguing against rewriting a prototype with corrupted database triggers and zero test coverage, realizing afterward that the two-week timeline would have delivered more value by rebuilding correctly in Rails from the start. 💼 SPONSORS [{"name": "WorkOS", "url": "https://workos.com"}, {"name": "Mailtrap", "url": "https://mailtrap.io"}] 🏷️ Software Rewrites, Legacy Modernization, Technical Debt, Refactoring Strategy

AI Summary

→ WHAT IT COVERS Stephanie and Joel explore how test suites serve purposes beyond verification: as learning tools for unfamiliar code, living documentation, code review aids, design feedback mechanisms, and accountability measures for shipping reliable features. → KEY INSIGHTS - **Tests as learning tools:** Writing tests for unfamiliar legacy code forces intimate understanding of edge cases and system behavior, making developers experts in complex areas teammates avoid. Backfilling test coverage reveals coupling issues faster than reading code alone. - **Dependency graph decomposition:** Break large features into leaf-node tasks with no blockers, ship each independently to production, then work backward to root. This approach transformed one risky multi-week initiative into 19 shippable PRs that maintained team velocity throughout. - **Test-first code review:** Reading test files before application code in pull requests provides context about intended behavior and edge cases, primes reviewers for what's coming, and increases confidence that last-minute changes didn't introduce breaking bugs before deployment. - **Tests enable experimentation:** A passing test suite acts as a safety net for trying multiple implementation approaches. Developers can discard entire code solutions while keeping tests, then attempt different designs knowing the specification remains constant and verifiable throughout iteration. → NOTABLE MOMENT Stephanie became the team expert on the most feared part of the codebase by methodically rewriting existing tests herself to understand complex, poorly documented code, transforming anxiety about an unfamiliar system into deep ownership and confidence. 💼 SPONSORS [{"name": "WorkOS", "url": "https://workos.com"}, {"name": "Mailtrap", "url": "https://mailtrap.io"}] 🏷️ Test-Driven Development, Code Review Practices, Technical Documentation, Dependency Management

AI Summary

→ WHAT IT COVERS Joel and Sally explore what constitutes actual skill in software development beyond syntax memorization, examining how critical thinking, information evaluation, and question-asking separate experienced developers from beginners in an AI-augmented world. → KEY INSIGHTS - **Error Message Analysis:** Reading error messages carefully reveals root causes versus surface symptoms. React tests showing undefined colors often indicate missing mocks rather than actual color problems, requiring context-based debugging skills beyond literal interpretation. - **Reference Lookup Evolution:** Experienced developers use Google and AI tools for reference lookups and solution exploration, not basic syntax. The skill lies in evaluating multiple Stack Overflow answers, recognizing security tradeoffs, and selecting solutions that compose well with existing code. - **TypeScript Confidence Trade-offs:** Type checkers eliminate entire classes of unit tests by guaranteeing nullability checks and data shape validation. This shifts testing focus from edge cases like nil handling to higher-level integration concerns, reducing test maintenance burden. - **Prompt Engineering Patterns:** Effective AI prompting requires asking for solution landscapes first, then narrowing based on constraints. Requesting approaches inspired by specific communities like Haskell unlocks alternative solution classes that generic prompts miss, leveraging fuzzy domain knowledge. → NOTABLE MOMENT Sally describes how TypeScript initially frustrated her until she recognized type definitions serve as inline documentation, eliminating the common Ruby problem of not knowing what object shape a method expects or returns without extensive code archaeology. 💼 SPONSORS [{"name": "Judo Scale", "url": "judoscale.com"}, {"name": "Scout Monitoring", "url": "scoutapm.com"}] 🏷️ TypeScript Development, Critical Thinking Skills, AI-Assisted Coding, Developer Learning Paths

AI Summary

→ WHAT IT COVERS Joel and Adji explore parallels between board game strategy and software development, examining how optimization problems, resource management, and team communication patterns translate between gaming and coding contexts. → KEY INSIGHTS - **Component extraction strategy:** Pull out React components aggressively when conditionals multiply, treating each card variant as a separate component rather than nesting logic within JSX soup to maintain single-layer abstraction and improve readability for future developers. - **Algebraic data types for analysis:** Model complex UI states using union and intersection types as an analysis tool, even without implementing them in code, to map out all possible component combinations and identify which parts can vary independently. - **Bottleneck identification framework:** Identify the limiting resource in any system first before optimizing, whether turns in a board game or database queries in production, since improving non-bottleneck resources yields zero performance gains regardless of effort invested. - **Linear versus exponential strategies:** Recognize when pursuing linear steady-progress approaches versus compounding exponential growth, then adjust game length accordingly—rush to end early with linear strategies before exponential competitors compound their advantages and overtake you. → NOTABLE MOMENT Joel realizes his board game analysis mirrors his software work exactly—applying Big O notation to strategy selection and flame graph thinking to resource bottlenecks—making connections between professional optimization skills and recreational problem-solving he hadn't consciously recognized before. 💼 SPONSORS [{"name": "Judo Scale", "url": "https://judoscale.com"}, {"name": "Scout Monitoring", "url": "https://scoutapm.com"}] 🏷️ React Architecture, Test Driven Development, Game Theory, Software Optimization

AI Summary

→ WHAT IT COVERS Joel and Adi explore strategies for managing large-scale application changes including framework upgrades, third-party vendor migrations, and database restructuring while maintaining zero downtime and preventing data corruption through incremental approaches. → KEY INSIGHTS - **Idempotent migrations:** Design data migrations to be safely retryable by using find-or-create patterns so running the task 50 times produces identical results to running once, enabling partial completion and recovery from failures without duplicating data. - **Dual-write strategy:** When restructuring databases, write to both old and new columns simultaneously while maintaining read-only status on deprecated columns, allowing incremental validation before final cutover and enabling safe rollback if issues emerge during transition periods. - **Lazy migration pattern:** For third-party service changeovers, trigger data conversions on-demand as users access their accounts rather than pre-migrating everything, reducing upfront work and allowing migrations to happen organically over time as traffic dictates. - **Forward-looking upgrades:** Adopt new framework features before major version upgrades by installing compatibility gems like strong parameters in Rails 3, making the eventual Rails 4 upgrade minimal since controllers already use the new patterns. → NOTABLE MOMENT A vendor changed their entire primary key scheme without providing ID mapping files, forcing implementation of a live detection system that identified when accounts needed migration and converted IDs on-the-fly as users accessed features during the cutover window. 💼 SPONSORS [{"name": "Judo Scale", "url": "judoscale.com"}, {"name": "Scout Monitoring", "url": "scoutapm.com"}] 🏷️ Database Migrations, Framework Upgrades, Change Management, Rails Development

AI Summary

→ WHAT IT COVERS The episode examines HTTP Basic Auth implementation, covering database connection pool configuration for Sidekiq workers, CSRF vulnerability mitigation strategies, and security trade-offs when using browser-based authentication versus token-based API authentication systems. → KEY INSIGHTS - **Sidekiq Connection Pooling:** Set database connection pool to 100-200 instead of matching concurrency exactly per dyno. This eliminates configuration complexity across environments since pools define maximum connections allowed, not connections created at boot time. - **Basic Auth CSRF Protection:** HTTP Basic Auth requires CSRF tokens on destructive endpoints because browsers automatically resend credentials on every request. Third-party sites can trigger authenticated requests via JavaScript or image URLs, enabling cross-site attacks even with CORS policies active. - **PG Bouncer Architecture:** Implement PG Bouncer as a global Postgres connection pool when scaling beyond basic setups. This centralizes connection management across all dynos and releases connections faster than per-dyno Active Record pools, improving IO efficiency at scale. - **API Authentication Safety:** APIs using OAuth tokens or bearer authentication don't need CSRF protection because tokens aren't automatically sent by browsers. Basic Auth and cookie-based sessions require CSRF tokens unless same-site cookie restrictions prevent cross-origin credential transmission. → NOTABLE MOMENT A Twitch streamer playing Mario 64 captured footage of the character instantly teleporting between platforms. The gaming community's best explanation attributes this visual glitch to a cosmic ray flipping a bit in memory during gameplay. 💼 SPONSORS [{"name": "Judo Scale", "url": "judoscale.com"}, {"name": "Scout Monitoring", "url": "scoutapm.com"}] 🏷️ HTTP Authentication, Database Connection Pooling, CSRF Security, Sidekiq Configuration

Explore More

Never miss Joel Kenville's insights

Subscribe to get AI-powered summaries of Joel Kenville's podcast appearances delivered to your inbox weekly.

Start Free Today

No credit card required • Free tier available