[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"sanity-Ey51PQgHDs7DQY1zKx_m1iIcpXYFleqsKEOUMtAeSt8":3,"sanity-8fSeAAg61yR-5g_PBQp-6yLq0Wn2_PYAMHGy4gJ9H3I":607},{"data":4,"sourceMap":-1},{"latestPodcast":5,"latestReleases":14,"post":39,"recent":582},[6],{"_id":7,"publishedAt":8,"slug":9,"sponsored":12,"title":13},"d81860b7-7b72-4ba5-8ad5-3b77fd9a8e9b","2026-07-14T07:40:00.000Z",{"_type":10,"current":11},"slug","your-ai-is-only-as-responsible-as-you-are",null,"Your AI is only as responsible as you are",[15,21,27,33],{"_id":16,"publishedAt":17,"slug":18,"title":20},"eb5b66eb-9410-4329-83bb-22bbff39402a","2026-04-28T13:00:00.000Z",{"_type":10,"current":19},"turn-scattered-knowledge-into-trusted-intelligence","Turning scattered knowledge into trusted intelligence: Stack Internal 2026.3",{"_id":22,"publishedAt":23,"slug":24,"title":26},"369c2401-b62e-4a37-8ff8-bf603023ecad","2026-03-02T15:03:00.988Z",{"_type":10,"current":25},"what-s-new-at-stack-overflow-march-2026","What’s new at Stack Overflow: March 2026",{"_id":28,"publishedAt":29,"slug":30,"title":32},"5e9053a4-07ea-447c-91ea-29e0b6228537","2026-02-02T15:00:00.000Z",{"_type":10,"current":31},"what-s-new-at-stack-overflow-february-2026","What’s new at Stack Overflow: February 2026",{"_id":34,"publishedAt":35,"slug":36,"title":38},"a1b538eb-a8a6-46d0-80a1-ac70ec9bb935","2026-01-05T10:00:00.000-05:00",{"_type":10,"current":37},"what-s-new-at-stack-overflow-january-2026","What’s new at Stack Overflow: January 2026",{"_createdAt":40,"_id":41,"_rev":42,"_type":43,"_updatedAt":44,"author":45,"body":59,"comments":554,"dateUrl":555,"excerpt":556,"image":557,"legacyBody":561,"product":12,"publishedAt":564,"slug":565,"sponsored":12,"tags":567,"title":581,"visible":554},"2023-05-25T09:36:57Z","wp-post-3319","dgl3SCUzppW3U2LvCoRyxY","blogPost","2023-07-13T14:54:20Z",[46],{"_createdAt":47,"_id":48,"_rev":49,"_type":50,"_updatedAt":51,"avatar":52,"employee":54,"name":55,"role":56,"slug":57},"2023-05-23T16:27:18Z","wp-author-114","07ZbrKPSUrjrV4wQ6fam8u","blogAuthor","2023-08-29T11:49:01Z",{"_type":53},"image","former","Jeff Atwood","Co-founder",{"current":58},"jeffatwood",[60,71,81,112,131,161,180,199,229,259,278,286,304,322,330,360,377,400,415,423,443,466,474,498,535],{"_key":61,"_type":62,"children":63,"markDefs":69,"style":70},"800f3991e323","block",[64],{"_key":65,"_type":66,"marks":67,"text":68},"800f3991e3230","span",[],"This is the 38th episode of the StackOverflow podcast, where Joel and Jeff discuss YSlow optimizations for large websites, the value of unit testing, and the hidden pitfalls of asking questions to programmers.",[],"normal",{"_key":72,"_type":62,"children":73,"level":78,"listItem":79,"markDefs":80,"style":70},"896a5cf425af",[74],{"_key":75,"_type":66,"marks":76,"text":77},"896a5cf425af0",[],"Joel notes that simply paying attention to what your coworkers are doing is an effective way to build and lead a team. If you aren't interested in what your teammates are doing.. why are you on that team, again?",1,"bullet",[],{"_key":82,"_type":62,"children":83,"level":78,"listItem":79,"markDefs":106,"style":70},"de0c85c4d44c",[84,88,93,97,102],{"_key":85,"_type":66,"marks":86,"text":87},"de0c85c4d44c0",[],"I've followed the ",{"_key":89,"_type":66,"marks":90,"text":92},"de0c85c4d44c1",[91],"c738ec724004","excellent Yahoo YSlow tool",{"_key":94,"_type":66,"marks":95,"text":96},"de0c85c4d44c2",[]," for a while. It really is intended for large scale websites, as I've ",{"_key":98,"_type":66,"marks":99,"text":101},"de0c85c4d44c3",[100],"a8ba70d130d9","noted before",{"_key":103,"_type":66,"marks":104,"text":105},"de0c85c4d44c4",[],". But Stack Overflow is exactly the type of website that can benefit from YSlow recommendations!",[107,110],{"_key":91,"_type":108,"href":109,"reference":12},"link","http:\u002F\u002Fdeveloper.yahoo.com\u002Fyslow\u002F",{"_key":100,"_type":108,"href":111,"reference":12},"http:\u002F\u002Fwww.codinghorror.com\u002Fblog\u002Farchives\u002F000932.html",{"_key":113,"_type":62,"children":114,"level":78,"listItem":79,"markDefs":128,"style":70},"b3dbc6c8327a",[115,119,124],{"_key":116,"_type":66,"marks":117,"text":118},"b3dbc6c8327a0",[],"We've been using the ",{"_key":120,"_type":66,"marks":121,"text":123},"b3dbc6c8327a1",[122],"28a7409fee78","Expires or Cache-Control Header",{"_key":125,"_type":66,"marks":126,"text":127},"b3dbc6c8327a2",[]," since we launched. This saves the browser round-trips when getting infrequently changing items, such as images, javascript, or css. The downside is that, when you do actually change these files, you have to remember to change the filenames. A part of our build process now \"tags\" these files with a version number so we no longer have to remember to do this manually.",[129],{"_key":122,"_type":108,"href":130,"reference":12},"http:\u002F\u002Fdeveloper.yahoo.com\u002Fperformance\u002Frules.html#expires",{"_key":132,"_type":62,"children":133,"level":78,"listItem":79,"markDefs":156,"style":70},"99f9076f275f",[134,138,143,147,152],{"_key":135,"_type":66,"marks":136,"text":137},"99f9076f275f0",[],"We also integrated the ",{"_key":139,"_type":66,"marks":140,"text":142},"99f9076f275f1",[141],"9ff23d36b870","YUI Compressor",{"_key":144,"_type":66,"marks":145,"text":146},"99f9076f275f2",[]," into our build, to minify our CSS and JavaScript resources. We had ",{"_key":148,"_type":66,"marks":149,"text":151},"99f9076f275f3",[150],"3de412605b98","bad luck with the .NET port",{"_key":153,"_type":66,"marks":154,"text":155},"99f9076f275f4",[]," of this tool, so we just shell out to Java in the build. Works great, although we had some crazy pathing issues that made us put the JAR file in the root.",[157,159],{"_key":141,"_type":108,"href":158,"reference":12},"http:\u002F\u002Fdeveloper.yahoo.com\u002Fyui\u002Fcompressor\u002F",{"_key":150,"_type":108,"href":160,"reference":12},"http:\u002F\u002Fwww.codeplex.com\u002FYUICompressor",{"_key":162,"_type":62,"children":163,"level":78,"listItem":79,"markDefs":177,"style":70},"1ebd1ff80587",[164,168,173],{"_key":165,"_type":66,"marks":166,"text":167},"1ebd1ff805870",[],"It's also possible for Google to ",{"_key":169,"_type":66,"marks":170,"text":172},"1ebd1ff805871",[171],"5e3987d29677","host your shared javascript files",{"_key":174,"_type":66,"marks":175,"text":176},"1ebd1ff805872",[],", if you're using a popular third party JS library. We chose not to do this because we package related JavaScript together, so it would defeat the benefits of packaging.",[178],{"_key":171,"_type":108,"href":179,"reference":12},"http:\u002F\u002Fgoogleajaxsearchapi.blogspot.com\u002F2008\u002F05\u002Fspeed-up-access-to-your-favorite.html",{"_key":181,"_type":62,"children":182,"level":78,"listItem":79,"markDefs":196,"style":70},"f3ad93cb54a5",[183,187,192],{"_key":184,"_type":66,"marks":185,"text":186},"f3ad93cb54a50",[],"Browsers will parallelize their requests, but only so many requests can be \"in flight\" to the same domain. So it can be wise to ",{"_key":188,"_type":66,"marks":189,"text":191},"f3ad93cb54a51",[190],"573053238b2f","split your website components across domains",{"_key":193,"_type":66,"marks":194,"text":195},"f3ad93cb54a52",[],". Simple aliases such as a.mydomain.com seem to work fine for this purpose.",[197],{"_key":190,"_type":108,"href":198,"reference":12},"http:\u002F\u002Fdeveloper.yahoo.com\u002Fperformance\u002Frules.html#split",{"_key":200,"_type":62,"children":201,"level":78,"listItem":79,"markDefs":224,"style":70},"d883ec90f835",[202,206,211,215,220],{"_key":203,"_type":66,"marks":204,"text":205},"d883ec90f8350",[],"Joel explains ",{"_key":207,"_type":66,"marks":208,"text":210},"d883ec90f8351",[209],"0ac349e1ae2b","CSS sprites",{"_key":212,"_type":66,"marks":213,"text":214},"d883ec90f8352",[],", which is an effective way to ",{"_key":216,"_type":66,"marks":217,"text":219},"d883ec90f8353",[218],"76bb4082e4db","minimize the number of HTTP requests",{"_key":221,"_type":66,"marks":222,"text":223},"d883ec90f8354",[]," your website is generating. This is particularly useful on toolbars and the like which contain a lot of related images.",[225,227],{"_key":209,"_type":108,"href":226,"reference":12},"http:\u002F\u002Falistapart.com\u002Farticles\u002Fsprites",{"_key":218,"_type":108,"href":228,"reference":12},"http:\u002F\u002Fdeveloper.yahoo.com\u002Fperformance\u002Frules.html#num_http",{"_key":230,"_type":62,"children":231,"level":78,"listItem":79,"markDefs":254,"style":70},"417b7fca7709",[232,236,241,245,250],{"_key":233,"_type":66,"marks":234,"text":235},"417b7fca77090",[],"There are analogs here in the Strings tab of ",{"_key":237,"_type":66,"marks":238,"text":240},"417b7fca77091",[239],"3f36a1161d1a","Process Explorer",{"_key":242,"_type":66,"marks":243,"text":244},"417b7fca77092",[],", and the ",{"_key":246,"_type":66,"marks":247,"text":249},"417b7fca77093",[248],"973c428d3b07","UNIX command Strings",{"_key":251,"_type":66,"marks":252,"text":253},"417b7fca77094",[],", as well as classic Windows resource browsing -- spelunking for whatever icons and image resources you can find in a file.",[255,257],{"_key":239,"_type":108,"href":256,"reference":12},"http:\u002F\u002Ftechnet.microsoft.com\u002Fen-us\u002Fsysinternals\u002Fbb896653.aspx",{"_key":248,"_type":108,"href":258,"reference":12},"http:\u002F\u002Flinux.about.com\u002Flibrary\u002Fcmd\u002Fblcmdl1_strings.htm",{"_key":260,"_type":62,"children":261,"level":78,"listItem":79,"markDefs":275,"style":70},"525386ff2eb3",[262,266,271],{"_key":263,"_type":66,"marks":264,"text":265},"525386ff2eb30",[],"This is all important because I want Stack Overflow to be as fast as possible. Performance is a feature, and I think often underestimated. Even ",{"_key":267,"_type":66,"marks":268,"text":270},"525386ff2eb31",[269],"3b313458b147","half a second delay can cause a 20% drop in traffic",{"_key":272,"_type":66,"marks":273,"text":274},"525386ff2eb32",[],".",[276],{"_key":269,"_type":108,"href":277,"reference":12},"http:\u002F\u002Fwww.codinghorror.com\u002Fblog\u002Farchives\u002F000722.html",{"_key":279,"_type":62,"children":280,"level":78,"listItem":79,"markDefs":285,"style":70},"b968f4b74213",[281],{"_key":282,"_type":66,"marks":283,"text":284},"b968f4b742130",[],"We discuss differential database backups and DNS time to live, to make the upcoming site transition to new harware as painless as possible, and minimize downtime. We'll also update the old site with a static HTML page that tells you you need to flush your DNS.",[],{"_key":287,"_type":62,"children":288,"level":78,"listItem":79,"markDefs":301,"style":70},"e98cbd68b331",[289,293,298],{"_key":290,"_type":66,"marks":291,"text":292},"e98cbd68b3310",[],"Joel notes that his partner Michael had to order thermal compound back in 2000 when he built up PCs for Fog Creek. This stuff is important! Please ",{"_key":294,"_type":66,"marks":295,"text":297},"e98cbd68b3311",[296],"0c261977536d","don't use vegemite",{"_key":299,"_type":66,"marks":300,"text":274},"e98cbd68b3312",[],[302],{"_key":296,"_type":108,"href":303,"reference":12},"http:\u002F\u002Fwww.dansdata.com\u002Fgoop.htm",{"_key":305,"_type":62,"children":306,"level":78,"listItem":79,"markDefs":319,"style":70},"8b89e21f4e83",[307,311,316],{"_key":308,"_type":66,"marks":309,"text":310},"8b89e21f4e830",[],"We finally fixed our paging algorithm, which had some aggravating edge condition bugs. I dedicate this fix to ",{"_key":312,"_type":66,"marks":313,"text":315},"8b89e21f4e831",[314],"6451c41720c2","John Topley",{"_key":317,"_type":66,"marks":318,"text":274},"8b89e21f4e832",[],[320],{"_key":314,"_type":108,"href":321,"reference":12},"http:\u002F\u002Fstackoverflow.com\u002Fusers\u002F1450\u002Fjohn-topley",{"_key":323,"_type":62,"children":324,"level":78,"listItem":79,"markDefs":329,"style":70},"db4b25c0523b",[325],{"_key":326,"_type":66,"marks":327,"text":328},"db4b25c0523b0",[],"Joel and I have some reservations about unit testing, at least the dogmatic test-first kind, where your goal is to have code coverage in the 95%+ range. It seems to us that this works best for legacy type applications that aren't changing very much. At some level, the tests become friction preventing you from making changes, as every change results in a stack of failing tests.",[],{"_key":331,"_type":62,"children":332,"level":78,"listItem":79,"markDefs":355,"style":70},"e565a894a8ac",[333,337,342,346,351],{"_key":334,"_type":66,"marks":335,"text":336},"e565a894a8ac0",[],"Joel talks about Robert Martin's (aka Uncle Bob) ",{"_key":338,"_type":66,"marks":339,"text":341},"e565a894a8ac1",[340],"d261a2a94302","Solid Principles",{"_key":343,"_type":66,"marks":344,"text":345},"e565a894a8ac2",[],", as explained on a ",{"_key":347,"_type":66,"marks":348,"text":350},"e565a894a8ac3",[349],"93895357bd46","recent Hanselminutes podcast",{"_key":352,"_type":66,"marks":353,"text":354},"e565a894a8ac4",[],". Joel: \"it sounded like extremely bureaucratic programming\" that \"could theoretically protect you against things, but You Aren't Gonna Need It.\"",[356,358],{"_key":340,"_type":108,"href":357,"reference":12},"http:\u002F\u002Fbutunclebob.com\u002FArticleS.UncleBob.PrinciplesOfOod",{"_key":349,"_type":108,"href":359,"reference":12},"http:\u002F\u002Fwww.hanselminutes.com\u002Fdefault.aspx?showID=163",{"_key":361,"_type":62,"children":362,"level":78,"listItem":79,"markDefs":376,"style":70},"51e1dbf29251",[363,367,372],{"_key":364,"_type":66,"marks":365,"text":366},"51e1dbf292510",[],"On the other hand, if you're building a framework or API, something designed to be used by thousands or millions of developers, then having a lot of unit tests -- or Uncle Bob's Principles of OOD -- might make sense. Principles and rules are fine, but thinking about what you're doing should ",{"_key":368,"_type":66,"marks":369,"text":371},"51e1dbf292511",[370],"em","always",{"_key":373,"_type":66,"marks":374,"text":375},"51e1dbf292512",[]," come first.",[],{"_key":378,"_type":62,"children":379,"level":78,"listItem":79,"markDefs":397,"style":70},"a0fb5fbd0670",[380,384,388,392],{"_key":381,"_type":66,"marks":382,"text":383},"a0fb5fbd06700",[],"The implied part of any question is whether the question ",{"_key":385,"_type":66,"marks":386,"text":387},"a0fb5fbd06701",[370],"even makes sense",{"_key":389,"_type":66,"marks":390,"text":391},"a0fb5fbd06702",[],". I've always loved Alex Papadimoulis' take on this, he \"nailed\" it with ",{"_key":393,"_type":66,"marks":394,"text":396},"a0fb5fbd06703",[395],"a9e32a897030","Pounding a Nail: Old Shoe or Glass Bottle?",[398],{"_key":395,"_type":108,"href":399,"reference":12},"http:\u002F\u002Fweblogs.asp.net\u002Falex_papadimoulis\u002Farchive\u002F2005\u002F05\u002F25\u002F408925.aspx",{"_key":401,"_type":62,"children":402,"level":78,"listItem":79,"markDefs":412,"style":70},"a0b0749571ba",[403,407],{"_key":404,"_type":66,"marks":405,"text":406},"a0b0749571ba0",[],"Software developers are trained from birth to ask why; when you ask a programming question, ignore that at your peril. And, please, when you see good questions, ",{"_key":408,"_type":66,"marks":409,"text":411},"a0b0749571ba1",[410],"8a8c298bfee2","vote them up!",[413],{"_key":410,"_type":108,"href":414,"reference":12},"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F2824\u002Fstackoverflow-why-arent-people-rating-questions",{"_key":416,"_type":62,"children":417,"markDefs":422,"style":70},"b6cbfda10267",[418],{"_key":419,"_type":66,"marks":420,"text":421},"b6cbfda102670",[],"Our favorite Stack Overflow questions this week are:",[],{"_key":424,"_type":62,"children":425,"level":78,"listItem":79,"markDefs":440,"style":70},"4c26f1ed16e0",[426,431,436],{"_key":427,"_type":66,"marks":428,"text":430},"4c26f1ed16e00",[429],"strong","Jeff: ",{"_key":432,"_type":66,"marks":433,"text":435},"4c26f1ed16e01",[434],"41f820e97af2","Problems with the MARQUEE HTML tag",{"_key":437,"_type":66,"marks":438,"text":439},"4c26f1ed16e02",[],". I love that we're reaching out to developers who ask naive (but earnest!) questions like this.",[441],{"_key":434,"_type":108,"href":442,"reference":12},"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F456815\u002Fproblems-with-html-marquee-tag",{"_key":444,"_type":62,"children":445,"level":78,"listItem":79,"markDefs":463,"style":70},"cf121c322b79",[446,450,454,459],{"_key":447,"_type":66,"marks":448,"text":449},"cf121c322b790",[429],"Joel",{"_key":451,"_type":66,"marks":452,"text":453},"cf121c322b791",[],": ",{"_key":455,"_type":66,"marks":456,"text":458},"cf121c322b792",[457],"da3a90d66d40","SQL Server \"AFTER INSERT\" trigger doesn't see the just-inserted row",{"_key":460,"_type":66,"marks":461,"text":462},"cf121c322b793",[],". Another example of being very careful, when you ask a question, to make sure you explain why you are asking this question. Otherwise you'll get some answers you didn't expect, such as \"why would anyone ever do that?\"",[464],{"_key":457,"_type":108,"href":465,"reference":12},"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F405288\u002Fsql-server-after-insert-trigger-doesnt-see-the-just-inserted-row",{"_key":467,"_type":62,"children":468,"markDefs":473,"style":70},"b5aa460250f6",[469],{"_key":470,"_type":66,"marks":471,"text":472},"b5aa460250f60",[],"We answered one listener question on this podcast:",[],{"_key":475,"_type":62,"children":476,"level":78,"listItem":494,"markDefs":495,"style":70},"21f8344e4343",[477,481,485,490],{"_key":478,"_type":66,"marks":479,"text":480},"21f8344e43430",[429],"Joe Hopkins",{"_key":482,"_type":66,"marks":483,"text":484},"21f8344e43431",[],": \"What have you found to be the most limiting or annoying part of the ASP.NET MVC? And do you have details on the ",{"_key":486,"_type":66,"marks":487,"text":489},"21f8344e43432",[488],"a81146baf868","Business of Software",{"_key":491,"_type":66,"marks":492,"text":493},"21f8344e43433",[]," 2009 conference?\"","number",[496],{"_key":488,"_type":108,"href":497,"reference":12},"http:\u002F\u002Fwww.businessofsoftware.org\u002F",{"_key":499,"_type":62,"children":500,"markDefs":530,"style":70},"99887d88b9b4",[501,505,510,514,519,523,527],{"_key":502,"_type":66,"marks":503,"text":504},"99887d88b9b40",[],"If you'd like to submit a question to be answered in our next episode, record an audio file (90 seconds or less) and mail it to ",{"_key":506,"_type":66,"marks":507,"text":509},"99887d88b9b41",[508],"b3de4210332e","podcast@stackoverflow.com",{"_key":511,"_type":66,"marks":512,"text":513},"99887d88b9b42",[],". You can ",{"_key":515,"_type":66,"marks":516,"text":518},"99887d88b9b43",[517],"14df4beb253d","record a question",{"_key":520,"_type":66,"marks":521,"text":522},"99887d88b9b44",[]," using nothing but a telephone and a web browser. We also have a dedicated phone number you can call to leave audio questions at ",{"_key":524,"_type":66,"marks":525,"text":526},"99887d88b9b45",[429],"646-826-3879",{"_key":528,"_type":66,"marks":529,"text":274},"99887d88b9b46",[],[531,533],{"_key":508,"_type":108,"href":532,"reference":12},"mailto:podcast@stackoverflow.com",{"_key":517,"_type":108,"href":534,"reference":12},"http:\u002F\u002Fblog.stackoverflow.com\u002Findex.php\u002F2008\u002F05\u002Frecording-podcast-questions-using-your-telephone\u002F",{"_key":536,"_type":62,"children":537,"markDefs":551,"style":70},"926a6164c4a8",[538,542,547],{"_key":539,"_type":66,"marks":540,"text":541},"926a6164c4a80",[],"The ",{"_key":543,"_type":66,"marks":544,"text":546},"926a6164c4a81",[545],"af35765de737","transcript wiki",{"_key":548,"_type":66,"marks":549,"text":550},"926a6164c4a82",[]," for this episode is available for public editing.",[552],{"_key":545,"_type":108,"href":553,"reference":12},"https:\u002F\u002Fstackoverflow.fogbugz.com\u002Fdefault.asp?pg=pgWiki&command=view&ixWikiPage=29025",true,"2009\u002F01\u002F22","",{"_type":53,"asset":558},{"_ref":559,"_type":560},"image-2e7e2d828ffbb0404d422ecab697f29109a4339b-1500x1000-jpg","reference",{"code":562,"language":563},"\u003Cp>This is the 38th episode of the StackOverflow podcast, where Joel and Jeff discuss YSlow optimizations for large websites, the value of unit testing, and the hidden pitfalls of asking questions to programmers.\u003C\u002Fp>\n\u003Cul>\u003Cli>\n\u003Cp>Joel notes that simply paying attention to what your coworkers are doing is an effective way to build and lead a team. If you aren't interested in what your teammates are doing.. why are you on that team, again?\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>I've followed the \u003Ca href=\"http:\u002F\u002Fdeveloper.yahoo.com\u002Fyslow\u002F\">excellent Yahoo YSlow tool\u003C\u002Fa> for a while. It really is intended for large scale websites, as I've \u003Ca href=\"http:\u002F\u002Fwww.codinghorror.com\u002Fblog\u002Farchives\u002F000932.html\">noted before\u003C\u002Fa>. But Stack Overflow is exactly the type of website that can benefit from YSlow recommendations!\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>We've been using the \u003Ca href=\"http:\u002F\u002Fdeveloper.yahoo.com\u002Fperformance\u002Frules.html#expires\">Expires or Cache-Control Header\u003C\u002Fa> since we launched. This saves the browser round-trips when getting infrequently changing items, such as images, javascript, or css. The downside is that, when you do actually change these files, you have to remember to change the filenames. A part of our build process now \"tags\" these files with a version number so we no longer have to remember to do this manually.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>We also integrated the \u003Ca href=\"http:\u002F\u002Fdeveloper.yahoo.com\u002Fyui\u002Fcompressor\u002F\">YUI Compressor\u003C\u002Fa> into our build, to minify our CSS and JavaScript resources. We had \u003Ca href=\"http:\u002F\u002Fwww.codeplex.com\u002FYUICompressor\">bad luck with the .NET port\u003C\u002Fa> of this tool, so we just shell out to Java in the build. Works great, although we had some crazy pathing issues that made us put the JAR file in the root.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>It's also possible for Google to \u003Ca href=\"http:\u002F\u002Fgoogleajaxsearchapi.blogspot.com\u002F2008\u002F05\u002Fspeed-up-access-to-your-favorite.html\">host your shared javascript files\u003C\u002Fa>, if you're using a popular third party JS library. We chose not to do this because we package related JavaScript together, so it would defeat the benefits of packaging.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Browsers will parallelize their requests, but only so many requests can be \"in flight\" to the same domain. So it can be wise to \u003Ca href=\"http:\u002F\u002Fdeveloper.yahoo.com\u002Fperformance\u002Frules.html#split\">split your website components across domains\u003C\u002Fa>. Simple aliases such as a.mydomain.com seem to work fine for this purpose.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Joel explains \u003Ca href=\"http:\u002F\u002Falistapart.com\u002Farticles\u002Fsprites\">CSS sprites\u003C\u002Fa>, which is an effective way to \u003Ca href=\"http:\u002F\u002Fdeveloper.yahoo.com\u002Fperformance\u002Frules.html#num_http\">minimize the number of HTTP requests\u003C\u002Fa> your website is generating. This is particularly useful on toolbars and the like which contain a lot of related images.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>There are analogs here in the Strings tab of \u003Ca href=\"http:\u002F\u002Ftechnet.microsoft.com\u002Fen-us\u002Fsysinternals\u002Fbb896653.aspx\">Process Explorer\u003C\u002Fa>, and the \u003Ca href=\"http:\u002F\u002Flinux.about.com\u002Flibrary\u002Fcmd\u002Fblcmdl1_strings.htm\">UNIX command Strings\u003C\u002Fa>, as well as classic Windows resource browsing -- spelunking for whatever icons and image resources you can find in a file.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>This is all important because I want Stack Overflow to be as fast as possible. Performance is a feature, and I think often underestimated. Even \u003Ca href=\"http:\u002F\u002Fwww.codinghorror.com\u002Fblog\u002Farchives\u002F000722.html\">half a second delay can cause a 20% drop in traffic\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>We discuss differential database backups and DNS time to live, to make the upcoming site transition to new harware as painless as possible, and minimize downtime. We'll also update the old site with a static HTML page that tells you you need to flush your DNS.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Joel notes that his partner Michael had to order thermal compound back in 2000 when he built up PCs for Fog Creek. This stuff is important! Please \u003Ca href=\"http:\u002F\u002Fwww.dansdata.com\u002Fgoop.htm\">don't use vegemite\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>We finally fixed our paging algorithm, which had some aggravating edge condition bugs. I dedicate this fix to \u003Ca href=\"http:\u002F\u002Fstackoverflow.com\u002Fusers\u002F1450\u002Fjohn-topley\">John Topley\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Joel and I have some reservations about unit testing, at least the dogmatic test-first kind, where your goal is to have code coverage in the 95%+ range. It seems to us that this works best for legacy type applications that aren't changing very much. At some level, the tests become friction preventing you from making changes, as every change results in a stack of failing tests.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Joel talks about Robert Martin's (aka Uncle Bob) \u003Ca href=\"http:\u002F\u002Fbutunclebob.com\u002FArticleS.UncleBob.PrinciplesOfOod\">Solid Principles\u003C\u002Fa>, as explained on a \u003Ca href=\"http:\u002F\u002Fwww.hanselminutes.com\u002Fdefault.aspx?showID=163\">recent Hanselminutes podcast\u003C\u002Fa>. Joel: \"it sounded like extremely bureaucratic programming\" that \"could theoretically protect you against things, but You Aren't Gonna Need It.\"\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>On the other hand, if you're building a framework or API, something\ndesigned to be used by thousands or millions of developers, then having\na lot of unit tests -- or Uncle Bob's Principles of OOD -- might make sense. Principles and rules are fine, but thinking about what you're doing should \u003Cem>always\u003C\u002Fem> come first.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>The implied part of any question is whether the question \u003Cem>even makes sense\u003C\u002Fem>. I've always loved Alex Papadimoulis' take on this, he \"nailed\" it with \u003Ca href=\"http:\u002F\u002Fweblogs.asp.net\u002Falex_papadimoulis\u002Farchive\u002F2005\u002F05\u002F25\u002F408925.aspx\">Pounding a Nail: Old Shoe or Glass Bottle?\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>Software developers are trained from birth to ask why; when you ask a programming question, ignore that at your peril. And, please, when you see good questions, \u003Ca href=\"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F2824\u002Fstackoverflow-why-arent-people-rating-questions\">vote them up!\u003C\u002Fa>  \u003C\u002Fli>\n\u003C\u002Ful>\u003Cp>Our favorite Stack Overflow questions this week are:\u003C\u002Fp>\n\u003Cul>\u003Cli>\n\u003Cp>\u003Cstrong>Jeff: \u003C\u002Fstrong>\u003Ca href=\"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F456815\u002Fproblems-with-html-marquee-tag\">Problems with the MARQUEE HTML tag\u003C\u002Fa>. I love that we're reaching out to developers who ask naive (but earnest!) questions like this.   \u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Joel\u003C\u002Fstrong>: \u003Ca href=\"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F392397\u002Farrays-whats-the-point\">\u003C\u002Fa>\u003Ca href=\"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F405288\u002Fsql-server-after-insert-trigger-doesnt-see-the-just-inserted-row\">SQL Server \"AFTER INSERT\" trigger doesn't see the just-inserted row\u003C\u002Fa>. Another example of being very careful, when you ask a question, to make sure you explain why you are asking this question. Otherwise you'll get some answers you didn't expect, such as \"why would anyone ever do that?\"  \u003C\u002Fli>\n\u003C\u002Ful>\u003Cp>We answered one listener question on this podcast:\u003C\u002Fp>\n\u003Col>\u003Cli>\u003Cstrong>Joe Hopkins\u003C\u002Fstrong>: \"What have you found to be the most limiting or annoying part of the ASP.NET MVC? And do you have details on the \u003Ca href=\"http:\u002F\u002Fwww.businessofsoftware.org\u002F\">Business of Software\u003C\u002Fa> 2009 conference?\"\u003C\u002Fli>\n\u003C\u002Fol>\u003Cp>If you'd like to submit a question to be answered in our next episode, record an audio file (90 seconds or less) and mail it to \u003Ca href=\"mailto:podcast@stackoverflow.com\">podcast@stackoverflow.com\u003C\u002Fa>. You can \u003Ca href=\"http:\u002F\u002Fblog.stackoverflow.com\u002Findex.php\u002F2008\u002F05\u002Frecording-podcast-questions-using-your-telephone\u002F\">record a question\u003C\u002Fa> using nothing but a telephone and a web browser. We also have a dedicated phone number you can call to leave audio questions at \u003Cstrong>646-826-3879\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fstackoverflow.fogbugz.com\u002Fdefault.asp?pg=pgWiki&amp;command=view&amp;ixWikiPage=29025\">transcript wiki\u003C\u002Fa> for this episode is available for public editing.\u003C\u002Fp>","html","2009-01-22T12:00:00.000Z",{"current":566},"podcast-38",[568,576],{"_createdAt":569,"_id":570,"_rev":571,"_type":572,"_updatedAt":569,"slug":573,"title":575},"2023-05-23T16:43:21Z","wp-tagcat-company","9HpbCsT2tq0xwozQfkc4ih","blogTag",{"current":574},"company","Company",{"_createdAt":569,"_id":577,"_rev":571,"_type":572,"_updatedAt":569,"slug":578,"title":580},"wp-tagcat-podcast",{"current":579},"podcast","The Stack Overflow Podcast","Podcast #38",[583,589,595,601],{"_id":584,"publishedAt":585,"slug":586,"sponsored":12,"title":588},"76c9771b-34e6-4d98-8641-ecefc711f0ef","2026-07-06T15:23:34.559Z",{"_type":10,"current":587},"when-the-sensor-starts-thinking-snortml-agentic-ai-and-the-evolving-architecture-of-intrusion-detection","When the sensor starts thinking: SnortML, agentic AI, and the evolving architecture of intrusion detection",{"_id":590,"publishedAt":591,"slug":592,"sponsored":12,"title":594},"28e560af-f0aa-4d46-bd90-f435ad604aa7","2026-06-26T14:00:27.102Z",{"_type":10,"current":593},"paging-charity-how-can-engineering-leaders-avoid-becoming-bond-villains","Paging Charity! How can engineering leaders avoid becoming Bond villains?",{"_id":596,"publishedAt":597,"slug":598,"sponsored":12,"title":600},"4b22c2a3-3779-4966-93eb-5230391dbdce","2026-06-23T14:08:58.595Z",{"_type":10,"current":599},"your-ai-shipped-a-backend-that-boots-that-is-the-whole-problem","Your AI shipped a backend that boots. That is the whole problem.",{"_id":602,"publishedAt":603,"slug":604,"sponsored":12,"title":606},"5cf362e1-fe7b-45af-b69c-914731c6a052","2026-06-23T14:00:00.000Z",{"_type":10,"current":605},"the-2026-developer-survey-is-now-open-for-human-developers-only","The 2026 Developer Survey is now open (for human developers only)!",{"data":608,"sourceMap":-1},{"count":609,"lastTimestamp":12},0]