[{"data":1,"prerenderedAt":1225},["ShallowReactive",2],{"blog-blog_en-page-5":3},{"posts":4,"totalPosts":1224,"totalPages":110,"currentPage":102},[5,245,569,857,965,1069],{"id":6,"title":7,"body":8,"cover":229,"date":230,"description":231,"draft":232,"extension":233,"meta":234,"navigation":235,"path":236,"seo":237,"stem":238,"tags":239,"__hash__":244},"blog_en\u002Fen\u002Fblog\u002Fki-integration-vom-hype-zur-produktionsreife.md","AI Integration in Development Teams: From Hype to Production Readiness",{"type":9,"value":10,"toc":224},"minimark",[11,15,20,23,52,174,178,181,207,211,220],[12,13,14],"p",{},"Most development teams are already using some form of AI assistance, whether officially sanctioned or not. The question is no longer whether to adopt AI tools, but how to do so without introducing new risks. A structured phased approach is not bureaucratic overhead, it is the prerequisite for the promised benefits to actually materialise.",[16,17,19],"h2",{"id":18},"phase-1-pilot-without-a-governance-vacuum","Phase 1: Pilot Without a Governance Vacuum",[12,21,22],{},"The first step is orientation, not restriction. Concrete measures in this phase:",[24,25,26,34,40,46],"ul",{},[27,28,29,33],"li",{},[30,31,32],"strong",{},"Define permitted tools and use cases:"," Which codebases may AI assistants be used on? Which tools are approved, which are not?",[27,35,36,39],{},[30,37,38],{},"Usage policy before the first problem:"," Guidelines are most useful when established before the first security incident, not after.",[27,41,42,45],{},[30,43,44],{},"2 to 3 pilot developers with explicit review responsibility:"," A small pilot group with a clear mandate, not open experimentation by the entire team.",[27,47,48,51],{},[30,49,50],{},"Measure impact:"," Compare PR cycle times and defect rates before and after the pilot.",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-yaml shiki shiki-themes github-light github-dark","# Example: simple usage policy as YAML configuration\nai_tools:\n  permitted:\n    - github-copilot\n    - cursor\n  restricted_codebases:\n    - payments-service   # no AI use due to compliance\n    - auth-service       # lead approval required\n  review_requirement: mandatory\n  pilot_reviewers:\n    - alice\n    - bob\n","yaml","",[60,61,62,71,82,90,100,108,116,127,138,150,158,166],"code",{"__ignoreMap":58},[63,64,67],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"sJ8bj","# Example: simple usage policy as YAML configuration\n",[63,72,74,78],{"class":65,"line":73},2,[63,75,77],{"class":76},"s9eBZ","ai_tools",[63,79,81],{"class":80},"sVt8B",":\n",[63,83,85,88],{"class":65,"line":84},3,[63,86,87],{"class":76},"  permitted",[63,89,81],{"class":80},[63,91,93,96],{"class":65,"line":92},4,[63,94,95],{"class":80},"    - ",[63,97,99],{"class":98},"sZZnC","github-copilot\n",[63,101,103,105],{"class":65,"line":102},5,[63,104,95],{"class":80},[63,106,107],{"class":98},"cursor\n",[63,109,111,114],{"class":65,"line":110},6,[63,112,113],{"class":76},"  restricted_codebases",[63,115,81],{"class":80},[63,117,119,121,124],{"class":65,"line":118},7,[63,120,95],{"class":80},[63,122,123],{"class":98},"payments-service",[63,125,126],{"class":69},"   # no AI use due to compliance\n",[63,128,130,132,135],{"class":65,"line":129},8,[63,131,95],{"class":80},[63,133,134],{"class":98},"auth-service",[63,136,137],{"class":69},"       # lead approval required\n",[63,139,141,144,147],{"class":65,"line":140},9,[63,142,143],{"class":76},"  review_requirement",[63,145,146],{"class":80},": ",[63,148,149],{"class":98},"mandatory\n",[63,151,153,156],{"class":65,"line":152},10,[63,154,155],{"class":76},"  pilot_reviewers",[63,157,81],{"class":80},[63,159,161,163],{"class":65,"line":160},11,[63,162,95],{"class":80},[63,164,165],{"class":98},"alice\n",[63,167,169,171],{"class":65,"line":168},12,[63,170,95],{"class":80},[63,172,173],{"class":98},"bob\n",[16,175,177],{"id":176},"phase-2-scale-with-guidelines","Phase 2: Scale With Guidelines",[12,179,180],{},"Once the pilot phase yields insights, structured rollout follows:",[24,182,183,189,195,201],{},[27,184,185,188],{},[30,186,187],{},"Written guidelines"," define when AI assistance is appropriate and when it is not, for example, not for security-critical authorisation logic.",[27,190,191,194],{},[30,192,193],{},"Review checklists specific to AI-generated code"," go beyond general code review standards and address the distinct failure modes of model output.",[27,196,197,200],{},[30,198,199],{},"Training for sceptical or inexperienced developers:"," Not every team member uses AI tools with the same level of understanding. Structured onboarding prevents misuse.",[27,202,203,206],{},[30,204,205],{},"Integration into general onboarding:"," AI tool policies belong on day one, not in week four.",[16,208,210],{"id":209},"why-this-matters","Why This Matters",[12,212,213,214,219],{},"Unstructured AI usage is already happening in most teams. The decision is not structured adoption versus no adoption, it is structured adoption with governance versus unstructured adoption with hidden risks. The second option is not the conservative choice, it is the riskier one. ",[215,216,218],"a",{"href":217},"\u002Fen\u002F#packages","AI Enablement"," provides the foundation for a rollout that secures productivity gains without sacrificing quality and security standards.",[221,222,223],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":58,"searchDepth":73,"depth":73,"links":225},[226,227,228],{"id":18,"depth":73,"text":19},{"id":176,"depth":73,"text":177},{"id":209,"depth":73,"text":210},null,"2026-03-31","Introducing AI tools in development teams is not a question of whether but how. A phased model for structured and safe rollout.",false,"md",{},true,"\u002Fen\u002Fblog\u002Fki-integration-vom-hype-zur-produktionsreife",{"title":7,"description":231},"en\u002Fblog\u002Fki-integration-vom-hype-zur-produktionsreife",[240,241,242,243],"AI","Engineering Leadership","AI Strategy","Developer Tools","qxr_paew5meZna6L8C1cUCZwMX-wEGz_2MK4gghXc5Y",{"id":246,"title":247,"body":248,"cover":558,"date":559,"description":560,"draft":232,"extension":233,"meta":561,"navigation":235,"path":562,"seo":563,"stem":564,"tags":565,"__hash__":568},"blog_en\u002Fen\u002Fblog\u002Fki-generierten-code-richtig-reviewen.md","Reviewing AI-Generated Code: Different Standards, Different Risks",{"type":9,"value":249,"toc":553},[250,253,257,260,292,296,299,513,516,542,544,550],[12,251,252],{},"AI-generated code passes syntax checks, compiles, and often looks clean. The same properties that make it easy to approve are precisely what conceals its most common failure modes. The problem is not the obvious error, it is the plausibly correct code that fails under specific conditions.",[16,254,256],{"id":255},"how-ai-generated-code-fails","How AI-Generated Code Fails",[12,258,259],{},"AI models optimise for the happy path. The result is code that works in common scenarios but breaks at the edges:",[24,261,262,268,274,280,286],{},[27,263,264,267],{},[30,265,266],{},"Plausible but wrong logic in edge cases:"," Calculations, comparisons, and state machines look correct but make false assumptions about inputs outside the normal range.",[27,269,270,273],{},[30,271,272],{},"Security issues in authentication and authorisation patterns:"," AI models frequently reproduce outdated or simplified patterns from public training data.",[27,275,276,279],{},[30,277,278],{},"Missing error handling:"," Because the model is trained on the success case, handling for network failures, timeouts, and inconsistent states is often absent.",[27,281,282,285],{},[30,283,284],{},"Subtle data type errors:"," Mistakes that only surface under production load, such as integer overflows or implicit type conversions.",[27,287,288,291],{},[30,289,290],{},"Deprecated patterns from training data:"," Outdated APIs, old library versions, or patterns that have not been recommended for years.",[16,293,295],{"id":294},"a-different-review-focus","A Different Review Focus",[12,297,298],{},"The central question when reviewing AI-generated code is not \"does this look correct?\" but \"what assumptions does this code make?\"",[53,300,304],{"className":301,"code":302,"language":303,"meta":58,"style":58},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F AI-generated function: looks correct, but is not\nasync function getUserBalance(userId: string): Promise\u003Cnumber> {\n  const user = await db.users.findOne({ id: userId });\n  return user.account.balance; \u002F\u002F bug: no null check, no error handling\n}\n\n\u002F\u002F Correct version\nasync function getUserBalance(userId: string): Promise\u003Cnumber> {\n  const user = await db.users.findOne({ id: userId });\n  if (!user || !user.account) {\n    throw new Error(`User or account not found: ${userId}`);\n  }\n  return user.account.balance;\n}\n","typescript",[60,305,306,311,355,378,389,394,399,404,432,448,471,495,500,508],{"__ignoreMap":58},[63,307,308],{"class":65,"line":66},[63,309,310],{"class":69},"\u002F\u002F AI-generated function: looks correct, but is not\n",[63,312,313,317,320,324,327,331,334,338,341,343,346,349,352],{"class":65,"line":73},[63,314,316],{"class":315},"szBVR","async",[63,318,319],{"class":315}," function",[63,321,323],{"class":322},"sScJk"," getUserBalance",[63,325,326],{"class":80},"(",[63,328,330],{"class":329},"s4XuR","userId",[63,332,333],{"class":315},":",[63,335,337],{"class":336},"sj4cs"," string",[63,339,340],{"class":80},")",[63,342,333],{"class":315},[63,344,345],{"class":322}," Promise",[63,347,348],{"class":80},"\u003C",[63,350,351],{"class":336},"number",[63,353,354],{"class":80},"> {\n",[63,356,357,360,363,366,369,372,375],{"class":65,"line":84},[63,358,359],{"class":315},"  const",[63,361,362],{"class":336}," user",[63,364,365],{"class":315}," =",[63,367,368],{"class":315}," await",[63,370,371],{"class":80}," db.users.",[63,373,374],{"class":322},"findOne",[63,376,377],{"class":80},"({ id: userId });\n",[63,379,380,383,386],{"class":65,"line":92},[63,381,382],{"class":315},"  return",[63,384,385],{"class":80}," user.account.balance; ",[63,387,388],{"class":69},"\u002F\u002F bug: no null check, no error handling\n",[63,390,391],{"class":65,"line":102},[63,392,393],{"class":80},"}\n",[63,395,396],{"class":65,"line":110},[63,397,398],{"emptyLinePlaceholder":235},"\n",[63,400,401],{"class":65,"line":118},[63,402,403],{"class":69},"\u002F\u002F Correct version\n",[63,405,406,408,410,412,414,416,418,420,422,424,426,428,430],{"class":65,"line":129},[63,407,316],{"class":315},[63,409,319],{"class":315},[63,411,323],{"class":322},[63,413,326],{"class":80},[63,415,330],{"class":329},[63,417,333],{"class":315},[63,419,337],{"class":336},[63,421,340],{"class":80},[63,423,333],{"class":315},[63,425,345],{"class":322},[63,427,348],{"class":80},[63,429,351],{"class":336},[63,431,354],{"class":80},[63,433,434,436,438,440,442,444,446],{"class":65,"line":140},[63,435,359],{"class":315},[63,437,362],{"class":336},[63,439,365],{"class":315},[63,441,368],{"class":315},[63,443,371],{"class":80},[63,445,374],{"class":322},[63,447,377],{"class":80},[63,449,450,453,456,459,462,465,468],{"class":65,"line":152},[63,451,452],{"class":315},"  if",[63,454,455],{"class":80}," (",[63,457,458],{"class":315},"!",[63,460,461],{"class":80},"user ",[63,463,464],{"class":315},"||",[63,466,467],{"class":315}," !",[63,469,470],{"class":80},"user.account) {\n",[63,472,473,476,479,482,484,487,489,492],{"class":65,"line":160},[63,474,475],{"class":315},"    throw",[63,477,478],{"class":315}," new",[63,480,481],{"class":322}," Error",[63,483,326],{"class":80},[63,485,486],{"class":98},"`User or account not found: ${",[63,488,330],{"class":80},[63,490,491],{"class":98},"}`",[63,493,494],{"class":80},");\n",[63,496,497],{"class":65,"line":168},[63,498,499],{"class":80},"  }\n",[63,501,503,505],{"class":65,"line":502},13,[63,504,382],{"class":315},[63,506,507],{"class":80}," user.account.balance;\n",[63,509,511],{"class":65,"line":510},14,[63,512,393],{"class":80},[12,514,515],{},"Concrete adjustments for the review process:",[24,517,518,524,530,536],{},[27,519,520,523],{},[30,521,522],{},"Always check error handling paths:"," Every function that returns something can also fail. Is that accounted for?",[27,525,526,529],{},[30,527,528],{},"Verify domain fit:"," AI generates generic solutions. Does the code actually match the domain context of the system?",[27,531,532,535],{},[30,533,534],{},"Invert confidence:"," The more domain-specific the requirement, the more critical the review should be. Confidence in the output is not a quality signal.",[27,537,538,541],{},[30,539,540],{},"No accelerated approvals:"," AI-generated code requires at least the same review effort as code from experienced developers.",[16,543,210],{"id":209},[12,545,546,547,549],{},"The review bar for AI-generated code must be higher than for senior developer output, not lower. Teams that relax their standards because \"the AI wrote it\" accumulate hidden technical debt faster than through any other cause. The speed that AI tools promise is not delivered through careless review, it is mortgaged. Structured handling of AI contributions, including clear review checklists and defined responsibilities, is part of an ",[215,548,218],{"href":217}," programme that equips teams for sustainable results.",[221,551,552],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":58,"searchDepth":73,"depth":73,"links":554},[555,556,557],{"id":255,"depth":73,"text":256},{"id":294,"depth":73,"text":295},{"id":209,"depth":73,"text":210},"\u002Fimg\u002Fblog\u002Fki-coding-assistenten-cover.jpg","2026-03-24","AI-generated code looks correct but carries different risks than human-written code. Why the review process needs to be adapted.",{},"\u002Fen\u002Fblog\u002Fki-generierten-code-richtig-reviewen",{"title":247,"description":560},"en\u002Fblog\u002Fki-generierten-code-richtig-reviewen",[240,566,567,241],"Code Review","Software Quality","QbfVZ1jpIylcIdXIGWsig69MiH3bNPKS40gvZaaJJv0",{"id":570,"title":571,"body":572,"cover":558,"date":849,"description":850,"draft":232,"extension":233,"meta":851,"navigation":235,"path":852,"seo":853,"stem":854,"tags":855,"__hash__":856},"blog_en\u002Fen\u002Fblog\u002Fki-coding-assistenten-im-produktiveinsatz-was-teams-wissen-muessen.md","AI Coding Assistants in Production: What Teams Need to Know",{"type":9,"value":573,"toc":844},[574,577,581,584,616,620,623,649,830,832,835,841],[12,575,576],{},"AI coding assistants have moved from experiment to standard tool in many development teams. The adoption rate is high, but structured rollouts with clear governance remain the exception. This creates risks that only become visible once the damage is done.",[16,578,580],{"id":579},"what-ai-assistants-do-and-do-not-do","What AI Assistants Do and Do Not Do",[12,582,583],{},"Using tools like GitHub Copilot or Cursor makes sense when strengths and limitations are clearly understood:",[24,585,586,592,598,604,610],{},[27,587,588,591],{},[30,589,590],{},"Strengths:"," Boilerplate code, familiar patterns, test scaffolding, and documentation comments. Here, AI assistants accelerate development measurably.",[27,593,594,597],{},[30,595,596],{},"Weaknesses:"," Domain-specific context that only exists within your own system. AI assistants have no knowledge of internal conventions, historical decisions, or system boundaries.",[27,599,600,603],{},[30,601,602],{},"Architecture is not a strength:"," AI assistants understand syntax, not architecture. Suggestions that are syntactically correct can be structurally wrong.",[27,605,606,609],{},[30,607,608],{},"Hallucinating with confidence:"," AI-generated code often appears complete and trustworthy even when it is not. This increases risk rather than confidence.",[27,611,612,615],{},[30,613,614],{},"Same review standards as human-written code:"," AI-generated code must go through the same review process as any other code. There is no shortcut.",[16,617,619],{"id":618},"what-teams-should-clarify-before-adoption","What Teams Should Clarify Before Adoption",[12,621,622],{},"Four questions must be answered before production use:",[24,624,625,631,637,643],{},[27,626,627,630],{},[30,628,629],{},"Data privacy and cloud models:"," Which code is sent to which cloud model? Proprietary code, customer data, and regulated areas require explicit rules.",[27,632,633,636],{},[30,634,635],{},"Review process for AI-generated code:"," Who reviews, how, and with what focus? AI-generated code must not be treated as more trustworthy than manually written code.",[27,638,639,642],{},[30,640,641],{},"Responsibility when AI-generated code causes a bug:"," If AI-generated code causes a production incident, who is accountable? This question must be answered before the incident occurs.",[27,644,645,648],{},[30,646,647],{},"Which areas are suitable?"," Not every part of the codebase is appropriate for AI-assisted development. Security-critical, regulated, or highly complex areas require special care.",[53,650,652],{"className":55,"code":651,"language":57,"meta":58,"style":58},"# Governance checklist: AI coding assistants\ndata_privacy:\n  - cloud_model_documented: true\n  - proprietary_code_excluded: true\n  - customer_data_protected: true\nreview:\n  - ai_code_review_mandatory: true\n  - review_focus: [\"Architecture\", \"Security\", \"Domain logic\"]\naccountability:\n  - bug_process_defined: true\n  - escalation_path: \"Tech Lead\"\nsuitable_areas:\n  - allowed: [\"Boilerplate\", \"Tests\", \"Documentation\"]\n  - restricted: [\"Security\", \"Database migrations\", \"Authentication\"]\n",[60,653,654,659,666,679,690,701,708,719,746,753,764,776,783,807],{"__ignoreMap":58},[63,655,656],{"class":65,"line":66},[63,657,658],{"class":69},"# Governance checklist: AI coding assistants\n",[63,660,661,664],{"class":65,"line":73},[63,662,663],{"class":76},"data_privacy",[63,665,81],{"class":80},[63,667,668,671,674,676],{"class":65,"line":84},[63,669,670],{"class":80},"  - ",[63,672,673],{"class":76},"cloud_model_documented",[63,675,146],{"class":80},[63,677,678],{"class":336},"true\n",[63,680,681,683,686,688],{"class":65,"line":92},[63,682,670],{"class":80},[63,684,685],{"class":76},"proprietary_code_excluded",[63,687,146],{"class":80},[63,689,678],{"class":336},[63,691,692,694,697,699],{"class":65,"line":102},[63,693,670],{"class":80},[63,695,696],{"class":76},"customer_data_protected",[63,698,146],{"class":80},[63,700,678],{"class":336},[63,702,703,706],{"class":65,"line":110},[63,704,705],{"class":76},"review",[63,707,81],{"class":80},[63,709,710,712,715,717],{"class":65,"line":118},[63,711,670],{"class":80},[63,713,714],{"class":76},"ai_code_review_mandatory",[63,716,146],{"class":80},[63,718,678],{"class":336},[63,720,721,723,726,729,732,735,738,740,743],{"class":65,"line":129},[63,722,670],{"class":80},[63,724,725],{"class":76},"review_focus",[63,727,728],{"class":80},": [",[63,730,731],{"class":98},"\"Architecture\"",[63,733,734],{"class":80},", ",[63,736,737],{"class":98},"\"Security\"",[63,739,734],{"class":80},[63,741,742],{"class":98},"\"Domain logic\"",[63,744,745],{"class":80},"]\n",[63,747,748,751],{"class":65,"line":140},[63,749,750],{"class":76},"accountability",[63,752,81],{"class":80},[63,754,755,757,760,762],{"class":65,"line":152},[63,756,670],{"class":80},[63,758,759],{"class":76},"bug_process_defined",[63,761,146],{"class":80},[63,763,678],{"class":336},[63,765,766,768,771,773],{"class":65,"line":160},[63,767,670],{"class":80},[63,769,770],{"class":76},"escalation_path",[63,772,146],{"class":80},[63,774,775],{"class":98},"\"Tech Lead\"\n",[63,777,778,781],{"class":65,"line":168},[63,779,780],{"class":76},"suitable_areas",[63,782,81],{"class":80},[63,784,785,787,790,792,795,797,800,802,805],{"class":65,"line":502},[63,786,670],{"class":80},[63,788,789],{"class":76},"allowed",[63,791,728],{"class":80},[63,793,794],{"class":98},"\"Boilerplate\"",[63,796,734],{"class":80},[63,798,799],{"class":98},"\"Tests\"",[63,801,734],{"class":80},[63,803,804],{"class":98},"\"Documentation\"",[63,806,745],{"class":80},[63,808,809,811,814,816,818,820,823,825,828],{"class":65,"line":510},[63,810,670],{"class":80},[63,812,813],{"class":76},"restricted",[63,815,728],{"class":80},[63,817,737],{"class":98},[63,819,734],{"class":80},[63,821,822],{"class":98},"\"Database migrations\"",[63,824,734],{"class":80},[63,826,827],{"class":98},"\"Authentication\"",[63,829,745],{"class":80},[16,831,210],{"id":209},[12,833,834],{},"Teams that adopt AI tools without structure often see short-term speed gains followed by long-term quality problems. Inconsistent patterns, creeping technical debt, and code paths that are difficult to trace are typical consequences of unstructured rollouts.",[12,836,837,838,840],{},"A structured enablement program prevents exactly this. The ",[215,839,218],{"href":217}," guides teams through governance, adoption strategy, and review processes that protect the long-term value of these tools.",[221,842,843],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":58,"searchDepth":73,"depth":73,"links":845},[846,847,848],{"id":579,"depth":73,"text":580},{"id":618,"depth":73,"text":619},{"id":209,"depth":73,"text":210},"2026-03-17","GitHub Copilot, Cursor and others are productive in many teams. What teams really need to know before introducing AI tools into development.",{},"\u002Fen\u002Fblog\u002Fki-coding-assistenten-im-produktiveinsatz-was-teams-wissen-muessen",{"title":571,"description":850},"en\u002Fblog\u002Fki-coding-assistenten-im-produktiveinsatz-was-teams-wissen-muessen",[240,243,241,567],"BkFokuFPV5vW77XGDsMq_81AKNV2OihlFVqWtONUUXg",{"id":858,"title":859,"body":860,"cover":229,"date":954,"description":955,"draft":232,"extension":233,"meta":956,"navigation":235,"path":957,"seo":958,"stem":959,"tags":960,"__hash__":964},"blog_en\u002Fen\u002Fblog\u002Farchitekturentscheidungen-bewerten-ohne-entwickler-zu-sein.md","How to Evaluate Architecture Decisions Without Being a Developer",{"type":9,"value":861,"toc":949},[862,865,869,872,898,902,905,937,939,942],[12,863,864],{},"Non-technical founders face a structural challenge: they need to evaluate technical decisions they did not make and may not fully understand. The right approach is not to learn to code, but to ask the right questions.",[16,866,868],{"id":867},"questions-every-founder-should-ask","Questions Every Founder Should Ask",[12,870,871],{},"Four questions are sufficient to assess the quality of thinking behind technical decisions:",[24,873,874,880,886,892],{},[27,875,876,879],{},[30,877,878],{},"\"What are the three assumptions this architecture depends on?\""," Someone who cannot answer this has not thought the decision through. Someone who answers easily has a foundation.",[27,881,882,885],{},[30,883,884],{},"\"What breaks first if our user count doubles?\""," This tests whether scalability was actively considered or only implicitly assumed.",[27,887,888,891],{},[30,889,890],{},"\"How long would it take to onboard a new senior developer?\""," Long onboarding times are a reliable indicator of missing structural clarity in the architecture.",[27,893,894,897],{},[30,895,896],{},"\"What would we do differently if we built this today?\""," This opens honest conversations about technical debt and reveals whether the team reflects on their work or becomes defensive about it.",[16,899,901],{"id":900},"red-flags-in-technical-presentations","Red Flags in Technical Presentations",[12,903,904],{},"When a team presents technical decisions, there are warning signs that are recognizable without a technical background:",[24,906,907,913,919,925,931],{},[27,908,909,912],{},[30,910,911],{},"Complexity presented as sophistication:"," Good architecture is explainable. When complexity is sold as a quality marker, a simpler path often existed.",[27,914,915,918],{},[30,916,917],{},"No mention of trade-offs:"," Every architecture decision has costs. Someone who names none either did not consider them or does not want to communicate them.",[27,920,921,924],{},[30,922,923],{},"Only \"how\", never \"why\":"," Technical teams who only describe how something works but not why it was built that way provide no sound basis for decisions.",[27,926,927,930],{},[30,928,929],{},"Resistance to external review:"," Good architecture withstands scrutiny. Resistance to it is not a sign of quality.",[27,932,933,936],{},[30,934,935],{},"Every problem requires a rewrite:"," When the answer to every question is \"we need to rebuild this\", the ability to work within existing systems is missing.",[16,938,210],{"id":209},[12,940,941],{},"Technical due diligence is not only a task for investors. Founders who cannot evaluate their own technical foundation are dependent on the goodwill of their team. That is not a sustainable pattern for a leadership role.",[12,943,944,945,948],{},"External review provides an independent, structured perspective that is difficult to generate internally. The ",[215,946,947],{"href":217},"Architecture & AI Review"," is designed precisely for this: a neutral assessment of the technical state, understandable for non-technical leaders.",{"title":58,"searchDepth":73,"depth":73,"links":950},[951,952,953],{"id":867,"depth":73,"text":868},{"id":900,"depth":73,"text":901},{"id":209,"depth":73,"text":210},"2026-03-10","Non-technical founders need to assess technical decisions they didn't make. The right questions make this possible.",{},"\u002Fen\u002Fblog\u002Farchitekturentscheidungen-bewerten-ohne-entwickler-zu-sein",{"title":859,"description":955},"en\u002Fblog\u002Farchitekturentscheidungen-bewerten-ohne-entwickler-zu-sein",[961,241,962,963],"Software Architecture","Startup","Technical Debt","vbQYD32IVl4Tkj-CWfP8jFKN5hJ3o6nF9-nc7JzWcso",{"id":966,"title":967,"body":968,"cover":229,"date":1059,"description":1060,"draft":232,"extension":233,"meta":1061,"navigation":235,"path":1062,"seo":1063,"stem":1064,"tags":1065,"__hash__":1068},"blog_en\u002Fen\u002Fblog\u002Fersten-senior-entwickler-einstellen-was-gruender-falsch-machen.md","Hiring Your First Senior Developer: What Founders Get Wrong",{"type":9,"value":969,"toc":1054},[970,973,977,1009,1013,1016,1042,1044,1047],[12,971,972],{},"The first senior developer hire is one of the most consequential decisions an early-stage company makes. This person sets the technical culture, the code standards, and often determines whether the next hires succeed or fail. Yet this decision is frequently made with the same recurring mistakes.",[16,974,976],{"id":975},"the-most-common-mistakes-in-a-senior-hire","The Most Common Mistakes in a Senior Hire",[24,978,979,985,991,997,1003],{},[27,980,981,984],{},[30,982,983],{},"Optimizing for the most impressive CV:"," Recognizable companies on a resume do not mean someone will thrive in a three-person startup. Enterprise experience and startup context require fundamentally different skill sets.",[27,986,987,990],{},[30,988,989],{},"Conflating years with seniority:"," Someone with twelve years of experience in a narrow role is not automatically senior. Seniority means judgment under uncertainty, not tenure.",[27,992,993,996],{},[30,994,995],{},"Not involving the existing team:"," The hiring decision is made by founders alone, without technical perspective. The people who will work alongside this person should be part of the process.",[27,998,999,1002],{},[30,1000,1001],{},"No technical assessment, or an irrelevant one:"," Textbook coding challenges test algorithmic knowledge, not the ability to make good technical decisions in a real context.",[27,1004,1005,1008],{},[30,1006,1007],{},"No clear picture of the role:"," Should this person lead or deliver? Mentor or build? Without a clear answer, you hire for the wrong phase.",[16,1010,1012],{"id":1011},"what-actually-matters","What Actually Matters",[12,1014,1015],{},"Four qualities matter more in early teams than technical depth in a single stack:",[24,1017,1018,1024,1030,1036],{},[27,1019,1020,1023],{},[30,1021,1022],{},"Communication and clarity:"," Can this person explain their decisions, including to non-technical stakeholders?",[27,1025,1026,1029],{},[30,1027,1028],{},"Ownership mindset:"," Is the problem taken through to completion, or only the assigned part addressed?",[27,1031,1032,1035],{},[30,1033,1034],{},"Breadth over depth:"," Someone effective in a small team works across product boundaries, not only within their own layer.",[27,1037,1038,1041],{},[30,1039,1040],{},"Learning velocity:"," New domains, new requirements. Someone who learns quickly is more valuable long-term than someone who already knows a lot.",[16,1043,210],{"id":209},[12,1045,1046],{},"A wrong senior hire is costly to undo: in time, money, and culture. A right one multiplies the entire team's effectiveness. The difference often lies less in the quality of candidates than in the quality of the selection process.",[12,1048,1049,1050,1053],{},"When no one internally is qualified to evaluate candidates technically, external support is the more effective investment. The ",[215,1051,1052],{"href":217},"Fractional Tech Lead"," can guide hiring processes, design technical assessments, and ensure the first senior hire fits the current phase of the company.",{"title":58,"searchDepth":73,"depth":73,"links":1055},[1056,1057,1058],{"id":975,"depth":73,"text":976},{"id":1011,"depth":73,"text":1012},{"id":209,"depth":73,"text":210},"2026-03-03","The first senior hire defines a company's technical culture. Common mistakes in the selection process and what actually matters.",{},"\u002Fen\u002Fblog\u002Fersten-senior-entwickler-einstellen-was-gruender-falsch-machen",{"title":967,"description":1060},"en\u002Fblog\u002Fersten-senior-entwickler-einstellen-was-gruender-falsch-machen",[241,1066,962,1067],"Hiring","Technical Leadership","u4X1Mq04ZpGABguX-YctwcMPzjGNpfX9IQPI-n1GR6Y",{"id":1070,"title":1071,"body":1072,"cover":229,"date":1215,"description":1216,"draft":232,"extension":233,"meta":1217,"navigation":235,"path":1218,"seo":1219,"stem":1220,"tags":1221,"__hash__":1223},"blog_en\u002Fen\u002Fblog\u002Fcode-reviews-die-wirklich-die-codequalitaet-verbessern.md","Code Reviews That Actually Improve Your Codebase",{"type":9,"value":1073,"toc":1210},[1074,1077,1081,1084,1116,1120,1123,1155,1196,1198,1201,1207],[12,1075,1076],{},"Code reviews are standard practice in most development teams. Yet the quality gap between effective and ineffective reviews is enormous. The difference lies not in the tooling, but in what is actually being evaluated during the review.",[16,1078,1080],{"id":1079},"what-makes-code-reviews-ineffective","What Makes Code Reviews Ineffective",[12,1082,1083],{},"Poor reviews share a small set of recurring patterns:",[24,1085,1086,1092,1098,1104,1110],{},[27,1087,1088,1091],{},[30,1089,1090],{},"Only syntax and formatting checked:"," That is what linters and formatters are for. A review that only addresses this level wastes time on both sides.",[27,1093,1094,1097],{},[30,1095,1096],{},"Approval within minutes of a 500-line diff:"," A change of that size cannot be meaningfully assessed in five minutes. Fast approvals signal that nobody actually looked.",[27,1099,1100,1103],{},[30,1101,1102],{},"No feedback on architecture or naming:"," Whether a function has the right name and whether the logic belongs in the right place are the critical questions. They go unasked in poor reviews.",[27,1105,1106,1109],{},[30,1107,1108],{},"No questions about the purpose of the change:"," What is this code supposed to solve? A reviewer who does not ask this question only checks whether the code runs, not whether it does the right thing.",[27,1111,1112,1115],{},[30,1113,1114],{},"Culture of not wanting to block colleagues:"," In many teams, rejecting a PR is considered impolite. The result is reviews without impact.",[16,1117,1119],{"id":1118},"what-good-code-reviews-actually-accomplish","What Good Code Reviews Actually Accomplish",[12,1121,1122],{},"High-quality review feedback addresses different layers:",[24,1124,1125,1131,1137,1143,1149],{},[27,1126,1127,1130],{},[30,1128,1129],{},"Intent:"," Does this change solve the right problem? Sometimes the error lies not in the code but in the underlying assumption.",[27,1132,1133,1136],{},[30,1134,1135],{},"Architecture:"," Is this the right place for this logic? Does this responsibility belong in this service or this module?",[27,1138,1139,1142],{},[30,1140,1141],{},"Abstraction level and naming:"," Does the name reveal what the function does? Is the abstraction introduced too early or too late?",[27,1144,1145,1148],{},[30,1146,1147],{},"Test coverage for the real cases:"," Not code coverage as a metric, but whether the tests cover the scenarios that will actually occur in production.",[27,1150,1151,1154],{},[30,1152,1153],{},"Small PRs as a prerequisite:"," Good reviews require small, focused pull requests. An 800-line diff cannot be reviewed meaningfully.",[53,1156,1160],{"className":1157,"code":1158,"language":1159,"meta":58,"style":58},"language-diff shiki shiki-themes github-light github-dark","# Ineffective review comment:\n- \"Please add a space after the comma.\"\n\n# Effective review comment:\n+ \"This validation logic now lives in the controller. Should it not sit\n+  in the domain object so it can be reused? If we need this same rule\n+  elsewhere, we will end up copying it.\"\n","diff",[60,1161,1162,1167,1172,1176,1181,1186,1191],{"__ignoreMap":58},[63,1163,1164],{"class":65,"line":66},[63,1165,1166],{},"# Ineffective review comment:\n",[63,1168,1169],{"class":65,"line":73},[63,1170,1171],{},"- \"Please add a space after the comma.\"\n",[63,1173,1174],{"class":65,"line":84},[63,1175,398],{"emptyLinePlaceholder":235},[63,1177,1178],{"class":65,"line":92},[63,1179,1180],{},"# Effective review comment:\n",[63,1182,1183],{"class":65,"line":102},[63,1184,1185],{},"+ \"This validation logic now lives in the controller. Should it not sit\n",[63,1187,1188],{"class":65,"line":110},[63,1189,1190],{},"+  in the domain object so it can be reused? If we need this same rule\n",[63,1192,1193],{"class":65,"line":118},[63,1194,1195],{},"+  elsewhere, we will end up copying it.\"\n",[16,1197,210],{"id":209},[12,1199,1200],{},"The review process shapes the codebase over time more than any single architectural decision. Teams without effective reviews accumulate patterns they later regret: inconsistent abstractions, scattered responsibilities, code that is hard to test. That is not a technical problem; it is a leadership problem.",[12,1202,1203,1204,1206],{},"Teams looking to reset their review process benefit from an external perspective. The ",[215,1205,1052],{"href":217}," supports teams in systematically improving review culture and quality.",[221,1208,1209],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":58,"searchDepth":73,"depth":73,"links":1211},[1212,1213,1214],{"id":1079,"depth":73,"text":1080},{"id":1118,"depth":73,"text":1119},{"id":209,"depth":73,"text":210},"2026-02-24","Code reviews are a ritual without impact in many teams. What separates effective reviews from ineffective ones and how to reset the process.",{},"\u002Fen\u002Fblog\u002Fcode-reviews-die-wirklich-die-codequalitaet-verbessern",{"title":1071,"description":1216},"en\u002Fblog\u002Fcode-reviews-die-wirklich-die-codequalitaet-verbessern",[566,241,567,1222],"Backend Development","JlB-x34J5deU9CrVPQSIEdQB_vavAyzZsf6iuRgJKlU",36,1780122461724]