[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"sanity-vf7wQErx-Pmw3ALaT3VNXVz3LAv6a4NViLB_j_j1JbQ":3},{"data":4,"sourceMap":-1},{"info":5,"latest":21},{"_createdAt":6,"_id":7,"_rev":8,"_type":9,"_updatedAt":10,"avatar":11,"bio":16,"employee":17,"name":18,"slug":19},"2023-05-23T16:27:18Z","wp-author-cap-18115","07ZbrKPSUrjrV4wQ6fDpaa","blogAuthor","2023-06-20T15:05:10Z",{"_type":12,"asset":13},"image",{"_ref":14,"_type":15},"image-8cf69a05d6ef9dfd6db2ac2da2518a7d5e4b90d1-386x426-png","reference","Daniel Orner is a Staff Software Engineer at Flipp and has previously worked at IBM. You can find his articles, ranging from musings on event-driven microservices to what Ruby can learn from Go, at his GitHub profile. He lives in Toronto with a wife and four small people who alternate between enriching and enraging him.","none","Daniel Orner",{"current":20},"daniel-orner",[22,80,109,146,179,234,257],{"_id":23,"author":24,"commentCount":30,"comments":31,"excerpt":32,"featureTag":28,"image":33,"publishedAt":36,"slug":37,"sponsored":28,"tags":39,"title":79},"wp-post-21885",[25],{"_id":7,"avatar":26,"name":18,"role":28,"slug":29},{"_type":12,"asset":27},{"_ref":14,"_type":15},null,{"current":20},5,true,"Do you solve new problems the same way because it's already done? Or do you go with a new approach that offers more benefits?",{"_type":12,"asset":34},{"_ref":35,"_type":15},"image-e73d1d45977f5166f08c446fe4dfc7e9811732fb-2560x1344-jpg","2023-03-23T14:00:00.000Z",{"current":38},"your-tech-toolbox-the-middle-ground-between-tech-chaos-and-rigidity",[40,48,53,58],{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":45,"title":47},"2023-05-23T16:43:21Z","wp-tagcat-code-for-a-living","9HpbCsT2tq0xwozQfkc4ih","blogTag",{"current":46},"code-for-a-living","Code for a Living",{"_createdAt":41,"_id":49,"_rev":43,"_type":44,"_updatedAt":41,"slug":50,"title":52},"wp-tagcat-software-development",{"current":51},"software-development","software development",{"_createdAt":41,"_id":54,"_rev":43,"_type":44,"_updatedAt":41,"slug":55,"title":57},"wp-tagcat-tech-stack",{"current":56},"tech-stack","tech stack",{"_createdAt":59,"_id":60,"_rev":61,"_type":44,"_updatedAt":62,"description":63,"slug":75,"title":78},"2024-09-12T10:47:51Z","1dc92c86-0099-46d4-ba5b-41e5697d43c0","6PK1Gm0YEnAcvtXN32g6bL","2024-09-17T14:27:36Z",[64],{"_key":65,"_type":66,"children":67,"markDefs":73,"style":74},"1ddad854068f","block",[68],{"_key":69,"_type":70,"marks":71,"text":72},"312bffce4f510","span",[],"Articles on business, SaaS, and the software that powers organizations.",[],"normal",{"_type":76,"current":77},"slug","business","Business Hub","Your tech toolbox: The middle ground between tech chaos and rigidity",{"_id":81,"author":82,"commentCount":87,"comments":31,"excerpt":88,"featureTag":28,"image":89,"publishedAt":92,"slug":93,"sponsored":28,"tags":95,"title":108},"wp-post-21495",[83],{"_id":7,"avatar":84,"name":18,"role":28,"slug":86},{"_type":12,"asset":85},{"_ref":14,"_type":15},{"current":20},3,"Dynamic languages allow for a lot of flexibility in typing — sometimes too much. Here's how to add some guardrails to your code. ",{"_type":12,"asset":90},{"_ref":91,"_type":15},"image-66dfd6f102b260dd3adb4278115f43e83e622d69-2560x1344-jpg","2023-01-19T14:00:00.000Z",{"current":94},"adding-structure-to-dynamic-languages",[96,98,103],{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":97,"title":47},{"current":46},{"_createdAt":41,"_id":99,"_rev":43,"_type":44,"_updatedAt":41,"slug":100,"title":102},"wp-tagcat-dynamic-programming",{"current":101},"dynamic-programming","dynamic programming",{"_createdAt":41,"_id":104,"_rev":43,"_type":44,"_updatedAt":41,"slug":105,"title":107},"wp-tagcat-static-types",{"current":106},"static-types","static types","Minimizing the downsides of dynamic programming languages",{"_id":110,"author":111,"commentCount":116,"comments":31,"excerpt":117,"featureTag":28,"image":118,"publishedAt":121,"slug":122,"sponsored":28,"tags":124,"title":145},"wp-post-20446",[112],{"_id":7,"avatar":113,"name":18,"role":28,"slug":115},{"_type":12,"asset":114},{"_ref":14,"_type":15},{"current":20},8,"An event-driven architecture can reduce dependencies, increase safety, and make your application easy to scale. But designing your systems and topics is a non-trivial task",{"_type":12,"asset":119},{"_ref":120,"_type":15},"image-80277011043659d940f9d799802981311e91bbc6-2560x1344-jpg","2022-07-21T14:00:00.000Z",{"current":123},"event-driven-topic-design-using-kafka",[125,127,132,136,141],{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":126,"title":47},{"current":46},{"_createdAt":41,"_id":128,"_rev":43,"_type":44,"_updatedAt":41,"slug":129,"title":131},"wp-tagcat-event-driven-architectures",{"current":130},"event-driven-architectures","event-driven architectures",{"_createdAt":41,"_id":133,"_rev":43,"_type":44,"_updatedAt":41,"slug":134,"title":135},"wp-tagcat-kafka",{"current":135},"kafka",{"_createdAt":41,"_id":137,"_rev":43,"_type":44,"_updatedAt":41,"slug":138,"title":140},"wp-tagcat-message-brokers",{"current":139},"message-brokers","message brokers",{"_createdAt":41,"_id":142,"_rev":43,"_type":44,"_updatedAt":41,"slug":143,"title":144},"wp-tagcat-topics",{"current":144},"topics","Design patterns for asynchronous API communication",{"_id":147,"author":148,"commentCount":153,"comments":31,"excerpt":154,"featureTag":28,"image":155,"publishedAt":158,"slug":159,"sponsored":28,"tags":161,"title":178},"wp-post-20131",[149],{"_id":7,"avatar":150,"name":18,"role":28,"slug":152},{"_type":12,"asset":151},{"_ref":14,"_type":15},{"current":20},4,"While the future may be a mystery, you can design software to accommodate future changes. But how much future-proofing gets in the way of good design? ",{"_type":12,"asset":156},{"_ref":157,"_type":15},"image-4b21b1a13f3a921852af21c666c6d2d8631d580b-2560x1344-jpg","2022-05-19T13:51:45.000Z",{"current":160},"crystal-balls-and-clairvoyance-future-proofing-in-a-world-of-inevitable-change",[162,164,168,173],{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":163,"title":47},{"current":46},{"_createdAt":41,"_id":165,"_rev":43,"_type":44,"_updatedAt":41,"slug":166,"title":167},"wp-tagcat-future-proof",{"current":167},"future-proof",{"_createdAt":41,"_id":169,"_rev":43,"_type":44,"_updatedAt":41,"slug":170,"title":172},"wp-tagcat-software-architecture",{"current":171},"software-architecture","software architecture",{"_createdAt":41,"_id":174,"_rev":43,"_type":44,"_updatedAt":41,"slug":175,"title":177},"wp-tagcat-software-engineering",{"current":176},"software-engineering","software engineering","Crystal balls and clairvoyance: Future proofing in a world of inevitable change",{"_id":180,"author":181,"commentCount":186,"comments":31,"excerpt":187,"featureTag":28,"image":188,"publishedAt":191,"slug":192,"sponsored":28,"tags":194,"title":233},"wp-post-19767",[182],{"_id":7,"avatar":183,"name":18,"role":28,"slug":185},{"_type":12,"asset":184},{"_ref":14,"_type":15},{"current":20},9,"When rewriting software in a new language, how do you test that your new and old programs do the same thing?",{"_type":12,"asset":189},{"_ref":190,"_type":15},"image-110976f49a93b63fd335e9081d04f240045ce9a2-2400x1260-jpg","2022-03-09T15:00:00.000Z",{"current":193},"rewriting-bash-scripts-in-go-using-black-box-testing",[195,199,201,205,209,213],{"_createdAt":41,"_id":196,"_rev":43,"_type":44,"_updatedAt":41,"slug":197,"title":198},"wp-tagcat-bash",{"current":198},"bash",{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":200,"title":47},{"current":46},{"_createdAt":41,"_id":202,"_rev":43,"_type":44,"_updatedAt":41,"slug":203,"title":204},"wp-tagcat-go",{"current":204},"go",{"_createdAt":41,"_id":206,"_rev":43,"_type":44,"_updatedAt":41,"slug":207,"title":208},"wp-tagcat-porting",{"current":208},"porting",{"_createdAt":41,"_id":210,"_rev":43,"_type":44,"_updatedAt":41,"slug":211,"title":212},"wp-tagcat-testing",{"current":212},"testing",{"_createdAt":214,"_id":215,"_rev":216,"_system":217,"_type":44,"_updatedAt":220,"description":221,"slug":230,"title":232},"2025-04-24T16:28:57Z","797b8797-6e65-4723-b53f-8bc005305384","IpfPEqg1c3Byvj9RrB3Xaj",{"base":218},{"id":215,"rev":219},"oc42Nphz1oZNOg9ttSv7Tn","2026-05-07T14:43:30Z",[222],{"_key":223,"_type":66,"children":224,"markDefs":229,"style":74},"bb32f75814b4",[225],{"_key":226,"_type":70,"marks":227,"text":228},"dbcf27ef29b3",[],"Community-generated articles submitted for your reading pleasure. If you’re interested in seeing your work here, log in with your Stack Overflow account and click the link below. Articles will be licensed under a CC BY-SA 4.0 grant. ",[],{"_type":76,"current":231},"contributed","The Heap","Rewriting Bash scripts in Go using black box testing",{"_id":235,"author":236,"commentCount":241,"comments":31,"excerpt":242,"featureTag":28,"image":243,"publishedAt":246,"slug":247,"sponsored":28,"tags":249,"title":256},"wp-post-18998",[237],{"_id":7,"avatar":238,"name":18,"role":28,"slug":240},{"_type":12,"asset":239},{"_ref":14,"_type":15},{"current":20},31,"While computing has changed a lot in the 20 years since the SOLID principles were conceived, they are still the best practices for designing software. ",{"_type":12,"asset":244},{"_ref":245,"_type":15},"image-34f7fb1e890c04839c8bfba50a13289da7020fbb-2400x1260-jpg","2021-11-01T14:00:00.000Z",{"current":248},"why-solid-principles-are-still-the-foundation-for-modern-software-architecture",[250,252,254],{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":251,"title":47},{"current":46},{"_createdAt":41,"_id":169,"_rev":43,"_type":44,"_updatedAt":41,"slug":253,"title":172},{"current":171},{"_createdAt":41,"_id":174,"_rev":43,"_type":44,"_updatedAt":41,"slug":255,"title":177},{"current":176},"Why SOLID principles are still the foundation for modern software architecture",{"_id":258,"author":259,"commentCount":264,"comments":31,"excerpt":265,"featureTag":28,"image":266,"publishedAt":269,"slug":270,"sponsored":28,"tags":272,"title":289},"wp-post-18112",[260],{"_id":7,"avatar":261,"name":18,"role":28,"slug":263},{"_type":12,"asset":262},{"_ref":14,"_type":15},{"current":20},11,"Many companies run parallel development and operations organizations. But what if you just ran one team that did both?",{"_type":12,"asset":267},{"_ref":268,"_type":15},"image-146fced0e4f8589a7256ca72a4b2247456283b6f-2400x1260-jpg","2021-05-24T14:08:23.000Z",{"current":271},"how-developers-can-be-their-own-operations-department",[273,275,280,285],{"_createdAt":41,"_id":42,"_rev":43,"_type":44,"_updatedAt":41,"slug":274,"title":47},{"current":46},{"_createdAt":41,"_id":276,"_rev":43,"_type":44,"_updatedAt":41,"slug":277,"title":279},"wp-tagcat-continuous-deployment",{"current":278},"continuous-deployment","continuous deployment",{"_createdAt":41,"_id":281,"_rev":43,"_type":44,"_updatedAt":41,"slug":282,"title":284},"wp-tagcat-continuous-integration",{"current":283},"continuous-integration","continuous integration",{"_createdAt":41,"_id":286,"_rev":43,"_type":44,"_updatedAt":41,"slug":287,"title":288},"wp-tagcat-devops",{"current":288},"devops","How developers can be their own operations department"]