𝐇𝐨𝐰 𝐰𝐞 𝐬𝐩𝐞𝐝 𝐮𝐩 𝐨𝐮𝐫 𝐂𝐈/𝐂𝐃 𝐭𝐞𝐬𝐭 𝐫𝐮𝐧𝐬 𝐟𝐫𝐨𝐦 18 𝐦𝐢𝐧𝐮𝐭𝐞𝐬 𝐭𝐨 4 — 𝐰𝐢𝐭𝐡𝐨𝐮𝐭 𝐬𝐚𝐜𝐫𝐢𝐟𝐢𝐜𝐢𝐧𝐠 𝐜𝐨𝐯𝐞𝐫𝐚𝐠𝐞 Our pipeline was slow. Developers started merging before tests finished. Not great. This is what we did ???? 1️⃣ 𝐉𝐞𝐬𝐭 𝐟𝐨𝐫 𝐚𝐥𝐥 𝐜𝐨𝐦𝐦𝐢𝐭, 𝐏𝐥𝐚𝐲𝐰𝐫𝐢𝐠𝐡𝐭 𝐟𝐨𝐫 𝐏𝐑𝐬 Unit tests are fast and catch 80% of bugs. E2E tests are slow and catch the scary ones. Don't treat them equally. 2️⃣ 𝐄𝐯𝐞𝐫𝐲𝐭𝐡𝐢𝐧𝐠 𝐢𝐧 𝐩𝐚𝐫𝐚𝐥𝐥𝐞𝐥 Frontend, backend, and E2E streams all run in parallel. Most teams still execute sequentially because it's the default. 3️⃣ 𝐂𝐚𝐜𝐡𝐞 𝐚𝐠𝐠𝐫𝐞𝐬𝐬𝐢𝐯𝐞𝐥𝐲 Re-use node modules and build artifacts between runs. We saved about a minute per suite, small wins that add up. 4️⃣ 𝐒𝐦𝐨𝐤𝐞 𝐭𝐞𝐬𝐭𝐬 𝐝𝐞𝐩𝐥𝐨𝐲 𝐟𝐢𝐫𝐬𝐭 Critical user flows (login, checkout, core APIs) run immediately after deploy. Full E2E runs asynchronously later. 5️⃣ 𝐃𝐚𝐬𝐡𝐛𝐨𝐚𝐫𝐝𝐬, 𝐧𝐨𝐭 𝐒𝐥𝐚𝐜𝐤 𝐬𝐩𝐚𝐦 We built a simple report page. Devs actually look at it because it shows trends, not just red or green. The goal isn’t perfect coverage, it’s making tests fast enough that people actually run them. 💬 What's your CI time like now? If it's longer than 10 minutes, something's probably misconfigured. #springboot #reactjs #playwright #jest #testing #devops #tdd #softwareengineering #nextjs #nodejs #cicd #fullstack
How we sped up our CI/CD test runs from 18 minutes to 4
More Relevant Posts
-
It Works on My Machine” - The Developer Trap We’ve all been there Everything works perfectly on your local setup Then you deploy and boom nothing works. Different environments. Different configs. Missing .env variables. And a little too much “it worked locally.” Here’s the truth local success ≠ production success. A few habits that save hours (and reputation): ✅ Test with staging environments before deploying. ✅ Use Docker or containers for consistent environments. ✅ Automate CI/CD pipelines to catch config or version mismatches early. ✅ Always double-check your .env and .gitignore. Because the fewer surprises in production, the better your sleep. 👉 What’s your best trick to prevent the classic “works on my machine” disaster? #WebDevelopment #ReactJS #Nextjs #FrontendEngineer #SoftwareEngineering #DevOps #CodingTips #DeveloperMindset #CICD #CleanCode #WebDev
To view or add a comment, sign in
-
Radhey Krishna Developers! 🙏 In my recent post, I talked about CDNs (Content Delivery Networks) and how they help deliver assets faster by caching them across multiple geographic locations. But while using CDNs with Vite, things can get unexpectedly tricky. Last Friday, while working on a React + Vite project that used a few external scripts through CDNs, I ran into this frustrating error: ❌ “G is used before initialization” At first glance, the code looked perfectly fine. But after digging deeper, I realized the issue wasn’t with my logic, it was with how Vite bundles and orders scripts during the build process. Here’s what actually happened while bundling, Vite reordered some functions that were coming from the CDN scripts. This caused a temporal dead zone (TDZ) error - meaning a variable or function was being used before it was defined in the final bundled output. After a lot of research and experimentation, I found a simple and effective fix: 💡viteExternalsPlugin💡- https://lnkd.in/g9CAFk9Z This plugin tells Vite not to bundle specific CDN dependencies. Instead, it treats them as global scripts and ensures they are loaded before your bundled code runs. Here’s why it works perfectly: 1️⃣ First load your cdn globally ready to use for bundler 2️⃣ load bundled app This is how Dev & prod behave the same 🤝. If you’re using CDNs in your Vite-based React projects, this approach can save you from unexpected runtime issues! 🚀 To explore more such engineering breakdowns, connect with me ➡️ Gaurav Agrawal Thanks for Kartik Mishra who helped me figirue it out. I’m exploring these concepts as part of my learning journey. If you have feedback or insights, I’d love to learn from you in the comments! #Vite #React #Frontend #WebDevelopment #JavaScript #TypeScript #CDN #Debugging #Developers #Tech #Programming #WebDev #SoftwareEngineering #OpenSource #FrontendDevelopment
To view or add a comment, sign in
-
😍 I love Promise.all() It's my go-to move to speed things up. Most teams reach for it to “parallelize” work — fetch 10 users, 50 files, 200 URLs — but they forget one key detail: Promise.all() fails fast. If a single promise fails, the entire batch fails. You lose all successful results, and you still waste time running the rest in the background. That’s fine for critical pipelines where all results must succeed. But for real-world APIs — where partial success is normal — it’s fragile. 💡 That’s where Promise.allSettled changes the equation. It waits for every promise to finish, successful or not, and gives you the whole picture. You can log errors, retry failed calls, and still use the successful data. Check out an amazing article in the comments from Matt Smith 👇 For high-volume workloads, Matt shows another middle ground: controlled concurrency. By batching promises with utilities like p-limit, you can run a few at a time — fast, but safe. The right async pattern depends on your tolerance for failure and your need for speed. Most of the time, “fail fast” isn’t the goal — “finish reliably” is. #JavaScript #Async #WebDev #Frontend #Promises
To view or add a comment, sign in
-
-
Good post on concurrent promises in JS. Just watch yourself with Promise.all. The function short-circuits the results on failure. Until you understand what that means, allSettled is a safer alternative.
😍 I love Promise.all() It's my go-to move to speed things up. Most teams reach for it to “parallelize” work — fetch 10 users, 50 files, 200 URLs — but they forget one key detail: Promise.all() fails fast. If a single promise fails, the entire batch fails. You lose all successful results, and you still waste time running the rest in the background. That’s fine for critical pipelines where all results must succeed. But for real-world APIs — where partial success is normal — it’s fragile. 💡 That’s where Promise.allSettled changes the equation. It waits for every promise to finish, successful or not, and gives you the whole picture. You can log errors, retry failed calls, and still use the successful data. Check out an amazing article in the comments from Matt Smith 👇 For high-volume workloads, Matt shows another middle ground: controlled concurrency. By batching promises with utilities like p-limit, you can run a few at a time — fast, but safe. The right async pattern depends on your tolerance for failure and your need for speed. Most of the time, “fail fast” isn’t the goal — “finish reliably” is. #JavaScript #Async #WebDev #Frontend #Promises
To view or add a comment, sign in
-
-
🧩 Micro Frontends: Scaling the UI Like Microservices As applications grow, the frontend often becomes the hardest part to scale. One massive codebase, too many dependencies, and small changes start to feel risky. That is where micro frontends change the game. Instead of one large application, you build multiple smaller, independent apps that come together seamlessly in the browser. Each team owns its part built, tested, and deployed separately while sharing a consistent design system and communication layer. In one of my recent projects, splitting a monolithic Angular application into React and Angular-based micro frontends transformed delivery speed. 🔹 Teams deployed independently without waiting on others 🔹 Shared libraries handled authentication, theming, and routing 🔹 CI/CD pipelines built and deployed each piece through Jenkins and GitHub Actions 🔹 Webpack Module Federation kept everything connected without heavy integration overhead The result was not just technical flexibility it was organizational freedom. Frontends became faster to develop, easier to test, and simpler to evolve. Micro frontends prove that scalability is not only a backend problem. It is a mindset that applies to every layer of software. #FullStackDevelopment #FrontendDevelopment #MicroFrontends #React #Angular #Webpack #ModuleFederation #Jenkins #GitHubActions #UIArchitecture #Scalability #SoftwareEngineering #DevOps #CloudEngineering #DesignSystems #WebDevelopment #CleanArchitecture
To view or add a comment, sign in
-
When ‘It Works Locally’ Becomes a Curse Ah yes — the most dangerous phrase in software development: “It works on my machine.” Locally, everything’s smooth — API responds, UI loads, DB syncs. Then you push to staging, and boom 💥 — nothing works. Suddenly, your code acts like it’s never met the server before. I’ve been there more times than I’d like to admit. One missing environment variable, one case-sensitive path, or a sneaky OS difference — and your “perfect” app collapses like a Jenga tower. 😅 Here’s what I’ve learned: · Containerize everything — Docker is your “it works everywhere” magic wand. · Keep configs consistent across environments. · Automate setup — no “manual magic” allowed. · And please, test outside localhost before declaring victory. If it only works on your machine… it doesn’t really work. 🤷♂️ When was the last time your “local hero” code betrayed you in production? #SoftwareEngineering #FullStackDeveloper #CleanCode #NodeJS #ReactJS #DevOps #TechCommunity #CodingJourney
To view or add a comment, sign in
-
Know this before you DEPLOY 1️⃣𝗡𝗲𝘃𝗲𝗿 𝗶𝗴𝗻𝗼𝗿𝗲 𝘄𝗵𝗮𝘁 𝗿𝗲𝘁𝘂𝗿𝗻𝘀 𝗮 𝗣𝗿𝗼𝗺𝗶𝘀𝗲. Async functions dont execute like sync ones, they schedule, not complete. 2️⃣𝗨𝘀𝗲 𝘗𝘳𝘰𝘮𝘪𝘴𝘦.𝘢𝘭𝘭() 𝘄𝗶𝘀𝗲𝗹𝘆. 𝘢𝘸𝘢𝘪𝘵 𝘗𝘳𝘰𝘮𝘪𝘴𝘦.𝘢𝘭𝘭(𝘶𝘴𝘦𝘳𝘴.𝘮𝘢𝘱((𝘶) => 𝘴𝘦𝘯𝘥𝘞𝘦𝘭𝘤𝘰𝘮𝘦𝘌𝘮𝘢𝘪𝘭(𝘶))); 𝘭𝘰𝘨𝘔𝘦𝘴𝘴𝘢𝘨𝘦("𝘈𝘭𝘭 𝘦𝘮𝘢𝘪𝘭𝘴 𝘴𝘦𝘯𝘵!"); You will ensure every task completes, or catch the failure early. 3️⃣𝗜𝗳 𝘀𝗼𝗺𝗲 𝗰𝗮𝗻 𝗳𝗮𝗶𝗹 𝘀𝗶𝗹𝗲𝗻𝘁𝗹𝘆, 𝘂𝘀𝗲 𝘗𝘳𝘰𝘮𝘪𝘴𝘦.𝘢𝘭𝘭𝘚𝘦𝘵𝘵𝘭𝘦𝘥() 𝘤𝘰𝘯𝘴𝘵 𝘳𝘦𝘴𝘶𝘭𝘵𝘴 = 𝘢𝘸𝘢𝘪𝘵 𝘗𝘳𝘰𝘮𝘪𝘴𝘦.𝘢𝘭𝘭𝘚𝘦𝘵𝘵𝘭𝘦𝘥(𝘶𝘴𝘦𝘳𝘴.𝘮𝘢𝘱(𝘴𝘦𝘯𝘥𝘞𝘦𝘭𝘤𝘰𝘮𝘦𝘌𝘮𝘢𝘪𝘭)); 𝘳𝘦𝘴𝘶𝘭𝘵𝘴.𝘧𝘰𝘳𝘌𝘢𝘤𝘩((𝘳) => { 𝘪𝘧 (𝘳.𝘴𝘵𝘢𝘵𝘶𝘴 === "𝘳𝘦𝘫𝘦𝘤𝘵𝘦𝘥") 𝘤𝘰𝘯𝘴𝘰𝘭𝘦.𝘦𝘳𝘳𝘰𝘳(𝘳.𝘳𝘦𝘢𝘴𝘰𝘯); }); 4️⃣𝗔𝗹𝘄𝗮𝘆𝘀 𝘄𝗿𝗮𝗽 𝗰𝗿𝗶𝘁𝗶𝗰𝗮𝗹 𝗮𝘀𝘆𝗻𝗰 𝗰𝗮𝗹𝗹𝘀 𝗶𝗻 𝗲𝗿𝗿𝗼𝗿 𝗯𝗼𝘂𝗻𝗱𝗮𝗿𝗶𝗲𝘀 𝗼𝗿 𝘁𝗿𝘆 𝗼𝗿 𝗰𝗮𝘁𝗰𝗵. Uncaught promise rejections can kill servers quietly. 5️⃣In React or frontend apps, a missing await can trigger re renders or memory leaks when states update before data arrives. One missing 𝘢𝘸𝘢𝘪𝘵 can look harmless, but in production, it means broken workflows, lost users, and long days chasing invisible bugs. 𝗕𝗲𝗳𝗼𝗿𝗲 𝘆𝗼𝘂 𝗗𝗘𝗣𝗟𝗢𝗬: ✅ Add ESLint rules 𝘯𝘰-𝘧𝘭𝘰𝘢𝘵𝘪𝘯𝘨-𝘱𝘳𝘰𝘮𝘪𝘴𝘦𝘴 ✅ Use typed APIs that force you to handle Promises ✅ Wrap all async functions in predictable handlers ✅ And above all, never assume async = done. When you build at scale, tiny async mistakes become massive bottlenecks. That’s why companies that value reliability, code discipline, and developer empathy move faster, not just with speed, but with control. If your team struggles with async bugs, data inconsistencies, or untraceable behavior, that is exactly the kind of system I help teams debug, refactor, and scale with full chest. #Nodejs #JavaScript #Async #Promise #Nextjs #WebDevelopment #Backend #Frontend #Startup #CTO #CleanCode #Debugging #SoftwareEngineering
To view or add a comment, sign in
-
-
You’ve built the frontend. Backend works too. Here are 15 common mistakes full-stack devs make, and how to avoid them. 1. Frontend Pitfalls – Ignoring responsive design – Rendering too many DOM elements at once – Not testing across different browsers Fix: – Use Flexbox/Grid – Virtualize long lists – Test with tools like BrowserStack 2. Backend Blunders – Poorly structured database models – Weak or no authentication – No error handling or logging Fix: – Normalize your schema – Use hashed passwords (bcrypt) – Add logs and return clear error messages 3. API & Integration Issues – Returning sensitive data – No API rate limiting – Hardcoded API keys in code Fix: – Use DTOs or serializers – Add rate limiting with libraries like express-rate-limit – Store secrets in environment variables 4. DevOps & Deployment Mistakes – Hardcoded URLs or credentials – No logging in production – Unoptimized JavaScript and CSS bundles Fix: – Use .env for configs – Implement logging tools like Sentry – Optimize build with tools like Webpack or Vite 5. Team & Workflow Mistakes – No documentation – Skipping user testing – Ignoring code reviews Fix: – Document APIs with Swagger – Collect feedback with MVPs – Collaborate using Git best practices Being a full-stack developer means balancing multiple layers of a product. Mistakes happen, but awareness is key. Start small, test often, secure everything, and prioritize communication. #TechSkills #codingtips #fullstackdeveloper #backenddevelopers #frontenddeveloper
To view or add a comment, sign in
-
-
“Frontend devs can do backend anytime… but not vice versa.” That’s the funniest line I’ve read all week. You really think someone who’s never touched a database, never deployed a container, never handled auth or scaling, can just wake up one day and “do backend”? Let's be serious for once. Backend devs are already mini frontend devs. They build APIs, handle integration, understand data flow, and half the time are fixing the frontend bugs that “frontend devs” caused during API calls. Some of us can spin up React, HTML, or templating UIs just to test features. Meanwhile, frontend devs are basically coders with great design taste. (Yes, I said it.). The only gap is usually design, give the engineer a design and they would code it out with a little determination You happen to make things look good, but you don’t get to act like backend is a weekend course away. Because last I checked, learning Spring Boot , SQL, Docker, AWS, scaling, and CI/CD isn’t something you just “do anytime.” Let’s stop acting like children, I thought we were suppossed to be logical as programmers and on this platform . You can’t “anytime” your way into understanding systems, architecture, and data integrity. Repect the backend people.
To view or add a comment, sign in
-
-
Most backend bugs don’t come from complex logic. They come from poor API design. I realised this while working on a Spring Boot microservice in my Weshopify project. The logic was perfect, the deployment was smooth, but the API was confusing. Frontend developers kept asking, “What does this field mean?” or “Why is this path so long?” That’s when it clicked. Writing APIs is not just coding. It’s designing a contract that other people depend on. Here’s the approach I follow now: 1️⃣ Keep endpoints clean and predictable Use nouns, not verbs. GET /products POST /products GET /products/{id} Simple, readable, and consistent. 2️⃣ Return meaningful responses A good response is more than data. It tells the consumer what happened. status timestamp message data This structure saves hours during debugging. 3️⃣ Think about versioning early Nothing hurts more than breaking clients when your service grows. /api/v1/products Small thing, big difference. 4️⃣ Document everything Swagger changed the game for me. Once the API is documented, onboarding becomes smooth and communication becomes clear. A clean API doesn’t just make your project better. It makes the entire team faster. What’s the biggest API mistake you’ve seen in real projects? I’d love to hear it. #Java #SpringBoot #API #BackendDevelopment #Microservices #RESTAPI #DevOps #SoftwareEngineering
To view or add a comment, sign in
Explore related topics
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development