<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: 👨‍💻Pierre-Henry ✨</title>
    <description>The latest articles on Forem by 👨‍💻Pierre-Henry ✨ (@pierre).</description>
    <link>https://forem.com/pierre</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F87903%2Fa1ab22ac-c90c-4af4-8268-23129389aa6f.jpeg</url>
      <title>Forem: 👨‍💻Pierre-Henry ✨</title>
      <link>https://forem.com/pierre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pierre"/>
    <language>en</language>
    <item>
      <title>Taking a Break from Dev.to (This is Why)</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sun, 18 Jan 2026 02:40:25 +0000</pubDate>
      <link>https://forem.com/pierre/taking-a-break-from-devto-37ep</link>
      <guid>https://forem.com/pierre/taking-a-break-from-devto-37ep</guid>
      <description>&lt;p&gt;After sharing posts here about AI, best engineering practices, and building scalable products, I'm stepping back from content creation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Happening?
&lt;/h3&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/iMDLYVUkuIA"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;&lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;Pierre-Henry&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Keep learning. Keep researching. Keep practicing. Keep growing!&lt;/em&gt; 🚀&lt;/p&gt;

&lt;p&gt;🏁 Follow my Software Engineering Journey on &lt;a href="https://substack.com/@pierrehenry/" rel="noopener noreferrer"&gt;PierreHenry.Dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Zero-Downtime Deployment &amp; Canary Release</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sun, 28 Dec 2025 10:42:11 +0000</pubDate>
      <link>https://forem.com/pierre/zero-downtime-deployment-canary-release-539m</link>
      <guid>https://forem.com/pierre/zero-downtime-deployment-canary-release-539m</guid>
      <description>&lt;p&gt;Let's speak about the &lt;strong&gt;Zero-Downtime Deployment&lt;/strong&gt;, a crucial concept for modern applications! Zero-downtime deployment ensures to keep everything running smoothly without interrupting the service while releasing new major changes to the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Zero-Downtime Deployment
&lt;/h2&gt;

&lt;p&gt;Zero-downtime deployment means deploying new application versions to production without any service interruption. Users continue using your application normally while updates roll out in the background.&lt;/p&gt;

&lt;p&gt;The core principle is maintaining service availability throughout the entire deployment process. This approach represents the best possible deployment scenario since teams can introduce new features and fix bugs without causing outages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blue-Green Deployment
&lt;/h2&gt;

&lt;p&gt;Blue-Green deployment is one of the most straightforward approaches to zero-downtime deployment. The concept is simple despite its colorful name.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Blue-Green Deployment Works
&lt;/h3&gt;

&lt;p&gt;The strategy involves running two identical production environments simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blue Environment&lt;/strong&gt;: Currently serves live traffic with the existing version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green Environment&lt;/strong&gt;: Receives the new version deployment and testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deployment process follows these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preparation&lt;/strong&gt;: Your blue environment serves production traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Create an identical green environment and deploy the new version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Run comprehensive smoke tests and sanity checks on the green environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traffic Switching&lt;/strong&gt;: Redirect traffic from blue to green once confident in the new version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Keep both environments running temporarily for quick rollback if needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup&lt;/strong&gt;: Decommission the blue environment after confirming stability&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Traffic Migration Strategies
&lt;/h3&gt;

&lt;p&gt;When transitioning from blue to green, you have two primary approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Immediate Switch&lt;/strong&gt;: Redirect all traffic at once to the new environment. This approach is faster but carries higher risk if issues arise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gradual Migration&lt;/strong&gt;: Start by routing a small percentage of traffic to the green environment, gradually increasing the load as confidence grows. This method provides better risk mitigation and allows for real-world testing under production conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blue-Green Deployment Checklist
&lt;/h3&gt;

&lt;p&gt;For successful blue-green deployments, maintain this checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Both environments are operational and properly configured&lt;/li&gt;
&lt;li&gt;[ ] Comprehensive testing completed on the new environment&lt;/li&gt;
&lt;li&gt;[ ] Traffic routing mechanism is ready and tested&lt;/li&gt;
&lt;li&gt;[ ] Monitoring and alerting systems are in place&lt;/li&gt;
&lt;li&gt;[ ] Rollback procedures are documented and tested&lt;/li&gt;
&lt;li&gt;[ ] Database migrations are compatible with both versions&lt;/li&gt;
&lt;li&gt;[ ] Load balancer configuration is updated appropriately to adjust the traffic accordingly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Canary Releases: Risk-Controlled Deployment
&lt;/h2&gt;

&lt;p&gt;Canary releases offer a more sophisticated approach to risk management during deployments than blue-green deployment alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Canary Release Philosophy
&lt;/h3&gt;

&lt;p&gt;Named after canaries used in coal mines to detect dangerous gases, canary releases expose new software versions to a small, controlled subset of users before full deployment. This strategy identifies potential issues early while minimizing the impact of any problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing Canary Releases
&lt;/h3&gt;

&lt;p&gt;The canary release process follows these stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initial Deployment&lt;/strong&gt;: Deploy the new version alongside the existing one, but route no user traffic to it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selective Exposure&lt;/strong&gt;: Begin routing a small percentage of users to the new version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring and Analysis&lt;/strong&gt;: Carefully monitor both business metrics and operational indicators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gradual Expansion&lt;/strong&gt;: Progressively increase the user base exposed to the new version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Rollout&lt;/strong&gt;: Migrate all users to the new version once confidence is established&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup&lt;/strong&gt;: Remove the old version after confirming stability&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  User Selection Strategies
&lt;/h3&gt;

&lt;p&gt;Choosing which users see the new version is crucial for effective canary releases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Random Sampling&lt;/strong&gt;: Select users randomly, providing an unbiased sample of your user base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal Users First&lt;/strong&gt;: Deploy to employees and internal stakeholders before external users, allowing for thorough testing in a controlled environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demographic-Based Selection&lt;/strong&gt;: Choose users based on specific characteristics, geographic location, or usage patterns that align with your testing objectives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geographic Rollout&lt;/strong&gt;: In distributed systems, deploy to specific regions or data centers before global rollout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Canary Strategies
&lt;/h3&gt;

&lt;p&gt;Large-scale organizations often employ sophisticated canary approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Stage Canaries&lt;/strong&gt;: Companies like Facebook use multiple canary stages, starting with internal employees who have feature flags enabled to detect issues early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partition-Based Deployment&lt;/strong&gt;: Instead of user-based routing, deploy to specific service instances, geographic regions, or business units.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capacity Testing&lt;/strong&gt;: Use canary releases to validate performance characteristics under real production load without risking the entire user base.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canary Releases vs. A/B Testing
&lt;/h2&gt;

&lt;p&gt;While canary releases and A/B testing share similar technical implementations, they serve different purposes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canary Releases&lt;/strong&gt; focus on risk mitigation and detecting regressions or operational issues with new software versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A/B Testing&lt;/strong&gt; aims to validate hypotheses about user behavior and business metrics using different feature variants.&lt;/p&gt;

&lt;p&gt;Mixing these concerns can interfere with results and create confusion. A/B tests typically require days or weeks to achieve statistical significance, while canary rollouts should complete within hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Complexity and Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Version Management
&lt;/h3&gt;

&lt;p&gt;Both blue-green and canary deployments require managing multiple software versions simultaneously. While this increases operational complexity, the benefits typically outweigh the costs. Best practices include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimizing the number of concurrent versions in production&lt;/li&gt;
&lt;li&gt;Implementing robust version tracking and monitoring&lt;/li&gt;
&lt;li&gt;Automating deployment and rollback procedures&lt;/li&gt;
&lt;li&gt;Maintaining clear documentation for each version&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database Considerations
&lt;/h3&gt;

&lt;p&gt;Database schema changes present unique challenges in zero-downtime deployments. The Parallel Change pattern offers an effective solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Expand&lt;/strong&gt;: Modify the database to support both old and new application versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrate&lt;/strong&gt;: Deploy the new application version while maintaining backward compatibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract&lt;/strong&gt;: Remove support for the old version once migration is complete&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach ensures database compatibility throughout the deployment process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client-Side Applications
&lt;/h3&gt;

&lt;p&gt;Deploying client-side applications (mobile apps, desktop software) presents additional challenges since update timing is beyond your control. Strategies include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using feature flags to control functionality rollout&lt;/li&gt;
&lt;li&gt;Maintaining backward compatibility for extended periods&lt;/li&gt;
&lt;li&gt;Implementing graceful degradation for unsupported client versions&lt;/li&gt;
&lt;li&gt;Monitoring client version distribution to inform deprecation decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Infrastructure Requirements
&lt;/h3&gt;

&lt;p&gt;Successful zero-downtime deployments require:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;: Required for traffic routing between environments. Solutions include cloud-based load balancers, nginx, HAProxy, or service mesh technologies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring and Observability&lt;/strong&gt;: Comprehensive monitoring of both business and operational metrics is crucial for detecting issues early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Manual processes are error-prone and slow. Invest in automation for deployments, testing, and rollbacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure as Code&lt;/strong&gt;: Ensure environments can be reliably reproduced and configured consistently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud vs. On-Premises
&lt;/h3&gt;

&lt;p&gt;Cloud platforms offer managed services that simplify zero-downtime deployments:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt;: Route 53 for DNS routing, Application Load Balancer for traffic distribution, and services like CodeDeploy for automated deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other Cloud Providers&lt;/strong&gt;: Similar services are available across major cloud platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On-Premises&lt;/strong&gt;: Requires more manual setup but remains achievable with proper tooling and processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices and Recommendations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Planning and Preparation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Design applications with zero-downtime deployment in mind from the beginning&lt;/li&gt;
&lt;li&gt;Implement comprehensive testing strategies including unit, integration, and end-to-end tests&lt;/li&gt;
&lt;li&gt;Practice deployment procedures regularly in non-production environments&lt;/li&gt;
&lt;li&gt;Maintain detailed runbooks for both deployment and rollback procedures&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitoring and Metrics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Define clear success criteria for deployments&lt;/li&gt;
&lt;li&gt;Monitor both technical metrics (error rates, response times) and business metrics (conversion rates, user engagement)&lt;/li&gt;
&lt;li&gt;Set up automated alerting for anomalies&lt;/li&gt;
&lt;li&gt;Establish baseline metrics before deployments for comparison&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Risk Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with smaller, less critical applications to build expertise&lt;/li&gt;
&lt;li&gt;Always have a tested rollback plan&lt;/li&gt;
&lt;li&gt;Communicate deployment schedules with stakeholders&lt;/li&gt;
&lt;li&gt;Consider the timing of deployments to minimize business impact&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Zero-downtime deployment strategies like blue-green deployment and canary releases have become standard practices for modern software delivery. These approaches enable organizations to ship features rapidly while preserving service reliability.&lt;/p&gt;

&lt;p&gt;Blue-green deployment provides a solid foundation with its straightforward approach to maintaining two production environments. Canary releases build upon this concept by adding sophisticated risk management through gradual user exposure and comprehensive monitoring.&lt;/p&gt;

&lt;p&gt;The choice between these strategies—or a combination of both—depends on your specific requirements, risk tolerance, and operational capabilities. Regardless of the chosen approach, investing in zero-downtime deployment practices improves user satisfaction, reduces business risk, and increases deployment confidence.&lt;/p&gt;

&lt;p&gt;As software delivery continues to accelerate, mastering these deployment strategies becomes increasingly important for DevOps and FullStack engineers seeking to balance innovation speed with operational stability. Start with solid fundamentals, invest in proper tooling and automation, and more importantly, continuously refine your processes based on real-world experience.&lt;/p&gt;




&lt;p&gt;Hopefully this helps! I wish you a wonderful happy deploying day! 🤠&lt;/p&gt;

&lt;p&gt;⚡️ You can check out my open-source projects I'm working on at &lt;strong&gt;&lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub.com/pH-7&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🏁 Follow my Software Engineering Journey on &lt;a href="https://substack.com/@pierrehenry/" rel="noopener noreferrer"&gt;PierreHenry.Dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deployment</category>
      <category>devops</category>
      <category>downtime</category>
      <category>aws</category>
    </item>
    <item>
      <title>What is Serverless? And why you should care about it?</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sat, 13 Dec 2025 12:42:39 +0000</pubDate>
      <link>https://forem.com/pierre/what-is-serverless-43fd</link>
      <guid>https://forem.com/pierre/what-is-serverless-43fd</guid>
      <description>&lt;p&gt;Let’s face it, the term “&lt;em&gt;serverless&lt;/em&gt;” can be quite confusing at first. Despite its name, servers are still involved. You’re just not the one managing them anymore. And honestly? That’s the beauty of it.&lt;/p&gt;

&lt;p&gt;Serverless is essentially a collection of endpoints and functions, each performing a single task. Unlike uploading a full-stack application on Lambda, you upload functions that act as endpoints. These endpoints can then be consumed on your frontend, just like any other regular REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture behind it 🏗️
&lt;/h2&gt;

&lt;p&gt;Ideally, your frontend should be decoupled from your backend and hosted on services like Vercel or Netlify, or any other platform of your choice. This separation of concerns isn’t just a nice-to-have. It’s fundamental to understanding what serverless truly brings to the table.&lt;/p&gt;

&lt;p&gt;While setting up serverless architecture on AWS can be slightly complex, numerous services abstract away this complexity, allowing you to focus solely on your code. And this is where the magic happens. You stop worrying about server maintenance, scaling, and infrastructure headaches, and instead spend your time writing the code that actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why serverless makes sense 💡
&lt;/h2&gt;

&lt;p&gt;Think about it. How many times have you spent hours configuring servers, setting up load balancers, or debugging deployment issues that had nothing to do with your actual application logic? With serverless, you write a function, deploy it, and it scales automatically based on demand.&lt;/p&gt;

&lt;p&gt;Each function is stateless and independent. Need to add a new feature? Write a new function. Need to update something? Deploy just that function without touching the rest of your infrastructure. No downtime, no complicated orchestration, just pure simplicity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real benefits 🚀
&lt;/h2&gt;

&lt;p&gt;The beauty of serverless goes beyond just “not managing servers.” You only pay for what you use. If your function isn’t being called, you’re not paying for idle server time. This makes it incredibly cost-effective, especially for applications with variable traffic patterns.&lt;/p&gt;

&lt;p&gt;Additionally, scaling happens automatically. Whether you have 10 requests or 10,000 requests per second, the cloud provider handles it for you. No need to predict traffic spikes or overprovision resources “just in case.”&lt;/p&gt;

&lt;h2&gt;
  
  
  When serverless shines ✨
&lt;/h2&gt;

&lt;p&gt;Serverless is particularly well-suited for event-driven architectures, microservices, APIs, and background processing tasks. If you’re building a REST API that needs to scale effortlessly, serverless is your friend. If you need to process files uploaded to S3 or respond to database changes, serverless fits perfectly.&lt;/p&gt;

&lt;p&gt;However, it’s not always the right choice for every scenario. Long-running processes, applications requiring persistent connections, or workloads with very predictable and constant traffic might be better suited for traditional server architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started without the headache 🎯
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; is the most popular serverless platform, but the initial setup can feel overwhelming. This is where frameworks and services come to the rescue. Tools like Serverless Framework, AWS SAM, or Vercel Functions abstract away much of the complexity, letting you focus on writing functions instead of wrestling with configuration files.&lt;/p&gt;

&lt;p&gt;The key is to start small. Pick one endpoint from your existing application and convert it to a serverless function. See how it works, understand the patterns, and gradually expand from there. Don’t try to migrate everything at once. That’s a recipe for frustration and confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mindset shift 🧠
&lt;/h2&gt;

&lt;p&gt;Moving to serverless requires a bit of a mindset shift. You’re no longer thinking about servers, you’re thinking about functions and events. Each function should do one thing and do it well. This aligns perfectly with good software engineering principles: single responsibility, loose coupling, and high cohesion.&lt;/p&gt;

&lt;p&gt;Your application becomes a collection of small, independently deployable units. This makes debugging easier (you know exactly which function is failing), deployments safer (you’re not deploying a monolith), and development faster (teams can work on different functions without stepping on each other’s toes).&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts 🤔
&lt;/h2&gt;

&lt;p&gt;Serverless isn’t just a buzzword or a passing trend. It’s a fundamental shift in how we build and deploy applications. Like any tool, it’s not perfect for every situation, but when used appropriately, it can significantly boost productivity and reduce operational overhead.&lt;/p&gt;

&lt;p&gt;The best part? Well, you can start today without committing to a full migration. Pick a small piece of functionality, write it as a serverless function, and see how it feels. And you might actually find that managing servers was never something you needed to do in the first place! 😉 ​​​​​​​​​​​​​​​​&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>lambda</category>
      <category>aws</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why I moved to Neovim. And ditched VS Code/IntelliJ</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sat, 06 Dec 2025 12:27:50 +0000</pubDate>
      <link>https://forem.com/pierre/why-i-moved-to-neovim-and-ditched-vs-codeintellij-4826</link>
      <guid>https://forem.com/pierre/why-i-moved-to-neovim-and-ditched-vs-codeintellij-4826</guid>
      <description>&lt;p&gt;I've been using VS Code and IntelliJ as my main editors for quite a long time, moving from Sublime Text and Atom. VS Code/IntelliJ immediately remind me of the time when we didn't have better alternatives for modern development workflows.&lt;/p&gt;

&lt;p&gt;Apart from being widely adopted and having massive plugin ecosystems, &lt;strong&gt;VS Code and IntelliJ&lt;/strong&gt; have some issues that can be easily fixed with a "more modern" (or rather, "timeless") alternative.&lt;/p&gt;

&lt;p&gt;I've recently started using &lt;strong&gt;Neovim&lt;/strong&gt; (along with tmux), and it does have many advantages compared to traditional IDEs. And FYI, the amazing Linux distribution, &lt;a href="https://learn.omacom.io/2/the-omarchy-manual/56/neovim" rel="noopener noreferrer"&gt;&lt;strong&gt;Omacom&lt;/strong&gt;, comes directly with Neovim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First of all, it's very fast! (Neovim, with its terminal-based interface, starts instantly compared to VS Code/IntelliJ). Editing code has been a real pleasure. The startup time and file switching are considerably faster.&lt;/p&gt;

&lt;p&gt;Then, it keeps you focused on the essential, whereas VS Code/IntelliJ don't do this at all. With traditional IDEs, each time you need to switch context, you're moving between windows, tabs, and panels. This leads to constant distraction and context switching. Furthermore, you will still need to use your mouse frequently for navigation. In addition, there is always the temptation to install "just one more extension" that slows everything down (Neovim keeps you in the terminal with keyboard-driven workflows).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/neovim/neovim" rel="noopener noreferrer"&gt;Neovim&lt;/a&gt; (and a few others such as &lt;code&gt;[Helix](https://github.com/helix-editor/helix)&lt;/code&gt; that can also be used as modern modal editors) handle this under the hood. This way, when you are dealing with multiple projects and terminal sessions, you won't have any bad surprises like slow startups or high CPU/memory usage, for instance.&lt;/p&gt;

&lt;p&gt;For instance, here's my typical workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal session with tmux&lt;/span&gt;
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; coding
nvim &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="c"&gt;# Everything happens here (editing, git, terminals, all keyboard-driven)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Neovim, I stay in the terminal where everything I need is right there. You can also (and very easily) start using Neovim in your existing projects without changing anything. At the end of the day, it's just a text editor that works with any codebase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Example Neovim config (init.lua)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relativenumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tabstop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shiftwidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;-- Using lazy.nvim for plugin management&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lazy"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="s2"&gt;"nvim-telescope/telescope.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"neovim/nvim-lspconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"hrsh7th/nvim-cmp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's also good to mention that Neovim is fully compatible with Vim plugins while adding modern features like LSP support, tree-sitter, and Lua configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Downsides
&lt;/h3&gt;

&lt;p&gt;The only case where you should still use VS Code/IntelliJ is when you're just starting out in programming. This occurs either when you're learning to code or working in a team that requires specific IDE features. The problem is that Neovim has a steep learning curve initially. We need time to learn modal editing and configure everything, such as LSP servers, formatters, and keybindings that don't come pre-configured.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;for experienced developers who value speed and efficiency, Neovim is the clear winner&lt;/strong&gt;. Anyway, it's worth trying it for a week or two 😉&lt;/p&gt;

&lt;p&gt;Now, it will give a significant boost to your productivity and focus, as well as better resource usage on your machine, which is the most important at the end of the day, right? 😊&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternatives
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Helix&lt;/strong&gt; is another modal editor option (still relatively new and not very popular either), that provides a similar experience to Neovim. It also offers modern features out of the box, but it uses a different selection-first model and has fewer plugins available compared to Neovim's mature ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to still use VS Code/IntelliJ
&lt;/h3&gt;

&lt;p&gt;Lastly (although you might not need this), it's good to mention that VS Code/IntelliJ are still perfectly valid for beginners, pair programming sessions (where screen sharing GUI is helpful), or teams with standardized IDE setups that require specific extensions and configurations.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;👉 See my projects on &lt;strong&gt;&lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub.com/pH-7&lt;/a&gt;&lt;/strong&gt; 💡&lt;/li&gt;
&lt;li&gt;☕️ Was this helpful? You could offer me one of my favorite coffees: &lt;strong&gt;&lt;a href="https://ko-fi.com/phenry" rel="noopener noreferrer"&gt;Ko-fi.com/phenry&lt;/a&gt;&lt;/strong&gt; 😋&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>neovim</category>
      <category>vim</category>
      <category>vscode</category>
      <category>productivity</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sun, 09 Nov 2025 09:17:22 +0000</pubDate>
      <link>https://forem.com/pierre/-fjl</link>
      <guid>https://forem.com/pierre/-fjl</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078" class="crayons-story__hidden-navigation-link"&gt;Why it's time to ditch UUIDv4 and switch to UUIDv7!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/pierre" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F87903%2Fa1ab22ac-c90c-4af4-8268-23129389aa6f.jpeg" alt="pierre profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/pierre" class="crayons-story__secondary fw-medium m:hidden"&gt;
              👨‍💻Pierre-Henry ✨
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                👨‍💻Pierre-Henry ✨
                
              
              &lt;div id="story-author-preview-content-3002468" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/pierre" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F87903%2Fa1ab22ac-c90c-4af4-8268-23129389aa6f.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;👨‍💻Pierre-Henry ✨&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 8 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078" id="article-link-3002468"&gt;
          Why it's time to ditch UUIDv4 and switch to UUIDv7!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/uuid"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;uuid&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/database"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;database&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/node"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;node&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;10&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>uuid</category>
      <category>database</category>
      <category>performance</category>
      <category>node</category>
    </item>
    <item>
      <title>Why it's time to ditch UUIDv4 and switch to UUIDv7!</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sat, 08 Nov 2025 02:29:13 +0000</pubDate>
      <link>https://forem.com/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078</link>
      <guid>https://forem.com/pierre/why-its-time-to-ditch-uuidv4-and-switch-to-uuidv7-2078</guid>
      <description>&lt;p&gt;I've been using UUIDv4 as my go-to identifier for database primary keys for quite a long time, moving from sequential integer IDs (auto-increment/SERIAL). UUIDv4 immediately reminds me of the time when we didn't have better alternatives for distributed systems.&lt;/p&gt;

&lt;p&gt;Apart from being widely adopted and having massive usage, &lt;strong&gt;UUIDv4&lt;/strong&gt; has some issues that can be easily fixed with a "more modern" alternative.&lt;/p&gt;

&lt;p&gt;I've recently started using &lt;strong&gt;UUIDv7&lt;/strong&gt; and it does offer many advantages in comparison with UUIDv4.&lt;/p&gt;

&lt;p&gt;First of all, &lt;strong&gt;it's really fast&lt;/strong&gt; (UUIDv7, with its time-ordered structure, claims to be 2-5x faster for inserts than UUIDv4). Writing records to the database has been a real pleasure. The insert performance and index maintenance are considerably faster.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;it naturally sorts by creation time&lt;/strong&gt;, whereas UUIDv4 doesn't do this at all. With UUIDv4, each time you insert a record, it lands in a random position in your B-tree index, causing page splits and fragmentation. This leads to degraded performance over time. Furthermore, you will still need to add a separate &lt;code&gt;created_at&lt;/code&gt; timestamp column if you want to sort records chronologically. In addition, there is always index fragmentation when inserting with UUIDv4 (UUIDv7 appends sequentially to the index, providing better cache locality for index operations).&lt;/p&gt;

&lt;p&gt;UUIDv7 (and a few others such as &lt;code&gt;ULID&lt;/code&gt; that can also be used as time-ordered identifiers) handle this under the hood. This way, when you are dealing with high-volume inserts and large databases, you won't have any bad surprises like severe performance degradation or bloated indexes, for instance.&lt;/p&gt;

&lt;p&gt;For instance, here's how UUIDv7 structures its data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;018c8e8a-9d4e-7890-a123-456789abcdef
└─timestamp─┘ └───random bits────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first 48 bits contain a Unix timestamp with millisecond precision, so UUIDs generated over time are naturally sequential. You can also (and very easily) start using UUIDv7 in your existing projects without migrating old UUIDv4 records, because both can coexist in the same column.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Node.js usage&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;v7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uuidv7&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uuid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;uuidv7&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 018c8e8a-9d4e-7890-a123-456789abcdef&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;record&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"018c8e8a-9d4e-7890-a123-456789abcdef"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"018c8e8a-9d50-7000-c345-6789abcdef01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-11-08T10:30:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's also good to mention that UUIDv7 maintains the same 128-bit format as UUIDv4, so it works with all existing UUID columns in your database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benchmark
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UUIDv4 database inserts: 2,847ms
UUIDv7 database inserts: 2,763ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: My benchmark was run with Node v20.10.0&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Run: node benchmark-uuid-comparison.js&lt;/span&gt;

&lt;span class="c1"&gt;// UUIDv4 benchmark&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UUIDv4 database inserts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UUIDv4 database inserts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// UUIDv7 benchmark&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;v7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uuidv7&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uuid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UUIDv7 database inserts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;uuidv7&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UUIDv7 database inserts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// note, I've used 10_000_000 with _ which are numeric separators&lt;/span&gt;
&lt;span class="c1"&gt;// https://github.com/pH-7/GoodJsCode#-clearreadable-numbers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real performance difference shows up in actual database operations where UUIDv7's sequential nature prevents index fragmentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Downsides...
&lt;/h3&gt;

&lt;p&gt;The only case where you still want to use UUIDv4 is when you explicitly don't want temporal ordering. This occurs either when you're building security tokens, API keys, or session IDs where predictability could be a security concern. The problem is that UUIDv7's timestamp-based structure reveals when the identifier was created. We need something completely unpredictable in these scenarios, such as pure random identifiers that don't leak any information about creation time.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;for database primary keys and foreign keys, UUIDv7 is the clear winner&lt;/strong&gt;. Anyway, it's worth trying it in your next new project 😉&lt;/p&gt;

&lt;p&gt;Now, it will give a significant boost to performance for your database operations, as well as better index efficiency over time, which is the most important at the end of the day, right? 😊&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternatives
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;UUIDv6&lt;/strong&gt; is another time-based UUID option (still relatively new and not very popular either), that is essentially a fixed version of UUIDv1. It also provides sequential ordering like UUIDv7, but it still includes MAC address information (or random node ID) in its structure, which UUIDv7 avoids entirely for privacy reasons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where to continue using UUIDv4
&lt;/h3&gt;

&lt;p&gt;Lastly (although you might not need this), it's good to mention that UUIDv4 is still perfectly valid for security tokens, API keys, session IDs (where you don't want creation time leakage), or PostgreSQL databases (where the performance impact of random UUIDs is less severe for PostgreSQL since it appends new data to a heap rather than reordering it in a clustered index like MySQL).&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;👉 See my projects on &lt;strong&gt;&lt;a href="https://github.com/pH-7?tab=repositories" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub.com/pH-7&lt;/a&gt;&lt;/strong&gt; 💡&lt;/li&gt;
&lt;li&gt;☕️ Was this helpful? You could offer me one of my favorite coffees: &lt;strong&gt;&lt;a href="https://ko-fi.com/phenry" rel="noopener noreferrer"&gt;Ko-fi.com/phenry&lt;/a&gt;&lt;/strong&gt; 😋&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>uuid</category>
      <category>database</category>
      <category>performance</category>
      <category>node</category>
    </item>
    <item>
      <title>Comparing Objects with PHP 🐘 Step-By-Step Guide</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Sat, 25 Oct 2025 02:53:14 +0000</pubDate>
      <link>https://forem.com/pierre/compare-objects-in-php-6pa</link>
      <guid>https://forem.com/pierre/compare-objects-in-php-6pa</guid>
      <description>&lt;p&gt;In this screencast tutorial, I’m sharing how to compare objects and their instances with PHP. We are discussing the comparison operator, the strict identity comparison operator, etc. All in PHP!&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/TPu4rza84cc"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🏁 Follow my AI Data Software Engineering Journey at &lt;a href="https://pierrehenry.dev" rel="noopener noreferrer"&gt;PierreHenry.DEV&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🤖 Get inspired by open-source GitHub projects I’ve built for the past years &lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub.com/pH-7&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;👋 Is this helpful? How about sending me a cup of coffee via &lt;a href="https://ko-fi.com/phenry" rel="noopener noreferrer"&gt;Ko-Fi&lt;/a&gt; 😊&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>php</category>
      <category>oop</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to UNDO a GIT PUSH FORCE?</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Wed, 22 Oct 2025 07:42:05 +0000</pubDate>
      <link>https://forem.com/pierre/how-to-undo-a-git-push-force-3ijo</link>
      <guid>https://forem.com/pierre/how-to-undo-a-git-push-force-3ijo</guid>
      <description>&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/cpLIVpwMtvU"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;In this session, you will see how you can use a &lt;code&gt;git reset -f&lt;/code&gt; to restore a &lt;code&gt;git push --force&lt;/code&gt; against a &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;development&lt;/code&gt; branch. Thanks to git reset, you will be able to reset your branch to the desire commit hash.&lt;/p&gt;

&lt;p&gt;You will understand how to undo an accidental &lt;code&gt;git push --force&lt;/code&gt; and recover your lost commits! This tutorial covers:&lt;/p&gt;

&lt;p&gt;Understanding the risks of force pushing&lt;br&gt;
Using git reflog to find lost commits&lt;br&gt;
Resetting your local branch&lt;br&gt;
Restoring the remote repository&lt;br&gt;
Best practices to avoid future accidents&lt;/p&gt;

&lt;p&gt;Whether you're a beginner or experienced developer, this guide will help you recover from git push force mistakes. Don't panic, your code can be saved!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Timestamps:&lt;/strong&gt;&lt;br&gt;
0:00 Introduction&lt;br&gt;
1:15 What is git push --force?&lt;br&gt;
3:30 Using git reflog&lt;br&gt;
5:45 Resetting your branch&lt;br&gt;
8:00 Pushing changes back&lt;br&gt;
10:15 Prevention tips&lt;br&gt;
📚 Resources:&lt;br&gt;
Git documentation: &lt;a href="https://git-scm.com/doc" rel="noopener noreferrer"&gt;https://git-scm.com/doc&lt;/a&gt;&lt;br&gt;
Git reflog: &lt;a href="https://git-scm.com/docs/git-reflog" rel="noopener noreferrer"&gt;https://git-scm.com/docs/git-reflog&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🏁 Follow my Software Engineering Journey on &lt;a href="https://substack.com/@pierrehenry/" rel="noopener noreferrer"&gt;PierreHenry.Dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>development</category>
      <category>webdev</category>
      <category>github</category>
    </item>
    <item>
      <title>Set systems, rather than relying on goals or motivations</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Wed, 15 Oct 2025 09:00:15 +0000</pubDate>
      <link>https://forem.com/pierre/set-systems-rather-than-relying-on-goals-or-motivations-1nkl</link>
      <guid>https://forem.com/pierre/set-systems-rather-than-relying-on-goals-or-motivations-1nkl</guid>
      <description>&lt;p&gt;Don't give up! Ever! And this is even more important as a software engineer. &lt;strong&gt;Set systems, rather than relying on goals or motivations&lt;/strong&gt;. The most difficult part is starting to think in "systems" for everything you want to achieve efficiently. Once you have that mindset, you are on the right track.&lt;/p&gt;

&lt;p&gt;Start breaking down problems into very small pieces, and draft a prototype before implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux50w7gtvbgkfz9rkguf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux50w7gtvbgkfz9rkguf.jpeg" alt="Start being motivated" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🏁 Follow my Software Engineering Journey on &lt;a href="https://substack.com/@pierrehenry/" rel="noopener noreferrer"&gt;PierreHenry.Dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>goal</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>🇫🇷 Commencer en tant que Data Scientist. Démarrer une carrière fructueuse</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Wed, 24 Sep 2025 08:26:20 +0000</pubDate>
      <link>https://forem.com/pierre/commencer-en-tant-que-data-scientist-demarrer-une-carriere-fructueuse-2d04</link>
      <guid>https://forem.com/pierre/commencer-en-tant-que-data-scientist-demarrer-une-carriere-fructueuse-2d04</guid>
      <description>&lt;p&gt;Aujourd'hui, dans cette courte vidéo, je te partager mes astuces pour démarrer ta carrière de Data Scientist, de la passion et des premiers challenges jusqu'aux missions et aux postes à haute responsabilité en science des données.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/makg3KPD0Sc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;🤩 Mon GitHub: &lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;https://github.com/pH-7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🏁 Mon Dev.to &lt;a href="https://dev.to/pierre"&gt;https://dev.to/pierre&lt;/a&gt;&lt;/p&gt;

</description>
      <category>french</category>
      <category>science</category>
      <category>donnée</category>
      <category>apprentissage</category>
    </item>
    <item>
      <title>Clean Code: How to use NAMED PARAMETERS in JavaScript</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Tue, 24 Jun 2025 12:17:04 +0000</pubDate>
      <link>https://forem.com/pierre/named-parameters-in-javascript-1amo</link>
      <guid>https://forem.com/pierre/named-parameters-in-javascript-1amo</guid>
      <description>&lt;p&gt;If you're familiar with named/keyword arguments in programming languages like Ruby, Python, and PHP 8, you might wonder if JavaScript offers the same functionality.&lt;br&gt;
That's an excellent question. Named parameters, also known as named arguments, significantly enhance code readability. With &lt;a href="https://en.wikipedia.org/wiki/Named_parameter" rel="noopener noreferrer"&gt;named-parameter arguments&lt;/a&gt;, we can directly understand the purpose of each argument in a function call.&lt;/p&gt;

&lt;p&gt;One way to achieve this is by &lt;strong&gt;using object destructuring on the function parameters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invertSentence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;doesFormat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doesFormat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Logic…&lt;/span&gt;

  &lt;span class="c1"&gt;// Split the sentence into two segments&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;stringOne&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stringTwo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Rebuild the sentence&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rebuiltString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stringTwo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stringOne&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;rebuiltString&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can specify the required properties as “named arguments” when calling the function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;invertSentence&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JS makes my job easier. Writing clean code avoid me from having a headache&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;doesFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, JavaScript doesn't support keyword arguments natively, unlike PHP 8 and Python for instance. However, &lt;strong&gt;thanks to the power of object destructuring&lt;/strong&gt; (introduced in ES6), we can structure our function signatures to accept arguments using their respective property names, thereby enhancing code readability.&lt;/p&gt;




&lt;p&gt;And you, how often are you using this technique?&lt;/p&gt;

&lt;p&gt;Happy JS Developing Day! 🤠 You can follow me on &lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; at &lt;a href="https://github.com/pH-7" rel="noopener noreferrer"&gt;GitHub.com/pH-7&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>cleancoding</category>
      <category>cleancode</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Rubber Duck Debugging Method</title>
      <dc:creator>👨‍💻Pierre-Henry ✨</dc:creator>
      <pubDate>Tue, 11 Mar 2025 09:16:26 +0000</pubDate>
      <link>https://forem.com/pierre/rubber-duck-debugging-method-34kj</link>
      <guid>https://forem.com/pierre/rubber-duck-debugging-method-34kj</guid>
      <description>&lt;p&gt;Today, I would like to share the &lt;a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging" rel="noopener noreferrer"&gt;Rubber Duck(y) Debugging Method&lt;/a&gt;. This efficient debugging approach in programming that can be used along with AI helps you to break down the situation of a given problem. This technique has helped me a lot as a software engineer.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/b_aqjMwIYPs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;And you? What is your favorite way to debug a problem/bug you are facing?&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Reference: &lt;a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Rubber_duck_debugging&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy problem-solving session! ⚡️&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;p&gt;👉 You can follow me on GitHub - &lt;a href="//GitHub.com/pH-7"&gt;https://github.com/pH-7&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;☕️ Was this debugging technique helpful? What about offering me a cup of my favorite coffee? &lt;a href="https://ko-fi.com/phenry" rel="noopener noreferrer"&gt;Ko-fi.com/phenry&lt;/a&gt; 😋&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>debug</category>
      <category>problemsolving</category>
    </item>
  </channel>
</rss>
