<<widget "randomChoices">>
<<set _choices = $args[0]>>
<<set _choices.shuffle()>>
<ul>
<<for _i to 0; _i lt _choices.length; _i++>>
<<capture _i>>
<li><<link [[_choices[_i].text|_choices[_i].link]]>>
<<set $integrity += _choices[_i].integrity>>
<<set $budget += _choices[_i].budget>>
<</link>></li>
<</capture>>
<</for>>
</ul>
<</widget>>
<<widget "Status">>
<<set _statusText = $args[0]>>
<h2>Status</h2>
<p>_statusText[0].text</p>
<p>Budget Remaining: £$budget</p>
<</widget>><span class="meter-label">Strategic Integrity</span>
<div class="meter-container">
<div class="meter-bar" @style="'width: ' + Math.clamp(($integrity * 10), 0, 100) + '%; background-color: ' + ($integrity >= 4 ? '#4CAF50' : '#F44336')"></div>
</div>
<span class="meter-label">Budget Remaining</span>
<div class="meter-container">
<div class="meter-bar" @style="'width: ' + ($budget / 50) + '%; background-color: ' + ($budget < 1000 ? '#f44336' : '#4CAF50')"></div>
</div>
<small>Budget: £$budget</small><h2>The Mission</h2>
<p>You are Alex, a project manager for a medium-sized company. You've been asked to procure a new Learning Management System (LMS) for your organization.</p>
<p>You have an initial budget of £$budget. This will need to cover the procurement process and initial implementation costs.</p>
<p>Every choice you make will affect:</p>
<ol>
<li> The ''Strategic Integrity'' of the project (how well the solution fits)</li>
<li> Your ''Budget''</li>
</ol>
<p>Your strategic integrity rating and budget are shown in the panel on the left.</p>
<p>Strategic choices often cost more upfront but prevent "bite-back" later.</p>
<p>You may want to checkout my "<a href="https://leanpub.com/howtobuysoftware" target="_blank">How to Buy Software</a>" guide for more context on the choices you'll be making.</p>
[[Begin Step 1: Identify the Problem|Step 1]]
<hr>
<p>This game is licensed under a <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.</p>
<p>Source code available on <a href="https://github.com/berthelemy/how-to-buy-software" target="_blank">GitHub</a>.</p><h2>Step 1: Identify the Problem</h2>
<p>How do you start the process?</p>
<<set _choices = [
{ text: "Focus on technical glitches and complaints about the user experience.", integrity: -1, budget: -100, link: "S1Ra" },
{ text: "Define your organisation's strategic problems and measurements.", integrity: 2, budget: -500, link: "S1R" },
{ text: "Prioritize look-and-feel based on user complaints.", integrity: -2, budget: -50, link: "S1Ra" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"Focussing on technical issues or the look and feel is easier and cheaper, but it doesn't address the strategic problems. Expect 'bite-back' later."}] >>
<<Status _statusText>>
[[Step 2: Identify Solutions|Step 2]]<<set _statusText = [{text:"The investigation stage is complete.Defining strategic problems cost a bit more in time/consultancy, but your integrity is higher."}] >>
<<Status _statusText>>
[[Step 2: Identify Solutions|Step 2]]<h2>Step 2: Identify Possible Solutions</h2>
<p>What "landscape" of solutions fits best?</p>
<<set _choices = [
{ text: "Specialist all-in-one closed-source solutions.", integrity: 1, budget: -1000, link: "S2Ra" },
{ text: "Open-Source options with specialized implementation partners.", integrity: 1, budget: -2000, link: "S2Rb" },
{ text: "Using existing software such as Sharepoint, Teams or Salesforce.", integrity: -1, budget: -500, link: "S2Rc" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"You've narrowed the solution type. Working with a specialist, commercial solution provider allows you to leverage their expertise and reduce implementation risk."}] >>
<<Status _statusText>>
[[Step 3: The Long List|Step 3]]<<set _statusText = [{text:"You've narrowed the solution type. Open-source implementation often requires a higher initial investment in partners but may offer a better long-term fit if managed correctly."}] >>
<<Status _statusText>>
[[Step 3: The Long List|Step 3]]<<set _statusText = [{text:"Using your existing software is a valid option, but it may not fully address the strategic needs of your organization."}] >>
<<Status _statusText>>
[[Step 3: The Long List|Step 3]]<h2>Step 3: Make the Long List</h2>
<p>Where are you looking for candidates?</p>
<<set _choices = [
{ text: "Search engine ads and sponsored 'Top 10' lists.", integrity: -1, budget: -50, link: "S3Ra" },
{ text: "Peer networks, analyst reports and 'Alternative to' searches.", integrity: 2, budget: -150, link: "S3Rb" },
{ text: "Visit an industry conference or trade show.", integrity: 0, budget: -300, link: "S3Rc" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"You've found the suppliers that have the largest market presence, but their solutions may not be the best fit for your specific needs."}] >>
<<Status _statusText>>
[[Step 4: User Scenarios|Step 4]]<<set _statusText = [{text:"You've found the suppliers that are recommended by peers and analysts, which may provide more reliable insights into their suitability for your needs."}] >>
<<Status _statusText>>
[[Step 4: User Scenarios|Step 4]]<<set _statusText = [{text:"You've found the suppliers that are present at industry conferences or trade shows, which may provide valuable insights and networking opportunities."}] >>
<<Status _statusText>>
[[Step 4: User Scenarios|Step 4]]<h2>Step 4: Prepare to test the solutions</h2>
<p>How will you test the software meets your requirements?</p>
<<set _choices = [
{ text: "Create a checklist of features and non-functional specifications such as performance, security, and data protection.", integrity: -1, budget: -400, link: "S4Ra" },
{ text: "Prepare a set of narrative stories for end-to-end testing from the user's perspective.", integrity: 2, budget: -825, link: "S4Rb" },
{ text: "Use the suppliers' comparison charts", integrity: -2, budget: -100, link: "S4Rc" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"Features and specifications are important, but they don't tell the whole story. User stories provide a more holistic view of how the software will meet the needs of your users and organization."}] >>
<<Status _statusText>>
[[Step 5: Requirements|Step 5]]<<set _statusText = [{text:"User scenarios provide a more holistic view of how the software will meet the needs of your users and organization. This can help identify potential issues and ensure a better fit."}] >>
<<Status _statusText>>
[[Step 5: Requirements|Step 5]]<<set _statusText = [{text:"Supplier comparison charts can provide a quick, albeit biased, overview, but they may not capture the nuances of how the software will perform in your specific environment."}] >>
<<Status _statusText>>
[[Step 5: Requirements|Step 5]]<h2>Step 5: List the Requirements</h2>
<p>Once you have your user stories, it's time to use them to create a list of requirements. What should these include?</p>
<<set _choices = [
{ text: "A prioritized list of functional and non-functional requirements, and the rationale behind each.", integrity: 2, budget: -400, link: "S5Ra" },
{ text: "A list of features based on what you've seen in the systems you've found during your research ", integrity: 1, budget: -250, link: "S5Rb" },
{ text: "The requirements of your current system, copied over from the documents created when that was purchased.", integrity: -1, budget: -50, link: "S5Rc" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"A prioritized list of requirements helps you focus on what's most important, ensuring that critical needs are met while allowing flexibility for less essential features."}] >>
<<Status _statusText>>
[[Step 6: Short List|Step 6]]<<set _statusText = [{text:"A list of features based on your research provides a snapshot of what's available, but it may not fully align with your organization's specific needs and priorities."}] >>
<<Status _statusText>>
[[Step 6: Short List|Step 6]]<<set _statusText = [{text:"Copying the requirements of your current system may seem like a shortcut, but it can lead to outdated or irrelevant specifications that don't meet your organization's evolving needs."}] >>
<<Status _statusText>>
[[Step 6: Short List|Step 6]]<h2>Step 6: Make the Short List</h2>
<p>How do you narrow 20 down to 5?</p>
<<set _choices = [
{ text: "Filter out any whose websites are outdated or unprofessional.", integrity: -1, budget: -50, link: "S6Ra" },
{ text: "Filter out any that fail to meet 'Must-Have' criteria.", integrity: 2, budget: -200, link: "S6Rb" },
{ text: "Filter the solutions based on their estimated costs.", integrity: -2, budget: -50, link: "S6Rc" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"The state of a supplier's website can provide some insight into their professionalism, but it doesn't necessarily reflect the quality of their software or services."}] >>
<<Status _statusText>>
[[Step 7: Competitive Dialogue|Step 7]]<<set _statusText = [{text:"Filtering out solutions that fail to meet 'Must-Have' criteria ensures that only viable options remain, focusing your efforts on the most critical requirements."}] >>
<<Status _statusText>>
[[Step 7: Competitive Dialogue|Step 7]]<<set _statusText = [{text:"Filtering solutions based on their estimated costs helps manage your budget, but it shouldn't be the sole criterion for selection."}] >>
<<Status _statusText>>
[[Step 7: Competitive Dialogue|Step 7]]<h2>Step 7: Competitive Dialogue</h2>
<p>This is the most critical stage. How do you handle the finalists?</p>
<<set _choices = [
{ text: "Request a proposal from each of the short-listed suppliers and score the documents.", integrity: -2, budget: -200, link: "S7Ra" },
{ text: "Work through an iterative series of presentations and test drives, followed by an RFP", integrity: 3, budget: -700, link: "S7Rb" },
{ text: "Request a sales demonstration based on the scenarios, plus a proposal to score", integrity: -1, budget: -300, link: "S7Rc" }
]>>
<<randomChoices _choices>><<set _statusText = [{text:"Requesting a proposal from each of the short-listed suppliers and scoring the documents provides a structured way to compare options, but it often results in mis-matched expectations and overlooked nuances."}] >>
<<Status _statusText>>
[[Step 8: Negotiation|Step 8]]<<set _statusText = [{text:"An iterative series of presentations and test drives allows for a deeper understanding of how each solution performs in real-world scenarios, leading to a more informed decision."}] >>
<<Status _statusText>>
[[Step 8: Negotiation|Step 8]]<<set _statusText = [{text:"Requesting a sales demonstration based on the scenarios, plus a proposal to score, provides a more interactive way to evaluate the solutions. However, it may not capture all the nuances of how the software will perform in your specific environment."}] >>
<<Status _statusText>>
[[Step 8: Negotiation|Step 8]]<h2>Step 8: Negotiation</h2>
<p>The finish line. How do you close the deal?</p>
<<set _choices = [
{ text: "Demand a massive discount or walk away.", integrity: -1, budget: +500, link: "End" },
{ text: "Negotiate on levers (eg. recycling licenses, break clauses).", integrity: 2, budget: -250, link: "End" },
{ text: "Sign the standard boilerplate contract immediately.", integrity: -1, budget: 0, link: "End" }
]>>
<<randomChoices _choices>><h2>Final Results</h2>
<p><strong>Strategic Integrity:</strong> $integrity / 10</p>
<p><strong>Budget Remaining:</strong> £$budget</p>
<<if $integrity gte 10 and $budget gte 1000>>
<h3>Result: Strategic Hero</h3>
<p>You spent your budget wisely on the <strong>process</strong> rather than just the software.</p>
<p>You have a solution that fits and a contract that protects you.</p>
<<elseif $budget lte 1000>>
<h3>Result: Bankrupt Strategist</h3>
<p>You followed the book perfectly, but you ran out of money! The project is stalled because you can't pay the vendor's first invoice.</p>
<<else>>
<h3>Result: Short Term Thinker</h3>
<p>You are likely to face some "bite-back" issues because of skipped steps. At least you've not spent much of your budget.</p>
<</if>>
<<button "Restart">>
<<run Engine.restart()>>
<</button>>