Best of LobstersDecember 2025

  1. 1
    Article
    Avatar of lobstersLobsters·22w

    I’m a former CTO. Here is the 15 sec coding test I used to instantly filter out 50% of unqualified applicants. – Jose Zarazua

    A former CTO shares a simple coding screening question used to filter job applicants. The test presents basic code logic that qualified developers can solve mentally in seconds, while unqualified candidates resort to copy-pasting into interpreters or AI tools. The question includes a hidden character that produces different results when copy-pasted versus solved manually. Results showed 50% of applicants used automated tools, 47% answered correctly, and 3% answered incorrectly, effectively halving the candidate pool requiring deeper review.

  2. 2
    Article
    Avatar of lobstersLobsters·24w

    Vanilla CSS is all you need

    Modern CSS has evolved to include native variables, nesting, container queries, and advanced features like :has() and color-mix(), making build tools and preprocessors unnecessary for many projects. An analysis of three production applications from 37signals (Campfire, Writebook, and Fizzy) reveals a consistent nobuild CSS architecture using OKLCH colors, character-based spacing, semantic component classes with minimal utilities, and progressive adoption of cutting-edge CSS features. The approach demonstrates that vanilla CSS can handle real-time chat, publishing platforms, and project management tools with 14,000 lines across 105 files, achieving sophisticated interactions like animated dialogs, dynamic theming, and stateful UI without JavaScript or build steps.

  3. 3
    Article
    Avatar of lobstersLobsters·24w

    Use Python for Scripting!

    Python 3 offers significant advantages over shell scripts for automation tasks, particularly for cross-platform compatibility. While Bash scripts often fail between Linux and Mac due to GNU vs BSD tool differences, Python's standardized library works consistently across systems. Python provides better readability with human-readable method names, a comprehensive standard library covering JSON, HTTP, and data structures, and is pre-installed on most machines. The article demonstrates practical examples comparing Bash's cryptic syntax with Python's clearer alternatives, recommending Python for scripts that grow beyond 10-20 lines or become difficult to maintain.

  4. 4
    Article
    Avatar of lobstersLobsters·22w

    Go ahead, self-host Postgres

    Self-hosting Postgres is more practical than cloud providers suggest. The author shares two years of experience running self-hosted Postgres serving millions of daily queries with minimal operational overhead (30 minutes monthly). Managed services like AWS RDS run standard Postgres with operational tooling, but at significant markup. Self-hosting offers better performance tunability, lower costs (dedicated servers cost less than equivalent RDS instances), and comparable reliability. The article provides specific configuration guidance for memory, connections, storage, and WAL settings, plus realistic time estimates for maintenance tasks. Self-hosting makes sense for most teams between complete beginners and enterprise-scale operations requiring dedicated database engineers.

  5. 5
    Article
    Avatar of lobstersLobsters·23w

    Gin is a very bad software library

    Gin is criticized as an overly complex Go web framework with massive bloat compared to the standard library. The framework requires over 1 million lines of code and 55MB of dependencies to accomplish what net/http does in 25,000 lines. Its API design violates Unix philosophy with enormous interfaces (gin.Context has 100+ methods), creates unnecessary abstraction layers that obscure control flow, and makes migration away nearly impossible once adopted. The article demonstrates how Gin's complexity provides no real benefit over using Go's standard library directly, while significantly increasing binary size, compilation time, and cognitive overhead.

  6. 6
    Article
    Avatar of lobstersLobsters·21w

    Goodbye SASS

    A developer shares their experience migrating from SASS to native CSS after modern features like nesting became widely supported. They replaced SASS with simple file concatenation and esbuild for minification, reducing critical dependencies. The decision prioritizes long-term maintainability over short-term optimization, as esbuild is optional for minification while SASS was required for compilation. The approach reflects lessons from maintaining a website for over 30 years, emphasizing the importance of choosing tools based on what happens when they disappear.

  7. 7
    Article
    Avatar of lobstersLobsters·22w

    You Can't Opt-Out of Accessibility

    Web accessibility is a fundamental requirement, not an optional feature. The industry has deprioritized accessibility in favor of developer convenience, treating it as an afterthought rather than a core responsibility. Legal mandates like the EAA and ADA have led to checkbox compliance rather than genuine improvement. Accessible design benefits everyone through universal design principles like captions, alt text, and intuitive interfaces. Real accessibility requires hiring professionals, integrating accessibility into every development phase, testing with actual users of assistive technologies, and recognizing it as everyone's responsibility. The human cost of inaccessible products is severe for people with disabilities who face physical exhaustion and exclusion from digital experiences.

  8. 8
    Article
    Avatar of lobstersLobsters·20w

    A SOLID Load of Bull

    A critical examination of the SOLID principles in object-oriented programming. The Liskov substitution principle is endorsed as mathematically sound and universally applicable. The open-closed principle is deemed obsolete in modern languages with proper tooling. The single-responsibility, interface segregation, and dependency inversion principles are criticized as misguided heuristics that lead to over-engineered code. The author argues for focusing on module depth (small interfaces with substantial implementations) rather than blindly following SOLID, and advocates injecting dependencies only when genuinely necessary rather than as default practice.

  9. 9
    Article
    Avatar of lobstersLobsters·21w

    The HTML Elements Time Forgot

    HTML has evolved significantly since 1993, leaving behind numerous obsolete elements that were once part of the standard. This exploration covers deprecated tags like <marquee>, <bgsound>, framesets, various code display elements (<xmp>, <listing>, <plaintext>), <spacer>, <keygen>, <nextid>, <isindex>, and <dir>. Each represented experiments in web development that addressed specific needs of their era, from background sounds and frame-based layouts to primitive search functionality and cryptographic key generation. While most are no longer supported or have modern equivalents, they illustrate how the web platform evolved through trial and error, with backward compatibility sometimes preserving these relics even after deprecation.

  10. 10
    Article
    Avatar of lobstersLobsters·24w

    In defense of lock poisoning in Rust · sunshowers

    Lock poisoning in Rust detects when a thread panics while holding a mutex, preventing silent data corruption. When a panic occurs during a critical section, the mutex is marked poisoned, causing subsequent lock attempts to fail. This mechanism is crucial because panics can leave shared data in inconsistent states. The author argues against proposals to remove poisoning by default, advocating instead for making lock() automatically panic on poison while maintaining safety. The piece explores how unexpected cancellations—both from panics and async future cancellations—can violate mutex invariants, and why detection through poisoning is more important than recovery.

  11. 11
    Article
    Avatar of lobstersLobsters·22w

    Please Just Fucking Try HTMX

    HTMX offers a middle ground between raw HTML limitations and JavaScript framework complexity. By adding HTML attributes that trigger server requests and swap in HTML responses, you can build interactive web apps without bundlers, state management, or massive dependencies. A case study shows a company reduced their codebase by 67% and improved performance by switching from React to HTMX. The approach works best for typical CRUD apps, dashboards, and forms—not highly interactive applications like Google Docs. The core idea: let the server return HTML fragments and use hypermedia architecture as originally intended.

  12. 12
    Article
    Avatar of lobstersLobsters·25w

    ty

    ty is a new Python type checker written in Rust that emphasizes speed. It can be run via uvx or installed directly, and checks Python files in a project directory for type errors. The tool automatically discovers virtual environments and installed packages, with configuration options available through CLI commands. An online playground is available for quick testing.

  13. 13
    Article
    Avatar of lobstersLobsters·21w

    Garbage collection in Rust got a little better

    The dumpster garbage collection library for Rust has been updated with significant improvements after two years. Key enhancements include making the Trace trait dyn-compatible to support trait objects inside Gc pointers, enabling dynamic dispatch while maintaining compile-time performance guarantees. A new_cyclic function simplifies creating self-referential garbage-collected structures by using a dead Gc sentinel approach that gets rehydrated after construction. These changes make dumpster more flexible and ergonomic for handling cyclic data structures and graph algorithms in Rust.

  14. 14
    Article
    Avatar of lobstersLobsters·21w

    Package managers keep using git as a database, it never works out

    Git repositories initially seem ideal for package registries with built-in version control and distributed architecture, but major package managers like Cargo, Homebrew, CocoaPods, and Go modules all eventually abandoned git-based indexes due to performance problems. As registries grow, git's filesystem limitations cause slow clones, expensive delta resolution, and CI bottlenecks. The pattern is consistent: start with git, hit scaling issues around directory limits and cross-platform compatibility, implement workarounds like sharding, then migrate to HTTP-based protocols or CDNs. Git lacks database features like constraints, indexes, and efficient point queries that package registries actually need.

  15. 15
    Article
    Avatar of lobstersLobsters·21w

    pre-commit hooks are fundamentally broken

    Pre-commit hooks are fundamentally flawed because they run on the working tree instead of the index, fail during rebases and interactive operations, and break workflows where commits are used for local state management. They can't handle commits without relevant files, run on branches being rebased, and create friction when dealing with code that predates the hook. Pre-push hooks are a better alternative as they avoid these issues while still providing automated checks before code is shared.

  16. 16
    Article
    Avatar of lobstersLobsters·23w

    Text Editors Should Be Worse

    Auto-completion features in text editors create frustrating inconsistencies across different tools. The author argues for simpler default behavior that matches basic text inputs like HTML textareas, particularly criticizing automatic quote pairing and cursor movement. They propose a NO_AUTOINPUT environment variable to disable these "smart" features by default, allowing developers to maintain consistent muscle memory across all text input contexts.