[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"header-categories":3,"post-art-of-code-review-better-feedback":73,"parsed-post-f9acf10b-40d3-4cdc-994a-4a4b321a3ce2":142},{"success":4,"data":5},true,{"items":6,"pagination":70},[7,16,24,32,40,48,56,63],{"id":8,"name":9,"description":10,"parentId":11,"createdAt":12,"updatedAt":12,"parent":11,"children":13,"_count":14},"ai-future","AI & The Future","Artificial intelligence and emerging technology",null,"2026-07-24T06:02:45.990Z",[],{"posts":15},1,{"id":17,"name":18,"description":19,"parentId":11,"createdAt":20,"updatedAt":20,"parent":11,"children":21,"_count":22},"tools-productivity","Tools & Productivity","Developer tools and workflow optimization","2026-07-24T06:02:45.712Z",[],{"posts":23},7,{"id":25,"name":26,"description":27,"parentId":11,"createdAt":28,"updatedAt":28,"parent":11,"children":29,"_count":30},"career","Career & Growth","Professional development for developers","2026-07-24T06:02:45.486Z",[],{"posts":31},3,{"id":33,"name":34,"description":35,"parentId":11,"createdAt":36,"updatedAt":36,"parent":11,"children":37,"_count":38},"opinion","Opinion & Analysis","Industry analysis and technical opinions","2026-07-24T06:02:45.272Z",[],{"posts":39},6,{"id":41,"name":42,"description":43,"parentId":11,"createdAt":44,"updatedAt":44,"parent":11,"children":45,"_count":46},"tutorials","Tutorials","Step-by-step learning guides","2026-07-24T06:02:44.965Z",[],{"posts":47},21,{"id":49,"name":50,"description":51,"parentId":11,"createdAt":52,"updatedAt":52,"parent":11,"children":53,"_count":54},"software-engineering","Software Engineering","Best practices, patterns, and principles","2026-07-24T06:02:44.689Z",[],{"posts":55},24,{"id":57,"name":58,"description":59,"parentId":11,"createdAt":60,"updatedAt":60,"parent":11,"children":61,"_count":62},"devops-cloud","DevOps & Cloud","Infrastructure, deployment, and cloud computing","2026-07-24T06:02:44.453Z",[],{"posts":39},{"id":64,"name":65,"description":66,"parentId":11,"createdAt":67,"updatedAt":67,"parent":11,"children":68,"_count":69},"web-development","Web Development","Frontend and backend web development tutorials and guides","2026-07-24T06:02:44.169Z",[],{"posts":55},{"page":15,"limit":71,"total":71,"totalPages":15,"hasNext":72,"hasPrev":72},8,false,{"success":4,"data":74},{"id":75,"slug":76,"title":77,"excerpt":78,"content":79,"status":80,"visibility":81,"featuredImage":82,"canonicalUrl":11,"readingTime":23,"viewCount":83,"commentEnabled":4,"publishedAt":84,"scheduledAt":11,"createdAt":85,"updatedAt":86,"seoTitle":87,"seoDescription":78,"seoKeywords":11,"authorId":88,"author":89,"coAuthors":94,"tags":95,"categories":106,"comments":109,"_count":110,"relatedPosts":112},"f9acf10b-40d3-4cdc-994a-4a4b321a3ce2","art-of-code-review-better-feedback","The Art of Code Review: Giving Feedback That Ships Better Code","Transform your code reviews from nitpick sessions into collaborative learning opportunities that improve code quality and team culture.","## Code Review Is a Conversation\n\nA code review is not a gate — it's a conversation between peers. The goal isn't to find faults; it's to collectively produce the best code possible.\n\n## The Reviewer's Mindset\n\nBefore writing any comment, ask yourself:\n\n1. **Is this a real issue or personal preference?**\n2. **Am I being specific enough to be actionable?**\n3. **Am I assuming good intent?**\n\n## Comment Categories\n\nPrefix your comments to set expectations:\n\n- `nit:` — Style\u002Fformatting, non-blocking\n- `suggestion:` — Alternative approach worth considering\n- `question:` — Seeking to understand, not criticize\n- `blocker:` — Must fix before merging\n\n::callout{icon=\"i-lucide-message-circle\" color=\"primary\"}\nWhen 80% of your comments are `nit:` — stop reviewing and configure a linter instead. Automation should handle style; humans should handle logic and design.\n::\n\n## Good vs Bad Feedback\n\n**❌ Bad:**\n> \"This is wrong.\"\n\n**✅ Good:**\n> \"suggestion: This could throw if `user` is null after the auth check on line 42 fails silently. Consider adding a guard: `if (!user) return notFound()`\"\n\n**❌ Bad:**\n> \"Why didn't you use X pattern?\"\n\n**✅ Good:**\n> \"question: I'm curious about the choice here — did you consider the strategy pattern? It might simplify adding new payment providers later. Happy to discuss!\"\n\n## The Author's Responsibilities\n\n- Write a clear PR description (what and **why**)\n- Self-review before requesting review\n- Keep PRs focused and under 400 lines\n- Respond to all comments (even with \"done\")\n- Don't take feedback personally\n\n## Speed Matters\n\n- Review within 4 hours of being requested\n- Don't block PRs over style preferences\n- If you need context, ask quickly instead of stalling\n- Approve with minor comments: \"LGTM with nits\"\n\n## What to Focus On\n\n**High value:** Logic errors, security issues, missing edge cases, architecture concerns\n\n**Low value:** Naming bikeshedding, brace style, import ordering (automate these!)\n\n## Building Review Culture\n\n- Celebrate good PRs publicly\n- Rotate reviewers to spread knowledge\n- New team members? Review their code generously, explain the \"why\"\n- Senior devs: request reviews from juniors too\n\nGreat code reviews build great teams. Invest in the practice.\n","published","public","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1551288049-bebda4e38f71?w=1200&q=80",1738,"2026-06-17T06:03:30.739Z","2026-07-24T06:03:30.742Z","2026-07-28T17:14:16.550Z","The Art of Code Review: Giving Feedback That Ships Better Code | BitBlog","fddb5d93-7a2c-4d86-a06a-fa32e73a01c6",{"email":90,"bio":91,"id":88,"name":92,"avatarUrl":93},"mbeahessilfieprince@gmail.com","Fullstack Software Developer ","Mbeah Essilfie","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F93322394?v=4",[],[96,101],{"id":97,"name":98,"color":99,"description":100},"devops","DevOps","#ff6c37","Development and Operations",{"id":102,"name":103,"color":104,"description":105},"architecture","Architecture","#795548","Software architecture patterns",[107,108],{"id":49,"name":50,"description":51},{"id":25,"name":26,"description":27},[],{"comments":111},0,[113,122,132],{"id":114,"slug":115,"title":116,"excerpt":117,"featuredImage":118,"viewCount":119,"readingTime":71,"publishedAt":120,"author":121},"2997028f-4d22-4eb7-9d86-894a54cb559a","building-type-safe-apis-nuxt3-prisma","Building Type-Safe APIs with Nuxt 3 and Prisma","Learn how to build end-to-end type-safe APIs using Nuxt 3 server routes and Prisma ORM for a seamless developer experience.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1498050108023-c5249f4df085?w=1200&q=80",1922,"2026-07-23T06:02:46.910Z",{"id":88,"name":92,"avatarUrl":93},{"id":123,"slug":124,"title":125,"excerpt":126,"featuredImage":127,"viewCount":128,"readingTime":129,"publishedAt":130,"author":131},"da9e4553-8b0d-411e-b4ec-f9684017e163","mastering-tailwind-css-design-systems","Mastering Tailwind CSS: From Utility Classes to Design Systems","Go beyond basic utility classes and learn how to build cohesive, maintainable design systems with Tailwind CSS.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1555066931-4365d14bab8c?w=1200&q=80",257,10,"2026-07-21T06:02:49.268Z",{"id":88,"name":92,"avatarUrl":93},{"id":133,"slug":134,"title":135,"excerpt":136,"featuredImage":137,"viewCount":138,"readingTime":139,"publishedAt":140,"author":141},"50add5fc-4026-4267-b917-7f71ea9e35b0","complete-guide-vue3-composables","The Complete Guide to Vue 3 Composables","Understand the power of Vue 3's Composition API through practical, real-world composable patterns that you can use today.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1517694712202-14dd9538aa97?w=1200&q=80",990,12,"2026-07-19T06:02:51.753Z",{"id":88,"name":92,"avatarUrl":93},{"data":143,"body":145,"toc":497},{"title":144,"description":144},"",{"type":146,"children":147},"root",[148,157,163,169,174,204,210,215,264,282,288,296,305,313,337,344,352,359,367,373,408,414,437,443,453,463,469,492],{"type":149,"tag":150,"props":151,"children":153},"element","h2",{"id":152},"code-review-is-a-conversation",[154],{"type":155,"value":156},"text","Code Review Is a Conversation",{"type":149,"tag":158,"props":159,"children":160},"p",{},[161],{"type":155,"value":162},"A code review is not a gate — it's a conversation between peers. The goal isn't to find faults; it's to collectively produce the best code possible.",{"type":149,"tag":150,"props":164,"children":166},{"id":165},"the-reviewers-mindset",[167],{"type":155,"value":168},"The Reviewer's Mindset",{"type":149,"tag":158,"props":170,"children":171},{},[172],{"type":155,"value":173},"Before writing any comment, ask yourself:",{"type":149,"tag":175,"props":176,"children":177},"ol",{},[178,188,196],{"type":149,"tag":179,"props":180,"children":181},"li",{},[182],{"type":149,"tag":183,"props":184,"children":185},"strong",{},[186],{"type":155,"value":187},"Is this a real issue or personal preference?",{"type":149,"tag":179,"props":189,"children":190},{},[191],{"type":149,"tag":183,"props":192,"children":193},{},[194],{"type":155,"value":195},"Am I being specific enough to be actionable?",{"type":149,"tag":179,"props":197,"children":198},{},[199],{"type":149,"tag":183,"props":200,"children":201},{},[202],{"type":155,"value":203},"Am I assuming good intent?",{"type":149,"tag":150,"props":205,"children":207},{"id":206},"comment-categories",[208],{"type":155,"value":209},"Comment Categories",{"type":149,"tag":158,"props":211,"children":212},{},[213],{"type":155,"value":214},"Prefix your comments to set expectations:",{"type":149,"tag":216,"props":217,"children":218},"ul",{},[219,231,242,253],{"type":149,"tag":179,"props":220,"children":221},{},[222,229],{"type":149,"tag":223,"props":224,"children":226},"code",{"className":225},[],[227],{"type":155,"value":228},"nit:",{"type":155,"value":230}," — Style\u002Fformatting, non-blocking",{"type":149,"tag":179,"props":232,"children":233},{},[234,240],{"type":149,"tag":223,"props":235,"children":237},{"className":236},[],[238],{"type":155,"value":239},"suggestion:",{"type":155,"value":241}," — Alternative approach worth considering",{"type":149,"tag":179,"props":243,"children":244},{},[245,251],{"type":149,"tag":223,"props":246,"children":248},{"className":247},[],[249],{"type":155,"value":250},"question:",{"type":155,"value":252}," — Seeking to understand, not criticize",{"type":149,"tag":179,"props":254,"children":255},{},[256,262],{"type":149,"tag":223,"props":257,"children":259},{"className":258},[],[260],{"type":155,"value":261},"blocker:",{"type":155,"value":263}," — Must fix before merging",{"type":149,"tag":265,"props":266,"children":269},"callout",{"color":267,"icon":268},"primary","i-lucide-message-circle",[270],{"type":149,"tag":158,"props":271,"children":272},{},[273,275,280],{"type":155,"value":274},"When 80% of your comments are ",{"type":149,"tag":223,"props":276,"children":278},{"className":277},[],[279],{"type":155,"value":228},{"type":155,"value":281}," — stop reviewing and configure a linter instead. Automation should handle style; humans should handle logic and design.",{"type":149,"tag":150,"props":283,"children":285},{"id":284},"good-vs-bad-feedback",[286],{"type":155,"value":287},"Good vs Bad Feedback",{"type":149,"tag":158,"props":289,"children":290},{},[291],{"type":149,"tag":183,"props":292,"children":293},{},[294],{"type":155,"value":295},"❌ Bad:",{"type":149,"tag":297,"props":298,"children":299},"blockquote",{},[300],{"type":149,"tag":158,"props":301,"children":302},{},[303],{"type":155,"value":304},"\"This is wrong.\"",{"type":149,"tag":158,"props":306,"children":307},{},[308],{"type":149,"tag":183,"props":309,"children":310},{},[311],{"type":155,"value":312},"✅ Good:",{"type":149,"tag":297,"props":314,"children":315},{},[316],{"type":149,"tag":158,"props":317,"children":318},{},[319,321,327,329,335],{"type":155,"value":320},"\"suggestion: This could throw if ",{"type":149,"tag":223,"props":322,"children":324},{"className":323},[],[325],{"type":155,"value":326},"user",{"type":155,"value":328}," is null after the auth check on line 42 fails silently. Consider adding a guard: ",{"type":149,"tag":223,"props":330,"children":332},{"className":331},[],[333],{"type":155,"value":334},"if (!user) return notFound()",{"type":155,"value":336},"\"",{"type":149,"tag":158,"props":338,"children":339},{},[340],{"type":149,"tag":183,"props":341,"children":342},{},[343],{"type":155,"value":295},{"type":149,"tag":297,"props":345,"children":346},{},[347],{"type":149,"tag":158,"props":348,"children":349},{},[350],{"type":155,"value":351},"\"Why didn't you use X pattern?\"",{"type":149,"tag":158,"props":353,"children":354},{},[355],{"type":149,"tag":183,"props":356,"children":357},{},[358],{"type":155,"value":312},{"type":149,"tag":297,"props":360,"children":361},{},[362],{"type":149,"tag":158,"props":363,"children":364},{},[365],{"type":155,"value":366},"\"question: I'm curious about the choice here — did you consider the strategy pattern? It might simplify adding new payment providers later. Happy to discuss!\"",{"type":149,"tag":150,"props":368,"children":370},{"id":369},"the-authors-responsibilities",[371],{"type":155,"value":372},"The Author's Responsibilities",{"type":149,"tag":216,"props":374,"children":375},{},[376,388,393,398,403],{"type":149,"tag":179,"props":377,"children":378},{},[379,381,386],{"type":155,"value":380},"Write a clear PR description (what and ",{"type":149,"tag":183,"props":382,"children":383},{},[384],{"type":155,"value":385},"why",{"type":155,"value":387},")",{"type":149,"tag":179,"props":389,"children":390},{},[391],{"type":155,"value":392},"Self-review before requesting review",{"type":149,"tag":179,"props":394,"children":395},{},[396],{"type":155,"value":397},"Keep PRs focused and under 400 lines",{"type":149,"tag":179,"props":399,"children":400},{},[401],{"type":155,"value":402},"Respond to all comments (even with \"done\")",{"type":149,"tag":179,"props":404,"children":405},{},[406],{"type":155,"value":407},"Don't take feedback personally",{"type":149,"tag":150,"props":409,"children":411},{"id":410},"speed-matters",[412],{"type":155,"value":413},"Speed Matters",{"type":149,"tag":216,"props":415,"children":416},{},[417,422,427,432],{"type":149,"tag":179,"props":418,"children":419},{},[420],{"type":155,"value":421},"Review within 4 hours of being requested",{"type":149,"tag":179,"props":423,"children":424},{},[425],{"type":155,"value":426},"Don't block PRs over style preferences",{"type":149,"tag":179,"props":428,"children":429},{},[430],{"type":155,"value":431},"If you need context, ask quickly instead of stalling",{"type":149,"tag":179,"props":433,"children":434},{},[435],{"type":155,"value":436},"Approve with minor comments: \"LGTM with nits\"",{"type":149,"tag":150,"props":438,"children":440},{"id":439},"what-to-focus-on",[441],{"type":155,"value":442},"What to Focus On",{"type":149,"tag":158,"props":444,"children":445},{},[446,451],{"type":149,"tag":183,"props":447,"children":448},{},[449],{"type":155,"value":450},"High value:",{"type":155,"value":452}," Logic errors, security issues, missing edge cases, architecture concerns",{"type":149,"tag":158,"props":454,"children":455},{},[456,461],{"type":149,"tag":183,"props":457,"children":458},{},[459],{"type":155,"value":460},"Low value:",{"type":155,"value":462}," Naming bikeshedding, brace style, import ordering (automate these!)",{"type":149,"tag":150,"props":464,"children":466},{"id":465},"building-review-culture",[467],{"type":155,"value":468},"Building Review Culture",{"type":149,"tag":216,"props":470,"children":471},{},[472,477,482,487],{"type":149,"tag":179,"props":473,"children":474},{},[475],{"type":155,"value":476},"Celebrate good PRs publicly",{"type":149,"tag":179,"props":478,"children":479},{},[480],{"type":155,"value":481},"Rotate reviewers to spread knowledge",{"type":149,"tag":179,"props":483,"children":484},{},[485],{"type":155,"value":486},"New team members? Review their code generously, explain the \"why\"",{"type":149,"tag":179,"props":488,"children":489},{},[490],{"type":155,"value":491},"Senior devs: request reviews from juniors too",{"type":149,"tag":158,"props":493,"children":494},{},[495],{"type":155,"value":496},"Great code reviews build great teams. Invest in the practice.",{"title":144,"searchDepth":498,"depth":498,"links":499},2,[500,501,502,503,504,505,506,507],{"id":152,"depth":498,"text":156},{"id":165,"depth":498,"text":168},{"id":206,"depth":498,"text":209},{"id":284,"depth":498,"text":287},{"id":369,"depth":498,"text":372},{"id":410,"depth":498,"text":413},{"id":439,"depth":498,"text":442},{"id":465,"depth":498,"text":468}]