[{"data":1,"prerenderedAt":2157},["ShallowReactive",2],{"content-/cperez/2026-08-11/ai-prototype-to-production-business-results":3},{"article":4,"all":1090},{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"publishDate":6,"image":11,"author":12,"tags":15,"excerpt":10,"body":22,"_type":1084,"_id":1085,"_source":1086,"_file":1087,"_stem":1088,"_extension":1089},"/cperez/2026-08-11/ai-prototype-to-production-business-results","2026-08-11",false,"","Your AI Prototype Is Finished. The Software Project Isn’t.","The demonstration went well. The application accepted a request, generated the right response, and completed a task that normally takes someone much longer, so everyone left the meeting impressed.","/cperez/2026-08-11/img/ai-prototype-to-production-business-results.jpg",{"name":13,"user":14},"Carlos Perez","cperez",[16,17,18,19,20,21],"ai software development","software rescue","vibe-coded application rescue","ai prototype development","ai application modernization","custom ai software development",{"type":23,"children":24,"toc":1045},"root",[25,32,37,42,47,52,57,64,69,74,90,95,101,141,147,152,157,162,167,172,177,182,187,199,205,210,215,220,225,238,243,248,253,259,264,269,274,279,284,289,295,300,305,310,315,320,325,337,343,348,353,358,363,368,373,379,384,389,402,415,420,432,437,443,448,453,458,463,468,480,492,498,503,508,513,518,523,528,534,539,544,549,554,559,564,570,575,580,585,590,595,606,612,617,622,627,632,637,642,648,653,658,663,668,680,685,690,695,701,706,711,716,721,728,733,739,744,750,755,760,766,771,777,782,787,798,804,809,814,819,824,836,841,847,859,864,869,874,879,890,895,901,906,911,916,921,926,931,940,946,952,957,963,968,974,979,985,990,996,1001,1007,1012,1018,1023,1029,1034,1040],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30],{"type":31,"value":10},"text",{"type":26,"tag":27,"props":33,"children":34},{},[35],{"type":31,"value":36},"Then the team tried to connect it to the business.",{"type":26,"tag":27,"props":38,"children":39},{},[40],{"type":31,"value":41},"The application needed customer data from three systems, users needed different permissions, and someone had to decide what should happen when the data disagreed. The AI service occasionally returned an unexpected answer, and there was no reliable way to tell whether an action had succeeded, failed, or happened twice.",{"type":26,"tag":27,"props":43,"children":44},{},[45],{"type":31,"value":46},"The prototype still worked, but the product didn’t exist yet.",{"type":26,"tag":27,"props":48,"children":49},{},[50],{"type":31,"value":51},"AI has made it much easier to generate code and test an idea. It hasn’t eliminated the work required to turn that idea into secure, maintainable software that fits an organization’s workflows and produces a measurable result.",{"type":26,"tag":27,"props":53,"children":54},{},[55],{"type":31,"value":56},"The distance between the demonstration and a dependable product is where much of the real software-development work now happens.",{"type":26,"tag":58,"props":59,"children":61},"h3",{"id":60},"why-isnt-a-working-prototype-enough",[62],{"type":31,"value":63},"Why isn’t a working prototype enough?",{"type":26,"tag":27,"props":65,"children":66},{},[67],{"type":31,"value":68},"A prototype proves that an idea may be technically possible, while a production software product has to keep working when it encounters real users, sensitive data, changing requirements, incomplete information, security threats, external systems, and unexpected behavior.",{"type":26,"tag":27,"props":70,"children":71},{},[72],{"type":31,"value":73},"That requires more than generated code. It requires architecture, integrations, authentication, permissions, testing, monitoring, deployment, support, and a clear understanding of the business process the software is supposed to improve.",{"type":26,"tag":27,"props":75,"children":76},{},[77,79,88],{"type":31,"value":78},"Art+Logic makes the same distinction in its guidance for AI-generated projects: code that runs may still lack the business context, scalability, security, testing, documentation, and edge-case handling required for real-world use. (",{"type":26,"tag":80,"props":81,"children":85},"a",{"href":82,"rel":83},"https://artandlogic.com/ai-rescue/",[84],"nofollow",[86],{"type":31,"value":87},"artandlogic.com",{"type":31,"value":89},")",{"type":26,"tag":27,"props":91,"children":92},{},[93],{"type":31,"value":94},"The important question isn’t simply whether the application can perform the task. It’s whether the organization can depend on it.",{"type":26,"tag":58,"props":96,"children":98},{"id":97},"key-takeaways",[99],{"type":31,"value":100},"Key takeaways",{"type":26,"tag":102,"props":103,"children":104},"ul",{},[105,111,116,121,126,131,136],{"type":26,"tag":106,"props":107,"children":108},"li",{},[109],{"type":31,"value":110},"A prototype demonstrates an idea, while a product supports a business process under real operating conditions.",{"type":26,"tag":106,"props":112,"children":113},{},[114],{"type":31,"value":115},"AI can accelerate implementation, but it doesn’t automatically supply architecture, security, integrations, testing, or operational ownership.",{"type":26,"tag":106,"props":117,"children":118},{},[119],{"type":31,"value":120},"Many AI-assisted projects stall because the team solved the visible interaction without designing the surrounding system.",{"type":26,"tag":106,"props":122,"children":123},{},[124],{"type":31,"value":125},"Production readiness includes user workflows, permissions, failure handling, monitoring, deployment, support, and maintainability.",{"type":26,"tag":106,"props":127,"children":128},{},[129],{"type":31,"value":130},"A project should be measured by the business result it creates, not by the amount of code generated or the number of features completed.",{"type":26,"tag":106,"props":132,"children":133},{},[134],{"type":31,"value":135},"An unfinished AI application may be repairable, and the right decision may be to stabilize, refactor, rearchitect, or selectively rebuild it rather than start over.",{"type":26,"tag":106,"props":137,"children":138},{},[139],{"type":31,"value":140},"Experienced software developers remain essential because they turn business constraints and domain knowledge into a system that can be operated safely.",{"type":26,"tag":58,"props":142,"children":144},{"id":143},"what-is-the-difference-between-a-prototype-and-a-software-product",[145],{"type":31,"value":146},"What is the difference between a prototype and a software product?",{"type":26,"tag":27,"props":148,"children":149},{},[150],{"type":31,"value":151},"A prototype answers a focused question.",{"type":26,"tag":27,"props":153,"children":154},{},[155],{"type":31,"value":156},"Can the model extract these fields? Can a user describe a task in natural language? Can the system generate a useful recommendation? Can this workflow be partially automated?",{"type":26,"tag":27,"props":158,"children":159},{},[160],{"type":31,"value":161},"Those are valuable questions because they let a team test an idea before committing to a larger investment. A prototype can put something in front of users, expose weak assumptions, and help determine whether the concept deserves to move forward.",{"type":26,"tag":27,"props":163,"children":164},{},[165],{"type":31,"value":166},"However, prototypes are usually designed to reduce uncertainty, not to carry the full weight of the business. They may assume a limited number of users, clean test data, a cooperative workflow, one role with broad access, stable third-party services, and an engineer nearby who understands the entire system.",{"type":26,"tag":27,"props":168,"children":169},{},[170],{"type":31,"value":171},"Production removes those assumptions.",{"type":26,"tag":27,"props":173,"children":174},{},[175],{"type":31,"value":176},"Real users arrive with different goals, permissions, devices, and levels of experience. They enter incomplete information, repeat requests, abandon workflows halfway through, and expect the application to preserve their work and explain what happened.",{"type":26,"tag":27,"props":178,"children":179},{},[180],{"type":31,"value":181},"External systems become unavailable, credentials expire, vendors change APIs, the business updates a policy, and the model itself may change.",{"type":26,"tag":27,"props":183,"children":184},{},[185],{"type":31,"value":186},"A demonstration doesn’t have to account for all of that, but a product does.",{"type":26,"tag":27,"props":188,"children":189},{},[190,192,198],{"type":31,"value":191},"Art+Logic has described launch as the point where a system stops being theoretical and begins encountering real usage, expectations, edge cases, and consequences. It has made a similar point about MVPs: the first version can validate direction, but it isn’t automatically a foundation for long-term growth. (",{"type":26,"tag":80,"props":193,"children":196},{"href":194,"rel":195},"https://artandlogic.com/newsletters/what-does-it-mean-launch/",[84],[197],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":58,"props":200,"children":202},{"id":201},"why-do-ai-assisted-projects-stall-after-the-demo",[203],{"type":31,"value":204},"Why do AI-assisted projects stall after the demo?",{"type":26,"tag":27,"props":206,"children":207},{},[208],{"type":31,"value":209},"The most common problem isn’t necessarily the AI. It’s everything the AI needs around it.",{"type":26,"tag":27,"props":211,"children":212},{},[213],{"type":31,"value":214},"A demonstration may use a model to interpret a request, summarize a document, generate a response, or select an action. The production system still has to determine who is making the request, what that person is allowed to see, which information is authoritative, whether the proposed action is permitted, and which systems need to be updated.",{"type":26,"tag":27,"props":216,"children":217},{},[218],{"type":31,"value":219},"It also has to handle partial failure. If one update succeeds and another fails, the software needs a clear response. If a person must approve the result, the application needs to show them enough information to make that approval meaningful. If the action affects a customer, account, or transaction, the organization needs a record of what happened.",{"type":26,"tag":27,"props":221,"children":222},{},[223],{"type":31,"value":224},"The model may provide the most visible capability, but the surrounding software is what makes that capability useful.",{"type":26,"tag":27,"props":226,"children":227},{},[228,230,237],{"type":31,"value":229},"Google’s 2025 DORA research reached a related conclusion: AI acts as an amplifier of the environment around it, so the largest gains don’t come from the tool alone. They come from strong internal platforms, clear workflows, and aligned teams. (",{"type":26,"tag":80,"props":231,"children":234},{"href":232,"rel":233},"https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report",[84],[235],{"type":31,"value":236},"cloud.google.com",{"type":31,"value":89},{"type":26,"tag":27,"props":239,"children":240},{},[241],{"type":31,"value":242},"That helps explain why the same AI tool can produce very different results in two organizations.",{"type":26,"tag":27,"props":244,"children":245},{},[246],{"type":31,"value":247},"One team has established development practices, reliable data, clear ownership, automated testing, and software designed to change. The other has fragmented systems, unclear business rules, broad credentials, and no dependable way to deploy or monitor the application.",{"type":26,"tag":27,"props":249,"children":250},{},[251],{"type":31,"value":252},"AI accelerates both teams, but it doesn’t make their foundations equivalent.",{"type":26,"tag":58,"props":254,"children":256},{"id":255},"the-prototype-solved-the-interaction-not-the-workflow",[257],{"type":31,"value":258},"The prototype solved the interaction, not the workflow",{"type":26,"tag":27,"props":260,"children":261},{},[262],{"type":31,"value":263},"Many AI applications begin with a compelling interaction: upload a document and ask questions, describe what you need and let the system create it, or tell an agent what to do and allow it to update the account.",{"type":26,"tag":27,"props":265,"children":266},{},[267],{"type":31,"value":268},"That interaction may be the right starting point, but it isn’t the whole workflow.",{"type":26,"tag":27,"props":270,"children":271},{},[272],{"type":31,"value":273},"Consider an application that helps an operations team resolve customer exceptions. The prototype may be able to read the request and suggest a resolution, while the finished product may need to confirm the user’s identity, find the correct customer and transaction, retrieve information from several systems, determine which policy version applies, and identify missing or conflicting data.",{"type":26,"tag":27,"props":275,"children":276},{},[277],{"type":31,"value":278},"It may also need to calculate the permitted resolution, request approval when a threshold is exceeded, update multiple systems, notify the customer, preserve the evidence behind the decision, and route unresolved cases to a person.",{"type":26,"tag":27,"props":280,"children":281},{},[282],{"type":31,"value":283},"The AI capability may contribute to only a few of those steps. Software developers still have to design the process connecting them.",{"type":26,"tag":27,"props":285,"children":286},{},[287],{"type":31,"value":288},"That’s why an AI prototype can appear nearly finished while the underlying project is not. The visible feature exists, but the operational product still needs to be built.",{"type":26,"tag":58,"props":290,"children":292},{"id":291},"integrations-determine-whether-the-application-can-do-real-work",[293],{"type":31,"value":294},"Integrations determine whether the application can do real work",{"type":26,"tag":27,"props":296,"children":297},{},[298],{"type":31,"value":299},"A prototype often works with information supplied directly in the demonstration, while a production application usually needs information held elsewhere.",{"type":26,"tag":27,"props":301,"children":302},{},[303],{"type":31,"value":304},"That may include customer relationship management software, accounting or payment systems, internal databases, document repositories, identity providers, scheduling platforms, inventory systems, custom legacy applications, and third-party APIs.",{"type":26,"tag":27,"props":306,"children":307},{},[308],{"type":31,"value":309},"Connecting those systems is rarely a matter of turning on access.",{"type":26,"tag":27,"props":311,"children":312},{},[313],{"type":31,"value":314},"The development team has to understand what each system contains, which one owns a particular piece of information, how records are identified, and what should happen when two sources disagree.",{"type":26,"tag":27,"props":316,"children":317},{},[318],{"type":31,"value":319},"The software may also need to account for missing or duplicated records, different definitions of the same field, API rate limits, delayed updates, vendor outages, data that can’t be sent to an AI provider, older systems without modern APIs, and actions that must occur in a particular order.",{"type":26,"tag":27,"props":321,"children":322},{},[323],{"type":31,"value":324},"An impressive model response can’t compensate for incorrect customer data or an unreliable integration. The product is only as dependable as the full path from the user’s request to the business outcome.",{"type":26,"tag":27,"props":326,"children":327},{},[328,330,336],{"type":31,"value":329},"Art+Logic’s custom AI work is positioned around bringing AI capabilities into real-world applications, including workflow automation, natural-language system actions, document processing, and modernization of existing software. That work necessarily connects AI to the applications and operational context around it. (",{"type":26,"tag":80,"props":331,"children":334},{"href":332,"rel":333},"https://artandlogic.com/ai/",[84],[335],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":58,"props":338,"children":340},{"id":339},"permissions-determine-what-the-software-is-allowed-to-become",[341],{"type":31,"value":342},"Permissions determine what the software is allowed to become",{"type":26,"tag":27,"props":344,"children":345},{},[346],{"type":31,"value":347},"Prototypes often use one account with broad access because that keeps the demonstration simple. It’s also one of the first things that has to change before production.",{"type":26,"tag":27,"props":349,"children":350},{},[351],{"type":31,"value":352},"A real application may serve customers, employees, managers, administrators, partners, and support personnel, and each person may be allowed to see and do something different.",{"type":26,"tag":27,"props":354,"children":355},{},[356],{"type":31,"value":357},"The software needs to determine whether a user can view or change a particular record, whether they’re acting for themselves or for an organization, and whether the AI service needs the full record or only selected fields.",{"type":26,"tag":27,"props":359,"children":360},{},[361],{"type":31,"value":362},"It may also need to distinguish between drafting an action and executing it, determine who can approve an exception, limit how long access remains valid, and record who initiated each change.",{"type":26,"tag":27,"props":364,"children":365},{},[366],{"type":31,"value":367},"Those rules shouldn’t live only in a prompt. They need to be enforced by the application.",{"type":26,"tag":27,"props":369,"children":370},{},[371],{"type":31,"value":372},"That becomes especially important when AI can take actions rather than merely generate text. A model may recommend something, but the surrounding software must determine whether it’s permitted.",{"type":26,"tag":58,"props":374,"children":376},{"id":375},"security-has-to-be-part-of-the-product",[377],{"type":31,"value":378},"Security has to be part of the product",{"type":26,"tag":27,"props":380,"children":381},{},[382],{"type":31,"value":383},"A prototype is usually built to demonstrate value, and attackers aren’t part of the demonstration.",{"type":26,"tag":27,"props":385,"children":386},{},[387],{"type":31,"value":388},"Production software has to assume that someone may misuse an account, manipulate an input, probe an API, expose sensitive information, or exploit an overlooked dependency.",{"type":26,"tag":27,"props":390,"children":391},{},[392,394,401],{"type":31,"value":393},"Generative AI applications add their own risks, including unsafe outputs, sensitive-information exposure, prompt manipulation, excessive agency, and insecure connections between the model and other systems. OWASP maintains dedicated guidance for security risks across the generative-AI application lifecycle. (",{"type":26,"tag":80,"props":395,"children":398},{"href":396,"rel":397},"https://genai.owasp.org/",[84],[399],{"type":31,"value":400},"genai.owasp.org",{"type":31,"value":89},{"type":26,"tag":27,"props":403,"children":404},{},[405,407,414],{"type":31,"value":406},"The broader principle isn’t unique to AI. CISA’s Secure by Design guidance recommends treating customer security as a core product requirement rather than a feature added after development. (",{"type":26,"tag":80,"props":408,"children":411},{"href":409,"rel":410},"https://www.cisa.gov/securebydesign",[84],[412],{"type":31,"value":413},"cisa.gov",{"type":31,"value":89},{"type":26,"tag":27,"props":416,"children":417},{},[418],{"type":31,"value":419},"In practice, that may require threat modeling, secure authentication, role-based authorization, data minimization, encryption, input and output validation, dependency management, audit logging, infrastructure hardening, security testing, and incident-response planning.",{"type":26,"tag":27,"props":421,"children":422},{},[423,425,431],{"type":31,"value":424},"Art+Logic’s secure-development service follows the same approach by incorporating security throughout the software lifecycle and offering code audits, threat modeling, secure DevOps pipelines, compliance-oriented architecture, and security work for AI systems. (",{"type":26,"tag":80,"props":426,"children":429},{"href":427,"rel":428},"https://artandlogic.com/secure-software-development/",[84],[430],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":27,"props":433,"children":434},{},[435],{"type":31,"value":436},"Security isn’t what happens after the product is complete. It’s part of what makes the product complete.",{"type":26,"tag":58,"props":438,"children":440},{"id":439},"testing-determines-what-working-means",[441],{"type":31,"value":442},"Testing determines what “working” means",{"type":26,"tag":27,"props":444,"children":445},{},[446],{"type":31,"value":447},"A prototype usually proves that a desirable outcome can happen, while testing asks what happens in all the other situations.",{"type":26,"tag":27,"props":449,"children":450},{},[451],{"type":31,"value":452},"What if the request is incomplete, the model returns a plausible but incorrect value, or a third-party system is unavailable? What happens if the same submission arrives twice, a user tries to access another organization’s data, or an update changes the model’s behavior?",{"type":26,"tag":27,"props":454,"children":455},{},[456],{"type":31,"value":457},"The team also has to consider partial success. If the application completes the first three steps and fails at the fourth, someone needs to know what changed, what remains incomplete, and whether the process can be resumed safely.",{"type":26,"tag":27,"props":459,"children":460},{},[461],{"type":31,"value":462},"That means testing more than the generated answer. The team needs to test business rules, user permissions, integrations, data transformations, error handling, model outputs, performance, security boundaries, deployment processes, and recovery behavior.",{"type":26,"tag":27,"props":464,"children":465},{},[466],{"type":31,"value":467},"AI can help developers create tests, but it doesn’t get to decide whether those tests adequately represent the business. Someone still needs to identify what must remain true.",{"type":26,"tag":27,"props":469,"children":470},{},[471,473,479],{"type":31,"value":472},"Google’s 2025 DORA guidance similarly emphasizes that AI’s value is amplified by established quality practices such as test-driven development rather than replacing them. (",{"type":26,"tag":80,"props":474,"children":477},{"href":475,"rel":476},"https://cloud.google.com/discover/how-test-driven-development-amplifies-ai-success",[84],[478],{"type":31,"value":236},{"type":31,"value":89},{"type":26,"tag":27,"props":481,"children":482},{},[483,485,491],{"type":31,"value":484},"Art+Logic’s AI-assisted modernization case study provides a practical example. AI was used for repetitive, pattern-based coding, while developers retained responsibility for architecture, review, testing, and validation. That combination allowed the team to move faster without handing control of application behavior to the model. (",{"type":26,"tag":80,"props":486,"children":489},{"href":487,"rel":488},"https://artandlogic.com/ai-assisted-modernization/",[84],[490],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":58,"props":493,"children":495},{"id":494},"monitoring-tells-you-whether-the-software-is-still-working",[496],{"type":31,"value":497},"Monitoring tells you whether the software is still working",{"type":26,"tag":27,"props":499,"children":500},{},[501],{"type":31,"value":502},"A prototype is observed by the people presenting it, but a production application may operate all day without a developer watching.",{"type":26,"tag":27,"props":504,"children":505},{},[506],{"type":31,"value":507},"The organization needs to know whether the application is available, whether users are completing the workflow, whether integrations are failing, and whether response times are getting worse.",{"type":26,"tag":27,"props":509,"children":510},{},[511],{"type":31,"value":512},"It may also need to monitor whether the model is producing more exceptions, costs are increasing unexpectedly, users are abandoning a particular step, or a recent deployment introduced a regression.",{"type":26,"tag":27,"props":514,"children":515},{},[516],{"type":31,"value":517},"Logs alone aren’t enough. The system needs useful signals tied to both technical operation and business behavior.",{"type":26,"tag":27,"props":519,"children":520},{},[521],{"type":31,"value":522},"A dashboard showing that the server is running doesn’t tell you whether customers can complete the task, just as a model returning responses doesn’t tell you whether employees trust them.",{"type":26,"tag":27,"props":524,"children":525},{},[526],{"type":31,"value":527},"Monitoring should help the organization see the difference between software that is online and software that is producing the intended result.",{"type":26,"tag":58,"props":529,"children":531},{"id":530},"user-workflow-determines-whether-anyone-adopts-it",[532],{"type":31,"value":533},"User workflow determines whether anyone adopts it",{"type":26,"tag":27,"props":535,"children":536},{},[537],{"type":31,"value":538},"A technically capable application can still fail because it doesn’t fit how people work.",{"type":26,"tag":27,"props":540,"children":541},{},[542],{"type":31,"value":543},"The AI may generate a useful recommendation, but the surrounding product still has to decide where that recommendation appears, how the user understands it, whether they can correct it, and how they compare it with the original information.",{"type":26,"tag":27,"props":545,"children":546},{},[547],{"type":31,"value":548},"The software also needs a clear response when the user disagrees. It should save time rather than adding another system to check, and it should make exceptions easier to resolve rather than hiding them behind a conversational interface.",{"type":26,"tag":27,"props":550,"children":551},{},[552],{"type":31,"value":553},"Business adoption depends on the complete experience around the capability. That includes how users begin the task, what information they need to provide, how the software communicates uncertainty, where human judgment remains necessary, and how users recover from mistakes.",{"type":26,"tag":27,"props":555,"children":556},{},[557],{"type":31,"value":558},"This is product and UX design, and it requires observing the workflow, talking with users, and understanding what success looks like from their perspective.",{"type":26,"tag":27,"props":560,"children":561},{},[562],{"type":31,"value":563},"A prototype can demonstrate what the technology can do. A product has to support what the user is trying to accomplish.",{"type":26,"tag":58,"props":565,"children":567},{"id":566},"the-application-needs-someone-to-operate-it",[568],{"type":31,"value":569},"The application needs someone to operate it",{"type":26,"tag":27,"props":571,"children":572},{},[573],{"type":31,"value":574},"Every production system creates ongoing responsibilities.",{"type":26,"tag":27,"props":576,"children":577},{},[578],{"type":31,"value":579},"Someone has to deploy updates, monitor performance, respond to incidents, patch dependencies, review security findings, manage credentials, support users, evaluate vendor changes, test model upgrades, prioritize improvements, and maintain documentation.",{"type":26,"tag":27,"props":581,"children":582},{},[583],{"type":31,"value":584},"A project can stall because no one decided who would own those responsibilities. The team concentrated on building the feature, while the operating model was left for later.",{"type":26,"tag":27,"props":586,"children":587},{},[588],{"type":31,"value":589},"That creates an awkward situation after launch: the application exists, but no team is prepared to support it. Changes become risky, problems remain unresolved, and the people who funded the project begin to lose confidence.",{"type":26,"tag":27,"props":591,"children":592},{},[593],{"type":31,"value":594},"The deliverable can’t be only a code repository. It has to include a practical path for operating and maintaining the software.",{"type":26,"tag":27,"props":596,"children":597},{},[598,600,605],{"type":31,"value":599},"Art+Logic’s AI-rescue offering explicitly addresses gaps such as missing version control, test coverage, documentation, development processes, and CI/CD pipelines. It also includes architecture assessment, refactoring, performance preparation, and support for real-world integrations and edge cases. (",{"type":26,"tag":80,"props":601,"children":603},{"href":82,"rel":602},[84],[604],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":58,"props":607,"children":609},{"id":608},"why-technical-completion-and-business-adoption-are-different",[610],{"type":31,"value":611},"Why technical completion and business adoption are different",{"type":26,"tag":27,"props":613,"children":614},{},[615],{"type":31,"value":616},"A development team can complete every item in the original feature list and still produce little business value, because the real problem may be the list itself.",{"type":26,"tag":27,"props":618,"children":619},{},[620],{"type":31,"value":621},"Perhaps the project measured whether the software could generate a report, while the business needed that report to shorten a decision process.",{"type":26,"tag":27,"props":623,"children":624},{},[625],{"type":31,"value":626},"Perhaps the project measured whether the agent could update a record, while the business needed fewer errors and less manual reconciliation.",{"type":26,"tag":27,"props":628,"children":629},{},[630],{"type":31,"value":631},"Perhaps the project measured whether the application could answer a question, while users needed confidence that the answer came from current, approved information.",{"type":26,"tag":27,"props":633,"children":634},{},[635],{"type":31,"value":636},"Technical completion asks whether the team built the requested capability. Business adoption asks whether that capability improved the way the organization works.",{"type":26,"tag":27,"props":638,"children":639},{},[640],{"type":31,"value":641},"Those questions should be connected before development begins. Otherwise, the team may optimize for an output no one ultimately values.",{"type":26,"tag":58,"props":643,"children":645},{"id":644},"how-should-a-company-measure-the-result",[646],{"type":31,"value":647},"How should a company measure the result?",{"type":26,"tag":27,"props":649,"children":650},{},[651],{"type":31,"value":652},"The right metric depends on the workflow, but the important thing is to define a baseline before the new software changes it.",{"type":26,"tag":27,"props":654,"children":655},{},[656],{"type":31,"value":657},"For an operational process, the organization might measure average processing time, the number of manual steps, error or rework rates, cases completed per employee, time spent switching among systems, the percentage of requests requiring escalation, or the time required to resolve exceptions.",{"type":26,"tag":27,"props":659,"children":660},{},[661],{"type":31,"value":662},"For a customer-facing product, useful measures might include completion rate, time to value, abandonment rate, support requests, customer retention, conversion to a paid service, or adoption of a new capability.",{"type":26,"tag":27,"props":664,"children":665},{},[666],{"type":31,"value":667},"For an internal development platform, the company might look at lead time for changes, deployment frequency, change failure rate, time required to restore service, or time spent maintaining repetitive processes.",{"type":26,"tag":27,"props":669,"children":670},{},[671,673,679],{"type":31,"value":672},"DORA’s established software-delivery metrics include deployment frequency, lead time for changes, change failure rate, and recovery time. These can help teams assess whether their development and delivery system is becoming faster and more reliable. (",{"type":26,"tag":80,"props":674,"children":677},{"href":675,"rel":676},"https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance",[84],[678],{"type":31,"value":236},{"type":31,"value":89},{"type":26,"tag":27,"props":681,"children":682},{},[683],{"type":31,"value":684},"Technical metrics should still connect to the intended business result. A faster deployment process matters because the organization can respond to customers sooner, while a lower error rate matters because employees spend less time correcting work.",{"type":26,"tag":27,"props":686,"children":687},{},[688],{"type":31,"value":689},"Higher completion matters because more users receive the value the product was designed to provide.",{"type":26,"tag":27,"props":691,"children":692},{},[693],{"type":31,"value":694},"The goal isn’t to find one universal software metric. It’s to establish a credible line from the application to an outcome the business cares about.",{"type":26,"tag":58,"props":696,"children":698},{"id":697},"does-an-unfinished-ai-application-need-to-be-rebuilt",[699],{"type":31,"value":700},"Does an unfinished AI application need to be rebuilt?",{"type":26,"tag":27,"props":702,"children":703},{},[704],{"type":31,"value":705},"Not always.",{"type":26,"tag":27,"props":707,"children":708},{},[709],{"type":31,"value":710},"A struggling project may still contain valuable work, including a validated product idea, useful interface design, working integrations, correct business logic, a usable data model, features customers already depend on, or code that becomes serviceable once it’s reorganized and tested.",{"type":26,"tag":27,"props":712,"children":713},{},[714],{"type":31,"value":715},"Starting over can discard that value, and it can also recreate the same uncertainty under a new architecture.",{"type":26,"tag":27,"props":717,"children":718},{},[719],{"type":31,"value":720},"The better first step is an assessment.",{"type":26,"tag":722,"props":723,"children":725},"h4",{"id":724},"repair",[726],{"type":31,"value":727},"Repair",{"type":26,"tag":27,"props":729,"children":730},{},[731],{"type":31,"value":732},"Repair may be appropriate when the foundation is mostly sound and the problems are localized. The team may need to fix defects, add missing tests, secure an integration, improve performance, or complete an unfinished workflow.",{"type":26,"tag":722,"props":734,"children":736},{"id":735},"refactor",[737],{"type":31,"value":738},"Refactor",{"type":26,"tag":27,"props":740,"children":741},{},[742],{"type":31,"value":743},"Refactoring may be appropriate when the software works but has become difficult to maintain. Developers can reorganize fragile code, introduce clearer boundaries, reduce duplication, add tests, and improve documentation without changing the product’s core behavior.",{"type":26,"tag":722,"props":745,"children":747},{"id":746},"rearchitect",[748],{"type":31,"value":749},"Rearchitect",{"type":26,"tag":27,"props":751,"children":752},{},[753],{"type":31,"value":754},"Rearchitecture may be necessary when structural decisions prevent the application from meeting production needs. The system may have tightly coupled components, unsuitable data boundaries, weak authorization, or an infrastructure design that can’t support expected usage.",{"type":26,"tag":27,"props":756,"children":757},{},[758],{"type":31,"value":759},"The goal isn’t necessarily to replace the entire product. It’s to change the parts of the structure that are creating the risk.",{"type":26,"tag":722,"props":761,"children":763},{"id":762},"rebuild-selected-components",[764],{"type":31,"value":765},"Rebuild selected components",{"type":26,"tag":27,"props":767,"children":768},{},[769],{"type":31,"value":770},"Some portions may be safer to replace. A generated authentication layer, an unreliable data pipeline, or a fundamentally unsuitable integration may not be worth preserving, but that doesn’t require discarding everything else.",{"type":26,"tag":722,"props":772,"children":774},{"id":773},"rebuild-the-product",[775],{"type":31,"value":776},"Rebuild the product",{"type":26,"tag":27,"props":778,"children":779},{},[780],{"type":31,"value":781},"A full rebuild may be justified when the current code provides little reusable value, the architecture is fundamentally incompatible with the product’s needs, or repairing it would cost more than creating a better foundation.",{"type":26,"tag":27,"props":783,"children":784},{},[785],{"type":31,"value":786},"That decision should be based on evidence, not embarrassment about how the first version was built.",{"type":26,"tag":27,"props":788,"children":789},{},[790,792,797],{"type":31,"value":791},"Art+Logic’s rescue positioning reflects that approach: AI-generated code can be a head start, and teams may be able to avoid a complete rewrite by auditing the architecture, stabilizing the application, and improving the areas that prevent it from launching or scaling successfully. (",{"type":26,"tag":80,"props":793,"children":795},{"href":82,"rel":794},[84],[796],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":58,"props":799,"children":801},{"id":800},"why-are-experienced-software-developers-still-necessary",[802],{"type":31,"value":803},"Why are experienced software developers still necessary?",{"type":26,"tag":27,"props":805,"children":806},{},[807],{"type":31,"value":808},"AI can produce code, but software engineering was never only about producing code.",{"type":26,"tag":27,"props":810,"children":811},{},[812],{"type":31,"value":813},"Developers are needed to translate business needs into a system that behaves predictably under real constraints. They decide how the components fit together, where business rules should live, which data can be trusted, how users and systems authenticate, and what each role is allowed to do.",{"type":26,"tag":27,"props":815,"children":816},{},[817],{"type":31,"value":818},"They also determine how failures are contained, how changes are tested, how the system is deployed, how behavior is monitored, and how future developers will understand it.",{"type":26,"tag":27,"props":820,"children":821},{},[822],{"type":31,"value":823},"Those decisions become more important as implementation becomes faster.",{"type":26,"tag":27,"props":825,"children":826},{},[827,829,835],{"type":31,"value":828},"Art+Logic has described the shift directly: AI makes code generation, iteration, and prototyping cheaper, but complexity moves into architecture, system design, integration, risk management, and maintainability. (",{"type":26,"tag":80,"props":830,"children":833},{"href":831,"rel":832},"https://artandlogic.com/newsletters/do-companies-still-need-software-engineers/",[84],[834],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":27,"props":837,"children":838},{},[839],{"type":31,"value":840},"The developer’s role isn’t to compete with the model at generating boilerplate. It’s to make sure the resulting software serves the organization.",{"type":26,"tag":58,"props":842,"children":844},{"id":843},"where-artlogic-fits",[845],{"type":31,"value":846},"Where Art+Logic fits",{"type":26,"tag":27,"props":848,"children":849},{},[850,852,858],{"type":31,"value":851},"Art+Logic develops custom AI applications, modernizes legacy software, and helps recover AI-assisted or traditional software projects that have stalled, broken, or failed to reach production readiness. (",{"type":26,"tag":80,"props":853,"children":856},{"href":854,"rel":855},"https://artandlogic.com/",[84],[857],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":27,"props":860,"children":861},{},[862],{"type":31,"value":863},"That work can begin with a promising prototype. The application may already demonstrate the core idea, users may already see value in it, and the project may simply lack the engineering foundation needed to move forward confidently.",{"type":26,"tag":27,"props":865,"children":866},{},[867],{"type":31,"value":868},"Art+Logic can assess the current software and help determine what is worth preserving, which risks need immediate attention, whether the architecture supports the product’s goals, and which workflows remain incomplete.",{"type":26,"tag":27,"props":870,"children":871},{},[872],{"type":31,"value":873},"The assessment can also identify missing security controls, integrations that need to be redesigned, the testing and monitoring required for production, and whether the system should be repaired, refactored, rearchitected, or selectively rebuilt.",{"type":26,"tag":27,"props":875,"children":876},{},[877],{"type":31,"value":878},"The goal isn’t to replace AI-assisted development with a slower process. It’s to use AI where it helps while applying experienced engineering where the business needs judgment, accountability, and control.",{"type":26,"tag":27,"props":880,"children":881},{},[882,884,889],{"type":31,"value":883},"Art+Logic used that combination in its AI-assisted modernization work: AI accelerated suitable implementation tasks, while developers directed the architecture, reviewed the generated code, tested behavior, and improved the product beyond a mechanical migration. (",{"type":26,"tag":80,"props":885,"children":887},{"href":487,"rel":886},[84],[888],{"type":31,"value":87},{"type":31,"value":89},{"type":26,"tag":27,"props":891,"children":892},{},[893],{"type":31,"value":894},"AI can help create the start, while developers build the system that has to last.",{"type":26,"tag":58,"props":896,"children":898},{"id":897},"working-code-is-not-the-business-result",[899],{"type":31,"value":900},"Working code is not the business result",{"type":26,"tag":27,"props":902,"children":903},{},[904],{"type":31,"value":905},"A prototype can be an important achievement because it can prove that an idea deserves investment, help a team learn quickly, and make a previously abstract possibility feel real.",{"type":26,"tag":27,"props":907,"children":908},{},[909],{"type":31,"value":910},"However, the prototype isn’t valuable simply because it runs. Its value comes from what it may allow the organization to do next.",{"type":26,"tag":27,"props":912,"children":913},{},[914],{"type":31,"value":915},"That could mean serving customers faster, reducing errors, giving employees better information, creating a new source of revenue, automating a process that has become difficult to scale, or delivering a service that wasn’t possible before.",{"type":26,"tag":27,"props":917,"children":918},{},[919],{"type":31,"value":920},"Those outcomes don’t come from code alone. They come from software that fits the workflow, survives real-world use, protects the organization, and can continue changing after the demonstration is over.",{"type":26,"tag":27,"props":922,"children":923},{},[924],{"type":31,"value":925},"AI has made the first working version easier to reach, which is good news because more organizations can now test ideas that once would have been too expensive or slow to explore.",{"type":26,"tag":27,"props":927,"children":928},{},[929],{"type":31,"value":930},"The most important part of the project still begins with the question the prototype can’t answer on its own:",{"type":26,"tag":27,"props":932,"children":933},{},[934],{"type":26,"tag":935,"props":936,"children":937},"strong",{},[938],{"type":31,"value":939},"Can we turn this into something the business can depend on?",{"type":26,"tag":58,"props":941,"children":943},{"id":942},"faqs",[944],{"type":31,"value":945},"FAQs",{"type":26,"tag":722,"props":947,"children":949},{"id":948},"what-is-the-difference-between-a-software-prototype-and-a-product",[950],{"type":31,"value":951},"What is the difference between a software prototype and a product?",{"type":26,"tag":27,"props":953,"children":954},{},[955],{"type":31,"value":956},"A prototype demonstrates that an idea or capability may work, while a production product must support real users, data, permissions, integrations, security requirements, failures, updates, and ongoing operations. The product has to remain dependable outside the controlled conditions of the demonstration.",{"type":26,"tag":722,"props":958,"children":960},{"id":959},"why-do-ai-generated-applications-fail-in-production",[961],{"type":31,"value":962},"Why do AI-generated applications fail in production?",{"type":26,"tag":27,"props":964,"children":965},{},[966],{"type":31,"value":967},"Common reasons include weak architecture, missing tests, insecure data handling, incomplete integrations, unclear permissions, limited monitoring, poor exception handling, and workflows that don’t fit how people actually work. The model may perform well while the surrounding application remains incomplete.",{"type":26,"tag":722,"props":969,"children":971},{"id":970},"what-does-production-ready-software-require",[972],{"type":31,"value":973},"What does production-ready software require?",{"type":26,"tag":27,"props":975,"children":976},{},[977],{"type":31,"value":978},"Production-ready software generally requires suitable architecture, secure authentication and authorization, reliable integrations, automated testing, monitoring, deployment processes, failure recovery, user support, documentation, and a plan for ongoing maintenance.",{"type":26,"tag":722,"props":980,"children":982},{"id":981},"can-an-ai-built-application-be-rescued",[983],{"type":31,"value":984},"Can an AI-built application be rescued?",{"type":26,"tag":27,"props":986,"children":987},{},[988],{"type":31,"value":989},"Often, yes. A development team can assess the current architecture, code, data, integrations, security, and tests to determine what can be preserved. The right approach may be to repair, refactor, rearchitect, or replace selected components rather than rebuild the entire application.",{"type":26,"tag":722,"props":991,"children":993},{"id":992},"how-do-you-move-an-ai-prototype-into-production",[994],{"type":31,"value":995},"How do you move an AI prototype into production?",{"type":26,"tag":27,"props":997,"children":998},{},[999],{"type":31,"value":1000},"Begin by defining the business workflow and success metrics, then assess the architecture, data, integrations, permissions, security, testing, monitoring, deployment, and support requirements. Address the highest-risk gaps before gradually introducing the application to real users.",{"type":26,"tag":722,"props":1002,"children":1004},{"id":1003},"should-a-prototype-be-designed-to-scale",[1005],{"type":31,"value":1006},"Should a prototype be designed to scale?",{"type":26,"tag":27,"props":1008,"children":1009},{},[1010],{"type":31,"value":1011},"A prototype doesn’t need every capability of the final product, but teams should understand which decisions are temporary and which may constrain future development. A prototype expected to evolve into production needs a clearer path for security, data, architecture, testing, and operations than one intended only to test an idea.",{"type":26,"tag":722,"props":1013,"children":1015},{"id":1014},"how-should-a-business-measure-software-success",[1016],{"type":31,"value":1017},"How should a business measure software success?",{"type":26,"tag":27,"props":1019,"children":1020},{},[1021],{"type":31,"value":1022},"Choose metrics tied to the intended result. These may include processing time, error rates, completion rates, manual steps eliminated, staff capacity, customer adoption, support volume, revenue enabled, deployment speed, or service reliability. Establish the baseline before implementation.",{"type":26,"tag":722,"props":1024,"children":1026},{"id":1025},"why-are-software-developers-needed-when-ai-can-generate-code",[1027],{"type":31,"value":1028},"Why are software developers needed when AI can generate code?",{"type":26,"tag":27,"props":1030,"children":1031},{},[1032],{"type":31,"value":1033},"Developers do more than write code. They interpret business requirements, design architecture, connect systems, enforce permissions, manage security, test behavior, handle failures, support users, and create software that can be maintained as the organization changes.",{"type":26,"tag":722,"props":1035,"children":1037},{"id":1036},"does-every-failed-prototype-need-to-be-rebuilt",[1038],{"type":31,"value":1039},"Does every failed prototype need to be rebuilt?",{"type":26,"tag":27,"props":1041,"children":1042},{},[1043],{"type":31,"value":1044},"No. A prototype may contain valuable code, workflows, integrations, or validated product decisions. An architecture and code assessment can determine whether it should be stabilized, refactored, rearchitected, selectively rebuilt, or replaced.",{"title":8,"searchDepth":1046,"depth":1046,"links":1047},3,[1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1070,1071,1072,1073],{"id":60,"depth":1046,"text":63},{"id":97,"depth":1046,"text":100},{"id":143,"depth":1046,"text":146},{"id":201,"depth":1046,"text":204},{"id":255,"depth":1046,"text":258},{"id":291,"depth":1046,"text":294},{"id":339,"depth":1046,"text":342},{"id":375,"depth":1046,"text":378},{"id":439,"depth":1046,"text":442},{"id":494,"depth":1046,"text":497},{"id":530,"depth":1046,"text":533},{"id":566,"depth":1046,"text":569},{"id":608,"depth":1046,"text":611},{"id":644,"depth":1046,"text":647},{"id":697,"depth":1046,"text":700,"children":1063},[1064,1066,1067,1068,1069],{"id":724,"depth":1065,"text":727},4,{"id":735,"depth":1065,"text":738},{"id":746,"depth":1065,"text":749},{"id":762,"depth":1065,"text":765},{"id":773,"depth":1065,"text":776},{"id":800,"depth":1046,"text":803},{"id":843,"depth":1046,"text":846},{"id":897,"depth":1046,"text":900},{"id":942,"depth":1046,"text":945,"children":1074},[1075,1076,1077,1078,1079,1080,1081,1082,1083],{"id":948,"depth":1065,"text":951},{"id":959,"depth":1065,"text":962},{"id":970,"depth":1065,"text":973},{"id":981,"depth":1065,"text":984},{"id":992,"depth":1065,"text":995},{"id":1003,"depth":1065,"text":1006},{"id":1014,"depth":1065,"text":1017},{"id":1025,"depth":1065,"text":1028},{"id":1036,"depth":1065,"text":1039},"markdown","content:cperez:2026-08-11:ai-prototype-to-production-business-results.md","content","cperez/2026-08-11/ai-prototype-to-production-business-results.md","cperez/2026-08-11/ai-prototype-to-production-business-results","md",[1091,1104,1113,1126,1141,1153,1161,1171,1182,1191,1203,1214,1225,1234,1244,1255,1268,1279,1288,1298,1306,1313,1322,1330,1339,1349,1359,1368,1377,1385,1396,1404,1412,1421,1429,1439,1447,1455,1463,1471,1479,1487,1495,1505,1513,1523,1531,1541,1551,1562,1572,1582,1596,1608,1621,1631,1642,1654,1664,1677,1689,1699,1708,1719,1722,1732,1742,1753,1763,1776,1785,1795,1805,1815,1825,1837,1849,1863,1877,1892,1900,1908,1917,1926,1935,1944,1953,1962,1971,1980,1989,2000,2013,2023,2031,2039,2047,2055,2067,2079,2089,2098,2107,2117,2126,2136,2145],{"_path":1092,"title":1093,"description":1094,"image":1095,"publishDate":1096,"tags":1097,"_id":1100,"author":1101},"/alalande/2023-1/escaping_text","Thinking Like a Programmer: Escaping Text","In this progressive and vivid explanation, we explore the HOW and WHY of quoting, nesting, and escaping text.","/alalande/2023-1/img/header.png","2024-02-15",[1098,1099],"series","educational","content:alalande:2023-1:escaping_text.md",{"user":1102,"name":1103},"alalande","Anthony Lalande",{"_path":1105,"title":1106,"description":1107,"image":1108,"publishDate":1109,"tags":1110,"_id":1111,"author":1112},"/alalande/2023-2/heuristics","Thinking Like a Programmer: Heuristics","We want to help you turbo-charge your decision making.","/alalande/2023-2/img/heuristics.png","2024-03-15",[1098,1099],"content:alalande:2023-2:heuristics.md",{"user":1102,"name":1103},{"_path":1114,"title":1115,"description":1116,"tags":1117,"publishDate":1120,"image":1121,"_id":1122,"author":1123},"/areichert/2023-10/rapid-testing-techniques-for-web-and-mobile","Rapid Testing Techniques for Web & Mobile Apps","Testing rapidly or the need to test quickly under shortened execution cycles is not new. Rapid testing has been around for as long as software testing has existed but increases when a product release is imminent, strained, or behind schedule. There are many reasons development gets behind schedule. Similar to testing, development is prone to surprise requirements changes and increases in scope and complexity.",[1118,1119],"software-testing","qa","2024-06-01","/areichert/2023-10/img/rapid_testing.png","content:areichert:2023-10:Rapid Testing techniques for web and mobile.md",{"user":1124,"name":1125},"areichert","Amy Reichert",{"_path":1127,"title":1128,"description":1129,"image":1130,"publishDate":1131,"tags":1132,"_id":1137,"author":1138},"/asherbrooke/2020-4/watchwah","Bringing an Idea to Life: WatchWah Proof of Concept","\"Wouldn't it be cool if...\"","/asherbrooke/2020-4/img/Guitar_and_Watch.jpeg","2020-04-01",[1133,1134,1135,1136],"ios","apple","watch","juce","content:asherbrooke:2020-4:watchwah.md",{"user":1139,"name":1140},"asherbrooke","Andrew Sherbrooke",{"_path":1142,"title":1143,"description":1144,"publishDate":1145,"tags":1146,"_id":1149,"author":1150},"/avogan/2012-07/salt","What Your Users Don't Know (Part 1)","What's wrong with this code?","2012-07-13",[1147,1148,1098],"cryptography","security","content:avogan:2012-07:salt.md",{"user":1151,"name":1152},"avogan","Andrew Vogan",{"_path":1154,"title":1155,"description":1156,"publishDate":1157,"tags":1158,"_id":1159,"author":1160},"/avogan/2012-07/salt-2","What Your Users Don't Know (Part 2)","In my last post we saw that what your users don't know can hurt them. In other words, how securely you handle your users' private data behind the scenes can have profound implications both for your business and your users' well being. To put it bluntly, it's bad for your business to be publicly shamed over your handling of sensitive data, and it's bad for your users to have their bank accounts pilfered -- those being some of the worse case scenarios.","2012-07-26",[1147,1148,1098],"content:avogan:2012-07:salt-2.md",{"user":1151,"name":1152},{"_path":1162,"title":1163,"description":1164,"publishDate":1165,"image":1166,"_id":1167,"author":1168},"/bporter/2012-5/cd_player","My First CD Player","I started college right about the time when the first CD players were coming onto the market -- there weren't many available, and they were all obscenely expensive. At the time, my dad was dong a lot of traveling to Japan for business, and he was able to bring me a really nice Yamaha CD player back from a shop in Akihabara for about 1/4th of what a similar unit would have cost me here in the US.","2012-05-01","/bporter/2012-5/img/cd_player.jpg","content:bporter:2012-5:cd_player.md",{"user":1169,"name":1170},"bporter","Brett Porter",{"_path":1172,"title":1173,"description":1174,"publishDate":1175,"tags":1176,"image":1179,"_id":1180,"author":1181},"/bporter/2012-5/improtech","ImproTech Paris-New York 2012","Last week, I took a vacation day to attend one day of workshops at NYU as part of ImproTech 2012 Paris-New York That website descibes the event as:","2012-05-24",[1177,1178],"improvisation","music","/bporter/2012-5/img/affichemartin.jpg","content:bporter:2012-5:improtech.md",{"user":1169,"name":1170},{"_path":1183,"title":1184,"description":1185,"publishDate":1186,"tags":1187,"_id":1189,"author":1190},"/bporter/2012-5/learntocode","Yes, Do Learn To Code!","My usual pre-work routine is to walk the dog (working at home, this is my counterpart to a commute), pour my first cup of coffee, and then curl up for a little while with Google Reader. I don't know if it's because I've selected feeds that are too closely aligned with my values and personal agenda, but it's really rare that I'll read a post that is just so wrong that it makes me angry. Jeff Atwood wrote a post like that: Please Don't Learn To Code","2012-05-15",[1188],"learn-to-code","content:bporter:2012-5:learntocode.md",{"user":1169,"name":1170},{"_path":1192,"title":1193,"description":1194,"publishDate":1195,"tags":1196,"image":1200,"_id":1201,"author":1202},"/bporter/2012-6/dsl","Watch Your Language","Interesting to see a theme emerge in my Pinboard account this week -- lots of stuff about the idea of 'programming language'. I've spent the last few weeks preparing to dive back into a personal interactive music project that I've been working on sporadically since I was in graduate school. I had recently realized that the conceptual roadblock I hit before my last hiatus was something that I'd need to address by adding some sort of little programming language into the system. After following Martin Fowler's many blog posts over the years discussing domain specific languages, I finally broke down and bought his book on the topic. It's too early yet for me to have much concrete to say about the book, but I remember getting enough out of those blog posts to be confident that it will be worth the money and time to read.","2012-06-29",[1197,1198,1199],"dsl","erlang","go","/bporter/2012-6/img/dsl.jpg","content:bporter:2012-6:dsl.md",{"user":1169,"name":1170},{"_path":1204,"title":1205,"description":1206,"image":1207,"publishDate":1208,"tags":1209,"_id":1212,"author":1213},"/bporter/2019-3/animator","Friz: A flexible animation controller for JUCE","As is often the case, I found myself working on a personal project and had some UI elements that really wanted to have some life to them on the screen.","/bporter/2019-3/img/animator.png","2019-03-01",[1136,1210,1211],"ui","c++","content:bporter:2019-3:animator.md",{"user":1169,"name":1170},{"_path":1215,"title":1216,"description":1217,"image":1218,"publishDate":1219,"tags":1220,"_id":1223,"author":1224},"/bporter/2019-4/aesannounce","Art+Logic In the Real World","There are a few events coming up in the next few weeks where A+L will have people in attendance. If you're going to be there or nearby, please get in touch and we'll meet up.","/bporter/2019-4/img/aesLogo.jpg","2019-04-01",[1221,1222],"a+l","event","content:bporter:2019-4:aesAnnounce.md",{"user":1169,"name":1170},{"_path":1226,"title":1227,"description":1228,"image":1229,"publishDate":1230,"tags":1231,"_id":1232,"author":1233},"/bporter/2020-10/reanimated","Re-animated","Last year, I posted here about an animation control framework called 'Friz' that works within the JUCE Application Framework.","/bporter/2020-10/img/module.png","2020-10-01",[1136,1210,1211],"content:bporter:2020-10:reanimated.md",{"user":1169,"name":1170},{"_path":1235,"title":1236,"description":1237,"image":1238,"publishDate":1208,"tags":1239,"_id":1240,"author":1241},"/bstevens/2019-3","Coding the Impossible","As you can see on the Art+Logic website, our slogan is Coding the \"impossible.\"®","/bstevens/2019-3/img/impossible.png",[1221],"content:bstevens:2019-3:index.md",{"user":1242,"name":1243},"bstevens","Ben Stevens",{"_path":1245,"title":1246,"description":1247,"publishDate":1248,"tags":1249,"_id":1251,"author":1252},"/ckeefer/2013-1/misc","JS Hints & Shortcuts","During the course of any complex project (and even many simple ones), on the way to accomplish the actual goal, you're certain to encounter any number of small hurdles along the way - little problems which need to be resolved for the bigger picture to come into focus.","2013-09-01",[1250],"js","content:ckeefer:2013-1:misc.md",{"user":1253,"name":1254},"ckeefer","Christopher Keefer",{"_path":1256,"title":1257,"description":1258,"publishDate":1259,"tags":1260,"image":1265,"_id":1266,"author":1267},"/ckeefer/2013-2/xslt","XML and XSLT","Not terribly long ago, XML was the darling of the web. HTML4 was reformulated as XHTML 1.0, SOAP messages were XML, and let us not forget XMLHttpRequest.","2013-10-08",[1261,1262,1263,1264],"data-formats","xml","xsl","xslt","/ckeefer/2013-2/img/xslt-processing.png","content:ckeefer:2013-2:xslt.md",{"user":1253,"name":1254},{"_path":1269,"title":1270,"description":1271,"publishDate":1272,"tags":1273,"image":1276,"_id":1277,"author":1278},"/ckeefer/2013-3/ajax-upload","Ajax Upload Part I: Framed (and jQuery Deferred)","Inevitably, people want their files on the Internet. If your project is about cute cats, someone will task you with allowing users to upload photos of their cats, videos of their cats, long rambling audio clips in which they attempt to convince their cat to stop attacking the microphone, etcetera. If your project is about the nature and proclivities of mold, someone, somewhere will want to share detailed photographic evidence of their mold problem. The need to upload files is a given.","2013-03-20",[1250,1274,1275],"jquery","html5","/ckeefer/2013-3/img/upframe.jpg","content:ckeefer:2013-3:ajax-upload.md",{"user":1253,"name":1254},{"_path":1280,"title":1281,"description":1282,"publishDate":1283,"tags":1284,"_id":1286,"author":1287},"/ckeefer/2013-4/teaching-programming","Can (and Should) Everyone Learn to Program?","Fair warning: The following article is long, rambly, and contains no code. It does, however, contain some rumination on the idea that everyone can and should learn to program.","2013-12-03",[1285],"programming","content:ckeefer:2013-4:teaching-programming.md",{"user":1253,"name":1254},{"_path":1289,"title":1290,"description":1291,"publishDate":1292,"tags":1293,"image":1295,"_id":1296,"author":1297},"/ckeefer/2013-5/ajax-uploader","Ajax Upload XHR2, Take 2","It's a pleasure to be able to interact with files in the browser at long last, isn't it? Reading files in without needing to bounce them against the server first opens up a lot of possibilities - and getting progress from a chunked ajax upload is miles away from the indeterminate form uploads of days past.","2014-02-19",[1274,1250,1294],"xhr2","/ckeefer/2013-5/img/html5.jpg","content:ckeefer:2013-5:ajax-uploader.md",{"user":1253,"name":1254},{"_path":1299,"title":1300,"description":1301,"publishDate":1302,"tags":1303,"_id":1304,"author":1305},"/ckeefer/2013-07/anchors-hash","Anchors, Hash Sign, javascript:void(0)","So, you've got a link that, in reality, is just a click target for performing some javascript function. You want the appearance of a standard anchor link, but if it's not performing the intended function, should it really be an anchor? And if so, what should we fill that 'href' attribute in with?","2013-07-29",[1250],"content:ckeefer:2013-07:anchors-hash.md",{"user":1253,"name":1254},{"_path":1307,"title":1308,"description":1309,"publishDate":1310,"_id":1311,"author":1312},"/ckeefer/2013-07/static-vmware-host","Static Hosting with VMWare","Virtualization is one of the many benefits of the excess (metaphorical) horsepower available to us with modern hardware. Need to test against (Windows XP/7/8/NT || Fedora || Mint || Ubuntu || FreeBSD || MacOSX || etc)? Fire up the VM. Need a Linux environment for the packages your server relies on, but need to test in the iPad simulator? VM's to the rescue.","2013-07-26","content:ckeefer:2013-07:static-vmware-host.md",{"user":1253,"name":1254},{"_path":1314,"title":1315,"description":1316,"publishDate":1317,"tags":1318,"_id":1320,"author":1321},"/ckeefer/2013-08/fullproof-fulltext-search","Client-side Fulltext Searching with Fullproof","Recently, I was engaged in a genial argument with a friend of an older generation, each of us taking an opposing stance on some obscure trivia neither of us was entirely certain about - but which we were both ready to defend with all the wit and rhetoric at our disposal. When we had finally exhausted all attempts to make the other budge on the matter, we turned to an authoritative 3rd-party source to lay the matter to rest for us - a Google search.","2013-08-29",[1319,1264],"search","content:ckeefer:2013-08:fullproof-fulltext-search.md",{"user":1253,"name":1254},{"_path":1323,"title":1324,"description":1325,"publishDate":1326,"tags":1327,"_id":1328,"author":1329},"/ckeefer/2013-11/jquery-ajax-blobs","jQuery Ajax Blobs and Array Buffers","A big part of what makes jQuery a regular part of so many web projects is the clean interface it offers us for a number of sometimes messy built-in aspects of javascript. The most obvious is the DOM interface; and in second place, jquery ajax and its various shorthand methods. Abstracting away the difference between ActiveXObject and XMLHttpRequest is one of the most obvious benefits - but even if you don't need to worry about supporting old versions of IE, you might well enjoy the clean, object-based, promise-returning interface that jquery ajax offers.","2013-11-21",[1250,1274],"content:ckeefer:2013-11:jquery-ajax-blobs.md",{"user":1253,"name":1254},{"_path":1331,"title":1332,"description":1333,"publishDate":1334,"tags":1335,"_id":1337,"author":1338},"/ckeefer/2013-12/deploying-with-git","Deploying Websites with Git","Deploying your webapp is an important part of the web development equation - your client's site isn't going to attract a lot of attention sitting in your local dev directory. Deployment concerns tend to fall to the bottom of the priority list, though, and the end result tends to be kludgy, hastily thrown-together deployment scripts; and because they are so kludgy and, often, time consuming, when time crunches threaten, a developer may resort to making changes directly on the remote server that need to be (but sometimes never are) backported to the code living in your version control.","2013-12-23",[1336],"git","content:ckeefer:2013-12:deploying-with-git.md",{"user":1253,"name":1254},{"_path":1340,"title":1341,"description":1342,"publishDate":1343,"tags":1344,"image":1346,"_id":1347,"author":1348},"/ckeefer/2014-1/still-using-php","Still Using PHP?","Poor PHP. It's so lonely and unloved these days.","2014-01-29",[1345],"php","/ckeefer/2014-1/img/php.jpg","content:ckeefer:2014-1:still-using-php.md",{"user":1253,"name":1254},{"_path":1350,"title":1351,"description":1352,"publishDate":1353,"tags":1354,"image":1356,"_id":1357,"author":1358},"/ckeefer/2014-2/ajax-upload-2","Ajax Upload Part II: XHR2 (and FileReader)","So, the client has told you their users should be able to upload their drunken party pictures for all the internet to see. \"We want the very best experience possible,\" they tell you. \"Simple, seamless - maybe using that new html5 thing I've heard so much about.\"","2013-04-09",[1250,1355],"xmlhttprequest","/ckeefer/2014-2/img/html5.jpg","content:ckeefer:2014-2:ajax-upload-2.md",{"user":1253,"name":1254},{"_path":1360,"title":1361,"description":1362,"publishDate":1363,"tags":1364,"_id":1366,"author":1367},"/ckeefer/2014-3/customgmapsinfowindow","Custom Google Maps Info Windows","When it comes time to relate the ephemeral world of data to the physical world, Maps are key in both enterprise and consumer applications. Whatever else you might think of it, Google Maps tends to be the default option - certainly, its the only one I've ever had clients ask for by name.","2014-02-26",[1250,1365],"google-maps","content:ckeefer:2014-3:customgmapsinfowindow.md",{"user":1253,"name":1254},{"_path":1369,"title":1370,"description":1371,"publishDate":1372,"tags":1373,"_id":1375,"author":1376},"/ckeefer/2014-4/hidden-options","Hidden Options: A Workaround","Here's the situation: You've got a select. Maybe a whole bunch of selects, with a ton of options each (metric ton - let's keep our imaginary hyperbolic units straight here); and these are meant to be complex interactive elements, with options made visible or not as some programmatic condition dictates.","2014-04-23",[1374,1250,1274],"how-to","content:ckeefer:2014-4:hidden-options.md",{"user":1253,"name":1254},{"_path":1378,"title":1379,"description":1380,"publishDate":1381,"tags":1382,"_id":1383,"author":1384},"/ckeefer/2014-5/cgwin2","Custom Google Info Windows: Updated, Live","April 30, 2014 at 3:22 am Remy says:","2014-05-09",[1250,1365],"content:ckeefer:2014-5:cgwin2.md",{"user":1253,"name":1254},{"_path":1386,"title":1387,"description":1388,"publishDate":1389,"tags":1390,"image":1393,"_id":1394,"author":1395},"/ckeefer/2014-6/backbonesocketsync","Websockets for Backbone","Backbone's had some of its thunder stolen lately by trendier frameworks like Meteor and Angular; for good reason, in most cases, as without the prosthetic functionality offered by the likes of Marionette, Backbone's view handling (amongst a few other lacks and warts) is really just 'roughed in'.","2014-06-25",[1250,1391,1392],"websockets","backbone","/ckeefer/2014-6/img/WebsocketsPlusBackbone.png","content:ckeefer:2014-6:backbonesocketsync.md",{"user":1253,"name":1254},{"_path":1397,"title":1398,"description":1399,"publishDate":1400,"tags":1401,"_id":1402,"author":1403},"/ckeefer/2014-7/promises","It's a (jQuery-style) Promise","Way back when I brought up the topic of promises (particularly, jQuery Deferred), and I promised we would come back to the topic someday.","2014-10-16",[1250,1274],"content:ckeefer:2014-7:promises.md",{"user":1253,"name":1254},{"_path":1405,"title":1406,"description":1407,"publishDate":1408,"tags":1409,"_id":1410,"author":1411},"/ckeefer/2014-8/behold-views","Behold! (JavaScript Views)","JavaScript has the propensity to be very untidy - if you let it, it will sprawl all over the place. Hundreds of global variables scattered across dozens of files, messy half-measures towards object-orientation, mixed in seemingly at random with ungrouped functions - anyone who's had a client bring them a failed project from some other development team knows just how bad it can get.","2015-01-07",[1250],"content:ckeefer:2014-8:behold-views.md",{"user":1253,"name":1254},{"_path":1413,"title":1414,"description":1415,"publishDate":1416,"tags":1417,"image":1418,"_id":1419,"author":1420},"/ckeefer/2015-1/writeonce","Write Once, Debug Everywhere","It's pretty seldom that anyone mentions web pages these days, other than in historical reference to days long gone by (yes, a whole few years ago). Web sites, sure, but not if what is really wanted is to replace something that, not so long ago, would have been some native code for a smartphone (or a little further back still, a desktop computer). Generally speaking, the most common term tripping from client's lips these days is 'web applications' - or webapps, because who has time for spaces and proper spelling, amirite?","2015-02-02",[1250],"/ckeefer/2015-1/img/html5java.jpg","content:ckeefer:2015-1:writeonce.md",{"user":1253,"name":1254},{"_path":1422,"title":1423,"description":1424,"publishDate":1425,"tags":1426,"_id":1427,"author":1428},"/ckeefer/2015-2/js-frameworks","The What and Why of Javascript Frameworks","JavaScript has the propensity to be very untidy if you let it be. This isn't a problem unique to JavaScript, of course - many other languages suffer from a lack of native organization, especially for specific tasks.","2015-05-29",[1250],"content:ckeefer:2015-2:js-frameworks.md",{"user":1253,"name":1254},{"_path":1430,"title":1431,"description":1432,"publishDate":1433,"tags":1434,"_id":1437,"author":1438},"/ckeefer/2015-3/emailvalidation","Email Validation with Django and python-social-auth","When it comes to user accounts, the standard litmus test is email validation. Besides the immediate benefits - of offering us a straightforward unique identifier for users, and making it more difficult to automate creating a mass of accounts on our service - by requiring that each account have an email address and interact therewith to confirm the addresses validity, it also offers us the chance to associate a known-working email account with a user account. This is important for transactional emails such as password resets or for potential two-factor authentication use... and if you're a little less ethical, for sending marketing desirable and informative emails about interesting products and services.","2015-07-23",[1435,1436],"python","django","content:ckeefer:2015-3:EmailValidation.md",{"user":1253,"name":1254},{"_path":1440,"title":1441,"description":1442,"publishDate":1443,"tags":1444,"_id":1445,"author":1446},"/ckeefer/2015-5/file-reader-chunking","FileReader Chunking and Base64 DataURLs","In a hurry? You can now use our HUp jquery plugin to read files in a chunked fashion as data URLs. Hooray!","2015-12-15",[1250,1274],"content:ckeefer:2015-5:file-reader-chunking.md",{"user":1253,"name":1254},{"_path":1448,"title":1449,"description":1450,"publishDate":1451,"tags":1452,"_id":1453,"author":1454},"/ckeefer/2016-1/ajaxbinarycaching","Caching Binary Data With jQuery Ajax and IndexedDB","After long, grueling months (years? or does it only feel like years?), your web application nears completion. It is tightly coded, well documented, works across all modern browsers, and is well received by your beta testers. It's nearly time to go live, and a smile of pure relief plays upon your lips... and freezes into a rictus grin when your client turns to you, and asks, \"so, hey, can we speed up the dynamic cat pic loading? Especially when I close the browser and come back to it later. I think that's really key to the whole application.\"","2016-04-25",[1250,1274],"content:ckeefer:2016-1:ajaxBinaryCaching.md",{"user":1253,"name":1254},{"_path":1456,"title":1457,"description":1458,"publishDate":1459,"tags":1460,"_id":1461,"author":1462},"/ckeefer/2016-2/paymentprocessing","Payment Processing with Braintree","You've built the web application of the century, and the users have rightly flooded to it. Cat pictures for everyone!","2016-05-11",[1436,1250,1274,1435],"content:ckeefer:2016-2:paymentprocessing.md",{"user":1253,"name":1254},{"_path":1464,"title":1465,"description":1466,"publishDate":1467,"tags":1468,"_id":1469,"author":1470},"/ckeefer/2016-3/djangochannels1","Django Channels: From the Ground Up - Part 1","You stare mournfully into the mass of code you've inherited. At some point, it's clear, the requirements called for the server to push information to the client, because there's an unholy mix of Server-Side Events, long-polling, hidden iframes and even a Java applet in there, all supporting some level of long-term connectivity with the server. It's almost fascinating in its barely functional hideousness, and you would be inclined to leave well enough alone... except for the new feature specifications you've been assigned, which require the client to be able to send data back to the server in response to the received events, in as close to real-time as you can get.","2016-06-13",[1436,1435,1391],"content:ckeefer:2016-3:djangoChannels1.md",{"user":1253,"name":1254},{"_path":1472,"title":1473,"description":1474,"publishDate":1475,"tags":1476,"_id":1477,"author":1478},"/ckeefer/2016-4/djangochannels2","Django Channels: From the Ground Up - Part 2","Last time, we decided to embark on a brave new adventure and give our Django framework a big upgrade with the inclusion of Django Channels. We got just far enough to get the development server running, but while this may be an adequate start, it's better to develop against something like what we intend to deploy, right?","2016-06-15",[1436,1435,1391],"content:ckeefer:2016-4:djangochannels2.md",{"user":1253,"name":1254},{"_path":1480,"title":1481,"description":1482,"publishDate":1483,"tags":1484,"_id":1485,"author":1486},"/ckeefer/2016-6/gofetch1","Go Fetch! (JavaScript Fetch API)","Long ago, we briefly brushed upon the topic of what has made jQuery such a valuable part of the web developer's toolset for such a long time - namely, a cleaner interface for interacting with the DOM, and the $.ajax abstraction over XMLHttpRequest.","2016-10-03",[1250,1274,1098],"content:ckeefer:2016-6:goFetch1.md",{"user":1253,"name":1254},{"_path":1488,"title":1489,"description":1490,"publishDate":1491,"tags":1492,"_id":1493,"author":1494},"/ckeefer/2016-7/gofetch2","Go Fetch 2! (JavaScript Fetch API)","Last time we discussed the Fetch API in general, taking a look at how it differed from the XMLHttpRequest API, and some of its advantages. Today, we're going to take a look at a little library that you can include in your projects today that offers you localStorage caching for the Fetch API.","2016-10-10",[1250,1274,1098],"content:ckeefer:2016-7:goFetch2.md",{"user":1253,"name":1254},{"_path":1496,"title":1497,"description":1498,"publishDate":1499,"tags":1500,"_id":1503,"author":1504},"/ckeefer/2016-8/herokupdf","Generating PDFs: wkhtmltopdf & Heroku","So, it has come to this.","2016-12-21",[1501,1502,1435],"heroku","pdf","content:ckeefer:2016-8:HerokuPDF.md",{"user":1253,"name":1254},{"_path":1506,"title":1507,"description":1508,"publishDate":1509,"tags":1510,"_id":1511,"author":1512},"/ckeefer/2017-1/downloadingclientsidecontent","Downloading Client-side Generated Content","A young developer, new to the Tao of the client-side, comes to a Master of the way, and speaks thusly: \"Oh Master, our application nears completion; and lo, cat pics can be drawn upon, and captions fixated thereto, for the creation of humour and the bounteous enjoyment of our users.\"","2017-02-06",[1250],"content:ckeefer:2017-1:downloadingclientsidecontent.md",{"user":1253,"name":1254},{"_path":1514,"title":1515,"description":1516,"publishDate":1517,"tags":1518,"_id":1521,"author":1522},"/ckeefer/2017-2/morepwatoya-part1","More PWA to Ya! (Progressive Web Apps, Part 1)","It's project kickoff time, and you're having a conversation with your client about what form the application will take:","2017-02-01",[1519,1520,1098],"pwa","mobile","content:ckeefer:2017-2:MorePWAToYa-Part1.md",{"user":1253,"name":1254},{"_path":1524,"title":1525,"description":1526,"tags":1527,"publishDate":1528,"_id":1529,"author":1530},"/ckeefer/2017-3/morepwatoya-part2","More PWA to Ya! (Progressive Web Apps, Part 2)","Last time, we got into the nitty gritty on how to make your web application into a Progressive Web Application (PWA to it's friends). I promised we'd dig even deeper this time, and show you how to make your web app a little more 'native' on Android - and how to deal with iOS Safari's special snowflake syndrome.",[1520,1519,1098],"2017-03-01","content:ckeefer:2017-3:MorePWAToYa-Part2.md",{"user":1253,"name":1254},{"_path":1532,"title":1533,"description":1534,"image":1535,"publishDate":1536,"tags":1537,"_id":1539,"author":1540},"/ckeefer/2019-1/unlockingwebaudio","Unlocking Web Audio","\"It's going to be the coolest thing ever.\"","/ckeefer/2019-1/img/featured_image.jpg","2019-01-01",[1250,1538],"audio","content:ckeefer:2019-1:UnlockingWebAudio.md",{"user":1253,"name":1254},{"_path":1542,"title":1543,"description":1544,"publishDate":1545,"image":1546,"tags":1547,"_id":1549,"author":1550},"/ckeefer/2020-1/why-vue","Why Vue","Why choose Vue over any other front-end framework?","2020-01-01","/ckeefer/2020-1/img/vue-wall.jpg",[1250,1548],"vue","content:ckeefer:2020-1:Why Vue.md",{"user":1253,"name":1254},{"_path":1552,"title":1553,"description":1554,"tags":1555,"image":1558,"publishDate":1559,"_id":1560,"author":1561},"/ckeefer/2024-3/e2e_testing","E2E Testing: To What End?","Friend, can we agree that tests are a good idea? I won't scorn you for sometimes omitting them - time and budget constraints are what they are, and even the best intentioned of us sometimes have to just give our projects a lick and a promise. \"Proper test coverage soon\", you sweetly croon as you rock it to sleep, the knowledge that you're telling a dark, terrible lie twisting you up inside. Maybe you could just scrape enough budget together for some simple unit tests? Then, at least, you'd have \"tests\", right?",[1119,1118,1556,1557],"e2e","playwright","/ckeefer/2024-3/img/E2E_Testing_2024.png","2024-06-15","content:ckeefer:2024-3:e2e_testing.md",{"user":1253,"name":1254},{"_path":1563,"title":1564,"description":1565,"tags":1566,"image":1568,"publishDate":1569,"_id":1570,"author":1571},"/ckeefer/2024-7/vpubsub","Vue 3 Pub / Sub: All aboard the (event) bus","We like Vue at A+L. We think it's one of the best frontend frameworks, and a great choice pretty much anywhere you might otherwise be tempted to use React.",[1250,1548,1567],"pub/sub","/ckeefer/2024-7/img/event_bus.png","2024-08-15","content:ckeefer:2024-7:VPubSub.md",{"user":1253,"name":1254},{"_path":1573,"title":1574,"description":1575,"publishDate":1576,"tags":1577,"_id":1578,"author":1579},"/cmacksey/2012-5/php-musings","PHP Musings","Ran into an interesting, but thorough, rant the other day - PHP: A Fractal of Bad Design. The part that grabbed me the most was the analogy at the beginning, which was all too perfect:","2012-05-07",[1345],"content:cmacksey:2012-5:php-musings.md",{"user":1580,"name":1581},"cmacksey","Chris Macksey",{"_path":1583,"title":1584,"description":1585,"publishDate":1586,"image":1587,"author":1588,"tags":1589,"_id":1595},"/cperez/2026-06-17/xamarin-to-maui","Migrating a Xamarin Medical Application to .NET MAUI","A widely used medical reference application built with Xamarin had become increasingly difficult to maintain as platform support deadlines approached. The client needed to modernize the application before operating system changes and framework deprecations created larger compatibility risks.","2026-06-22","/cperez/2026-06-17/img/xamarin-to-maui.png",{"name":13,"user":14},[1590,1591,1592,1593,1594,1520],"legacy modernization","xamarin",".net","maui","app migration","content:cperez:2026-06-17:xamarin-to-maui.md",{"_path":1597,"title":1598,"description":1599,"publishDate":1600,"image":1601,"author":1602,"tags":1603,"_id":1607},"/cperez/2026-06-25/ai_makes_modernization_feasible","How AI-Assisted Legacy Modernization Reduces Cost, Risk, and Project Timelines","Many organizations know they need to modernize their legacy applications. They also know why they haven't.","2026-06-25","/cperez/2026-06-25/img/ai_makes_modernization_feasible.png",{"name":13,"user":14},[1590,1604,1605,1606],"tech debt","ai","legacy migration","content:cperez:2026-06-25:ai_makes_modernization_feasible.md",{"_path":1609,"title":1610,"description":1611,"publishDate":1612,"image":1613,"author":1614,"tags":1615,"_id":1620},"/cperez/2026-06-30/how-ceos-should-evaluate-ai-investments","How Should CEOs Evaluate AI Investments?","CEOs should evaluate AI investments by asking whether the investment improves a measurable business outcome, changes a real workflow, keeps humans appropriately involved, has a realistic path to production, and creates value that outweighs cost and risk.","2026-06-30","/cperez/2026-06-30/img/how-ceos-should-evaluate-ai-investments.jpg",{"name":13,"user":14},[1616,1617,1618,1605,1619],"agentic ai","ai investment","humans in the loop","software development","content:cperez:2026-06-30:how-ceos-should-evaluate-ai-investments.md",{"_path":1622,"title":1623,"description":1624,"publishDate":1625,"image":1626,"author":1627,"tags":1628,"_id":1630},"/cperez/2026-07-02/hidden-costs-of-legacy-software","What Are the Hidden Costs of Legacy Software?","Legacy software is rarely “bad” software.","2026-07-02","/cperez/2026-07-02/img/hidden-costs-of-legacy-software.jpg",{"name":13,"user":14},[1590,1629],"legacy software","content:cperez:2026-07-02:hidden-costs-of-legacy-software.md",{"_path":1632,"title":1633,"description":1634,"publishDate":1635,"image":1636,"author":1637,"tags":1638,"_id":1641},"/cperez/2026-07-07/why-ai-projects-fail","Why Do Most AI Projects Fail?","AI projects rarely fail because the model was not powerful enough.","2026-07-07","/cperez/2026-07-07/img/why-ai-projects-fail.jpg",{"name":13,"user":14},[1605,1639,1619,1640],"ethics","vibe coding","content:cperez:2026-07-07:why-ai-projects-fail.md",{"_path":1643,"title":1644,"description":1645,"publishDate":1646,"image":1647,"author":1648,"tags":1649,"_id":1653},"/cperez/2026-07-09/5-rs-application-modernization-legacy-software","Art+Logic’s 5 Rs of Application Modernization: How to Choose the Right Path for Legacy Software","Legacy software creates a strange kind of tension.","2026-07-09","/cperez/2026-07-09/img/5-rs-application-modernization-legacy-software.jpg",{"name":13,"user":14},[1650,1651,1605,1652],"5-rs","legacy","application modernization","content:cperez:2026-07-09:5-rs-application-modernization-legacy-software.md",{"_path":1655,"title":1656,"description":1657,"publishDate":1658,"image":1659,"author":1660,"tags":1661,"_id":1663},"/cperez/2026-07-16/rebuild-vs-modernize-software-cfo-guide","Rebuild or Modernize? A Guide to Making the Right Software Investment","Every aging software system eventually reaches a financial decision point.","2026-07-16","/cperez/2026-07-16/img/rebuild-vs-modernize-software-cfo-guide.jpg",{"name":13,"user":14},[1662,1606,1604,1652,1629],"modernization","content:cperez:2026-07-16:rebuild-vs-modernize-software-cfo-guide.md",{"_path":1665,"title":1666,"description":1667,"publishDate":1668,"image":1669,"author":1670,"tags":1671,"_id":1676},"/cperez/2026-07-21/building-digital-health-platforms-beyond-samd","Beyond SaMD: Building a Digital Health Platform That Can Evolve","A medical application can work exactly as designed and still fall short of what the organization needs next.","2026-07-21","/cperez/2026-07-21/img/building-digital-health-platforms-beyond-samd.jpg",{"name":13,"user":14},[1672,1651,1662,1673,1674,1591,1675],"samd","biomedical","healthcare",".net maui","content:cperez:2026-07-21:building-digital-health-platforms-beyond-samd.md",{"_path":1678,"title":1679,"description":1680,"publishDate":1681,"image":1682,"author":1683,"tags":1684,"_id":1688},"/cperez/2026-07-23/why-ai-agents-need-software-developers","Beyond the Chatbot: Your AI Agent Is a Software Product, Not a Prompt","The AI-agent demo usually looks simple.","2026-07-23","/cperez/2026-07-23/img/why-ai-agents-need-software-developers.jpg",{"name":13,"user":14},[1605,1618,1617,1685,1616,1686,1148,1687],"chatbots","ai agents","ai development","content:cperez:2026-07-23:why-ai-agents-need-software-developers.md",{"_path":1690,"title":1691,"description":1692,"publishDate":1693,"image":1694,"author":1695,"tags":1696,"_id":1698},"/cperez/2026-07-28/ai-assisted-legacy-modernization-business-logic","AI-Assisted Legacy Modernization: How to Move Faster Without Losing the Business Logic","AI can translate your Legacy Code. Can it preserve what your business actually depends on?","2026-07-28","/cperez/2026-07-28/img/ai-assisted-legacy-modernization-business-logic.jpg",{"name":13,"user":14},[1590,1652,1697,1604],"code migration","content:cperez:2026-07-28:ai-assisted-legacy-modernization-business-logic.md",{"_path":1700,"title":1701,"description":1702,"publishDate":1703,"image":1704,"author":1705,"tags":1706,"_id":1707},"/cperez/2026-08-04/technical-debt-enterprise-value","Technical Debt and Enterprise Value: What Your Software Is Really Costing the Business","Technical debt rarely announces itself as a financial problem.","2026-08-04","/cperez/2026-08-04/img/technical-debt-enterprise-value.jpg",{"name":13,"user":14},[1604,1590,1606],"content:cperez:2026-08-04:technical-debt-enterprise-value.md",{"_path":1709,"title":1710,"description":1711,"publishDate":1712,"image":1713,"author":1714,"tags":1715,"_id":1718},"/cperez/2026-08-06/turnover-reveals-weak-software-architecture","Can Employee Turnover Reveal Weak Software Architecture?","When an engineer leaves, the initial plan usually feels manageable: someone else will step in, spend a few days getting up to speed, and keep the roadmap moving forward. However, this is often the moment when the questions begin. Suddenly, the team finds themselves wondering why changing a simple field breaks the reporting process, or which service is actually responsible for a specific calculation. They might encounter a dependency that everyone is afraid to touch or find that the application behaves unpredictably in production without any clear explanation.","2026-08-06","/cperez/2026-08-06/img/turnover-reveals-weak-software-architecture.png",{"name":13,"user":14},[1716,1590,1717],"engineering turnover","software architecture","content:cperez:2026-08-06:turnover-reveals-weak-software-architecture.md",{"_path":5,"title":9,"description":10,"publishDate":6,"image":11,"author":1720,"tags":1721,"_id":1085},{"name":13,"user":14},[16,17,18,19,20,21],{"_path":1723,"title":1724,"description":1725,"publishDate":1726,"image":1727,"author":1728,"tags":1729,"_id":1731},"/cperez/2026-08-18/legacy-software-holding-business-back","Is Your Legacy Software Holding the Business Back?","The software still works, which is usually the first argument for leaving it alone.","2026-08-18","/cperez/2026-08-18/img/legacy-software-holding-business-back.jpg",{"name":13,"user":14},[1590,1605,1730,1606],"ai-assisted modernization","content:cperez:2026-08-18:legacy-software-holding-business-back.md",{"_path":1733,"title":1734,"description":1735,"publishDate":1736,"image":1737,"author":1738,"tags":1739,"_id":1741},"/cperez/2026-08-20/ai-code-review-verifying-generated-software","AI Can Write the Code. Who Verifies It?","AI Code Review: Who Verifies AI-Generated Software?","2026-08-20","/cperez/2026-08-20/img/ai-code-review-verifying-generated-software.jpg",{"name":13,"user":14},[1740,16,1640,1618],"ai code review","content:cperez:2026-08-20:ai-code-review-verifying-generated-software.md",{"_path":1743,"title":1744,"description":1745,"publishDate":1746,"tags":1747,"_id":1749,"author":1750},"/dpopowich/2021-07-30/data-collector","Asynchronous Python - A Real World Example","A dive into a real example of async Python usage.","2021-07-30",[1435,1374,1748],"async","content:dpopowich:2021-07-30:data-collector.md",{"user":1751,"name":1752},"dpopowich","Daniel Popowich",{"_path":1754,"title":1755,"description":1756,"tags":1757,"image":1759,"publishDate":1760,"_id":1761,"author":1762},"/dpopowich/2023-8/postgres-pubsub","Using PostgreSQL for Pub/Sub","A+L has been working on a Single Page Application (SPA) wherein our client's users take on the role of Staff Users (think: project managers) as they aid their Customer Users in using the application to complete a complex project.",[1758,1435,1748],"postgresql","/dpopowich/2023-8/img/psql_pub_sub.png","2024-04-15","content:dpopowich:2023-8:postgres-pubsub.md",{"user":1751,"name":1752},{"_path":1764,"title":1765,"description":1766,"tags":1767,"image":1770,"publishDate":1771,"_id":1772,"author":1773},"/ewahl/2025-05/escape_deployment_hell","Escape Deployment Hell: IaC, CDK, Ephemeral Environments, and the Pragmatic Path to Platform Power","Another Friday afternoon, another deployment fire. If this sounds familiar, you're not alone. On too many projects, the chasm between application code and infrastructure management breeds manual configuration nightmares, crippling complexity, and agonizingly slow development cycles. But what if your team could sidestep this chaos, focusing on building features instead of constantly battling deployment gremlins?",[1768,1769,1435],"devops","aws","/ewahl/2025-05/img/deployment_hell.png","2025-05-13","content:ewahl:2025-05:escape_deployment_hell.md",{"user":1774,"name":1775},"ewahl","Edward F. Wahl",{"_path":1777,"title":1778,"description":1779,"publishDate":1780,"image":1781,"tags":1782,"_id":1783,"author":1784},"/ewahl/2025-06/argued_with_ai","I Argued With an AI for 20 Minutes About Async Code &mdash; And I'm Surprisingly Happy","If you have ever spent twenty minutes debating an obscure AWS Lambda invocation pattern with an AI, you might question your life choices. But here I am: amused by the wasted time but ultimately happy with the outcome and understanding I gained.","2026-06-01","/ewahl/2025-06/img/argued_with_ai.png",[1768,1769,1435],"content:ewahl:2025-06:argued_with_ai.md",{"user":1774,"name":1775},{"_path":1786,"title":1787,"description":1788,"publishDate":1789,"image":1790,"author":1791,"tags":1792,"_id":1794},"/ewahl/2026-07/goodharts-law-ai-coding-agents","Why AI Coding Agents Still Need Human Experts","An AI coding agent quietly steered my protected test suite away from a money bug — the same failure mode that forced OpenAI to retire SWE-bench Verified. Goodhart's Law explains why, and why the demand for senior engineers goes up, not down, as agents improve.","2026-07-30","/ewahl/2026-07/img/goodharts-law-ai-coding-agents.jpg",{"name":1775,"user":1774},[1605,1616,1793],"human in the loop","content:ewahl:2026-07:goodharts-law-ai-coding-agents.md",{"_path":1796,"title":1797,"description":1798,"tags":1799,"image":1800,"publishDate":1219,"_id":1801,"author":1802},"/jbagley/2019-4/makingspectrogramsinjuce","Making Spectrograms in JUCE","Art+Logic's Incubator project has made a lot of progress. In a previous post I mentioned that Dr. Scott Hawley's technique to classify audio involved converting audio to an image and using a Convolution Neural Network (CNN) to classify the audio based on this image. That image is a spectrogram. I'm going to go into some detail about what we do to create one, and why to the best of my ability.",[1136,1211,1538],"/jbagley/2019-4/img/Fortissimo_Trumpet_Ensemble_Matrix_Swells_61.wav-2048x1700.png","content:jbagley:2019-4:MakingSpectrogramsInJUCE.md",{"user":1803,"name":1804},"jbagley","Jason Bagley",{"_path":1806,"title":1807,"description":1808,"tags":1809,"image":1811,"publishDate":1812,"_id":1813,"author":1814},"/jbagley/2021-07/softwaresenescence","Legacy Vulnerabilities AKA Software Senescence","Does your business still have an XT computer in the back office because it's\nrunning that one version of some database software that your business depends\non? Yeah, we know there is. Most modern software doesn't work like that.",[1651,1810],"project-management","/jbagley/2021-07/img/old_software_to_new.jpg","2021-07-01","content:jbagley:2021-07:SoftwareSenescence.md",{"user":1803,"name":1804},{"_path":1816,"title":1817,"description":1818,"tags":1819,"image":1821,"publishDate":1822,"_id":1823,"author":1824},"/jbagley/2021-08-01/accuratetiming","Accurate Timing","In many tasks we need to do something at given intervals of time. The most obvious ways may not give you the best results.",[1211,1820],"timing","/jbagley/2021-08-01/img/accurateTiming.jpg","2021-08-01","content:jbagley:2021-08-01:AccurateTiming.md",{"user":1803,"name":1804},{"_path":1826,"title":1827,"description":1828,"tags":1829,"image":1833,"publishDate":1834,"_id":1835,"author":1836},"/jbagley/2023-06-01/universal_ffmpeg_custom_builds","Building Universal FFmpeg Custom Binaries","I am using a very pared down set of FFMpeg features for a macOS project that I\nbuild into a custom library. I had a script set up to configure the build which\nworked fine on my Intel based MacBook Pro. Then I upgraded to an Apple Silicon\nMacBookPro and wanted to run natively, or at least see what happened when I\ndid. To build, FFMpeg uses autoconf which produces a makefile that then handles\nthe build.",[1830,1831,1832,1134],"c","bash","ffmpeg","/jbagley/2023-06-01/img/header.png","2024-04-01","content:jbagley:2023-06-01:Universal_FFMPEG_custom_builds.md",{"user":1803,"name":1804},{"_path":1838,"title":1839,"description":1840,"publishDate":1841,"image":1842,"tags":1843,"_id":1847,"author":1848},"/jbagley/2025-08/a_developers_primer_on_apple_tracking_transparency","A Primer on Apple's App Tracking Transparency","If an app tracks user activity, Apple requires them to declare all information they collect as well as whether that data is linked or tracked. This includes collection by the app itself and any third parties the app uses. The app owner is responsible for knowing and correctly reporting privacy information for all components in the app.","2026-05-22","/jbagley/2025-08/img/apple_app_transparency.png",[1844,1845,1133,1846],"app tracking transparency","att","macos","content:jbagley:2025-08:a_developers_primer_on_apple_tracking_transparency.md",{"user":1803,"name":1804},{"_path":1850,"title":1851,"description":1852,"tags":1853,"image":1857,"publishDate":1858,"_id":1859,"author":1860},"/jestep/2023-3/fastapi","FastAPI: A High-Performance Python Framework for Rapid Web Development","FastAPI is a modern and high-performance Python web framework designed specifically for building APIs and web applications quickly and efficiently. Developed by Sebastián Ramírez and first released in 2018, FastAPI has rapidly gained traction in the developer community thanks to its focus on providing key features for API and web app development with excellent performance.",[1435,1854,1436,1855,1856],"fastapi","flask","pyramid","/jestep/2023-3/img/header.png","2024-05-01","content:jestep:2023-3:fastapi.md",{"user":1861,"name":1862},"jestep","Jagger Estep",{"_path":1864,"title":1865,"description":1866,"publishDate":1867,"tags":1868,"image":1872,"_id":1873,"author":1874},"/nharrison/2012-07/core-data","Securing Your Core Data with Transformable Attributes","In order to store private data in an iOS Core Data database, there are several methods available for encryption, including:","2012-07-30",[1869,1870,1133,1148,1871],"core-data","encryption","objective-c","/nharrison/2012-07/img/superman.jpg","content:nharrison:2012-07:core-data.md",{"user":1875,"name":1876},"nharrison","Noah Harrison",{"_path":1878,"title":1879,"description":1880,"tags":1881,"publishDate":1886,"image":1887,"_id":1888,"author":1889},"/phendry/2019-3/restfromthebottomup","REST from the Bottom Up","The RESTful API has a funny place in the software development world: it's widely regarded as the best general-purpose pattern for building web application APIs, and yet it's also nebulous enough of a concept to cause endless disagreements within teams over exactly how to implement one.",[1882,1883,1884,1885],"rest","api","web","architecture","2019-10-01","/phendry/2019-3/img/feature_image.png","content:phendry:2019-3:RestFromTheBottomUp.md",{"user":1890,"name":1891},"phendry","Paul Hendry",{"_path":1893,"title":1894,"description":1895,"tags":1896,"publishDate":1812,"image":1897,"_id":1898,"author":1899},"/phendry/2021-06/smoothupgradestovue3","Smooth Upgrades to Vue 3","This post assumes basic familiarity with Vue.js v2.x.",[1250,1548,1374],"/phendry/2021-06/img/vue-transition.jpg","content:phendry:2021-06:SmoothUpgradesToVue3.md",{"user":1890,"name":1891},{"_path":1901,"title":1902,"description":1903,"image":1904,"tags":1905,"publishDate":1746,"_id":1906,"author":1907},"/phendry/2021-07-30/spotthevulndataranges","Spot the Vulnerability: Data Ranges and Untrusted Input","In 1997, a flaw was discovered in how Linux and Windows handled IP fragmentation, a Denial-of-Service vulnerability which allowed systems to be crashed remotely.","/phendry/2021-07-30/img/vulnerability.jpg",[1148,1098],"content:phendry:2021-07-30:SpotTheVulnDataRanges.md",{"user":1890,"name":1891},{"_path":1909,"title":1910,"description":1911,"tags":1912,"image":1913,"publishDate":1914,"_id":1915,"author":1916},"/phendry/2021-08-15/exploringdependenttypesinidris","Exploring Dependent Types in Idris","When I'm not coding the \"impossible\" at Art+Logic, I take a lot of interest in new programming technologies and paradigms; even if they're not yet viable for use in production, there can often be takeaways for improving your everyday code.",[1285],"/phendry/2021-08-15/img/dependent-types.jpg","2021-08-15","content:phendry:2021-08-15:ExploringDependentTypesInIdris.md",{"user":1890,"name":1891},{"_path":1918,"title":1919,"description":1920,"tags":1921,"image":1922,"publishDate":1923,"_id":1924,"author":1925},"/phendry/2021-10-30/spotthevulnloopsandtermconditions","Spot the Vulnerability: Loops and Terminating Conditions","In memory-unsafe languages like C, special care must be taken when copying untrusted data, particularly when copying it to another buffer. In this post, we'll spot and mitigate a past vulnerability in Linux's NTP daemon.",[1148,1098],"/phendry/2021-10-30/img/vulnerability-2.jpg","2021-10-30","content:phendry:2021-10-30:SpotTheVulnLoopsAndTermConditions.md",{"user":1890,"name":1891},{"_path":1927,"title":1928,"description":1929,"image":1930,"tags":1931,"publishDate":1932,"_id":1933,"author":1934},"/phendry/2022-07-21/migratingfromexpresstofastifypart1","Migrating from Express to Fastify, Part 1","Express.js has for years been the dominant lightweight Web framework for Node.js, but over time its development has stalled, with its latest major version (5.0) still in pre-release nearly eight years after its first alpha release. There's a lot to be said for this sort of stability in a foundational dependency for a project, but it's worth assessing whether the added features of competing frameworks are worth making a switch. In this article we'll be looking at Fastify in particular, to understand what it has to offer compared to Express and how difficult it is to migrate an existing Express project.","/phendry/2022-07-21/img/Migrating from Express to Fastify, Part 1.png",[1250,1098],"2023-12-01","content:phendry:2022-07-21:MigratingFromExpressToFastifyPart1.md",{"user":1890,"name":1891},{"_path":1936,"title":1937,"description":1938,"image":1939,"tags":1940,"publishDate":1941,"_id":1942,"author":1943},"/phendry/2022-07-28/migratingfromexpresstofastifypart2","Migrating from Express to Fastify, Part 2","In Part 1, we looked at the features of the Fastify Node.js Web framework compared to Express.js. In Part 2, we'll work through migrating an example Express.js application to Fastify.","/phendry/2022-07-28/img/Migrating from Express to Fastify, Part 2.png",[1250,1098],"2023-12-31","content:phendry:2022-07-28:MigratingFromExpressToFastifyPart2.md",{"user":1890,"name":1891},{"_path":1945,"title":1946,"description":1947,"tags":1948,"image":1949,"publishDate":1950,"_id":1951,"author":1952},"/phendry/2023-01-19/badcode","\"Bad\" Code (Or, Why Software Development is Hard)","Recently, the Dutch government open-sourced the iOS application for their \"DigiD\" authentication service. A tweet with a snippet of that source code, presumably making fun of it, blew up into a debate about whether mocking it is even justified. The amount of debate over such a simple snippet of code highlights, in my mind, just how tricky software development can be.",[1148,1098],"/phendry/2023-01-19/img/Bad Code.png","2024-01-15","content:phendry:2023-01-19:BadCode.md",{"user":1890,"name":1891},{"_path":1954,"title":1955,"description":1956,"image":1957,"publishDate":1958,"tags":1959,"_id":1960,"author":1961},"/phendry/2023-01-31/forgetaboutcodestyle","Forget About [Code] Style","Good code style, being highly subjective, is something often debated among developers. After all, we spend more time reading code than writing it, so it's worth making sure our code is styled to be as easy as possible to read and to understand. On the other hand, deciding upon and continuously enforcing a style is also time-consuming, and the benefits are near-impossible to quantify. Given that modern code formatting tools can fully automate the process, is it still worth fretting about style?","/phendry/2023-01-31/img/forget_style_header.png","2024-02-01",[1285],"content:phendry:2023-01-31:ForgetAboutCodeStyle.md",{"user":1890,"name":1891},{"_path":1963,"title":1964,"description":1965,"image":1966,"tags":1967,"publishDate":1968,"_id":1969,"author":1970},"/phendry/2023-04-02/semantichtml","Don't Give Up on Semantic HTML","Since the early days of the Web, there has been tension between the ideal of \"semantic HTML\" and the practical reality of designing complex page layouts, which often could not be achieved without inserting style concerns into the document. More recently, frameworks like Tailwind CSS have emerged which challenge the very idea that semantic HTML is an ideal to strive for, and which commit to thoroughly embedding style concerns into HTML documents. With modern CSS features however, semantic HTML is more achievable than ever, and I do think it remains a worthy goal.","/phendry/2023-04-02/img/Don't Give Up on Semantic HTML.png",[1285],"2024-03-01","content:phendry:2023-04-02:SemanticHtml.md",{"user":1890,"name":1891},{"_path":1972,"title":1973,"description":1974,"image":1975,"tags":1976,"publishDate":1977,"_id":1978,"author":1979},"/phendry/2023-05-16/doyouneedacsspreprocessor","Do You Need a CSS Preprocessor in 2023?","CSS preprocessors like Less, Sass and Stylus have long provided powerful features that vanilla CSS lacked: variables, nesting of rulesets, mixins, control flow constructs, etc. These days however, the feature gap is considerably narrower, and it's not so clear that the benefits of a preprocessor outweight the burdens of setting it up.","/phendry/2023-05-16/img/css_preprocessor_header.png",[1285],"2023-01-01","content:phendry:2023-05-16:DoYouNeedACSSPreprocessor.md",{"user":1890,"name":1891},{"_path":1981,"title":1982,"description":1983,"image":1984,"publishDate":1985,"tags":1986,"_id":1987,"author":1988},"/phendry/2023-07-28/dependencymanagement","Software Dependency Management: Best Practices","Leveraging third-party libraries and frameworks is essential in most modern software projects, and the projects we build at Art+Logic are no exception. The pressure on developers to rapidly deliver features is high, and there are so many commonalities in the details of each project (particularly in Web development) that a lot of development time can be saved by using well-designed libraries that handle the details.","/phendry/2023-07-28/img/dependency_header.png","2023-01-02",[1285],"content:phendry:2023-07-28:DependencyManagement.md",{"user":1890,"name":1891},{"_path":1990,"title":1991,"description":1992,"tags":1993,"publishDate":1996,"image":1997,"_id":1998,"author":1999},"/phendry/2023-11-06/frontendframeworksin2024","Frontend Frameworks in 2024: React, Svelte and Vue","Several years ago, Art+Logic settled on Vue.js as our preferred frontend Web framework. Now, in 2024, we feel it's time to revisit the frontend framework landscape to see how things have (or haven't) changed.",[1285,1994,1995,1548],"react","svelte","2024-05-15","/phendry/2023-11-06/img/frontend_frameworks_2024.png","content:phendry:2023-11-06:FrontendFrameworksIn2024.md",{"user":1890,"name":1891},{"_path":2001,"title":2002,"description":2003,"publishDate":2004,"tags":2005,"image":2008,"_id":2009,"author":2010},"/rbrubaker/2012-06/arduino-thermometer","Turn Your Mac into a Thermometer with Arduino","The topic of the Arduino came up around A&L's \"virtual water cooler\" last week. About a year and a half ago, I purchased a SparkFun Inventor's Kit for Arduino. The kit is a fun way for a hardware novice like me to get started and learn some basics. It comes with more than a dozen sample projects such as lighting LEDs, spinning a motor and generating audio.","2012-06-28",[2006,2007],"arduino","java","/rbrubaker/2012-06/img/arduino1.jpg","content:rbrubaker:2012-06:arduino-thermometer.md",{"user":2011,"name":2012},"rbrubaker","Ryan Brubaker",{"_path":2014,"title":2015,"description":2016,"publishDate":2017,"tags":2018,"_id":2021,"author":2022},"/rbrubaker/2012-06/coffe-backbone-1","Fun with CoffeeScript and Backbone.js : Part 1","CoffeeScript has been all the rage lately and I've been wanting to hop on board the bandwagon. I've also seen Backbone.js mentioned quite a bit and was even more intrigued after listening to this .NET Rocks podcast. I decided to convert some plain JavaScript code I had in a side project to use both CoffeeScript and Backbone.js and see how things went.","2012-06-06",[2019,2020,1275,1098],"backbone-js","coffeescript","content:rbrubaker:2012-06:coffe-backbone-1.md",{"user":2011,"name":2012},{"_path":2024,"title":2025,"description":2026,"publishDate":2027,"tags":2028,"_id":2029,"author":2030},"/rbrubaker/2012-06/coffee-backbone-2","Fun with CoffeeScript and Backbone.js : Part 2","In this post I’ll discuss the code that handles updating the UI.","2012-06-07",[2019,2020,1275,1098],"content:rbrubaker:2012-06:coffee-backbone-2.md",{"user":2011,"name":2012},{"_path":2032,"title":2033,"description":2034,"publishDate":2035,"tags":2036,"_id":2037,"author":2038},"/rbrubaker/2012-06/coffee-backbone-3","Fun with CoffeeScript and Backbone.js : Part 3","In this post I’ll discuss my thoughts on CoffeeScript and Backbone.js.","2012-06-08",[2019,2020,1275,1098],"content:rbrubaker:2012-06:coffee-backbone-3.md",{"user":2011,"name":2012},{"_path":2040,"title":2041,"description":2042,"publishDate":2043,"tags":2044,"_id":2045,"author":2046},"/rbrubaker/2012-07/prototypal-js","Prototypal vs. Functional Inheritance in JavaScript","If you ever found JavaScript's prototypal inheritance confusing, do yourself a favor and open this article, open a JavaScript console and code each example in the article. You will definitely come away with a better understanding of how prototypal inheritance works in JavaScript.","2012-07-11",[2020,1250],"content:rbrubaker:2012-07:prototypal-js.md",{"user":2011,"name":2012},{"_path":2048,"title":2049,"description":2050,"publishDate":2051,"tags":2052,"_id":2053,"author":2054},"/rbrubaker/2012-07/whither-pm","Whither Project Management?","When I was first asked to manage a project at Art & Logic, I had my reservations. Did I really want to start down a career path that led to less development? Would my skills as a developer go stale? My first few projects as a manager were solo projects so I still had plenty of development work and fortunately, I found myself to be a pretty easy person to manage. As time went on I started managing larger projects and with them came the responsibility to manage other developers. To my surprise I found project management to be rewarding and dare I say, even fun. It's very satisfying to work with clients, helping them define their visions and seeing those visions come to life.","2012-07-25",[1810],"content:rbrubaker:2012-07:whither-pm.md",{"user":2011,"name":2012},{"_path":2056,"title":2057,"description":2058,"tags":2059,"image":2062,"publishDate":1219,"_id":2063,"author":2064},"/scharette/2019-4/discover_machine_learning","Discover Machine Learning","Computers have been around for less than 100 years.  In that short period of time, some incredible things have happened:  they've been universally adopted so quickly that we have them in our houses.  In our cars.  Even in our pockets.  In the last 40 years, there have been many significant events when it comes to computers:",[2060,2061,1211],"machine-learning","neural-networks","/scharette/2019-4/img/discover_machine_learning.png","content:scharette:2019-4:discover_machine_learning.md",{"user":2065,"name":2066},"scharette","Stéphane Charette",{"_path":2068,"title":2069,"description":2070,"publishDate":2071,"image":2072,"tags":2073,"_id":2075,"author":2076},"/shuey/2012-05/baas","BaaS Offerings Continue to Grow","The makers of Simplenote recently introduced their Backend as a Service (BaaS) offering called Simperium that looks to compete in an increasingly crowded space with services like CloudMine, Kinvey, and Parse and to some extent with iCloud for iOS and OS X only apps. So just how crowded is this space? Back in February, Kinvey published their own map of the BaaS ecosystem that highlights different tiers of the ecosystem and various relationships between them.","2012-05-10","/shuey/2012-05/img/header.png",[2074],"baas","content:shuey:2012-05:baas.md",{"user":2077,"name":2078},"shuey","Steven Huey",{"_path":2080,"title":2081,"description":2082,"publishDate":2083,"tags":2084,"image":2086,"_id":2087,"author":2088},"/shuey/2012-05/cloud","Under the Sheets with iCloud and Core Data","Drew McCormack is writing a great series (Part 1, Part 2, Part 3) of posts about using iCloud for syncing Core Data managed data. It's harder than Apple lets on and Drew has done a great job of uncovering how this actually works.","2012-05-28",[1134,2085],"icloud","/shuey/2012-05/img/icloud.jpg","content:shuey:2012-05:cloud.md",{"user":2077,"name":2078},{"_path":2090,"title":2091,"description":2092,"publishDate":2093,"tags":2094,"_id":2096,"author":2097},"/shuey/2012-05/economics-android","The Economics of Android","If you haven't already do yourself a favor and head over to asymco.com to catch Horace Deidu's multi-post series on \"The Economics of Android\". Horace and Dan Benjamin discuss the series during this week's Critical Path podcast as well. Horace is a former analyst for Nokia and has been writing Asymco for a few years now. His analysis of the mobile industry and Apple's place within it in particular has been featured in publications such as Bloomberg and Forbes.","2012-05-17",[2095],"android","content:shuey:2012-05:economics-android.md",{"user":2077,"name":2078},{"_path":2099,"title":2100,"description":2101,"publishDate":1576,"tags":2102,"_id":2105,"author":2106},"/shuey/2012-05/iot","The Internet of Things and Big Data","I've been following the developments in the \"Internet of Things\" and Big Data / Open Data markets as new apps and tools are released and they look to be two exciting technologies on a collision course. With the advent of internet connected home appliances like Wattvision and Nest that provide real utility to the average home owner at reasonable prices along with crowd funded projects like Air Quality Egg or Twine we should see an explosion in the kinds and amount of useful and real-time or near real-time data that is available to anyone with a smartphone. Health metric or \"quantitative self\" tracking devices such as Fitbit, Jawbone Up, and the Pebble watch will fuel this data explosion as well.",[2103,2104],"big-data","iot","content:shuey:2012-05:iot.md",{"user":2077,"name":2078},{"_path":2108,"title":2109,"description":2110,"publishDate":2111,"tags":2112,"image":2114,"_id":2115,"author":2116},"/shuey/2012-05/rubymotion","RubyMotion Brings Ruby to iOS","RubyMotion is a new development toolchain that allows you to build iOS apps using Ruby created by Laurent Sansonetti, a former Apple engineer and contributor to the MacRuby project. It has garnered a lot of attention the past few weeks and some detailed reviews have already been written:","2012-05-14",[1133,2113],"ruby","/shuey/2012-05/img/logotype-icon.png","content:shuey:2012-05:rubymotion.md",{"user":2077,"name":2078},{"_path":2118,"title":2119,"description":2120,"publishDate":2121,"tags":2122,"image":2123,"_id":2124,"author":2125},"/shuey/2012-06/thoughts-ios6","A few thoughts on iOS 6","Apple made their session videos from WWDC 2012 available earlier this week in record time. It's nice to see since tickets for this years event sold out in under two hours. Apple has an iOS 6 Preview page touting some of the new features such as Siri's new abilities, tighter integration with Facebook, Photo Stream sharing, and things like iCloud tabs for Safari all of which look great.","2012-06-21",[1134,1133],"/shuey/2012-06/img/ios6.jpg","content:shuey:2012-06:thoughts-ios6.md",{"user":2077,"name":2078},{"_path":2127,"title":2128,"description":2129,"publishDate":2130,"tags":2131,"image":2133,"_id":2134,"author":2135},"/shuey/2012-07/mixer","A Simple Mixer Using AVFoundation","In iOS 4.0 Apple introduced the AV Foundation APIs that made working with audio and video media much easier than it had been in previous versions of iOS. Apple then brought these APIs to Mac OS X in OS X 10.7 \"Lion\". In this post I'll show how to use some of the APIs to create a simple four track mixer.","2012-07-02",[1134,2132,1133],"cocoa","/shuey/2012-07/img/mixer-screenshot.jpg","content:shuey:2012-07:mixer.md",{"user":2077,"name":2078},{"_path":2137,"title":2138,"description":2139,"publishDate":2140,"tags":2141,"image":2142,"_id":2143,"author":2144},"/shuey/2012-07/reset-button","The Reset Button","Horace Dediu of Asymco has been publishing some fantastic insights and analysis of the mobile market in the past few weeks. I linked to some of Dediu's analysis of the Economics of Android in an earlier post, and since then he's updated his work with the latest data and is studying RIM and Microsoft's efforts in the space as well.","2012-07-19",[2095,1134,1133],"/shuey/2012-07/img/kevin.jpg","content:shuey:2012-07:reset-button.md",{"user":2077,"name":2078},{"_path":2146,"title":2147,"description":2148,"publishDate":2149,"tags":2150,"image":2152,"_id":2153,"author":2154},"/tfarrel/2012-07","Looking at Steganography","With the help of one of my favorite news aggregators, I discovered this article on using JavaScript and the canvas element to hide information inside images. I've long been fascinated by steganography and this article and demonstration makes it even more accessible. If you can't be bothered to read the article, it describes a method of using the HTML5 File API and the canvas element to embed a message in images.","2012-07-24",[2151],"steganography","/tfarrel/2012-07/img/white.png","content:tfarrel:2012-07:index.md",{"user":2155,"name":2156},"tfarrel","Troy Farrel",1787245444767]