[{"data":1,"prerenderedAt":1516},["ShallowReactive",2],{"i-lucide:chevron-down":3,"i-lucide:search":8,"i-lucide:sun":10,"i-lucide:moon":12,"i-lucide:arrow-right":14,"i-lucide:menu":16,"i-lucide:mail":18,"i-simple-icons:x":20,"i-simple-icons:linkedin":22,"i-simple-icons:dribbble":25,"i-simple-icons:github":27,"i-lucide:arrow-up-right":29,"blog-\u002Fblog\u002Fbn\u002Fevent-loop-settimeout-zero":31,"blog-related-\u002Fblog\u002Fbn\u002Fevent-loop-settimeout-zero":817,"i-lucide:chevron-right":1502,"i-lucide:calendar":1504,"i-lucide:clock":1506,"i-lucide:link":1508,"i-lucide:globe-2":1510,"i-lucide:trending-up":1512,"i-lucide:copy":1514},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cpath fill=\"currentColor\" d=\"M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":23,"hidden":24},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":26},"\u003Cpath fill=\"currentColor\" d=\"M12 24C5.385 24 0 18.615 0 12S5.385 0 12 0s12 5.385 12 12s-5.385 12-12 12m10.12-10.358c-.35-.11-3.17-.953-6.384-.438c1.34 3.684 1.887 6.684 1.992 7.308a10.28 10.28 0 0 0 4.395-6.87zm-6.115 7.808c-.153-.9-.75-4.032-2.19-7.77l-.066.02c-5.79 2.015-7.86 6.025-8.04 6.4a10.16 10.16 0 0 0 6.29 2.166c1.42 0 2.77-.29 4-.814zm-11.62-2.58c.232-.4 3.045-5.055 8.332-6.765q.202-.067.405-.12q-.392-.879-.832-1.74C7.17 11.775 2.206 11.71 1.756 11.7l-.004.312c0 2.633.998 5.037 2.634 6.855zm-2.42-8.955c.46.008 4.683.026 9.477-1.248a66 66 0 0 0-3.8-5.928a10.28 10.28 0 0 0-5.676 7.17zM9.6 2.052c.282.38 2.145 2.914 3.822 6c3.645-1.365 5.19-3.44 5.373-3.702A10.2 10.2 0 0 0 12 1.764c-.825 0-1.63.1-2.4.285zm10.335 3.483c-.218.29-1.935 2.493-5.724 4.04c.24.49.47.985.68 1.486c.08.18.15.36.22.53c3.41-.43 6.8.26 7.14.33c-.02-2.42-.88-4.64-2.31-6.38z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":28},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":30},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"id":32,"title":33,"author":34,"body":37,"category":801,"cover":802,"coverAlt":33,"date":803,"description":804,"draft":6,"extension":805,"featured":6,"lang":806,"meta":807,"navigation":24,"path":808,"readingTime":161,"seo":809,"seoTitle":810,"stem":811,"tags":812,"__hash__":816},"blog\u002Fblog\u002Fbn\u002Fevent-loop-settimeout-zero.md","setTimeout(fn, 0) সাথে সাথে চলে না কেন",{"name":35,"role":36},"নাফিস রহমান","ডিজাইন সিস্টেম লিড",{"type":38,"value":39,"toc":793},"minimark",[40,44,173,183,186,191,194,210,213,262,265,269,272,277,309,315,337,340,350,361,365,372,420,427,433,471,474,478,487,577,591,596,600,603,611,614,620,753,765,769,779,789],[41,42,43],"p",{},"এই কোডটার আউটপুট কী হবে?",[45,46,51],"pre",{"className":47,"code":48,"language":49,"meta":50,"style":50},"language-js shiki shiki-themes github-dark-dimmed github-dark-dimmed","console.log('১')\n\nsetTimeout(() => console.log('২'), 0)\n\nPromise.resolve().then(() => console.log('৩'))\n\nconsole.log('৪')\n","js","",[52,53,54,77,83,115,120,154,159],"code",{"__ignoreMap":50},[55,56,59,63,67,70,74],"span",{"class":57,"line":58},"line",1,[55,60,62],{"class":61},"sM9_K","console.",[55,64,66],{"class":65},"s-wk_","log",[55,68,69],{"class":61},"(",[55,71,73],{"class":72},"szYpP","'১'",[55,75,76],{"class":61},")\n",[55,78,80],{"class":57,"line":79},2,[55,81,82],{"emptyLinePlaceholder":24},"\n",[55,84,86,89,92,96,99,101,103,106,109,113],{"class":57,"line":85},3,[55,87,88],{"class":65},"setTimeout",[55,90,91],{"class":61},"(() ",[55,93,95],{"class":94},"sEYkB","=>",[55,97,98],{"class":61}," console.",[55,100,66],{"class":65},[55,102,69],{"class":61},[55,104,105],{"class":72},"'২'",[55,107,108],{"class":61},"), ",[55,110,112],{"class":111},"sQdni","0",[55,114,76],{"class":61},[55,116,118],{"class":57,"line":117},4,[55,119,82],{"emptyLinePlaceholder":24},[55,121,123,126,129,132,135,138,140,142,144,146,148,151],{"class":57,"line":122},5,[55,124,125],{"class":111},"Promise",[55,127,128],{"class":61},".",[55,130,131],{"class":65},"resolve",[55,133,134],{"class":61},"().",[55,136,137],{"class":65},"then",[55,139,91],{"class":61},[55,141,95],{"class":94},[55,143,98],{"class":61},[55,145,66],{"class":65},[55,147,69],{"class":61},[55,149,150],{"class":72},"'৩'",[55,152,153],{"class":61},"))\n",[55,155,157],{"class":57,"line":156},6,[55,158,82],{"emptyLinePlaceholder":24},[55,160,162,164,166,168,171],{"class":57,"line":161},7,[55,163,62],{"class":61},[55,165,66],{"class":65},[55,167,69],{"class":61},[55,169,170],{"class":72},"'৪'",[55,172,76],{"class":61},[41,174,175,176,179,180,182],{},"উত্তর ",[52,177,178],{},"১ ৪ ৩ ২","। ",[52,181,88],{},"-এ ০ মিলিসেকেন্ড দেওয়া সত্ত্বেও সেটা সবার শেষে চলে, এমনকি এমন একটা প্রমিসের পরেও যেটা তার পরে লেখা হয়েছে।",[41,184,185],{},"\"০ মানে এখনই নয়\" — এইটুকু মনে রাখলে কাজ চলে যায়, কিন্তু কেন নয় সেটা জানলে আর মুখস্থ করতে হয় না।",[187,188,190],"h2",{"id":189},"কল-স্ট্যাক-আগে-শেষ-হয়","কল স্ট্যাক আগে শেষ হয়",[41,192,193],{},"জাভাস্ক্রিপ্ট সিঙ্গল-থ্রেডেড। যেকোনো মুহূর্তে একটাই জিনিস চলে, আর সেটা কল স্ট্যাকের উপরের ফাংশনটা।",[41,195,196,197,201,202,205,206,209],{},"ইভেন্ট লুপ কোনো কিছু তুলে নেওয়ার আগে ",[198,199,200],"strong",{},"স্ট্যাক পুরো খালি হওয়া লাগে","। তাই উপরের কোডে ",[52,203,204],{},"console.log('১')"," আর ",[52,207,208],{},"console.log('৪')"," — যেগুলো সিঙ্ক্রোনাস — আগে চলবেই। বাকি সবকিছু সারিতে অপেক্ষা করে।",[41,211,212],{},"এখান থেকেই সবচেয়ে সাধারণ বাগটা আসে:",[45,214,216],{"className":47,"code":215,"language":49,"meta":50,"style":50},"\u002F\u002F ব্রাউজার এই পুরো লুপটা শেষ না হওয়া পর্যন্ত জমে থাকে\nfor (let i = 0; i \u003C 1e9; i++) {}\n",[52,217,218,224],{"__ignoreMap":50},[55,219,220],{"class":57,"line":58},[55,221,223],{"class":222},"s0RzX","\u002F\u002F ব্রাউজার এই পুরো লুপটা শেষ না হওয়া পর্যন্ত জমে থাকে\n",[55,225,226,229,232,235,238,241,244,247,250,253,256,259],{"class":57,"line":79},[55,227,228],{"class":94},"for",[55,230,231],{"class":61}," (",[55,233,234],{"class":94},"let",[55,236,237],{"class":61}," i ",[55,239,240],{"class":94},"=",[55,242,243],{"class":111}," 0",[55,245,246],{"class":61},"; i ",[55,248,249],{"class":94},"\u003C",[55,251,252],{"class":111}," 1e9",[55,254,255],{"class":61},"; i",[55,257,258],{"class":94},"++",[55,260,261],{"class":61},") {}\n",[41,263,264],{},"স্ট্যাক খালি না হলে ইভেন্ট লুপ কিছুই করতে পারে না — ক্লিক হ্যান্ডলার চলবে না, রেন্ডারও হবে না। \"পেজ হ্যাং করে আছে\" মানে বেশিরভাগ সময় \"স্ট্যাক খালি হচ্ছে না\"।",[187,266,268],{"id":267},"দুইটা-আলাদা-সারি","দুইটা আলাদা সারি",[41,270,271],{},"স্ট্যাক খালি হলে ইভেন্ট লুপ যা দেখে, তা একটা সারি নয় — দুইটা, আর তাদের অগ্রাধিকার আলাদা।",[41,273,274],{},[198,275,276],{},"মাইক্রোটাস্ক সারি",[278,279,280,293,299,304],"ul",{},[281,282,283,286,287,286,290],"li",{},[52,284,285],{},"Promise.then"," \u002F ",[52,288,289],{},".catch",[52,291,292],{},".finally",[281,294,295,298],{},[52,296,297],{},"await","-এর পরের অংশ",[281,300,301],{},[52,302,303],{},"queueMicrotask",[281,305,306],{},[52,307,308],{},"MutationObserver",[41,310,311,314],{},[198,312,313],{},"ম্যাক্রোটাস্ক সারি"," (স্পেকে \"টাস্ক\")",[278,316,317,325,328,331],{},[281,318,319,321,322],{},[52,320,88],{},", ",[52,323,324],{},"setInterval",[281,326,327],{},"DOM ইভেন্ট (click, input)",[281,329,330],{},"নেটওয়ার্ক কলব্যাক",[281,332,333,336],{},[52,334,335],{},"requestAnimationFrame"," (আলাদা ধাপে, রেন্ডারের আগে)",[41,338,339],{},"নিয়মটা এক লাইনে:",[341,342,343],"blockquote",{},[41,344,345,346,349],{},"প্রতিটা ম্যাক্রোটাস্কের পর, ",[198,347,348],{},"পুরো"," মাইক্রোটাস্ক সারি খালি করা হয় — তারপর পরের ম্যাক্রোটাস্ক।",[41,351,352,353,356,357,360],{},"তাই ",[52,354,355],{},"৩"," (প্রমিস, মাইক্রোটাস্ক) ",[52,358,359],{},"২","-এর (টাইমআউট, ম্যাক্রোটাস্ক) আগে চলে। ০ মিলিসেকেন্ড লেখা থাকলেও সেটা অন্য সারিতে, আর ওই সারির পালা পরে।",[187,362,364],{"id":363},"পুরো-শব্দটা-গুরুত্বপূর্ণ","\"পুরো\" শব্দটা গুরুত্বপূর্ণ",[41,366,367,368,371],{},"মাইক্রোটাস্ক সারি খালি করার সময় নতুন মাইক্রোটাস্ক যোগ হলে সেগুলোও ",[198,369,370],{},"একই দফায়"," চলে। এটা সুবিধা, আবার ফাঁদও:",[45,373,375],{"className":47,"code":374,"language":49,"meta":50,"style":50},"function loop() {\n  Promise.resolve().then(loop)\n}\nloop() \u002F\u002F পেজ জমে যায়\n",[52,376,377,388,404,409],{"__ignoreMap":50},[55,378,379,382,385],{"class":57,"line":58},[55,380,381],{"class":94},"function",[55,383,384],{"class":65}," loop",[55,386,387],{"class":61},"() {\n",[55,389,390,393,395,397,399,401],{"class":57,"line":79},[55,391,392],{"class":111},"  Promise",[55,394,128],{"class":61},[55,396,131],{"class":65},[55,398,134],{"class":61},[55,400,137],{"class":65},[55,402,403],{"class":61},"(loop)\n",[55,405,406],{"class":57,"line":85},[55,407,408],{"class":61},"}\n",[55,410,411,414,417],{"class":57,"line":117},[55,412,413],{"class":65},"loop",[55,415,416],{"class":61},"() ",[55,418,419],{"class":222},"\u002F\u002F পেজ জমে যায়\n",[41,421,422,423,426],{},"এখানে কোনো ইনফিনিট ",[52,424,425],{},"while"," নেই, তবু ব্রাউজার আর কিছু করতে পারে না — সারিটা কখনো খালি হয় না, তাই লুপ কখনো পরের ধাপে যায় না।",[41,428,429,430,432],{},"একই কোড ",[52,431,88],{}," দিয়ে লিখলে পেজ সচল থাকে:",[45,434,436],{"className":47,"code":435,"language":49,"meta":50,"style":50},"function loop() {\n  setTimeout(loop, 0)\n}\nloop() \u002F\u002F চলতেই থাকে, কিন্তু পেজ ব্যবহারযোগ্য\n",[52,437,438,446,458,462],{"__ignoreMap":50},[55,439,440,442,444],{"class":57,"line":58},[55,441,381],{"class":94},[55,443,384],{"class":65},[55,445,387],{"class":61},[55,447,448,451,454,456],{"class":57,"line":79},[55,449,450],{"class":65},"  setTimeout",[55,452,453],{"class":61},"(loop, ",[55,455,112],{"class":111},[55,457,76],{"class":61},[55,459,460],{"class":57,"line":85},[55,461,408],{"class":61},[55,463,464,466,468],{"class":57,"line":117},[55,465,413],{"class":65},[55,467,416],{"class":61},[55,469,470],{"class":222},"\u002F\u002F চলতেই থাকে, কিন্তু পেজ ব্যবহারযোগ্য\n",[41,472,473],{},"কারণ প্রতিটা ম্যাক্রোটাস্কের মাঝে ব্রাউজার রেন্ডার করার সুযোগ পায়।",[187,475,477],{"id":476},"await-আসলে-কী","await আসলে কী",[41,479,480,482,483,486],{},[52,481,297],{}," নতুন কিছু নয় — এটা ",[52,484,485],{},".then","-এর সিনট্যাক্স।",[45,488,490],{"className":47,"code":489,"language":49,"meta":50,"style":50},"async function run() {\n  console.log('ক')\n  await null \u002F\u002F ← এখানেই ফাংশনটা থামে\n  console.log('খ') \u002F\u002F ← এই অংশটা মাইক্রোটাস্ক\n}\n\nrun()\nconsole.log('গ')\n",[52,491,492,505,519,530,547,551,555,563],{"__ignoreMap":50},[55,493,494,497,500,503],{"class":57,"line":58},[55,495,496],{"class":94},"async",[55,498,499],{"class":94}," function",[55,501,502],{"class":65}," run",[55,504,387],{"class":61},[55,506,507,510,512,514,517],{"class":57,"line":79},[55,508,509],{"class":61},"  console.",[55,511,66],{"class":65},[55,513,69],{"class":61},[55,515,516],{"class":72},"'ক'",[55,518,76],{"class":61},[55,520,521,524,527],{"class":57,"line":85},[55,522,523],{"class":94},"  await",[55,525,526],{"class":111}," null",[55,528,529],{"class":222}," \u002F\u002F ← এখানেই ফাংশনটা থামে\n",[55,531,532,534,536,538,541,544],{"class":57,"line":117},[55,533,509],{"class":61},[55,535,66],{"class":65},[55,537,69],{"class":61},[55,539,540],{"class":72},"'খ'",[55,542,543],{"class":61},") ",[55,545,546],{"class":222},"\u002F\u002F ← এই অংশটা মাইক্রোটাস্ক\n",[55,548,549],{"class":57,"line":122},[55,550,408],{"class":61},[55,552,553],{"class":57,"line":156},[55,554,82],{"emptyLinePlaceholder":24},[55,556,557,560],{"class":57,"line":161},[55,558,559],{"class":65},"run",[55,561,562],{"class":61},"()\n",[55,564,566,568,570,572,575],{"class":57,"line":565},8,[55,567,62],{"class":61},[55,569,66],{"class":65},[55,571,69],{"class":61},[55,573,574],{"class":72},"'গ'",[55,576,76],{"class":61},[41,578,579,580,179,583,586,587,590],{},"আউটপুট ",[52,581,582],{},"ক গ খ",[52,584,585],{},"await null"," — যেখানে অপেক্ষা করার মতো কিছুই নেই — তবু ফাংশনটা থামে, বাকিটা মাইক্রোটাস্ক হিসেবে সারিতে যায়, আর ",[52,588,589],{},"গ"," আগে চলে।",[41,592,352,593,595],{},[52,594,297],{},"-এর পরের প্রতিটা লাইন কার্যত একটা কলব্যাকের ভেতরে। সিরিয়ালি লেখা যায় বলে এটা ভুলে যাওয়া সহজ।",[187,597,599],{"id":598},"রেন্ডারিং-কোথায়","রেন্ডারিং কোথায়",[41,601,602],{},"ব্রাউজার সাধারণত প্রতি ফ্রেমে একবার রেন্ডার করে — মোটামুটি ১৬.৭ms পরপর, ৬০Hz-এ। ধাপটা এরকম:",[45,604,609],{"className":605,"code":607,"language":608},[606],"language-text","ম্যাক্রোটাস্ক → মাইক্রোটাস্ক (সব) → rAF কলব্যাক → স্টাইল → লেআউট → পেইন্ট\n","text",[52,610,607],{"__ignoreMap":50},[41,612,613],{},"দুইটা ব্যবহারিক ফল:",[41,615,616,619],{},[198,617,618],{},"এক"," — একই টিকে DOM বদলে আবার পড়লে ব্রাউজার জোর করে লেআউট হিসাব করে (layout thrashing):",[45,621,623],{"className":47,"code":622,"language":49,"meta":50,"style":50},"\u002F\u002F খারাপ — প্রতি ধাপে জোর করে reflow\nfor (const el of items) {\n  el.style.height = el.offsetHeight + 10 + 'px'\n}\n\n\u002F\u002F ভালো — আগে সব পড়ুন, তারপর সব লিখুন\nconst heights = items.map((el) => el.offsetHeight)\nitems.forEach((el, i) => (el.style.height = heights[i] + 10 + 'px'))\n",[52,624,625,630,648,670,674,678,683,713],{"__ignoreMap":50},[55,626,627],{"class":57,"line":58},[55,628,629],{"class":222},"\u002F\u002F খারাপ — প্রতি ধাপে জোর করে reflow\n",[55,631,632,634,636,639,642,645],{"class":57,"line":79},[55,633,228],{"class":94},[55,635,231],{"class":61},[55,637,638],{"class":94},"const",[55,640,641],{"class":111}," el",[55,643,644],{"class":94}," of",[55,646,647],{"class":61}," items) {\n",[55,649,650,653,655,658,661,664,667],{"class":57,"line":85},[55,651,652],{"class":61},"  el.style.height ",[55,654,240],{"class":94},[55,656,657],{"class":61}," el.offsetHeight ",[55,659,660],{"class":94},"+",[55,662,663],{"class":111}," 10",[55,665,666],{"class":94}," +",[55,668,669],{"class":72}," 'px'\n",[55,671,672],{"class":57,"line":117},[55,673,408],{"class":61},[55,675,676],{"class":57,"line":122},[55,677,82],{"emptyLinePlaceholder":24},[55,679,680],{"class":57,"line":156},[55,681,682],{"class":222},"\u002F\u002F ভালো — আগে সব পড়ুন, তারপর সব লিখুন\n",[55,684,685,687,690,693,696,699,702,706,708,710],{"class":57,"line":161},[55,686,638],{"class":94},[55,688,689],{"class":111}," heights",[55,691,692],{"class":94}," =",[55,694,695],{"class":61}," items.",[55,697,698],{"class":65},"map",[55,700,701],{"class":61},"((",[55,703,705],{"class":704},"siJwO","el",[55,707,543],{"class":61},[55,709,95],{"class":94},[55,711,712],{"class":61}," el.offsetHeight)\n",[55,714,715,718,721,723,725,727,730,732,734,737,739,742,744,746,748,751],{"class":57,"line":565},[55,716,717],{"class":61},"items.",[55,719,720],{"class":65},"forEach",[55,722,701],{"class":61},[55,724,705],{"class":704},[55,726,321],{"class":61},[55,728,729],{"class":704},"i",[55,731,543],{"class":61},[55,733,95],{"class":94},[55,735,736],{"class":61}," (el.style.height ",[55,738,240],{"class":94},[55,740,741],{"class":61}," heights[i] ",[55,743,660],{"class":94},[55,745,663],{"class":111},[55,747,666],{"class":94},[55,749,750],{"class":72}," 'px'",[55,752,153],{"class":61},[41,754,755,758,759,761,762,764],{},[198,756,757],{},"দুই"," — অ্যানিমেশন ",[52,760,88],{}," দিয়ে নয়, ",[52,763,335],{}," দিয়ে। rAF রেন্ডার ধাপের ঠিক আগে চলে, তাই ফ্রেম মিস হয় না।",[187,766,768],{"id":767},"০-আসলে-০-নয়","০ আসলে ০ নয়",[41,770,771,772,774,775,778],{},"শেষ একটা খুঁটিনাটি: HTML স্পেক অনুযায়ী নেস্টেড ",[52,773,88],{}," পাঁচ স্তরের পর সর্বনিম্ন ",[198,776,777],{},"৪ মিলিসেকেন্ড"," ক্ল্যাম্প হয়। ব্যাকগ্রাউন্ড ট্যাবে ব্রাউজার এটা আরও বাড়িয়ে ১০০০ms-ও করে দিতে পারে।",[41,780,781,782,785,786,788],{},"অর্থাৎ ",[52,783,784],{},"setTimeout(fn, 0)"," মানে \"যত দ্রুত সম্ভব\" নয়, মানে \"পরের টাস্ক হিসেবে, সুবিধামতো\"। এখনই দরকার হলে ",[52,787,303],{}," আছে — কিন্তু তাতে ব্রাউজার রেন্ডার করার সুযোগ পায় না, যেটা প্রায়ই আপনি চাইছিলেন।",[790,791,792],"style",{},"html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .s-wk_, html code.shiki .s-wk_{--shiki-default:#DCBDFB;--shiki-dark:#DCBDFB}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html pre.shiki code .sEYkB, html code.shiki .sEYkB{--shiki-default:#F47067;--shiki-dark:#F47067}html pre.shiki code .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s0RzX, html code.shiki .s0RzX{--shiki-default:#768390;--shiki-dark:#768390}html pre.shiki code .siJwO, html code.shiki .siJwO{--shiki-default:#F69D50;--shiki-dark:#F69D50}",{"title":50,"searchDepth":85,"depth":85,"links":794},[795,796,797,798,799,800],{"id":189,"depth":79,"text":190},{"id":267,"depth":79,"text":268},{"id":363,"depth":79,"text":364},{"id":476,"depth":79,"text":477},{"id":598,"depth":79,"text":599},{"id":767,"depth":79,"text":768},"web-development","\u002Fcovers\u002Fblog\u002Fbn\u002Fevent-loop-settimeout-zero.webp","2026-06-11","ম্যাক্রোটাস্ক, মাইক্রোটাস্ক আর রেন্ডারিং — ইভেন্ট লুপের ধাপগুলো জানলে অ্যাসিঙ্ক কোডের ক্রম আর অনুমান করতে হয় না।","md","bn",{},"\u002Fblog\u002Fbn\u002Fevent-loop-settimeout-zero",{"title":33,"description":804},null,"blog\u002Fbn\u002Fevent-loop-settimeout-zero",[813,814,815],"JavaScript","ইভেন্ট লুপ","অ্যাসিঙ্ক","sDSuoRwr_XRySGJ1RlFuI9K5Bb1TEKO_ZDlQkE38918",[818,1241,1386],{"id":819,"title":820,"author":821,"body":822,"category":801,"cover":810,"coverAlt":810,"date":1230,"description":1231,"draft":6,"extension":805,"featured":6,"lang":806,"meta":1232,"navigation":24,"path":1233,"readingTime":161,"seo":1234,"seoTitle":810,"stem":1235,"tags":1236,"__hash__":1240},"blog\u002Fblog\u002Fbn\u002Fcomponent-margin-ownership.md","কম্পোনেন্টের গায়ে margin দেবেন না",{"name":35,"role":36},{"type":38,"value":823,"toc":1223},[824,827,834,838,841,848,851,861,865,1100,1107,1117,1125,1129,1132,1142,1147,1158,1162,1165,1171,1177,1187,1203,1207,1210,1217,1220],[41,825,826],{},"একটা কম্পোনেন্ট লাইব্রেরি সাধারণত একভাবেই ভাঙে — এক জায়গায় সুন্দর দেখায়, অন্য জায়গায় বসালেই ফাঁকা জায়গার হিসাব মেলে না।",[41,828,829,830,833],{},"কারণটা প্রায় সবসময় একই। কার্ডের নিজের CSS-এ ",[52,831,832],{},"margin-bottom: 24px"," লেখা আছে।",[187,835,837],{"id":836},"সমস্যাটা-মালিকানার","সমস্যাটা মালিকানার",[41,839,840],{},"একটা কম্পোনেন্টের ভেতরের ফাঁকা জায়গা — প্যাডিং, আইকন আর লেখার দূরত্ব, শিরোনাম আর বডির গ্যাপ — কম্পোনেন্টেরই সম্পত্তি। ওটা তার ডিজাইনের অংশ, সব জায়গায় এক থাকা উচিত।",[41,842,843,844,847],{},"কিন্তু কম্পোনেন্টের ",[198,845,846],{},"বাইরের"," ফাঁকা জায়গা তার নয়। ওটা লেআউটের সিদ্ধান্ত, আর লেআউট জানে কম্পোনেন্টটা কোথায় বসছে — গ্রিডে, সাইডবারে, নাকি ডায়ালগের ভেতরে একা। কম্পোনেন্ট সেটা জানে না, জানার কথাও না।",[41,849,850],{},"চাইল্ড যখন নিজের বাইরের মার্জিন নিজে ঠিক করে, তখন সে এমন একটা প্রশ্নের উত্তর দিয়ে ফেলে যেটা তাকে কেউ করেনি।",[852,853,854],"note",{},[41,855,856,857,860],{},"নিয়মটা এক লাইনে: ",[198,858,859],{},"প্যাডিং ভেতরের দিকে তাকায়, মার্জিন বাইরের দিকে।"," ভেতরের দিকের সবকিছু কম্পোনেন্টের, বাইরের দিকের সবকিছু প্যারেন্টের।",[187,862,864],{"id":863},"কোডে-পার্থক্যটা","কোডে পার্থক্যটা",[866,867,872,1001],"compare",{"after":868,"before":869,"note":870,"split":871},"প্যারেন্ট গ্যাপ দিচ্ছে","চাইল্ড মার্জিন দিচ্ছে","দ্বিতীয়টায় কার্ড নিজে জানে না তার পরে আর কিছু আছে কি না — আর সেটাই ঠিক।","দুটোই",[873,874,875],"template",{"v-slot:before":50},[45,876,880],{"className":877,"code":878,"language":879,"meta":50,"style":50},"language-vue shiki shiki-themes github-dark-dimmed github-dark-dimmed","\u003C!-- Card.vue -->\n\u003Ctemplate>\n  \u003Carticle class=\"mb-6 rounded-xl border p-5\">\n    \u003Cslot \u002F>\n  \u003C\u002Farticle>\n\u003C\u002Ftemplate>\n\n\u003C!-- ব্যবহার -->\n\u003CCard v-for=\"item in items\" :key=\"item.id\" \u002F>\n","vue",[52,881,882,887,897,915,929,938,947,951,956],{"__ignoreMap":50},[55,883,884],{"class":57,"line":58},[55,885,886],{"class":222},"\u003C!-- Card.vue -->\n",[55,888,889,891,894],{"class":57,"line":79},[55,890,249],{"class":61},[55,892,873],{"class":893},"sza-u",[55,895,896],{"class":61},">\n",[55,898,899,902,905,908,910,913],{"class":57,"line":85},[55,900,901],{"class":61},"  \u003C",[55,903,904],{"class":893},"article",[55,906,907],{"class":111}," class",[55,909,240],{"class":61},[55,911,912],{"class":72},"\"mb-6 rounded-xl border p-5\"",[55,914,896],{"class":61},[55,916,917,920,923,927],{"class":57,"line":117},[55,918,919],{"class":61},"    \u003C",[55,921,922],{"class":893},"slot",[55,924,926],{"class":925},"skSX4"," \u002F",[55,928,896],{"class":61},[55,930,931,934,936],{"class":57,"line":122},[55,932,933],{"class":61},"  \u003C\u002F",[55,935,904],{"class":893},[55,937,896],{"class":61},[55,939,940,943,945],{"class":57,"line":156},[55,941,942],{"class":61},"\u003C\u002F",[55,944,873],{"class":893},[55,946,896],{"class":61},[55,948,949],{"class":57,"line":161},[55,950,82],{"emptyLinePlaceholder":24},[55,952,953],{"class":57,"line":565},[55,954,955],{"class":222},"\u003C!-- ব্যবহার -->\n",[55,957,959,961,964,967,969,972,975,978,981,983,986,989,991,993,996,998],{"class":57,"line":958},9,[55,960,249],{"class":61},[55,962,963],{"class":893},"Card",[55,965,966],{"class":94}," v-for",[55,968,240],{"class":61},[55,970,971],{"class":61},"\"",[55,973,974],{"class":61},"item ",[55,976,977],{"class":94},"in",[55,979,980],{"class":61}," items",[55,982,971],{"class":61},[55,984,985],{"class":61}," :",[55,987,988],{"class":111},"key",[55,990,240],{"class":61},[55,992,971],{"class":61},[55,994,995],{"class":61},"item.id",[55,997,971],{"class":61},[55,999,1000],{"class":61}," \u002F>\n",[873,1002,1003],{"v-slot:after":50},[45,1004,1006],{"className":877,"code":1005,"language":879,"meta":50,"style":50},"\u003C!-- Card.vue -->\n\u003Ctemplate>\n  \u003Carticle class=\"rounded-xl border p-5\">\n    \u003Cslot \u002F>\n  \u003C\u002Farticle>\n\u003C\u002Ftemplate>\n\n\u003C!-- ব্যবহার -->\n\u003Cdiv class=\"flex flex-col gap-6\">\n  \u003CCard v-for=\"item in items\" :key=\"item.id\" \u002F>\n\u003C\u002Fdiv>\n",[52,1007,1008,1012,1020,1035,1045,1053,1061,1065,1069,1085,1091],{"__ignoreMap":50},[55,1009,1010],{"class":57,"line":58},[55,1011,886],{"class":222},[55,1013,1014,1016,1018],{"class":57,"line":79},[55,1015,249],{"class":61},[55,1017,873],{"class":893},[55,1019,896],{"class":61},[55,1021,1022,1024,1026,1028,1030,1033],{"class":57,"line":85},[55,1023,901],{"class":61},[55,1025,904],{"class":893},[55,1027,907],{"class":111},[55,1029,240],{"class":61},[55,1031,1032],{"class":72},"\"rounded-xl border p-5\"",[55,1034,896],{"class":61},[55,1036,1037,1039,1041,1043],{"class":57,"line":117},[55,1038,919],{"class":61},[55,1040,922],{"class":893},[55,1042,926],{"class":925},[55,1044,896],{"class":61},[55,1046,1047,1049,1051],{"class":57,"line":122},[55,1048,933],{"class":61},[55,1050,904],{"class":893},[55,1052,896],{"class":61},[55,1054,1055,1057,1059],{"class":57,"line":156},[55,1056,942],{"class":61},[55,1058,873],{"class":893},[55,1060,896],{"class":61},[55,1062,1063],{"class":57,"line":161},[55,1064,82],{"emptyLinePlaceholder":24},[55,1066,1067],{"class":57,"line":565},[55,1068,955],{"class":222},[55,1070,1071,1073,1076,1078,1080,1083],{"class":57,"line":958},[55,1072,249],{"class":61},[55,1074,1075],{"class":893},"div",[55,1077,907],{"class":111},[55,1079,240],{"class":61},[55,1081,1082],{"class":72},"\"flex flex-col gap-6\"",[55,1084,896],{"class":61},[55,1086,1088],{"class":57,"line":1087},10,[55,1089,1090],{"class":61},"  \u003CCard v-for=\"item in items\" :key=\"item.id\" \u002F>\n",[55,1092,1094,1096,1098],{"class":57,"line":1093},11,[55,1095,942],{"class":61},[55,1097,1075],{"class":893},[55,1099,896],{"class":61},[41,1101,1102,1103,1106],{},"প্রথমটায় লিস্টের শেষ কার্ডের নিচেও ২৪ পিক্সেল ঝুলে থাকে, যেটা কেউ চায়নি। ঠিক করতে গিয়ে ",[52,1104,1105],{},":last-child { margin-bottom: 0 }"," লেখা হয়, তারপর গ্রিডে বসালে আবার অন্য নিয়ম, তারপর ডায়ালগে আরেকটা। তিনটা ব্যতিক্রম লেখার পর কম্পোনেন্টটার স্পেসিং আর কেউ পড়ে বুঝতে পারে না।",[41,1108,1109,1110,1113,1114,1116],{},"দ্বিতীয়টায় ব্যতিক্রম নেই, কারণ নিয়মটাই নেই। প্যারেন্ট ",[52,1111,1112],{},"gap"," দিচ্ছে, শেষ আইটেমের পরে গ্যাপ বসে না — এটা ",[52,1115,1112],{},"-এর সংজ্ঞা, কারও লেখা নিয়ম নয়।",[1118,1119,1120],"tip",{},[41,1121,1122,1124],{},[52,1123,1112],{}," শুধু ফ্লেক্স আর গ্রিডে কাজ করে, আর সেটাই এর সবচেয়ে বড় সুবিধা। মার্জিন যেকোনো জায়গায় বসানো যায় বলেই যেকোনো জায়গায় ভুল হতে পারে।",[187,1126,1128],{"id":1127},"মার্জিন-কলাপস-আরেকটা-কারণ","মার্জিন কলাপস আরেকটা কারণ",[41,1130,1131],{},"লম্বালম্বি মার্জিন পাশাপাশি বসলে দুটো যোগ হয় না, বড়টা টিকে থাকে। এটা CSS-এর পুরোনো আচরণ, ভুল নয় — কিন্তু কম্পোনেন্ট লেখার সময় এটাই সবচেয়ে বেশি বিভ্রান্ত করে।",[41,1133,1134,1135,1137,1138,1141],{},"উপরের কার্ডের ",[52,1136,832],{}," আর নিচের কার্ডের ",[52,1139,1140],{},"margin-top: 16px"," মিলে ফাঁক হয় ২৪, ৪০ নয়। মানে আপনি যে সংখ্যাটা লিখেছেন, স্ক্রিনে সেটা নাও থাকতে পারে — নির্ভর করছে প্রতিবেশী কে।",[41,1143,1144,1146],{},[52,1145,1112],{}," কলাপস করে না। যা লিখবেন তাই পাবেন।",[1148,1149],"quiz",{":answer":1150,":options":1151,"checkLabel":1152,"correctLabel":1153,"explanation":1154,"incorrectLabel":1155,"question":1156,"resetLabel":1157},"2","[\"১৬px — গ্রিডের gap মার্জিনকে বাতিল করে দেয়\",\"২৪px — মার্জিন আর gap কলাপস করে বড়টা থাকে\",\"৪০px — gap আর মার্জিন যোগ হয়\",\"২০px — দুটোর গড়\"]","উত্তর মিলিয়ে দেখি","ঠিক আছে","গ্রিড আর ফ্লেক্স আইটেমে মার্জিন কলাপস হয় না, তাই gap-এর ১৬px-এর সাথে কার্ডের নিজের ২৪px যোগ হয়ে ৪০px দাঁড়ায়। একই কম্পোনেন্ট ফ্লো লেআউটে বসালে উত্তর হতো ২৪ — অর্থাৎ ফাঁকা জায়গাটা কম্পোনেন্টের নয়, তার প্রতিবেশীর উপর নির্ভরশীল। এটাই মার্জিন এড়ানোর মূল যুক্তি।","হয়নি","একটা কার্ড কম্পোনেন্টে `margin-bottom: 24px` দেওয়া আছে। সেটাকে একটা `display: grid` কন্টেইনারে `gap: 16px` দিয়ে বসানো হলো। দুটো কার্ডের মাঝে ফাঁক কত হবে?","আবার চেষ্টা করি",[187,1159,1161],{"id":1160},"ভেতরের-স্পেসিং-অবশ্যই-কম্পোনেন্টের","ভেতরের স্পেসিং অবশ্যই কম্পোনেন্টের",[41,1163,1164],{},"উল্টো দিকটাও সমান গুরুত্বপূর্ণ। কম্পোনেন্টের ভেতরের প্যাডিং প্যারেন্টের হাতে ছেড়ে দিলে একই বোতাম দশ জায়গায় দশ রকম হয়।",[41,1166,1167,1170],{},[52,1168,1169],{},"size"," একটা বন্ধ তালিকা হওয়া উচিত — তিনটা মান, তিনটাই কম্পোনেন্টের ভেতরে লেখা। বাইরে থেকে ক্লাস দিয়ে প্যাডিং বদলানো মানে তালিকার বাইরে একটা চতুর্থ সাইজ তৈরি করা, যেটা কোথাও লেখা নেই:",[1172,1173],"playground",{":controls":1174,"component":1175,"label":1176},"[{\"prop\":\"size\",\"options\":[\"sm\",\"md\",\"lg\"]},{\"prop\":\"variant\",\"options\":[\"primary\",\"outline\",\"ghost\"]}]","button","সংরক্ষণ করুন",[41,1178,1179,1180,1183,1184,1186],{},"উপরের প্রতিটা অবস্থার জন্য নিচে যে মার্কআপটা দেখাচ্ছে, সেটাই যথেষ্ট। কোনো ",[52,1181,1182],{},"class=\"px-6\""," নেই — কারণ দরকার হলে সেটা ",[52,1185,1169],{},"-এর তালিকায় যোগ করার আলোচনা, ব্যবহারের জায়গায় চুপচাপ ওভাররাইড নয়।",[1188,1189,1190],"warning",{},[41,1191,1192,1195,1196,321,1199,1202],{},[52,1193,1194],{},"class"," প্রপ রাখা দরকার, কিন্তু সেটা অবস্থানের জন্য — ",[52,1197,1198],{},"w-full",[52,1200,1201],{},"self-end",", গ্রিডের কলাম স্প্যান। ভেতরের প্যাডিং বা ফন্ট সাইজ ওভাররাইড করার জন্য নয়। দুটোর পার্থক্য রিভিউতে ধরা সহজ, কোডে নয়।",[187,1204,1206],{"id":1205},"পুরোনো-কোডে-কীভাবে-ঢুকবেন","পুরোনো কোডে কীভাবে ঢুকবেন",[41,1208,1209],{},"একবারে সব বদলানোর দরকার নেই। যে কম্পোনেন্টটা সবচেয়ে বেশি জায়গায় ব্যবহার হয়েছে, সেটা দিয়ে শুরু করলেই সবচেয়ে বেশি ব্যতিক্রম মুছে যায়।",[1211,1212],"checklist",{":items":1213,"doneLabel":1214,"resetLabel":1215,"title":1216},"[{\"label\":\"কম্পোনেন্টের বাইরের সব margin খুঁজে বের করুন\",\"detail\":\"mb-, mt-, my- আর :last-child ব্যতিক্রমগুলো একসাথে।\"},{\"label\":\"প্রতিটা ব্যবহারের জায়গা তালিকা করুন\",\"detail\":\"গ্রেপ করলেই পাওয়া যায় — এখান থেকেই বোঝা যাবে কয়টা লেআউট আসলে আছে।\"},{\"label\":\"প্যারেন্টে flex\u002Fgrid আর gap বসান\",\"detail\":\"মার্জিনের যে মানটা ছিল, সেটাই gap-এ যাবে — নতুন সংখ্যা বানানোর দরকার নেই।\"},{\"label\":\"এবার কম্পোনেন্ট থেকে margin মুছুন\",\"detail\":\"আগে নয়। আগে মুছলে মাঝের কমিটে লেআউট ভাঙা থাকে।\"},{\"label\":\"last-child ব্যতিক্রমগুলো মুছুন\",\"detail\":\"এগুলো টিকে থাকলে বুঝতে হবে কোথাও মার্জিন রয়ে গেছে।\"},{\"label\":\"সরু স্ক্রিনে একবার দেখুন\",\"detail\":\"gap দুই দিকেই কাজ করে, তাই কলাম ভেঙে গেলে হিসাব বদলায়।\"}]","শেষ","রিসেট","একটা কম্পোনেন্ট থেকে মার্জিন সরানোর ধাপ",[41,1218,1219],{},"কাজটা ছোট, কিন্তু ফলটা কোড কমার চেয়ে বড়। এরপর থেকে কেউ কম্পোনেন্টটা নতুন কোনো জায়গায় বসালে তাকে আর জিজ্ঞেস করতে হয় না, \"এটার নিচে কি এমনিতেই ফাঁক আছে?\"",[790,1221,1222],{},"html pre.shiki code .s0RzX, html code.shiki .s0RzX{--shiki-default:#768390;--shiki-dark:#768390}html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .sza-u, html code.shiki .sza-u{--shiki-default:#8DDB8C;--shiki-dark:#8DDB8C}html pre.shiki code .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html pre.shiki code .skSX4, html code.shiki .skSX4{--shiki-default:#FF938A;--shiki-default-font-style:italic;--shiki-dark:#FF938A;--shiki-dark-font-style:italic}html pre.shiki code .sEYkB, html code.shiki .sEYkB{--shiki-default:#F47067;--shiki-dark:#F47067}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":50,"searchDepth":85,"depth":85,"links":1224},[1225,1226,1227,1228,1229],{"id":836,"depth":79,"text":837},{"id":863,"depth":79,"text":864},{"id":1127,"depth":79,"text":1128},{"id":1160,"depth":79,"text":1161},{"id":1205,"depth":79,"text":1206},"2026-09-06","ফাঁকা জায়গার মালিক প্যারেন্ট, চাইল্ড নয়। একটা কম্পোনেন্ট নিজের বাইরের মার্জিন নিজে ঠিক করলে সেটা আর যেকোনো জায়গায় বসানো যায় না।",{},"\u002Fblog\u002Fbn\u002Fcomponent-margin-ownership",{"title":820,"description":1231},"blog\u002Fbn\u002Fcomponent-margin-ownership",[1237,1238,1239],"CSS","লেআউট","কম্পোনেন্ট","8rjBjFFzefhZZ6SjjDHL64MrE_oUUP0P5go4GZiR5Mk",{"id":1242,"title":1243,"author":1244,"body":1247,"category":1373,"cover":810,"coverAlt":810,"date":1374,"description":1375,"draft":6,"extension":805,"featured":6,"lang":806,"meta":1376,"navigation":24,"path":1377,"readingTime":565,"seo":1378,"seoTitle":1379,"stem":1380,"tags":1381,"__hash__":1385},"blog\u002Fblog\u002Fbn\u002Ftrust-social-proof-conversion.md","মানুষ কেন অচেনা কারো কাছ থেকে কিনতে দ্বিধা করে — Trust Signal যেভাবে সেল বাড়ায়",{"name":1245,"role":1246},"সাদিয়া ইসলাম","গ্রোথ ও মার্কেটিং লিড",{"type":38,"value":1248,"toc":1366},[1249,1252,1259,1263,1270,1275,1279,1301,1304,1309,1313,1320,1325,1329,1336,1341,1345,1349,1352],[41,1250,1251],{},"একটা নতুন ফ্রিল্যান্সার, ভালো কাজ জানেন, পোর্টফোলিওও ভালো — কিন্তু ক্লায়েন্ট পাচ্ছেন না। অথচ পাশের আরেকজন, কাজের মান প্রায় কাছাকাছি, কিন্তু প্রোফাইলে \"৫০+ প্রজেক্ট সম্পন্ন, ৪.৯ রেটিং\" লেখা — তার কাছেই ক্লায়েন্ট বেশি যাচ্ছে।",[41,1253,1254,1255,1258],{},"এটা অন্যায্য মনে হতে পারে, কিন্তু মানুষের সিদ্ধান্ত নেওয়ার প্রক্রিয়াটাই এভাবে কাজ করে। কোনো কিছু সম্পর্কে নিজে যাচাই করার সময় বা তথ্য না থাকলে, মানুষ দেখে ",[198,1256,1257],{},"অন্যরা কী করছে"," — আর সেটাকেই নিরাপদ সিদ্ধান্ত হিসেবে ধরে নেয়।",[187,1260,1262],{"id":1261},"social-proof-একা-সিদ্ধান্ত-নিতে-না-চাওয়ার-প্রবণতা","Social Proof — একা সিদ্ধান্ত নিতে না চাওয়ার প্রবণতা",[41,1264,1265,1266,1269],{},"মনোবিজ্ঞানী Robert Cialdini তার বিখ্যাত \"Influence\" বইতে এই প্যাটার্নটাকে বলেছেন ",[198,1267,1268],{},"social proof"," — অনিশ্চয়তার মুহূর্তে মানুষ অন্যদের আচরণ দেখে নিজের সিদ্ধান্ত ঠিক করে। একটা রেস্টুরেন্টের সামনে লাইন দেখলে সেটাকে \"ভালো রেস্টুরেন্ট\" ধরে নেওয়া, বা একটা প্রোডাক্টের হাজার হাজার রিভিউ দেখে ভরসা পাওয়া — দুটোই একই প্রবৃত্তি থেকে আসে।",[852,1271,1272],{},[41,1273,1274],{},"Social proof সবচেয়ে বেশি কাজ করে যখন কাস্টমার নিজে নিশ্চিত না — নতুন প্রোডাক্ট, নতুন সার্ভিস প্রোভাইডার, বা দামি একটা সিদ্ধান্ত। যেখানে মানুষ ইতিমধ্যে নিশ্চিত (যেমন নিয়মিত কেনা কোনো ব্র্যান্ড), সেখানে রিভিউ-সংখ্যার প্রভাব তুলনামূলক কম।",[187,1276,1278],{"id":1277},"নির্দিষ্ট-সংখ্যা-ভাসা-ভাসা-দাবির-চেয়ে-বেশি-কার্যকর","নির্দিষ্ট সংখ্যা, ভাসা ভাসা দাবির চেয়ে বেশি কার্যকর",[866,1280,1285,1293],{"after":1281,"before":1282,"note":1283,"split":1284},"নির্দিষ্ট, যাচাইযোগ্য তথ্য","ভাসা ভাসা দাবি","ডান পাশের সংস্করণ নির্দিষ্ট সংখ্যা আর নাম দিয়ে যাচাইযোগ্যতা তৈরি করে — মিথ্যা বলার সুযোগ কম মনে হয়, তাই বিশ্বাসযোগ্যতাও বেশি।","একই ফ্রিল্যান্স প্রোফাইল",[873,1286,1287],{"v-slot:before":50},[45,1288,1291],{"className":1289,"code":1290,"language":608},[606],"অনেক ক্লায়েন্টের সাথে কাজ\nকরেছি, সবাই খুশি হয়েছেন।\nসেরা সার্ভিস দেওয়ার\nচেষ্টা করি সবসময়।\n",[52,1292,1290],{"__ignoreMap":50},[873,1294,1295],{"v-slot:after":50},[45,1296,1299],{"className":1297,"code":1298,"language":608},[606],"৩৭টা প্রজেক্ট, ৪.৯\u002F৫ রেটিং\n(১১ জন ক্লায়েন্ট রিভিউ)\n\"Grameenphone-এর ড্যাশবোর্ড\nরিডিজাইন — ৩ সপ্তাহে ডেলিভারি\"\n",[52,1300,1298],{"__ignoreMap":50},[41,1302,1303],{},"ভাসা ভাসা দাবি (\"সবাই খুশি\") আসলে মিথ্যা বলার মতোই সহজ, তাই মস্তিষ্ক সেটাকে বিশেষ গুরুত্ব দেয় না। কিন্তু নির্দিষ্ট সংখ্যা আর নাম — যাচাই করা যায় এমন কিছু — সহজে বানিয়ে বলা যায় না বলেই বেশি বিশ্বাসযোগ্য মনে হয়।",[1188,1305,1306],{},[41,1307,1308],{},"জাল রিভিউ বা বানানো সংখ্যা ব্যবহার করাটা শুধু নৈতিকভাবে ভুল না — বাস্তবে ধরা পড়ে গেলে (আর প্রায়ই পড়ে) সেটা নিরপেক্ষভাবে বিশ্বাসহীনতার চেয়েও বেশি ক্ষতি করে, কারণ কাস্টমার তখন প্রতারিত বোধ করে। যা আছে তাই দেখান — অল্প কিছু আসল রিভিউ, বানানো অনেক রিভিউয়ের চেয়ে বেশি কাজ করে।",[187,1310,1312],{"id":1311},"reciprocity-আগে-দিলে-পরে-পাওয়া-যায়","Reciprocity — আগে দিলে, পরে পাওয়া যায়",[41,1314,1315,1316,1319],{},"Cialdini-র আরেকটা নীতি — ",[198,1317,1318],{},"reciprocity","। কেউ আগে থেকে বিনামূল্যে কিছু মূল্যবান পেলে, বিনিময়ে কিছু ফেরত দেওয়ার একটা স্বাভাবিক তাগিদ অনুভব করে। এই কারণেই ফ্রি টেমপ্লেট, ফ্রি অডিট, ফ্রি কনসালটেশন — এসব দীর্ঘমেয়াদে সেল বাড়ায়: প্রথমেই বিক্রির চেষ্টা না করে, আগে সাহায্য করলে বিশ্বাস তৈরি হয়, আর সেই বিশ্বাস থেকেই লেনদেন শুরু হয়।",[1118,1321,1322],{},[41,1323,1324],{},"Reciprocity কাজ করার জন্য যা দিচ্ছেন সেটা আসলেই দরকারি হতে হবে — একটা সাধারণ ব্লগ পোস্টের চেয়ে, কাস্টমারের নির্দিষ্ট সমস্যার একটা ছোট, ব্যক্তিগতকৃত সমাধান (যেমন তার ওয়েবসাইটের একটা কুইক পারফরম্যান্স অডিট) অনেক বেশি প্রভাব ফেলে — কারণ সেটা স্পষ্টভাবে বোঝায় যে তার জন্যই সময় দেওয়া হয়েছে।",[187,1326,1328],{"id":1327},"authority-কে-বলছে-সেটাও-গুরুত্বপূর্ণ","Authority — কে বলছে সেটাও গুরুত্বপূর্ণ",[41,1330,1331,1332,1335],{},"একই তথ্য একজন নবীন ফ্রিল্যান্সার বললে এক রকম শোনায়, আর কেউ যদি জানে যে সেই একই মানুষ একটা পরিচিত কোম্পানির সাথে কাজ করেছেন, তাহলে সেটা অন্যরকম ওজন পায়। এটাকে বলে ",[198,1333,1334],{},"authority"," — সার্টিফিকেট, পরিচিত ক্লায়েন্টের নাম, বা কোনো প্রতিষ্ঠিত প্ল্যাটফর্মে ফিচার হওয়া — এসব প্রকৃত দক্ষতা না বাড়ালেও, সেই দক্ষতার প্রতি বিশ্বাসকে বাড়িয়ে দেয়।",[1148,1337],{":answer":1150,":options":1338,"checkLabel":1152,"correctLabel":1153,"explanation":1339,"incorrectLabel":1155,"question":1340,"resetLabel":1157},"[\"দাম খুব বেশি দেখাচ্ছে\",\"সার্ভিস লিস্ট খুব ছোট\",\"কোনো social proof বা trust signal নেই, তাই ভিজিটর ঝুঁকি নিতে দ্বিধা করবে\",\"ওয়েবসাইটের ডিজাইন পুরনো\"]","দাম বা ডিজাইন সমস্যা হতে পারে, কিন্তু মূল বাধা হলো বিশ্বাসের অভাব। একটা নতুন বা অচেনা এজেন্সির কাছ থেকে কেনার সিদ্ধান্তে ঝুঁকি বেশি মনে হয় — কেউ যাচাই করতে পারছে না এটা আসলেই কাজ করে কি না। ক্লায়েন্ট লোগো, নির্দিষ্ট সংখ্যাসহ রিভিউ, বা আসল কেস স্টাডি এই ঝুঁকির অনুভূতি কমিয়ে দেয়, কারণ সেগুলো দেখায় যে অন্যরা আগে ঝুঁকি নিয়ে সন্তুষ্ট হয়েছে।","একটা নতুন ওয়েব এজেন্সির ওয়েবসাইটে কোনো ক্লায়েন্ট লোগো, রিভিউ বা কেস স্টাডি নেই — শুধু সার্ভিস লিস্ট আর দাম আছে। সবচেয়ে বড় সমস্যা কী?",[187,1342,1344],{"id":1343},"trust-signal-অডিট-করার-চেকলিস্ট","Trust signal অডিট করার চেকলিস্ট",[1211,1346],{":items":1347,"doneLabel":1214,"resetLabel":1215,"title":1348},"[{\"label\":\"রিভিউ বা টেস্টিমোনিয়ালে নির্দিষ্ট নাম, সংখ্যা বা ফলাফল আছে কি?\",\"detail\":\"\\\"ভালো লেগেছে\\\"-র চেয়ে \\\"৩ সপ্তাহে ডেলিভারি, ৪০% দ্রুত লোড টাইম\\\" বেশি বিশ্বাসযোগ্য।\"},{\"label\":\"পরিচিত ক্লায়েন্ট বা প্রতিষ্ঠানের নাম দেখানো যাচ্ছে কি (অনুমতি নিয়ে)?\",\"detail\":\"একটা পরিচিত নাম, দশটা অচেনা নামের চেয়ে বেশি কাজ করতে পারে।\"},{\"label\":\"কোনো ফ্রি মূল্যবান কিছু আগে থেকে দেওয়া হচ্ছে কি (reciprocity)?\",\"detail\":\"একটা ছোট, ব্যক্তিগতকৃত সাহায্য — সাধারণ কনটেন্টের চেয়ে বেশি বিশ্বাস তৈরি করে।\"},{\"label\":\"কোনো দাবিই কি যাচাই-অযোগ্য বা অতিরঞ্জিত শোনাচ্ছে?\",\"detail\":\"অতিরঞ্জিত দাবি সন্দেহ তৈরি করে, বিশ্বাস না।\"},{\"label\":\"রিভিউ বা প্রমাণ কি আসল, নাকি বানানো?\",\"detail\":\"জাল প্রমাণ ধরা পড়লে যেকোনো pricing বা marketing কৌশলের চেয়ে বেশি ক্ষতি করে।\"}]","ওয়েবসাইট বা প্রোফাইলে বিশ্বাসযোগ্যতা যাচাই করার তালিকা",[41,1350,1351],{},"সেল বাড়ানোর অনেকটাই আসলে প্রোডাক্ট বদলানো না — কাস্টমারের চোখে ঝুঁকিটা কমিয়ে দেওয়া। আর সেই ঝুঁকি কমে যখন সে দেখে, তার আগে অন্যরাও একই সিদ্ধান্ত নিয়ে ঠকেনি।",[41,1353,1354,1355,1360,1361,1365],{},"বিশ্বাস তৈরি হয়ে গেলে পরের প্রশ্নটা আসে দাম নিয়ে — ",[1356,1357,1359],"a",{"href":1358},"\u002Fblog\u002Fbn\u002Fprice-anchoring-decoy-effect","সেটা কীভাবে উপস্থাপন করলে কাজ করে",", আর ",[1356,1362,1364],{"href":1363},"\u002Fblog\u002Fbn\u002Ffreelance-rate-setting","নিজের রেট কীভাবে ঠিক করবেন"," — দুটোই আলাদা হিসাব।",{"title":50,"searchDepth":85,"depth":85,"links":1367},[1368,1369,1370,1371,1372],{"id":1261,"depth":79,"text":1262},{"id":1277,"depth":79,"text":1278},{"id":1311,"depth":79,"text":1312},{"id":1327,"depth":79,"text":1328},{"id":1343,"depth":79,"text":1344},"business","2026-09-11","একই ল্যান্ডিং পেজ, একই দাম, একই প্রোডাক্ট — শুধু নিচে তিনটা রিভিউ যোগ করলেই কনভার্শন বদলে যায়। এটা কাকতালীয় না, মানুষ সিদ্ধান্ত নেওয়ার সময় অন্যদের আচরণ দেখেই ভরসা করে।",{},"\u002Fblog\u002Fbn\u002Ftrust-social-proof-conversion",{"title":1243,"description":1375},"মানুষ অচেনা কারো কাছ থেকে কিনতে কেন দ্বিধা করে","blog\u002Fbn\u002Ftrust-social-proof-conversion",[1382,1383,1384],"Trust","Conversion","সাইকোলজি","zbp8wNKt8V0yU7FIOwTSAV5lhPtUdkwPcOtUAWdPOJA",{"id":1387,"title":1388,"author":1389,"body":1390,"category":1373,"cover":810,"coverAlt":810,"date":1490,"description":1491,"draft":6,"extension":805,"featured":6,"lang":806,"meta":1492,"navigation":24,"path":1493,"readingTime":565,"seo":1494,"seoTitle":1495,"stem":1496,"tags":1497,"__hash__":1501},"blog\u002Fblog\u002Fbn\u002Fjobs-to-be-done-customer-problem.md","প্রোডাক্ট বেচবেন না, সমস্যার সমাধান বেচুন — Customer আসলে কী 'hire' করছে",{"name":1245,"role":1246},{"type":38,"value":1391,"toc":1484},[1392,1395,1398,1401,1405,1412,1417,1421,1443,1446,1451,1455,1462,1467,1473,1477,1481],[41,1393,1394],{},"একটা ফাস্ট-ফুড চেইন মিল্কশেকের সেল বাড়াতে চেয়েছিল। তারা শুরুতে করেছিল যা সবাই করে: কাস্টমারদের জিজ্ঞেস করেছিল মিল্কশেক আরও মিষ্টি হওয়া উচিত কি না, ঘন হওয়া উচিত কি না, ফ্লেভার বাড়ানো উচিত কি না। ফিডব্যাক অনুযায়ী বদলও করেছিল — সেলে তেমন পার্থক্য হয়নি।",[41,1396,1397],{},"পরে একজন গবেষক আলাদাভাবে খেয়াল করলেন: প্রায় অর্ধেক মিল্কশেক বিক্রি হচ্ছিল সকালবেলা, একা আসা মানুষদের কাছে, যারা সেটা গাড়িতে বসে খেয়ে অফিসে যাচ্ছিলেন। জিজ্ঞেস করে জানা গেল — তারা মিল্কশেক \"খেতে\" আসেননি। তারা এসেছিলেন একটা বোরিং, একঘেয়ে ড্রাইভকে একটু সহনীয় করার মতো কিছু খুঁজতে — যেটা এক হাতে খাওয়া যায়, নোংরা হয় না, আর অনেকক্ষণ ধরে টিকে থাকে যাতে পুরো জ্যামটা কাটানো যায়।",[41,1399,1400],{},"মিল্কশেক তাদের কাছে আসলে একটা \"সঙ্গী\" — বোরডম দূর করার একটা টুল। এই আসল কাজটা বুঝেই কোম্পানি প্রোডাক্টে বদল আনল: আরও ঘন করল (যাতে বেশিক্ষণ ধরে খাওয়া যায়, স্ট্র দিয়ে টানতে সময় লাগে), আর ছোট ছোট ফল-টুকরো যোগ করল (মাঝেমধ্যে একটা \"সারপ্রাইজ\")। মিষ্টতা নিয়ে কিছুই বদলায়নি।",[187,1402,1404],{"id":1403},"customer-প্রোডাক্ট-কেনে-না-একটা-কাজের-জন্য-hire-করে","Customer প্রোডাক্ট কেনে না, একটা কাজের জন্য \"hire\" করে",[41,1406,1407,1408,1411],{},"এই চিন্তাধারাকে বলে ",[198,1409,1410],{},"Jobs-to-be-Done (JTBD)"," — মূল কথা: মানুষ কোনো প্রোডাক্ট বা সার্ভিস কেনে না, বরং তাদের জীবনের একটা নির্দিষ্ট মুহূর্তে, একটা নির্দিষ্ট সমস্যা সমাধানের জন্য সেটাকে \"hire\" করে। প্রোডাক্ট বদলে গেলেও, বা প্রতিযোগী বদলে গেলেও, \"job\"-টা একই থেকে যায়।",[852,1413,1414],{},[41,1415,1416],{},"\"Job\" মানে সবসময় ব্যবহারিক (functional) কিছু না। একটা দামি ঘড়ি কেনার job হতে পারে \"সময় দেখা\" — অথবা হতে পারে \"নিজেকে সফল হিসেবে অনুভব করা\" (emotional job) বা \"অন্যদের কাছে একটা নির্দিষ্ট ইমেজ তৈরি করা\" (social job)। একই প্রোডাক্ট, ভিন্ন কাস্টমারের কাছে ভিন্ন job সমাধান করছে হতে পারে।",[187,1418,1420],{"id":1419},"ফিচার-ভিত্তিক-পিচ-বনাম-job-ভিত্তিক-পিচ","ফিচার-ভিত্তিক পিচ বনাম job-ভিত্তিক পিচ",[866,1422,1427,1435],{"after":1423,"before":1424,"note":1425,"split":1426},"Job-ভিত্তিক পিচ","ফিচার-ভিত্তিক পিচ","বাম পাশেরটা প্রোডাক্ট নিয়ে কথা বলছে, ডান পাশেরটা কাস্টমারের আসল ভয় আর সময়ের সংকট নিয়ে কথা বলছে।","একই সার্ভিস — accounting সফটওয়্যার",[873,1428,1429],{"v-slot:before":50},[45,1430,1433],{"className":1431,"code":1432,"language":608},[606],"আমাদের সফটওয়্যারে আছে:\n- অটোমেটিক ইনভয়েস জেনারেশন\n- রিয়েল-টাইম ট্যাক্স ক্যালকুলেশন\n- মাল্টি-কারেন্সি সাপোর্ট\n",[52,1434,1432],{"__ignoreMap":50},[873,1436,1437],{"v-slot:after":50},[45,1438,1441],{"className":1439,"code":1440,"language":608},[606],"মাস শেষে হিসাব মেলাতে বসে\nরাত জাগতে হবে না।\n৫ মিনিটে ইনভয়েস, ট্যাক্সের\nহিসাব নিজে থেকেই ঠিক থাকবে।\n",[52,1442,1440],{"__ignoreMap":50},[41,1444,1445],{},"দুটোই একই ফিচার বর্ণনা করছে। কিন্তু দ্বিতীয়টা কাস্টমারের আসল অভিজ্ঞতা — মাস শেষে হিসাব নিয়ে চাপ, রাত জেগে কাজ করা — সেই জায়গা থেকে কথা বলছে। যে কাস্টমার এই ব্যথাটা অনুভব করছেন, তার কাছে দ্বিতীয় পিচটাই আগে পৌঁছায়।",[1188,1447,1448],{},[41,1449,1450],{},"নিজে থেকে অনুমান করে নেওয়া সবচেয়ে বড় ভুল — \"আমার মনে হয় কাস্টমাররা স্পিড চায়\" বলে ফিচার বানিয়ে ফেলা, আসল কাস্টমারকে জিজ্ঞেস না করেই। মিল্কশেকের উদাহরণেও প্রথম রাউন্ডের সার্ভে ব্যর্থ হয়েছিল কারণ প্রশ্নগুলো ছিল প্রোডাক্ট নিয়ে (\"মিষ্টি কেমন লাগে\"), কাস্টমারের পরিস্থিতি নিয়ে না (\"কখন, কেন এটা কেনেন\")।",[187,1452,1454],{"id":1453},"আসল-job-খুঁজে-বের-করার-একটা-সহজ-উপায়","আসল job খুঁজে বের করার একটা সহজ উপায়",[41,1456,1457,1458,1461],{},"সরাসরি \"আপনার কী দরকার\" জিজ্ঞেস করলে মানুষ প্রায়ই ফিচারের ভাষায় উত্তর দেয় (\"আরেকটু দ্রুত হলে ভালো হতো\"), আসল কারণ বলে না। এর বদলে জিজ্ঞেস করুন: ",[198,1459,1460],{},"\"সবশেষ কবে এই সমস্যায় পড়েছিলেন? তখন ঠিক কী হচ্ছিল, আর তখন কী করেছিলেন?\""," — একটা নির্দিষ্ট ঘটনার গল্প জিজ্ঞেস করলে আসল পরিস্থিতিটা বেরিয়ে আসে, সাধারণ মতামতের চেয়ে।",[1118,1463,1464],{},[41,1465,1466],{},"একটা উত্তর পাওয়ার পর থেমে যাবেন না — একবার \"কেন\" জিজ্ঞেস করলে সাধারণত উপরিভাগের কারণ পাওয়া যায়। পরপর তিন-চারবার \"তারপর কেন এটা গুরুত্বপূর্ণ\" জিজ্ঞেস করলে আসল emotional বা social job-এ পৌঁছানো যায় — এটাকে বলে \"৫ কেন\" (5 Whys) টেকনিক।",[1148,1468],{":answer":1469,":options":1470,"checkLabel":1152,"correctLabel":1153,"explanation":1471,"incorrectLabel":1155,"question":1472,"resetLabel":1157},"1","[\"\\\"জিমে আর কী কী ইকুইপমেন্ট থাকলে ভালো হতো?\\\"\",\"\\\"যেদিন মেম্বারশিপ নিয়েছিলেন, সেদিন ঠিক কী হয়েছিল যে সিদ্ধান্তটা নিলেন?\\\"\",\"\\\"আপনি কি জিমের দামে সন্তুষ্ট?\\\"\",\"\\\"আর কোন জিমে ট্রাই করেছিলেন?\\\"\"]","নির্দিষ্ট একটা মুহূর্তের কথা জিজ্ঞেস করলে (মেম্বারশিপ নেওয়ার দিন কী হয়েছিল) আসল \"job\"-টা বেরিয়ে আসে — হয়তো এটা নতুন বছরের রেজোলিউশন ছিল, বা ডাক্তারের সতর্কবার্তা, বা বন্ধুর সাথে সময় কাটানোর ইচ্ছা। ইকুইপমেন্ট বা দাম নিয়ে প্রশ্ন ফিচার-লেভেলে আটকে থাকে, আসল প্রেরণা পর্যন্ত পৌঁছায় না।","একজন কাস্টমার প্রিমিয়াম জিম মেম্বারশিপ কিনেছেন, কিন্তু মাসে মাত্র ২ বার যান। ঠিক জিম কেন কিনেছিলেন সেটা বুঝতে চাইলে সবচেয়ে ভালো প্রশ্ন কোনটা?",[187,1474,1476],{"id":1475},"customer-discovery-তে-যা-করবেন","Customer discovery-তে যা করবেন",[1211,1478],{":items":1479,"doneLabel":1214,"resetLabel":1215,"title":1480},"[{\"label\":\"প্রোডাক্ট নিয়ে না জিজ্ঞেস করে, নির্দিষ্ট একটা ঘটনার গল্প জিজ্ঞেস করুন\",\"detail\":\"\\\"সবশেষ কবে এই সমস্যায় পড়েছিলেন\\\" — সাধারণ মতামতের চেয়ে অনেক বেশি সত্য বেরিয়ে আসে।\"},{\"label\":\"একটা \\\"কেন\\\"-তে থেমে যাবেন না, পরপর কয়েকবার জিজ্ঞেস করুন\",\"detail\":\"প্রথম উত্তর প্রায়ই উপরিভাগের — আসল emotional\u002Fsocial কারণ তিন-চার স্তর গভীরে থাকে।\"},{\"label\":\"যারা প্রোডাক্ট কিনে ব্যবহার করছেন না (churn), তাদেরও জিজ্ঞেস করুন\",\"detail\":\"যারা \\\"job\\\"-টা অন্য কোথাও সমাধান করে ফেলেছেন, তারাই আসল প্রতিযোগী কে সেটা বলে দেয় — যেটা সবসময় সরাসরি প্রতিদ্বন্দ্বী কোম্পানি হয় না।\"},{\"label\":\"ফিচার-অনুরোধকে সরাসরি বাস্তবায়ন না করে, পেছনের কারণটা খুঁজুন\",\"detail\":\"\\\"আরও দ্রুত চাই\\\" বলার পেছনে হয়তো \\\"সময়মতো বসের কাছে রিপোর্ট পাঠাতে না পারার ভয়\\\" লুকিয়ে আছে।\"},{\"label\":\"একই প্রোডাক্টের বিভিন্ন কাস্টমারের ভিন্ন job থাকতে পারে, এটা মেনে নিন\",\"detail\":\"একটাই মেসেজ সবার জন্য কাজ নাও করতে পারে — সেগমেন্ট অনুযায়ী পিচ বদলাতে হতে পারে।\"}]","আসল \"job\" খুঁজে বের করার চেকলিস্ট",[41,1482,1483],{},"কাস্টমার কী কিনছে সেটা প্রশ্ন না — কাস্টমার কেন কিনছে, ঠিক কোন মুহূর্তে, কোন চাপ থেকে — সেই প্রশ্নের উত্তরেই আসল সেলস স্ট্র্যাটেজি লুকিয়ে থাকে।",{"title":50,"searchDepth":85,"depth":85,"links":1485},[1486,1487,1488,1489],{"id":1403,"depth":79,"text":1404},{"id":1419,"depth":79,"text":1420},{"id":1453,"depth":79,"text":1454},{"id":1475,"depth":79,"text":1476},"2026-09-10","একজন কাস্টমার মিল্কশেক কেনে না — সকালের বোরিং গাড়ি-চালানোর সময়টাকে সহনীয় করার একটা উপায় কেনে। প্রোডাক্টের ফিচার লিস্ট না, এই \"job\"-টা বুঝলেই সেল বাড়ে।",{},"\u002Fblog\u002Fbn\u002Fjobs-to-be-done-customer-problem",{"title":1388,"description":1491},"প্রোডাক্ট বেচবেন না, সমস্যার সমাধান বেচুন","blog\u002Fbn\u002Fjobs-to-be-done-customer-problem",[1498,1499,1500],"Customer Research","সেলস","বিজনেস","TOPAjOCpt_BhKxqqeV_N_Hx9tTiiamlLw20vaHTTO0E",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1503},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1505},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 2v3m8-3v3\"\u002F>\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M3 9h18\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1507},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 6v6l4 2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1509},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u002F>\u003Cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1511},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M21.54 15H17a2 2 0 0 0-2 2v4.54M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05\"\u002F>\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1513},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 7h6v6\"\u002F>\u003Cpath d=\"m22 7l-8.5 8.5l-5-5L2 17\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1515},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",1791742745935]