<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gitpod</title>
    <description>The latest articles on Forem by Gitpod (@gitpod).</description>
    <link>https://forem.com/gitpod</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4991%2F6fa202a1-fe54-43db-935a-206139de1a49.jpg</url>
      <title>Forem: Gitpod</title>
      <link>https://forem.com/gitpod</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gitpod"/>
    <language>en</language>
    <item>
      <title>Gitpod CLI Cheatsheet</title>
      <dc:creator>Jean-Phi Baconnais</dc:creator>
      <pubDate>Wed, 03 Jan 2024 16:17:30 +0000</pubDate>
      <link>https://forem.com/gitpod/gitpod-cli-cheatsheet-55hj</link>
      <guid>https://forem.com/gitpod/gitpod-cli-cheatsheet-55hj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Gitpod&lt;/strong&gt; offers us a Command Lines Interface (CLI) to manage our workspaces. Documentation is available &lt;a href="https://www.gitpod.io/docs/references/gitpod-cli" rel="noopener noreferrer"&gt;here&lt;/a&gt; and I created this cheatsheet to summarize it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsnr32765n0ntx3wayuip.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsnr32765n0ntx3wayuip.jpg" alt="Gitpod CLI Cheatsheet" width="800" height="984"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you discover Gitpod, I created this first Cheatsheet to explain you what it is : &lt;a href="https://dev.to/gitpod/gitpod-cheatsheet-2ek6"&gt;Gitpod Cheatsheet&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gitpod</category>
      <category>cloud</category>
      <category>ide</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Field Guide for Sabotaging Developer Productivity: The Art of Code Chaos</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Thu, 21 Dec 2023 15:00:00 +0000</pubDate>
      <link>https://forem.com/gitpod/a-field-guide-for-sabotaging-developer-productivity-the-art-of-code-chaos-1ej2</link>
      <guid>https://forem.com/gitpod/a-field-guide-for-sabotaging-developer-productivity-the-art-of-code-chaos-1ej2</guid>
      <description>&lt;p&gt;In the ever-evolving landscape of tech companies, where the battle for developer productivity rages like an unending storm, a new series emerges – a satirical guide that delves into the art of sabotaging developer productivity. This guide is not just a collection of stories; it's a field manual for those who dare to tread the path of controlled chaos within the realms of software development.&lt;/p&gt;

&lt;p&gt;Our satirical journey begins with the legendary tale of Carlo Gustafsson, a name that echoes through the halls of developer history. In the 1970s, this pioneer of productivity sabotage executed a masterstroke, one that would reverberate through the decades: he replaced all tabs with spaces in every changeset. This seemingly innocuous act threw developer tools into disarray, spawning a conflict that would divide developers into two factions – the Spaces and the Tabs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gitpod.io%2F%2Fimages%2Fblog%2Fa-field-guide-for-sabotaging-developer-productivity-the-art-of-code-chaos%2Fdramatic-scene.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gitpod.io%2F%2Fimages%2Fblog%2Fa-field-guide-for-sabotaging-developer-productivity-the-art-of-code-chaos%2Fdramatic-scene.webp" alt="dramatic scene at office"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Spaces, led by Gustafsson, waged a relentless campaign, transforming every tab into a space with the zeal of a crusader. This act wasn't just about preference; it was a statement, a line drawn in the sand (or perhaps, in the code). The Tabs, feeling the heat of this unorthodox warfare, struck back, subverting the space indentation and turning it back into tabs reclaiming 3 bytes for every tab reestablished! Thus, a cold war was born, not of nations, but of keystrokes, one that persists in companies worldwide.&lt;/p&gt;

&lt;p&gt;As a reader intrigued by this history, you might be wondering: How can I, too, become a maestro of developer productivity sabotage? Fear not, for this guide will unveil methods that have been shrouded in the annals of tech lore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Volume 1: Discontinuous Disintegration
&lt;/h3&gt;

&lt;p&gt;Dive into the world of developer productivity sabotage with the first masterful strategies designed to unsettle even the most stalwart of coders. The first prong of this devious plan involves a cunning manipulation of the continuous integration (CI) system. Envision a scenario where developers are perpetually grappling with a test suite that behaves like a capricious trickster, sprinkling random failures and incomprehensible delays into their workflow. This method's genius lies in its stealth; a seemingly benign requirement stipulates that all PRs must pass the CI build before merging. However, the road to achieving this pass is littered with mysterious and unpredictable obstacles. By introducing these erratic challenges, this strategy aims to erode developers' patience, provoke hasty and ill-considered decisions, and ultimately cultivate an environment rife with errors – a surefire recipe for plummeting productivity.&lt;/p&gt;

&lt;p&gt;The second prong in this arsenal of disruption takes psychological warfare to new heights. It mandates that every PR must be rebased from the most recent commit on the main branch before merging. This rule might appear straightforward, but as the frequency of commits to the main branch escalates, so too does the complexity and exasperation associated with struggling to get a passing CI build. Some may speculate that organizations could evolve to trust their developers to merge changes, even amidst the chaos of flaky tests. Yet, this underestimates the resolute nature of DevOps, who operate as the hidden puppeteers in this intricate dance of coding chaos. These two prongs, when combined, form a potent strategy that sows doubt and disarray, turning the once orderly world of software development into a labyrinth of frustration and inefficiency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gitpod.io%2Fimages%2Fblog%2Fa-field-guide-for-sabotaging-developer-productivity-the-art-of-code-chaos%2Fchaotic-scene.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gitpod.io%2Fimages%2Fblog%2Fa-field-guide-for-sabotaging-developer-productivity-the-art-of-code-chaos%2Fchaotic-scene.webp" alt="chaotic scene at office"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As this series unfolds, we will delve deeper into this field guide, unveiling tactics and strategies that have shaped the landscape of developer productivity – for better or for worse. Stay tuned, for this is just the beginning of a journey into the heart of developer chaos, a path few dare to walk, but many will find morbidly fascinating. Welcome to the Field Guide for Sabotaging Developer Productivity. Let the games begin.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Common bottlenecks that impact developer productivity</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Tue, 19 Dec 2023 14:49:52 +0000</pubDate>
      <link>https://forem.com/gitpod/common-bottlenecks-that-impact-developer-productivity-1jjm</link>
      <guid>https://forem.com/gitpod/common-bottlenecks-that-impact-developer-productivity-1jjm</guid>
      <description>&lt;h2&gt;
  
  
  So you want to improve developer productivity? This is what really works
&lt;/h2&gt;

&lt;p&gt;Through my work at Gitpod, I’ve engaged with developers from a diverse range of companies and industries. This experience has provided me with a unique perspective into the factors that impact developer’s productivity, both individually or as part of a team. Instead of going through your typical theoretical frameworks to measure productivity like DORA and SPACE instead today, I want to get &lt;em&gt;really&lt;/em&gt; &lt;em&gt;practical&lt;/em&gt; and go over the most common challenges for developer productivity I encountered and go over actionable ways to overcome them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We’ll&lt;/strong&gt; &lt;strong&gt;cover everything from improving your own individual developer flow state with time blocking, increasing your developer feedback loops with tools like hot reloading and why it’s important to standardize to reduce cognitive load&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Individual developer's challenges
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vjucP_S1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/common-bottlenecks-that-impacts-developer-productivity/productivity-1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vjucP_S1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/common-bottlenecks-that-impacts-developer-productivity/productivity-1.webp" alt="Productivity" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are productivity challenges that any developer will encounter - even if they are working solo:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Interruptions and flow state
&lt;/h3&gt;

&lt;p&gt;Developers often work best when in a &lt;a href="https://en.wikipedia.org/wiki/Flow_(psychology)"&gt;'flow state'&lt;/a&gt;, delivering quality work quickly. In this state, they're deeply focused and highly productive. But frequent interruptions can break this flow, hurting both quality and quantity of work.&lt;/p&gt;

&lt;p&gt;Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  **Edit your status: **turn off Slack notifications and add a status indicating you are in flow state. Pro tip: leverage something like &lt;a href="https://www.getclockwise.com/slack-app"&gt;Clockwise&lt;/a&gt; which can automatically slot focus time in your calendar and automatically mute your Slack notifications and change your Slack status for you.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Snooze&lt;/strong&gt;: turn off all notifications on your Apple devices via the do not disturb feature&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Leverage social pressure&lt;/strong&gt;: get a meeting room or jump on a call with one or more trusted colleagues. Set a fixed time for how long you want to concentrate on a specific task, and share the outcomes each of you wants to achieve. Then collectively work on your tasks, and at the end of that time share which outcomes you were able to accomplish. Because you committed to doing something publicly, you are more likely to follow-through and shut down interruptions. And because you are in a shared room or environment, it reduces the tendency to procrastinate&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Centralize interruptions:&lt;/strong&gt; find a way to centralize interruptions, such that only one person takes the brunt of interruptions and others are free to focus. For example, if there are constant interruptions to engineers due to customer or product questions, have the on-call person be the first responder to all of these. This way, the load is still shared as the on-call person changes, but everyone else gets more focus time. Practically, this can be done via an “ask team X” &lt;a href="https://slack.com/intl/en-gb/features/workflow-automation"&gt;Slack workflow&lt;/a&gt; that pings the current on-call person from that team.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Iteration speed (slow &lt;a href="https://notes.paulswail.com/public/The+inner+and+outer+loops+of+software+development+workflow"&gt;inner loop&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;The speed at which a developer can change, build, and test code is crucial for productivity. Quicker builds allow for more changes in a single day. Slow builds aren't just inconvenient—they can greatly impede progress. Consider a scenario where a change-build-test cycle takes 10 minutes, with half that time dedicated to building. If you work undisturbed for 5 hours, you can do 30 cycles a day. Reducing build times by just two minutes saves an hour each day or adds 7 additional cycles. That's 21 hours saved per engineer every month!&lt;/p&gt;

&lt;p&gt;(Not so) Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;More power:&lt;/strong&gt; opt for larger machines or switch to cloud development environments (CDEs) that offer more resources&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Hot-reloading&lt;/strong&gt;: can you use hot-reloading to instantly reflect code changes in a running service or application? This could nearly eliminate build times!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Cognitive load
&lt;/h3&gt;

&lt;p&gt;Developers need to keep a mental map of their code's structure, dependencies, bugs, and more. This mental effort can slow progress, especially with complex projects. If a codebase has unclear boundaries, many interacting components, or confusing names, the mental load further increases.&lt;/p&gt;

&lt;p&gt;Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standardize the development environment&lt;/strong&gt;: switching to CDEs can result in a lower cognitive load to manage a complex development environment - because the environment is codified. This means that one person can set this up, and others can “just” use it. In their day to day, they only need to think about code changes, not the environment where these changes are made in. Of course, this will not fix all problems that come with a very complex and interrelated architecture - but it does help reduce some of the cognitive load.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Developer environment maintenance
&lt;/h3&gt;

&lt;p&gt;A developer's environment isn't static. Operating systems update, tools evolve and sometimes clash. Maintaining this takes time—time not spent writing code.&lt;/p&gt;

&lt;p&gt;(Not so) Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Leverage CDEs&lt;/strong&gt;: Switching to CDEs means that the developer environment is now standardized and is set up to work every time. That means that once set up, developers can focus on writing code, not updating dependencies. Switching between branches or projects is simplified to starting a new workspace, eliminating the need for constant updates to local dependencies and toolchains. Furthermore, updates to dependencies and tools can be managed centrally, ensuring that every new development environment is automatically up-to-date, streamlining the workflow and enhancing overall efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team-level challenges
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--olPhrryv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/common-bottlenecks-that-impacts-developer-productivity/productivity-2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--olPhrryv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/common-bottlenecks-that-impacts-developer-productivity/productivity-2.webp" alt="Productivity" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When developers collaborate and share work a new set of challenges emerge:&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Slow feedback loops (slow &lt;a href="https://notes.paulswail.com/public/The+inner+and+outer+loops+of+software+development+workflow"&gt;outer loop&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;When more than one developer is involved, collaboration is essential. They co-own the codebase and need feedback. However, slow feedback loops, whether from a sluggish outer loop (i.e. CI/CD) or lengthy PR reviews, can hamper progress and lower spirits.&lt;/p&gt;

&lt;p&gt;Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Unblock before doing your own work&lt;/strong&gt;: schedule fixed time every morning for developers to do PR reviews before they start their own work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Environment inconsistencies
&lt;/h3&gt;

&lt;p&gt;When multiple developers are involved, different development environments come into play. These can vary based on machine setup, OS, developer preferences, and update frequency. This can lead to a code change working on one machine but not another— the "it works on my machine" problem. \&lt;/p&gt;

&lt;p&gt;Additionally, there are CI and production environments to consider. These can differ greatly, especially when developers use Windows or Mac, and production runs on Linux containers. This mismatch can reduce productivity, as what works in the development environment might break in production.&lt;/p&gt;

&lt;p&gt;Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standardize your development environments&lt;/strong&gt;: by codifying your development environments via a gitpod.yml or devcontianer.json file you can make sure that every developer gets the same environment every time and, when running the environment in a container, “dev” matches “production”. No more “works on my machine” problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Onboarding onto unfamiliar codebases
&lt;/h3&gt;

&lt;p&gt;A lone developer knows all their code - they wrote it. But in a team or a large company, developers often encounter unfamiliar code. Contributing to an unfamiliar codebase is costly - not just because of the learning curve to understand the code, but also to have the right tools and dependencies set up. An outdated readme.md file usually guides this setup. This initial hurdle of setting up not only hampers productivity, but also discourages developers from contributing to other code bases hurting cross-team collaboration and hampering any inner-source initiative before it takes off.&lt;/p&gt;

&lt;p&gt;Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Ask each first-time-user to improve the readme.md of the repo&lt;/strong&gt;: The repo’s readme.md file usually explains how to set up your development environment. Keeping it up to date can be a burden and is often neglected due to other priorities. Make it a thing for developers onboarding onto a repo for the first time to fix any inconsistencies in the readme.md that they find - e.g. with a CTA at the top. Let’s be honest: This is unlikely to do much, but it is better than nothing :)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Codify the readme.md by using CDEs&lt;/strong&gt;: CDEs are effectively a codified version of your readme.md environment setup guide. They describe the expected development environment as code once, and then each instance (or workspace) of that environment will behave exactly the same. Someone unfamiliar with a code base will have the same exact experience as someone that has worked on it for years - all by just pressing a single button. Any changes made to the development environment are automatically picked up by any new instance of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Costly context switches
&lt;/h3&gt;

&lt;p&gt;Reviewing a PR or “quickly” switching from feature work to fixing a bug means switching context - not just mentally, but also in the development environment. You need to checkout a different code branch, build it, and install dependencies. This can take time, especially with large codebases and varied tool requirements. It's time spent waiting, not coding.&lt;/p&gt;

&lt;p&gt;Hot fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Find ways to reduce the number of “switches”:&lt;/strong&gt; if you do PR reviews in the morning only, you might be able to reduce the number of times you switch contexts because you do not need to switch back and forth as often, and can review PRs that require similar environments all at once.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;(again) Leverage CDEs&lt;/strong&gt;: with CDEs, you can easily do a PR review without having to make any changes to the environment you are working in. Instead, just spin up an entirely new environment just for that other branch or PR you want to check out, do what you need to do, and then switch back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The role of the developer, whether working individually or as part of a team, is marked by challenges that extend beyond simply writing effective code. The challenges that arise compound when developers need to collaborate with others. Cloud Development Environments (CDEs), where a developers environment is standardized and readily available in the cloud, are a holistic solution to all of the challenges listed above. CDEs are worth a deeper look if you can identify with the challenges listed - find out more by &lt;a href="https://www.gitpod.io/whitepaper/cde"&gt;downloading our white paper&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tooling</category>
      <category>devdiscuss</category>
    </item>
    <item>
      <title>Confessions from sales: my playbook for creating a bulletproof business case to invest in a developer tool</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Thu, 14 Dec 2023 13:46:47 +0000</pubDate>
      <link>https://forem.com/gitpod/confessions-from-sales-my-playbook-for-creating-a-bulletproof-business-case-to-invest-in-a-developer-tool-m8d</link>
      <guid>https://forem.com/gitpod/confessions-from-sales-my-playbook-for-creating-a-bulletproof-business-case-to-invest-in-a-developer-tool-m8d</guid>
      <description>&lt;p&gt;Let’s face it: most software engineers struggle with business cases. Most engineers focus too much on solutions, jargon, and details, and not enough on hard-hitting and straight-talking business value. The best engineers, however, know how to speak the language of the business and translate technical projects into real business impact.&lt;/p&gt;

&lt;p&gt;So, why is it that some engineers thrive where others struggle?&lt;/p&gt;

&lt;p&gt;Now, I know what you are already thinking: “That’s bold! How do you know engineers are so bad at writing business cases?” And the short answer is: because I watch engineers struggle creating business cases every day. And it’s my job to help engineers craft business cases that compel, speak to technical leaders like CTOs and CISOs, and ultimately get projects off the ground. Let me explain…&lt;/p&gt;

&lt;p&gt;Gitpod has a free tier, open to the entire world. Which means that we’ve seen over 1 million developers on our platform. Rather unsurprisingly, we get asked every single day: &lt;strong&gt;“&lt;em&gt;I love Gitpod! How can I convince my boss that I can also use Gitpod at work?&lt;/em&gt;”.&lt;/strong&gt; Whilst I absolutely love hearing this question, I can’t help but feel how this question has flaws. The question is not really “how can I convince my boss?”. The question is: &lt;strong&gt;“How do I show how Gitpod can help my company to achieve its goals?”.&lt;/strong&gt; And this applies to any developer tool, also.&lt;/p&gt;

&lt;p&gt;Today, I’m going to give you the playbook I use when helping Gitpod customers create business cases. I’ll use Gitpod as the example here, but you can easily apply this playbook to build a rock solid business case for any product or tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1 - start with the “why?”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When it comes to embarking on any new initiative, it’s imperative that you start to think very deeply about your “why”. What needs are you hoping to fulfill with this project? What is the compelling future you are creating for your organization? Or, what urgent need are you solving?&lt;/p&gt;

&lt;p&gt;If you have not read “start with the why” by Simon Sinek - it’s a book on leadership and persuasion. Sinek argues: “People don’t buy what you do, they buy why you do it” and the same is exactly true when it comes to building business cases. If you are having issues you know a cloud development environment can solve for - your peers and managers are simply going to want to know “why should we purchase this?”&lt;/p&gt;

&lt;p&gt;You should have this thought fully fleshed out. Does this help achieve overarching business goals such as shipping product faster? Does it help with your developer experience initiative? Does it help with a mandate around security? Does it help strengthen the story of your cloud first-approach to infra and tooling? All of these questions help tie back to why purchasing this tool impacts goals that your leadership are thinking about.&lt;/p&gt;

&lt;p&gt;Another way to help tie back to business goals is by explaining the problems and pain you are feeling today. Use this as an anchor to justify how this tool’s solution is going to help with the given problems. We will circle back to this as it’s part of the business case - but before doing the work - you need to understand how to articulate the why.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2 - research and requirements.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Google is your friend. Forums are your friend. G2 is your friend. Reddit has good info. Find out who the top vendors are and research them deeply to determine who you may want to partner with. How should you decide?&lt;/p&gt;

&lt;p&gt;There are 2 ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Social proof (reviews, ads, word of mouth)&lt;/li&gt;
&lt;li&gt;  Trying the free version of the product to get an idea of what that product is like.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After you understand what vendors stand out - make a short list. Looking at 12 vendors is a waste of time - in most cases only 3-5 vendors will be best in class, the rest will be column fodder. There is no reason to subject your team to look at 12 vendors just to find out the top vendors were the most popular for a reason.&lt;/p&gt;

&lt;p&gt;Then comes the hard part - creating technical requirements.&lt;/p&gt;

&lt;p&gt;For CDE vendors, you should understand if they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Support connectivity to cloud and on-prem resources&lt;/li&gt;
&lt;li&gt;  Work with all your IDEs and editors&lt;/li&gt;
&lt;li&gt;  Are extensible with your existing tooling&lt;/li&gt;
&lt;li&gt;  Support your SCM of choice&lt;/li&gt;
&lt;li&gt;  Connect to your security tools (SSO, VPN, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For CDEs, this is not just a tool for developers, platform, security, devops or engineering leadership. It is actually a powerful platform that will affect all of them - and you should absolutely find out what is important to each stakeholder group and invite them to look at your requirements list. I call this out as this is the case for many developer tools now, and leveraging the wants and needs across cross-functional stakeholders, will only strengthen your case.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3 - engage vendors.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You have a reason for why, you understand your company's technical requirements across stakeholders and you know who the top vendors are in the space. It is time to (take a deep breath) - talk to salespeople.&lt;/p&gt;

&lt;p&gt;As someone who has been a sales person for over a decade - I promise we are not all bad. Remember - the more open you are with your account executive - the more they can help you and that is what they are there for. They will run a process called discovery to better understand the current state of your business, your pain points, internal structure and tech stack to determine if you are a good fit for their offering.&lt;/p&gt;

&lt;p&gt;If you come prepared with your technical and business requirements - this will tremendously help them assist you - doing this work beforehand will also allow you to stay objective in your evaluation and not get a vendor to suggest a checklist that only aligns to their offerings.&lt;/p&gt;

&lt;p&gt;Vendors should be helpful to you in this process - but they can only be helpful if you give them relevant information and access to the team to make a consensus driven decision. Taking a first call with just yourself is fine - but be prepared to invite other folks from your team to the demo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4 - shortlist, test and start the internal procurement process.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You are now at the proof of concept stage. Something that we refer to as a proof of value here at Gitpod - as successful evaluations consider both technical and business requirements.\&lt;br&gt;
Before you dive into a POV with anyone - it would behoove you to understand your internal procurement process - especially if you have not done this before. A typical procurement process will need the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Alignment across all teams that the issue is real and works within their boundaries.&lt;/li&gt;
&lt;li&gt;  An executive buyer (someone who can sign a contract and has access to budget for a tool).&lt;/li&gt;
&lt;li&gt;  A security review - your team likely has a questionnaire for software vendors to complete.&lt;/li&gt;
&lt;li&gt;  Contacts from procurement and legal that will need to be involved to negotiate on terms and commercials of the agreement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can never start this process too early. Vendors can assist you in navigating this process, but only introduce vendors you like and trust.&lt;/p&gt;

&lt;p&gt;In the POV stage, it is important to test our use cases that solve for your “whys”. Deep technical testing, combined with commercial evaluation will set you up for success. You will need to carve out employee time for these projects. As a rule of thumb - you should never, ever, POV with more than 3 vendors at once. It will be very clear what products are technically sound and which products are not a good fit within the first few days of getting it up and running.&lt;/p&gt;

&lt;p&gt;During the testing phase we recommend devoting at least 8-10 dev hours to each vendor you are evaluating. It’s important to give each platform a rigorous trial to make sure that you’re comfortable with installation, setup, and usage.&lt;/p&gt;

&lt;p&gt;For CDEs specifically - there should be a big emphasis on developer experience - as you are changing a workflow devs have known their entire career. Get feedback from them - as end user adoption is the most critical part of a successful implementation. Here at Gitpod - we send out engineering surveys before and after testing to measure results (link content here).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 5 build your business case&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You should have nailed your “whys” and identified some main use cases that you validated are solved for with your vendors. Once you have identified your emerging winner - you have to build out a business case with that vendor.&lt;/p&gt;

&lt;p&gt;In the business case you should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A history of the why.&lt;/li&gt;
&lt;li&gt;  Metrics around how pains of local development are hurting staff today.&lt;/li&gt;
&lt;li&gt;  A return on investment calculation&lt;/li&gt;
&lt;li&gt;  A summary of why you chose that specific vendor as preferred and some high level information about them - including price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your vendor should help you put the above together. Here at Gitpod, we help our partners with the business case and have a very detail oriented ROI calculator (&lt;a href="https://dev.to/contact/sales"&gt;contact us&lt;/a&gt; if you’re interested in a copy) that tells you how much money you will save by implementing a CDE with your data inputs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ytexT-io--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/how-to-buy-a-developer-tool/Gitpod-ROI-calculator.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ytexT-io--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/how-to-buy-a-developer-tool/Gitpod-ROI-calculator.webp" alt="Gitpod ROI Calculator" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 6 - enjoy.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Take a deep breath and get ready to implement and solve your problems. Purchasing a CDE doesn’t have to be a lot of work if you partner with the right company and the benefits will make you and the team look great with less work!&lt;/p&gt;

&lt;p&gt;If you have any questions feel free to &lt;a href="https://dev.to/contact/sales"&gt;reach out to the sales team at Gitpod&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>The cost vs. UX trade offs of designing and operating CDEs</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Tue, 12 Dec 2023 11:13:20 +0000</pubDate>
      <link>https://forem.com/gitpod/the-cost-vs-ux-trade-offs-of-designing-and-operating-cdes-4937</link>
      <guid>https://forem.com/gitpod/the-cost-vs-ux-trade-offs-of-designing-and-operating-cdes-4937</guid>
      <description>&lt;h2&gt;
  
  
  Let’s build a cloud development environment
&lt;/h2&gt;

&lt;p&gt;Cloud Development Environments (CDEs) offer significant improvements to developer experience and productivity, as well as security by centralizing source code access. Given how close they are to a company's IP and core operations, for some companies and industries it is sensible to consider running them within the company network and build them in-house. But how do you get started, and what are the likely challenges that you will face? This blog post takes you on a mental journey of turning a simple solution into something that works in practice and strikes the right balance between cost and user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  V0: The starting point: always-on VM-based CDEs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3TSNA6Yp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3TSNA6Yp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-1.webp" alt="Cost VS UX diagram" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It makes sense to start simple - after all, &lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; is a well known engineering principle for a reason. Initially, keeping it simple allows you to assess the benefits of CDEs for your company without committing to months-long implementation efforts. The KISS version of CDEs involves providing each developer with a long-running VM in the cloud (e.g. EC2), running &lt;a href="https://github.com/gitpod-io/openvscode-server"&gt;open-VScode-server&lt;/a&gt; on the VM to develop remotely, and using &lt;a href="https://containers.dev/overview"&gt;.devcontainer json file&lt;/a&gt; to describe and standardize the development environment. Running in a container on a VM also has the benefit of your development environment more closely resembling your production environment. This solution will allow you to benefit from &lt;em&gt;some&lt;/em&gt; of the &lt;a href="https://www.gitpod.io/cde"&gt;core benefits of CDEs&lt;/a&gt;, namely equitable and consistent development environments. And notably, this architecture is how companies like &lt;a href="https://www.youtube.com/watch?v=TjD7fEGMPhE"&gt;Stripe&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=cc10pjk9lLU"&gt;Slack&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=TJsuLPk7ZYw"&gt;Uber&lt;/a&gt; got started on their journeys to building CDE solutions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Side note: successfully rolling out developer tools is not trivial. T&lt;a href="https://www.gitpod.io/blog/champion-building"&gt;his blog post&lt;/a&gt; outlines proven strategies for successful developer tool adoption.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  V0.1: Automatic shut down
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cir3DXjj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cir3DXjj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-2.webp" alt="Cost VS UX diagram" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The fact that the VMs are always on is good for user experience as it allows for quickly jumping in and out of existing development environments with almost no wait times. However, this architecture can become very costly, very quickly. For example, a comparatively small 8 core, 16GB RAM VM with a fast disk (useful because a lot of dev workloads are very I/O heavy) can cost around &lt;a href="https://instances.vantage.sh/aws/ec2/c6id.2xlarge?region=us-east-1&amp;amp;os=linux&amp;amp;cost_duration=monthly&amp;amp;reserved_term=Standard.noUpfront"&gt;$300 per month&lt;/a&gt; at on-demand pricing. Multiplying this by 100 engineers, this costs $360,000 per year.&lt;/p&gt;

&lt;p&gt;Once your CDE solution sees some adoption, it’s sensible to look for ways to reduce cost. The first obvious way is to shut down the VMs when not in use. To do this without losing an engineer’s work you need a reliable way to persist data from a development environment, enabling engineers to pick up where they left off. Allowing engineers to pick up where they left off not only means persisting any working directories where source code may be stored, but also (ideally) also any shell history, environment variables, (ideally) runtime state and more. Without these the developer needs to reconfigure every time they jump into a development environment.&lt;/p&gt;

&lt;p&gt;There are several different storage options, ranging from using the instance storage of the VM to using networked storage (such as EBS or S3 on AWS) that can be detach and reattach to VMs, decoupling the VM from the development environment state. Decoupling storage from VMs increases flexibility, because you can attach the state of one VM to another - such as attaching the state of a “paused” development environment to a pooled or “warm” VM and thus increasing startup times (see below).&lt;/p&gt;

&lt;p&gt;Another complex aspect is the shut down or timeout logic. When do you shut down a development environment? How do you know when an engineer is ‘done’ with their environment and not working late? There are several approaches here, ranging from hour of the day based shut downs, to user-defined timeouts at each startup, or even automatic inactivity-triggered timeouts. The choice depends on the context, however the latter is the most scalable and user-friendly.&lt;/p&gt;

&lt;p&gt;Implementing automatic shutdown of development environments can lead to considerable savings. Assuming a development environment only runs for 10 hours each week day, the abovementioned cost of $360,000 per year would be reduced to ~$104,800 (50 hours per week _ 52 _ $0.4032 p/h * 100 engineers).&lt;/p&gt;

&lt;h2&gt;
  
  
  V0.2: Improving workspace startup times
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--omiSvAg2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--omiSvAg2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-3.webp" alt="Cost VS UX diagram" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This significant cost reduction must be balanced against its impact on user experience. After implementing VM shutdowns, engineers have to wait for an entire VM to spin up whenever they want to write a line of code - at the start of each workday, after timeouts, or when launching additional environments for tasks like PR reviews or testing new features. VM start up times can often take around 2 minutes. And once the VM itself is running, it needs to be setup for development: the devcontainer needs to be spun up and configured, a backup potentially downloaded and unzipped, source code checked out, development tools started, code built and more. If 100 engineers each start their development environment twice a day, and each startup takes 5 minutes, the total daily time lost is 1000 minutes. This is equivalent to over 16 hours, or more than two full 8-hour workdays. Considering an annual wage of $120,000 per engineer, this inefficiency costs around $240,000 a year - about the same as the amount saved by spinning down VMs above! This highlights that improving CDE startup times can be just as if not more effective in saving cost as reducing infrastructure cost. Outside of cost savings via increased productivity, a faster startup time is sure to delight users and keeps them from context switching while waiting.&lt;/p&gt;

&lt;p&gt;Development environment startup times can be reduced in many ways. A sensible first step is to always have a pool of VMs ready to go that can be used to spin up a development environment. When an engineer requests an environment, they receive one from the pool. Then a development environment defined in the .devcontainer.json is started and another VM is spun up to keep the number of VMs in the pool constant. This requires you to build logic that manages this pooling. There is a clear trade off between user experience and cost here: increasing the size of the pool increases the chances that there will be a machine ready to go for every engineer, however this also increases the cost. Finding the right balance depends on how much you are willing to pay for a reduction in startup times.&lt;/p&gt;

&lt;p&gt;While a pool of pre-warmed machines eliminates VM spin-up time, it doesn’t necessarily speed up the setup of development environments. Further, the tasks that are run when starting a development environment are likely the same for most engineers - meaning the same work is happening many times over. To counter this, it is reasonable to implement logic that prebuilds and preconfigures development environments on top of the pooled VMs. With this, startup times can be reduced to less than 1 minute (depending on the code base) and engineers can immediately start developing when they get their environment. Prebuilding also comes with cost versus UX considerations: you need to decide the frequency of prebuilding to incorporate main code changes efficiently. A balanced approach, like prebuilding every 10th commit, could be an effective solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  V0.3: Reducing cost even further:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X0Bs5WLi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X0Bs5WLi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-4.webp" alt="Cost VS UX diagram" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Incorporating the user experience benefits above will unfortunately increase your costs again. For example, a pool of 10 8-core VMs running 10 hours per weekday costs ~$880 month or about $10,400 a year. This is on top of the ~$104,800 that it costs just to run the development environments during working hours. As such, it is sensible to again find more ways to reduce cost.&lt;/p&gt;

&lt;p&gt;Engineers don’t always need 100% of the hardware resources of their development environment. Usually 100% of available resources are only needed when building code or running other compute intensive tasks like data science workloads. If several development environments are run on the same VM, chances are high that not every developer is using all of the hardware resources of their development environment at the same time. This means that we can try to add more development environments onto a VM than would theoretically fit (a.k.a. oversubscribing or overbooking). Doing this can further significantly reduce cost, as we can run more development environments with the same amount of resources. This can be done by running them in containers, and running several containers on each VM. Either via Docker or leveraging container orchestration solutions like Kubernetes (and in this case, achieving this by setting requests and limits appropriately).&lt;/p&gt;

&lt;p&gt;To further optimize cost, it is important to shut down VMs when they are not in use. However, when running several environments on one machine, you need to wait until the last one shuts down before you can shut down the VM. This again can cause unnecessarily high costs. The solution would be to add the capability to shut down a dev environment on one machine and then spin it back up on another - effectively allowing the running development environments to be defragmented, and the utilization of VMs to be increased.&lt;/p&gt;

&lt;p&gt;Depending on how quickly and smoothly this happens, it can impact the user experience and interrupt an engineer in their flow. Again, here is a tradeoff here between UX and cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking stock
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9lEhJpz0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9lEhJpz0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-5.webp" alt="Cost VS UX diagram" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s take stock of how far we got: we created a system that allows developers to fairly quickly spin up an on-demand development environment at a manageable cost. There were many questions that had to be answered, revolving around storage content, timeout logic and duration, architecture choices (VMs versus containers), oversubscribing, prebuild frequency, and the size of the pool of instances that are kept ready. This just scratches the surface of things that need to be considered, but it gives a glimpse at how complex it is to build and operate a CDE solution in house. Some important considerations were not covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  **Observability: **CDEs can quickly become business critical, and hence a good level of observability and alerting is essential.&lt;/li&gt;
&lt;li&gt;  **Updates: **Updates are also critical - when there is a patch for a vulnerability in an image being used, how do you make sure that all development environments are updated when they are running all the time? And how do you update them to avoid impacting users? Also, how do you update the infrastructure (e.g. new AMI) without impacting users?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting to a sensible spot regarding cost versus UX takes a lot of implementation effort. Just trying things out with a naive implementation is unlikely to create a system that can withstand the requirements of continuous use at reasonable cost. To short circuit this, it is practical to consider vendor-managed CDE products such as Gitpod. You can try Gitpod for free today whether it runs in &lt;a href="https://www.gitpod.io/contact/dedicated-self-serve"&gt;your cloud account&lt;/a&gt; or &lt;a href="https://www.gitpod.io/cloud"&gt;Gitpod’s&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rethinking the trade-offs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bV3XJH3I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bV3XJH3I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cost-vs-ux-tradeoffs-building-cdes/cost-vs-UX-diagram-6.webp" alt="Cost VS UX diagram" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a thought: what if this trade-off can be avoided altogether? Imagine having development environments that are available exactly when you need them and gone when you don’t, just like opening and closing a laptop, with all processes running precisely where you left them. And all of this without the cost of perpetually running instances and also with almost unlimited development environments.&lt;/p&gt;

&lt;p&gt;That's exactly what we at Gitpod are working on right now. Stay tuned as we reveal more about our journey to rethink the cost vs. UX tradeoffs of CDEs over the next few months.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>cloud</category>
      <category>ux</category>
      <category>devops</category>
    </item>
    <item>
      <title>Champion Building - How to successfully adopt a developer tool</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Mon, 11 Dec 2023 13:41:59 +0000</pubDate>
      <link>https://forem.com/gitpod/champion-building-how-to-successfully-adopt-a-developer-tool-3n8</link>
      <guid>https://forem.com/gitpod/champion-building-how-to-successfully-adopt-a-developer-tool-3n8</guid>
      <description>&lt;p&gt;So you've just bought a new platform tool? Maybe it's &lt;a href="https://www.vaultproject.io"&gt;Hashicorp Vault&lt;/a&gt;? &lt;a href="https://snyk.io"&gt;Snyk&lt;/a&gt;? &lt;a href="https://backstage.io"&gt;Backstage&lt;/a&gt;? You’re excited about all of the developer experience, security and other benefits you're about to unleash on your company—right? But wait…&lt;/p&gt;

&lt;p&gt;Because, if you've ever rolled out a developer tool, you know: it’s hard. No matter how shiny the tool. If it’s your first time rolling out a tool, I will guarantee that you’ll make mistakes: you’ll push out your tool too early, or too late, which would compromise your timeline. If you misjudge your timing and communications, you risk users having a poor experience, leaving you to fight to win them back in future. These adoption mistakes at best will stall your adoption, but at worst they can completely derail your project, causing it to outright fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this post, you'll learn&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;why running an 'all-hands' demo too early can hurt developer tooling adoption&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;why champion-building is your highest leverage for adoption success&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;best practices for building knowledge, support, documentation and more.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adopting a developer tool is hard
&lt;/h2&gt;

&lt;p&gt;How do I know? Because I've been there. Back in 2021, I was part of a platform team that was one of the first adopters of Backstage. I've also seen what it takes to move &lt;a href="https://medium.com/dazn-tech/a-tale-of-moving-4000-github-repositories-to-github-actions-362ab96b71e6"&gt;4,000 repositories to GitHub Actions&lt;/a&gt; (spoiler: it wasn't easy). And these days, I help our customers adopt Gitpod, a cloud development environment (CDE) for their engineering organizations to improve developer velocity. It's no surprise that I see many similar challenges to those I've faced in the past.&lt;/p&gt;

&lt;p&gt;Over the past couple of years at Gitpod, I've seen the difference between companies that adopt Gitpod quickly and those that take longer to realize the developer velocity improvements that come with a &lt;a href="https://dev.to/cde"&gt;Cloud Development Environment&lt;/a&gt;. So, the big question is: &lt;strong&gt;why are some companies faster at adopting developer tools than others?&lt;/strong&gt; Let's explore that today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beware of the early 'all hands' demo trap
&lt;/h2&gt;

&lt;p&gt;One trend that I've noticed teams gravitate towards in the early days is wanting to run demos or 'all hands' calls, typically involving as many engineers as possible, with the intention of a ‘grand unveiling’.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behold! A new developer tool—in all its glory!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;However, as is nearly always the case with these 'all hands' calls, a group of engineers will immediately try the developer tool, and briefly after exploring it before thoughts of urgent pull requests will flash in their minds, soon leading to those developers having their focus pulled back to their urgent and pressing needs of the business. So, how do we avoid this fate?&lt;/p&gt;

&lt;p&gt;Assuming that visibility is the main challenge and that excitement alone is sufficient for successful adoption. &lt;strong&gt;But the reality is that excitement wanes, and the reality of the business's urgent needs soon takes precedence. And business priorities always win.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's nothing wrong with demoing a developer tool. But it's the timing of these demos and the narrative you craft can be critical to what happens after the demo. Instead of rushing into demos, what I've found most successful is &lt;strong&gt;acknowledging that developer tools adoption is a socio-technical challenge&lt;/strong&gt;, and to which the most effective pattern we see is &lt;strong&gt;champion building&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But, what is champion building? And how do you do it?&lt;/p&gt;

&lt;h2&gt;
  
  
  You need to start champion building
&lt;/h2&gt;

&lt;p&gt;Adopting a developer tool within an organization is not just a technical task, but a socio-technical challenge, necessitating a strategy that involves people, priorities, and technology. &lt;strong&gt;The key to successful adoption lies beyond the tool itself; it's about intentionally engaging engineers and leveraging their surrounding ecosystem for effective adoption.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it's so important to "start small"
&lt;/h3&gt;

&lt;p&gt;One of the most critical factors to getting a tool off the ground, is building simultaneously: organic, real and true support from your own engineers, whilst also building a few compelling real-life use-cases. It's usually important you build this foundation &lt;em&gt;before&lt;/em&gt; widely inviting your engineering organization to use the developer tool that you're adopting.&lt;/p&gt;

&lt;p&gt;Ideally, you start by working with one or two teams or use-cases maximum. &lt;strong&gt;You want these use-cases to be shining examples of the future you're trying to create with the adoption of your new developer tool and ideally use-cases that solve obvious and painful needs of the business.&lt;/strong&gt; Nothing wins over skeptics, naysayers and detractors better than being able to say: "&lt;em&gt;Don't think it's possible? Well let's take a quick tour of how X team are doing things&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;The steps to champion building for a developer tool look something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Identify internal champions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build one or two compelling use cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expand and scale&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 1: Identify internal champions
&lt;/h3&gt;

&lt;p&gt;Find motivated, energetic, and ideally influential engineers within your organization. These champions could be senior engineers like tech-leads, principal engineers, or even junior engineers eager to prove themselves. Look for engineers who are dreamers, who believe in the future, not ones that find solace in the status quo. Once you've got a few champion candidates, it's time for step 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Build one or two compelling use cases
&lt;/h3&gt;

&lt;p&gt;Now that you have your champions, work closely with them, integrating your tool into projects they are involved in where you will see the highest business return. Ensure the use cases you work on are within their sphere of influence and the champion can be available to assist others. That typically means adopting the tool within a project that your champion works on day-to-day.&lt;/p&gt;

&lt;p&gt;It is vital these use-cases are close to your champion's influence, and that your champion has time to support others. Because you will undoubtedly have issues, and will need your champions to be present to quickly resolve them. Time to respond in the early days is going to be very important.&lt;/p&gt;

&lt;p&gt;Avoid the mistake of being too distant with early use cases. &lt;strong&gt;Pull them close. Not just metaphorically, but physically. If you're a co-located company, sit physically with the champion(s) and their teams.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've seen this done well with &lt;a href="https://medium.com/dazn-tech/developer-experience-dx-at-dazn-e6de9a0208d2"&gt;the concept of a "platform team rota"&lt;/a&gt;, where an engineer does a mini "secondment" into the platform team whilst you're getting things up and running.&lt;/p&gt;

&lt;p&gt;As you build out these use-cases the main outcomes you're looking for are to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Grow "institutional" knowledge in your engineering organization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Build documentation that connects the tool and your company context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's break each of these down a little further:&lt;/p&gt;

&lt;h4&gt;
  
  
  Grow "institutional" knowledge in your engineering organization
&lt;/h4&gt;

&lt;p&gt;You want to deliberately build knowledge depth of the tool you're adopting with your champion(s). Deep knowledge only comes from using a tool frequently, ideally day-to-day. &lt;strong&gt;A great litmus test is when you see your champion(s) answering other engineers' questions quickly and without referring to any documentation&lt;/strong&gt;. Institutional knowledge will be vital later in your adoption as it can significantly reduce the support burden which otherwise will fall on the adopting team (read: you).&lt;/p&gt;

&lt;h4&gt;
  
  
  Build documentation that connects the tool and company context
&lt;/h4&gt;

&lt;p&gt;Every organization is structured differently. As you build that institutional knowledge, you want to create documentation which will tie together the developer tool to the specific context of your engineering organization. Most developer tools are highly flexible, so it's not uncommon that you'll need to show how to connect a combination of features to solve certain use-cases.&lt;/p&gt;

&lt;p&gt;In the early days it's common for teams to "copy" other teams configurations and setup. Make sure to signpost the best-in-class examples of how to use the tool. If you don't signpost examples well, engineers are going to search in GitHub and copy/paste whatever they find first, which can be difficult to unpick later, and could lead to a bad first-time experience.&lt;/p&gt;

&lt;p&gt;As you discover tips-and-tricks, document them. Treat each new engineer as an "experiment" to test the effectiveness of your documentation. Pay attention to the questions those engineers ask like: "&lt;em&gt;Can I connect Gitpod to Vault?&lt;/em&gt;" or "&lt;em&gt;How do I login to AWS with Gitpod?&lt;/em&gt;". The frequently asked question (FAQ) format works best for these types of documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus on providing real-world examples and optimize for copy/paste.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Expand and scale
&lt;/h3&gt;

&lt;p&gt;If you've successfully completed the champion-building steps above, you should now have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;One or two compelling use-cases of the tool being used in practice&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some good initial documentation, most likely in an FAQ type format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A handful of engineers who have good institutional knowledge of how the tool works.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You might want to consider quickly surveying your initial use-case engineers to gather quotes. These quotes can be incredibly useful to influence leadership on your return on investment (ROI) in adopting the developer tool. &lt;strong&gt;Social proof is the most powerful currency you have to convince future engineers to switch to a new developer tool.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At this point, running the 'all hands' and focussing on driving visibility to the developer tool can work. Ideally, when planning any demos of the tool, &lt;strong&gt;you don't present the developer tool yourself, but get your champion(s) to tell success stories&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Steer the focus of the stories so that you are leading with the value delivered. Showcase what you achieved with the tool, not just what you did. This is a great opportunity to give your champions credit for helping you to get this far with your adoption, and you want others in your organization to see those champions as "the people to go to" for when they need help, support and inspiration.&lt;/p&gt;

&lt;p&gt;From here it's a case of working through additional teams and use-cases. Continue the same process of building champions, pulling champions close and iterating on their setups. Do it right, and you'll find with each new team you have fewer and fewer issues. Do it right, and you'll see engineers supporting other engineers and adoption will thrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  You're on your way to a successful developer tool adoption
&lt;/h2&gt;

&lt;p&gt;Hopefully this gave you some insights into champion-building, which is what we have seen to be an incredibly successful model for adopting a developer tool within an organization. If it's your first time driving adoption of a developer tool, hopefully you now have some more tools in your toolbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; Identify champions. Build compelling use-cases. Use early engineers to iterate on your documentation. Give visibility to those champions as social proof. Achieve developer velocity.&lt;/p&gt;

&lt;p&gt;Before we wrap up, I wanted to takes a moment to pay a special thanks to the folks who helped proofread and provide additional insight into this blog post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.linkedin.com/in/joshgav/"&gt;Josh Gavant&lt;/a&gt; - CNCF Platforms Working Group&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.linkedin.com/in/simonemms/"&gt;Simon Emms&lt;/a&gt; - Lead Platform Engineer&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://linkedin.com/in/bryanross/"&gt;Bryan Ross&lt;/a&gt; - Executive Advisor&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.linkedin.com/in/williamghelfi/"&gt;William Ghelfi&lt;/a&gt; - Senior Software Engineer &amp;amp; Gitpod Community Hero&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, as always, thank you ! The tech community never ceases to amaze me with it's generosity.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Self-hosted, not self-managed</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Fri, 08 Dec 2023 13:01:12 +0000</pubDate>
      <link>https://forem.com/gitpod/self-hosted-not-self-managed-58ih</link>
      <guid>https://forem.com/gitpod/self-hosted-not-self-managed-58ih</guid>
      <description>&lt;p&gt;When you want to introduce cloud development environments (CDEs) to your organization, you have to decide between building or buying, and self-managing or self-hosting. These decisions are more than just technical, they impact every aspect of your development and operational efficiency. So whether you are managing a team of developers or overseeing the infrastructure of a large organization, understanding the nuances of these decisions, especially self-hosting or self-managing, is crucial for your future strategies.&lt;/p&gt;

&lt;p&gt;In December of 2022, we discontinued our self-managed offering. After three years of trying to make it work we realized that CDE platforms benefit from not being self-managed. While they can be self-hosted, self-management makes them less effective and more costly. In this article I’ll explain why self-managed CDEs do not offer the experience we wanted to provide to our customers - and what an alternative can look like.&lt;/p&gt;

&lt;p&gt;These are hard-won lessons. Giving up on self-managed meant forfeiting seven figures of net-new revenue and eventually led to us laying off &lt;a href="https://www.gitpod.io/blog/building-for-the-long-run"&gt;28% of&lt;/a&gt; Gitpodders beginning of 2023. Those were never easy decisions. The alternative we created with Gitpod Dedicated, which is still self-hosted but not self-managed, is so much better - and we have the customers to prove it.&lt;/p&gt;

&lt;h2&gt;
  
  
  CDEs are mission critical
&lt;/h2&gt;

&lt;p&gt;Cloud Development Environments are mission critical software. They are the place in which developers write software, review their work and use the tooling required to be &lt;a href="https://dev.to/ready-to-code"&gt;ready to code&lt;/a&gt;. When your CDE service is down your engineers cannot work - every minute of downtime is very expensive and frustrating. Therefore, reliability is fundamental for any CDE service. This basic need is well understood by organizations adopting CDEs and often drives their desire to self-manage their CDE installations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---zrc4r9G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/self-hosted-not-self-managed/gitpod-customers-hierarchy-of-needs.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---zrc4r9G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/self-hosted-not-self-managed/gitpod-customers-hierarchy-of-needs.webp" alt="Gitpod Customer's Hierarch of needs" width="800" height="753"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tight vertical integration is crucial to deliver an experience that adheres to the &lt;a href="https://dev.to/cde"&gt;CDE principles (Equitable, On-Demand, Extensible, Consistent)&lt;/a&gt;, while meeting basic needs. Hence, full control over the technology stack that powers a cloud development environment is a prerequisite. Any flaw in integrating the various components of a CDE can undermine reliability and security. Consider, for example, workspace content: there’s little more excruciating than losing your work after hours of intense concentration. Any CDE must ensure that your changes are not lost because of state handling bugs or node failures - something which requires significant influence over the underlying infrastructure.&lt;/p&gt;

&lt;p&gt;CDEs aren’t merely better VDIs or VMs moved to the cloud. They represent a foundational shift in how we develop software, how we collaborate and what expectations we have towards our development environments. We want to build the best experience possible, and not compromise on the lowest common infrastructure denominator.&lt;/p&gt;

&lt;p&gt;Until 2023, Gitpod offered a product inaccurately labeled as “Gitpod Self-Hosted”. At the time,  we didn’t understand the difference between self-hosted and self-managed. Self-hosted implies that the service runs on your infrastructure, such as an AWS account, and aids in network integration and compliance. In contrast, self-managed means taking full operational responsibility for the service. The distinction has become increasingly relevant with the growing popularity of Software as a Service (SaaS) offerings.&lt;/p&gt;

&lt;p&gt;Self-managing CDEs seems intuitive, as it aligns with decades of engineering ‘best practice’.  Engineers are accustomed to maintaining their own development environments and adjacent services, like Continuous Integration. However, running a service close to home differs significantly from managing it yourself. Managing a service, i.e. assuming responsibility for it means overseeing every aspect: components, data storage methods, computing resources, and network setup. In cases of downtime, the burden falls on the operator who is then called out of bed. This level of control introduces demands to CDEs that can conflict with the vertical integration required to provide a great user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing self-managed CDEs is hard
&lt;/h2&gt;

&lt;p&gt;Any CDE provider integrates a number of different services and functions. Consider storage: whenever a workspace stops, its content needs to be backed up, often in object storage like S3. Chances are your organization already runs its own storage service, maybe MinIO. Wouldn’t it make sense if the CDE service you want to operate reused that existing MinIO installation? This preference extends to other CDE components. Operating yet another database, no thank you - we already got one over here. Docker registry? Our security team says we have to use Artifactory. Kubernetes? That would be GKE on 1.25, thank you very much. As the team who’s responsible for making sure the most foundational need –reliability – is met, it’s just sensible to rely on existing infrastructure. This also adds a complex set of requirements to any CDE of your choice: it has to support all these existing technologies and systems.&lt;/p&gt;

&lt;p&gt;In larger organizations, chances are these existing infrastructure systems are managed by teams of their own. There’s the Kubernetes team, the networking team, the S3 team, and the database team. Coordinating with these teams for self-managing a CDE platform can be a complex task. You’ll need to make sure that what those teams offer aligns with the requirements and capabilities of the CDE software you intend to run - and if not, need time from those teams to ensure they do. We have seen this process take weeks, sometimes months. Self-managing a CDE in the real world can be a complex and time consuming endeavor of organizational navigation.&lt;/p&gt;

&lt;p&gt;Kubernetes is the hardest part of this technology stack. Few organizations have a team which truly understands Kubernetes in depth - most, sensibly, focus on operational concerns and methodology. For CDEs that use Kubernetes, like Gitpod, deep integration is essential to deliver expected security and performance. Point in case: &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/"&gt;dynamic resource allocation&lt;/a&gt;. Gitpod has supported resource overbooking for many years, but only recently has this capability found its way into Kubernetes. To make this happen we had to break the abstractions Kubernetes provides and interface with the container runtime and Linux cgroups directly. The same is true for &lt;a href="https://www.cncf.io/online-programs/power-to-the-people-making-root-docker-a-reality-inside-a-gitpod-container/"&gt;security boundaries&lt;/a&gt;, network bandwidth control, IOPS and storage quotas. Such deep vertical integration imposes specific requirements on the container runtime (e.g. has to be containerd ≥ 1.6), Linux kernel version or filesystems, which are unusual for typical Kubernetes-focused teams, but not for CDEs.&lt;/p&gt;

&lt;p&gt;While the consumption of Kubernetes software has improved, with increased skill and knowledge among teams and UX enhancements within the community, managing complex Kubernetes software remains a significant challenge. This has led to  &lt;a href="https://www.replicated.com/"&gt;entire companies&lt;/a&gt; being built to attempt to solve this problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frankensteining software
&lt;/h3&gt;

&lt;p&gt;The inherent need to adapt CDEs to pre-existing infrastructure and an innate desire for integration within an existing ecosystem often results in a situation we’ve come to call “frankensteining”. For CDE vendors, accommodating the diverse ways of integrating with various infrastructures is a challenging task.&lt;br&gt;
As a CDE customer, the desire for deeper integration with the CDE platform frequently outpaces what the platforms currently support. This is especially true for customers managing and owning the software. Naturally additional means for authentication using internal APIs are added, new custom features are built on assumptions which break with the next update. That clandestine CDE installation becomes a frankenstein implementation that is hard to update, difficult to operate and near impossible to support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operating self-managed CDEs is bad for your sleep
&lt;/h2&gt;

&lt;p&gt;Now, you’ve managed to piece together all the required bits of infrastructure. You’ve gone through the installation and are finally up and running. Developers in your organization love their CDEs: no more “works on my machine” issues, onboarding time is virtually non-existent - as are context switching costs - and you got brownie-points from your security team because endpoint security is less of a concern. In short, the CDE platform you now operate is becoming mission critical.&lt;/p&gt;

&lt;p&gt;Much like any mission critical software, maintaining operational excellence is crucial. Observability forms the cornerstone of your ability to guarantee the most foundational need: reliability. Much like the other infrastructure building blocks you probably already have an observability stack in place - and if not you’ll need one now. CDEs sport a myriad of failure modes, due to their dynamism (starting and stopping workloads several hundreds of times a day) and variance (developers run a variety of different applications with different load profiles). Once you’ve integrated the multitude of metrics, imported or built your own dashboards, understood and set up the alerts and hooked it all up to your PagerDuty installation, you can finally sleep well again - until PagerDuty ends your slumber of course.&lt;/p&gt;

&lt;p&gt;Every month or so a new update will be available. Considering that CDEs are mission critical, updates must cause no downtime - expected or unexpected. Kubernetes simplifies this process but isn’t a complete solution. Successful updates require cooperation between your team and the CDE vendor to ensure tools and methods, like blue/green deployments or canary releases, are in place for smooth transitions. Ensuring continuous operation of all workspaces, preserving ongoing work, and maintaining functionality of integrations like SCM, SSO, Docker registries, package repositions, can be stressful. Better do this on a Sunday morning.&lt;/p&gt;

&lt;p&gt;Frankensteined installations make updates a gamble and these custom configurations deviate significantly from the standard setups tested by CDE vendors rendering them unhelpful. The uncertainty of whether your customizations will remain functional post-update adds to the challenge.&lt;/p&gt;

&lt;p&gt;The operational risk and effort of updates incentivizes slow and few updates of your CDE installation. Consequently, staying up to date with security fixes, and offering the latest features your developers crave for is hard. As CDE vendor product cycles become longer, feedback becomes less. It becomes harder for them to provide the best possible experience. This creates a lose-lose situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Hosted, but not self-managed
&lt;/h2&gt;

&lt;p&gt;There’s a middle way that balances customers’ desire for control and integration with the advantage of not having to manage everything themselves: the distinction between self-hosting and self-managing.&lt;/p&gt;

&lt;p&gt;In November 2022, during an offsite in beautiful &lt;a href="https://sonomacounty.ca.gov/"&gt;Sonoma County&lt;/a&gt; we made the decision to end our self-managed offering, previously mislabeled as “self-hosted”, in favor of what we now call &lt;em&gt;Gitpod Dedicated.&lt;/em&gt; This was not an easy decision with very direct and tangible consequences. However, years of providing a self-managed CDE offering led us to believe that there must be a better way: self-hosted, but vendor-managed.&lt;/p&gt;

&lt;p&gt;“Vendor-managed” solutions have become a standard way to  consume software, most commonly referred to as Software as a Service (SaaS). SaaS offers several compelling benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  It eliminates the need for you to operate the software, as you can purchase a Service Level Agreement (SLA) directly from the vendor, freeing your resources and ensuring someone else is called out of bed when things go sideways.&lt;/li&gt;
&lt;li&gt;  It requires minimal upfront investment; you simply sign up and start using the product.&lt;/li&gt;
&lt;li&gt;  It removes the burden of updating the software, as you automatically receive updates and new features.&lt;/li&gt;
&lt;li&gt;  The quality and features of the software improve rapidly, as vendors can execute quicker feedback loops and product development cycles in a SaaS model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More and more companies aim to bring these benefits to a self-hosted model. Database vendors like PlanetScale, data service providers like Databricks or Snowflake, and other developer tooling companies have pioneered this approach. For Cloud Development Environments, this model is nearly ideal, offering a practical balance between control and enjoying convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Hosted, vendor managed CDEs: Gitpod Dedicated
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MyPElaLl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/self-hosted-not-self-managed/gitpod-dedicated-architecture-overview.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MyPElaLl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/self-hosted-not-self-managed/gitpod-dedicated-architecture-overview.webp" alt="Gitpod Dedicated architecture overview" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s look at the Gitpod Dedicated architecture to understand how such a self-hosted, vendor managed CDE can look like. First, we need to distinguish between infrastructure and application.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Infrastructure management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  All infrastructure is installed using a vendor-supplied CloudFormation template in less than 20 minutes. This template orchestrates the creation of things like a VPC, subnets, load balancer, EC2 auto-scaling groups, an RDS database, and crucially, all IAM roles and permissions.&lt;/li&gt;
&lt;li&gt;  The customer applies and updates this CloudFormation template, ensuring they retain complete control over their infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Application management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  The Gitpod application, operating on this infrastructure, is installed and updated through a set of Lambdas deployed as part of the overall infrastructure.&lt;/li&gt;
&lt;li&gt;  These Lambdas connect to a control plane responsible for orchestrating updates and handling operational aspects like telemetry, alerting and log introspection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A pivotal aspect of this model is the meticulous separation of permissions, allowing customers to maintain authority over their infrastructure while offloading the operational burden of the software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early Adoption
&lt;/h2&gt;

&lt;p&gt;Gitpod Dedicated was developed in close collaboration with early adopter customers, ensuring its architecture would meet the stringent security and architecture requirements of diverse companies. Gitpod Dedicated has since been reviewed - and passed - the most stringent security reviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Forward-looking industry leaders like &lt;a href="https://www.dynatrace.com/"&gt;Dynatrace&lt;/a&gt; and &lt;a href="https://www.adaptavist.com/"&gt;Quizlet&lt;/a&gt; have since adopted Gitpod Dedicated, praising its ease of installation and low operational overhead.&lt;/li&gt;
&lt;li&gt;  Large financial institutions adopted CDEs by virtue of the control afforded by the Dedicated architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Several customers have migrated from our previous self-managed offering to Gitpod Dedicated. All reported reduced operational effort and some saw up to 93% faster workspace startup times.&lt;/p&gt;

&lt;p&gt;We have time and time again seen how simple vendor-managed CDEs are to install. Throughout the many Gitpod Dedicated installations, it’s become clear that reducing the variance of how a product is installed makes the product more reliable and easier to use.&lt;/p&gt;

&lt;p&gt;We’re always looking to learn more about how to make the experience of using CDEs optimal while meeting any and all security and architecture requirements that organizations have. &lt;br&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://gitpod.io/contact/dedicated-self-serve"&gt;&lt;strong&gt;trial Gitpod Dedicated&lt;/strong&gt;&lt;/a&gt; today and drop us feedback on what your experience was like.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Internal developer portals aren't a silver bullet for platform engineering</title>
      <dc:creator>Pauline P. Narvas</dc:creator>
      <pubDate>Mon, 04 Dec 2023 12:54:38 +0000</pubDate>
      <link>https://forem.com/gitpod/internal-developer-portals-arent-a-silver-bullet-for-platform-engineering-3h8b</link>
      <guid>https://forem.com/gitpod/internal-developer-portals-arent-a-silver-bullet-for-platform-engineering-3h8b</guid>
      <description>&lt;p&gt;A hard-to-ignore &lt;a href="https://danielbryantuk.medium.com/kubecon-chicago-key-takeaways-3de5ca13b375"&gt;theme&lt;/a&gt; at KubeCon this year was how many organizations are grappling with the challenges of improving developer velocity and wrangling the increasing complexity of their tooling. To improve the situation, many organizations are now investing in, or exploring the idea of platform engineering as the solution to their developer velocity challenges.&lt;/p&gt;

&lt;p&gt;In the absence of a prescriptive guide on how to build a platform, many organizations are turning to internal developer portals as their first investment. Whilst some organizations do achieve success, many are also struggling. The “average Backstage adoption rate is stuck at 10%” reported &lt;a href="https://thenewstack.io/how-spotify-achieved-a-voluntary-99-internal-platform-adoption-rate/"&gt;The New Stack&lt;/a&gt;. For inexperienced platform teams, internal developer portals risk becoming a hammer looking for a nail in a scramble to solve for developer velocity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this article, we explore the trend towards internal developer portals, and the reasons why many platform teams seem to be struggling with adoption. We then take a look at why our platform tools must use interfaces most relevant to our developers, if we are to avoid needing to resort to top-down mandates to spur platform tooling adoption. Drawing on my past experiences adopting Backstage, and stories from Gitpod, hopefully you’ll be able to avoid similar mistakes and instead achieve successful adoption for your platform.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Vp8y0Re--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/backstage-wilderness.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Vp8y0Re--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/backstage-wilderness.webp" alt="Build an ecosystem, not a wilderness" width="800" height="406"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Caption:&lt;/strong&gt; "Build an ecosystem, not a wilderness" - slogan from the &lt;a href="https://backstage.io/"&gt;Backstage&lt;/a&gt; homepage.&lt;/p&gt;



&lt;p&gt;Backstage &lt;a href="https://backstage.io/blog/2020/03/16/announcing-backstage/"&gt;first launched in 2020&lt;/a&gt; by the engineering team at Spotify. The announcements caught the eye of the developer experience team &lt;a href="https://medium.com/dazn-tech/developer-experience-dx-at-dazn-e6de9a0208d2"&gt;I was working on&lt;/a&gt; at DAZN. What Spotify were articulating in their messaging felt so painfully similar to what we felt at the time, as we wrangled with trying to support in increasing the developer velocity of a scaling engineering organization, built on top of microservice principles and architecture.&lt;/p&gt;

&lt;p&gt;Software sprawl was rife. Duplicated work was happening across many different libraries and packages across the organization. Developers complained of the amount of work and platform knowledge required to launch a new service. Reliability was a top concern, and during incidents, it was often hard to figure out which service belonged to which team, leading to longer than tolerable outages. Leadership could only look on, dismayed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“&lt;em&gt;Build an ecosystem not a wilderness”&lt;/em&gt;&lt;/strong&gt; was the messaging of Backstage. Which resonated deeply with us, and soon we became &lt;a href="https://github.com/backstage/backstage/pull/6118"&gt;early adopters&lt;/a&gt;. Since Backstage was announced the market for internal developer portals has exploded, and we see many other tools in the market like &lt;a href="https://www.getport.io/"&gt;getport&lt;/a&gt;, &lt;a href="https://cortex.io/"&gt;cortex&lt;/a&gt;, &lt;a href="https://www.opslevel.com/"&gt;opslevel&lt;/a&gt; offering various takes on the same underlying principles of having a centralized, extensible catalog “single-pane-of-glass” into your internal developer platform.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--usStK-B0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/dev-experience-worse.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--usStK-B0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/dev-experience-worse.webp" alt="Worse DevX" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caption:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=Ojh6Ekc3ifc"&gt;Five Backstage lessons in 5 minutes - Chris Westerhold, Thoughtworks&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;However, with the growth of Spotify Backstage, comes a growing emphasis on internal developer portals as a significant piece of the platform engineering puzzle. With many newly minted platform engineering functions risk making the cardinal sin of the platform, which is thinking &lt;strong&gt;“if we build it they will come”.&lt;/strong&gt; As &lt;a href="https://www.linkedin.com/in/chriswesterhold/"&gt;Chris Westerhold&lt;/a&gt; of Thoughtworks pointed out at his BackstageCon talk: “you can actually make your developer experience worse” (&lt;a href="https://twitter.com/phennex/status/1721566517806891235/photo/1"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;It’s becoming a trope that every Backstage talk seems to start and end more-or-less identically with an opener like: “&lt;em&gt;we had challenges with developer experience, we started our journey to platform engineering, then we discovered Backstage…&lt;/em&gt;”. before coming to a conclusion with some variation of: &lt;strong&gt;“&lt;em&gt;internal developer portals aren’t a silver bullet&lt;/em&gt;”&lt;/strong&gt;, or...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“&lt;em&gt;If you build it they will come&lt;/em&gt; doesn’t work”&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This trend points to a repeating pattern.&lt;/p&gt;

&lt;p&gt;Which makes me wonder: did these platform teams not watch the other adopter talks? Or, do these platform teams believe they are unique enough to not need to heed the warnings from others who have walked a similar path before them? And finally, what is it about internal developer portals that creates such a big challenge for adoption?&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I8KhbBMy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/spotify-model.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I8KhbBMy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/spotify-model.webp" alt="Spotify Engineering Culture" width="800" height="467"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Caption:&lt;/strong&gt; &lt;a href="https://engineering.atspotify.com/2014/03/spotify-engineering-culture-part-1/"&gt;Spotify Engineering Culture&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Spotify’s Backstage feels to have a parallel to &lt;a href="https://www.atlassian.com/agile/agile-at-scale/spotify"&gt;the Spotify model&lt;/a&gt;, a structure for engineering organizations that Spotify popularized. The spotify model was subsequently adopted by many organizations as the “silver bullet” to their software delivery challenges. However, as many organizations soon found out: &lt;strong&gt;what works for Spotify might not work for you.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Just as the human body can “reject” a foreign transplant, engineering organizations can reject “implanted” culture and tools, including developer portals.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I believe a big part of the challenge here is that platform teams make the mistake of jumping too early to the solution. &lt;strong&gt;Skipping over the—often difficult—step of building a deep, empathetic understanding for the problem they are solving.&lt;/strong&gt; However, the realization of the overconfidence always comes too late in the process, typically when the developer portal is unveiled and the adoption numbers don’t grow as you might have hoped. If the agile revolution taught us anything, it’s that we must test our assumptions, and work in small iterations to de-risk.&lt;/p&gt;

&lt;p&gt;Another challenge is that &lt;strong&gt;when the path of least resistance for new platform capabilities is the developer portal, portals become the go-to option for interfacing into the platform&lt;/strong&gt;. Portals might be easy to implement, but that doesn’t mean they’re easy for developers to adopt. When adoption challenges arise, the common response is usually that the portal “needs more functionality”. However, what experience has taught me is that adding more functionality into a developer tool seldom solves adoption challenges—as the challenges are often more complex.&lt;/p&gt;

&lt;p&gt;What I’ve learned from my time working on platform teams in the past, and now from working on product at Gitpod is how critical it is to&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Leave interface choice to the developer—and never break their workflow”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As articulated by &lt;a href="https://www.youtube.com/watch?v=ZPNrVAWRZh4"&gt;Humanitec&lt;/a&gt; in: how to make an enterprise grade internal developer platform.&lt;/p&gt;

&lt;p&gt;Because, if you’ve ever tried, you know just how difficult it is to change the habits of your users. And this is particularly true if your users are developers.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mYR9Ghu5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/mechanical-keyboard.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mYR9Ghu5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/internal-developer-portals-not-a-silver-bullet/mechanical-keyboard.webp" alt="Mechanical Keyboard by Michelle Ding" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caption:&lt;/strong&gt; Mechanical Keyboard by Michelle Ding (&lt;a href="https://unsplash.com/photos/black-and-orange-computer-keyboard-50uD7HzOLW8"&gt;Unsplash&lt;/a&gt;)&lt;/p&gt;



&lt;p&gt;Developers are highly technical users, with incredibly specific behaviors that have been honed through their many years of their professional work. Developers are often tuned towards quite specific interface mental models when completing certain tasks.&lt;/p&gt;

&lt;p&gt;When it comes to tooling adoption, what I’ve come to learn is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The sane choice—often the &lt;em&gt;only&lt;/em&gt; choice—is to: "meet developers where they are аt"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We need a deep understanding of our developers, and we need to understand their behavioral patterns. User researchers have understood the importance of observing users in their natural environment for some time to inform product decision making, researchers call this practice &lt;a href="https://www.nngroup.com/articles/contextual-inquiry/"&gt;contextual inquiry&lt;/a&gt;. Which is the practice of observing users in their context, to more deeply understand how they perform certain tasks. Why? Because &lt;strong&gt;the best indicator of future behavior is past behavior.&lt;/strong&gt; With platform tooling, we’re often trying to nudge developers towards best practices. To do this, we need to understand developers' current behaviors.&lt;/p&gt;

&lt;p&gt;To underscore how critical it is to “meet developers where they are at”, let me give you a few examples from my time working at Gitpod. At the time of writing, Gitpod has over &amp;gt;1 million developers on the platform. &lt;strong&gt;In building out Gitpod, we’ve learned a lot about developer experience, and we’ve also certainly made our fair share of mistakes.&lt;/strong&gt; But what we’ve also  seen is that every time we move closer to meeting developers where they are at, we also see a spike in adoption, which is not merely a coincidence.&lt;/p&gt;

&lt;p&gt;For context, Gitpod is a “Cloud Development Environment''. Which in simple terms means that when developers are using Gitpod, they don’t work on their own machines, but they work in the cloud. There is certainly a lot more to cloud development environments, in general, but that’s not the purpose of today's blog. All you need to know is that the primary interface to Gitpod is mostly an editor or IDE. And, as we’ve learned over the years, the editor is at the center of the developer workflow—a very sensitive part of the developer experience.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GNfWU1LD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cloud-ide-history/cover_cloudIDE.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GNfWU1LD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.gitpod.io/images/blog/cloud-ide-history/cover_cloudIDE.jpg" alt="" width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Caption:&lt;/strong&gt; Header image from &lt;a href="https://www.gitpod.io/blog/cloud-ide-history"&gt;From Theia to OpenVSCode Server - A history of Cloud IDEs&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;The first time we saw one of those significant spikes in adoption was when Gitpod moved from the browser-based editor developed by Gitpod called &lt;a href="https://www.gitpod.io/blog/cloud-ide-history"&gt;Theia to VS Code&lt;/a&gt;. At the time, this move felt bold and risky. Theia was inspired by and looked incredibly similar to VS Code. But, what we learned in hindsight was how the developer experience simply wasn’t good enough for mass adoption. Developers wanted the full, undiluted VS Code experience they had come to rely on—and not some “diet coke” version. As I mentioned, the editor is one of the most sensitive aspects of the developer experience, and even subtle differences cause distraction and pull developers out of their flow state. Moving to VS Code marked one of the first major upticks in users on the platform, no doubt attributed to the familiarity and convenience of VS Code.&lt;/p&gt;

&lt;p&gt;We then saw another similar spike in adoption when we &lt;a href="https://www.gitpod.io/blog/gitpod-jetbrains"&gt;announced our JetBrains integration&lt;/a&gt;. At the time we were astounded by &lt;a href="https://github.com/gitpod-io/gitpod/issues/6342"&gt;just how many users&lt;/a&gt; were using VS Code with Gitpod, but were also secretly dying to use their more familiar JetBrains IDE. Again, possibly unsurprisingly, by giving developers literally their interface of preference, we again saw adoption spike. What I learned throughout both of these stories was just how specific developer requirements for interfaces can be. Admittedly, it can be difficult to comprehend this phenomena unless you’ve experienced it first hand, which is why I also believe that many platform teams are often overly optimistic about their adoption numbers when it comes to new developer tools.&lt;/p&gt;

&lt;p&gt;I could share more examples, but by now I hope the point is fairly clear. Developers are power users, with unique mental models, behaviors and expectations for their tooling. &lt;strong&gt;If hoping developers change their workflows is tied to your platform's success, adoption is going to be a difficult, or even impossible task.&lt;/strong&gt; Because, the more you diverge from meeting developers where they’re at, the more you’ll need to apply top-down pressure, mandates and send threatening emails to get your developers to use your platform tooling. Which goes against the mantra of most platform teams, who actively want their tools to be so good that developers actively want to use them.&lt;/p&gt;

&lt;p&gt;Instead, if we’re looking for true adoption success, we should &lt;strong&gt;choose the right interface for the job, taking each tool on a case-by-case basis&lt;/strong&gt;. Platform teams need to remember how many options we have: building command line interfaces, libraries, editor plugins, browser extensions, slack bots, native apps, pull request apps, continuous integration plugins and more to bring the interface of the platform closer to our developers to support with driving adoption. &lt;strong&gt;We need to avoid the temptation to put all of our platform tools into our portal, simply because we have one.&lt;/strong&gt; That all being said, internal developer portals absolutely do have a very necessary role in our platform engineering stack, but we do need to be careful that portals don’t become a hammer looking for a nail.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the original goal of platform engineering was to keep our developers in flow, then blindly baking every platform tool into a user interface doesn’t make sense. Instead, &lt;strong&gt;we should strive to meet developers where they are at and keep developers in flow.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;A special thanks to the folks outside Gitpod who also helped by reviewing, proofreading or otherwise providing valuable inputs that lead to this blog: &lt;a href="https://www.linkedin.com/in/royronalds/"&gt;Roy Ronalds&lt;/a&gt; (Software Architect), &lt;a href="https://www.linkedin.com/in/nandoit/"&gt;Fernando Villalba&lt;/a&gt; (Platform Engineer, OpsLevel), &lt;a href="https://twitter.com/OrkoHunter"&gt;Himanshu Mishra&lt;/a&gt; (Product, Harness), &lt;a href="https://twitter.com/boristane"&gt;Boris Tane&lt;/a&gt; (Founder, Baselime).&lt;/p&gt;

</description>
      <category>gitpod</category>
      <category>platformengineering</category>
      <category>platform</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Gitpod Cheatsheet</title>
      <dc:creator>Jean-Phi Baconnais</dc:creator>
      <pubDate>Thu, 01 Sep 2022 10:11:30 +0000</pubDate>
      <link>https://forem.com/gitpod/gitpod-cheatsheet-2ek6</link>
      <guid>https://forem.com/gitpod/gitpod-cheatsheet-2ek6</guid>
      <description>&lt;p&gt;Are you familiar with &lt;a href="https://gitpod.io/" rel="noopener noreferrer"&gt;Gitpod&lt;/a&gt;? I offer you a Cheatsheet to discover this awesome tool 🤩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqm5ztjomz1s7ixuc6af.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqm5ztjomz1s7ixuc6af.jpg" alt="Gitpod Cheatsheet" width="800" height="1006"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gitpod</category>
      <category>cloud</category>
      <category>ide</category>
      <category>programming</category>
    </item>
    <item>
      <title>Gitpod x Blockchain</title>
      <dc:creator>Om More</dc:creator>
      <pubDate>Thu, 07 Jul 2022 17:25:43 +0000</pubDate>
      <link>https://forem.com/gitpod/gitpod-x-blockchain-3egd</link>
      <guid>https://forem.com/gitpod/gitpod-x-blockchain-3egd</guid>
      <description>&lt;p&gt;Save your hours for &lt;strong&gt;blockchain&lt;/strong&gt; development by removing hard setup on &lt;strong&gt;Gitpod&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First lets see this repo &lt;a href="https://github.com/MyriadFlow/StoreFront_contracts" rel="noopener noreferrer"&gt;StoreFront_contracts&lt;/a&gt;&lt;br&gt;
This project is build with &lt;a href="https://hardhat.org/" rel="noopener noreferrer"&gt;hardhat&lt;/a&gt; and also has &lt;a href="https://thegraph.com/" rel="noopener noreferrer"&gt;TheGraph&lt;/a&gt; powered indexer in subgraph.&lt;br&gt;
The project provides NFT based smart contract like &lt;strong&gt;ERC721&lt;/strong&gt; build on top of &lt;strong&gt;openzeppelin&lt;/strong&gt; contracts.&lt;/p&gt;

&lt;p&gt;Now lets assume this is your project and you want your co-worker or friend to start with it, well then he can right?&lt;/p&gt;

&lt;p&gt;Nope, that's not that easy.&lt;br&gt;
Try to construct the steps required to do the steps.&lt;/p&gt;
&lt;h2&gt;
  
  
  Like,
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; - Clone (Yeaaaaah!)&lt;br&gt;
&lt;strong&gt;Step 2&lt;/strong&gt; - Install packages (You have npm right? 😏)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;om@linux-pc:/# npm
bash: npm: &lt;span class="nb"&gt;command &lt;/span&gt;not found
om@linux-pc:/# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; - Install node, npm and &lt;code&gt;npm i&lt;/code&gt; (How come you don't have npm &lt;br&gt;
😔)&lt;br&gt;
&lt;strong&gt;Step 4&lt;/strong&gt; - Start local ethereum node&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; ganache-cli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ganache-cli &lt;span class="nt"&gt;-h&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MNEMONIC&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ooof thats going to take time and with another such painful 4-5 steps.
&lt;/h3&gt;




&lt;h2&gt;
  
  
  How to fix this?
&lt;/h2&gt;

&lt;p&gt;Easy, just use &lt;strong&gt;gitpod&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Try going to this &lt;a href="https://gitpod.io/#https://github.com/MyriadFlow/StoreFront_contracts" rel="noopener noreferrer"&gt;link&lt;/a&gt; now and see the magic, everything should be up and running.&lt;/p&gt;

&lt;p&gt;Now new window should open,&lt;br&gt;
just append &lt;code&gt;subgraphs/name/TheLazarusNetwork/MyriadFlow&lt;/code&gt; to url and hit &lt;code&gt;**Enter**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here you can write any graphQL queries and get the needed data.&lt;br&gt;
For example try&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  tokens{
    id
    metaDataUri
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now try changing scripts/deploy.ts line 48 to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;creatify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createArtifact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://ipfs.infura.io/ipfs/itworks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the way this field is for &lt;strong&gt;ipfs&lt;/strong&gt; hash, &lt;code&gt;itworks&lt;/code&gt; is not valid ipfs hash it is just used here for testing.&lt;/p&gt;

&lt;p&gt;Now check your terminal,&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m0naz2efvrd9cft05vu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m0naz2efvrd9cft05vu.png" alt="Terminal after changes to code"&gt;&lt;/a&gt; everything should be redploying live and then you can rerun the query and see that the new ipfs hash is there. Its like live reloading in blockchain development, isn't it?&lt;/p&gt;


&lt;h2&gt;
  
  
  How is that happening?
&lt;/h2&gt;

&lt;p&gt;Again easy, just write &lt;strong&gt;gitpod&lt;/strong&gt; config, like provide initial scripts, start up scripts and custom docker image, like we did that in our repo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.gitpod.Dockerfile&lt;/span&gt;
&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Graph query&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
    &lt;span class="na"&gt;visibility&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;private&lt;/span&gt;
    &lt;span class="na"&gt;onOpen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;open-browser&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;npm install&lt;/span&gt;
      &lt;span class="s"&gt;cd subgraph &amp;amp;&amp;amp; yarn install &amp;amp;&amp;amp; cd -&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gp sync-done depinit&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ethereum Node&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ganache-cli -h 0.0.0.0 -m "$MNEMONIC"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Graph Node&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;cd /home/gitpod/graph-docker/graph-node/docker&lt;/span&gt;
      &lt;span class="s"&gt;docker-compose up -d&lt;/span&gt;
      &lt;span class="s"&gt;sleep 10&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-done graphnode&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create deploy&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-await depinit&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-await graphnode&lt;/span&gt;
      &lt;span class="s"&gt;gp await-port 8020&lt;/span&gt;
      &lt;span class="s"&gt;cd subgraph &amp;amp;&amp;amp; yarn create-local &amp;amp;&amp;amp; cd -&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-done graphdeploy&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Smart contract&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-await depinit&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-await graphdeploy&lt;/span&gt;
      &lt;span class="s"&gt;gp sync-await graphnode&lt;/span&gt;
      &lt;span class="s"&gt;gp await-port 8020&lt;/span&gt;
      &lt;span class="s"&gt;./watch.sh&lt;/span&gt;

&lt;span class="na"&gt;vscode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dbaeumer.vscode-eslint&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;graphql.vscode-graphql&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;juanblanco.solidity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why not gave it a try with your own blockchain project, there is whole easy documentation &lt;a href="https://www.gitpod.io/docs" rel="noopener noreferrer"&gt;https://www.gitpod.io/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also you can contact &lt;a href="https://www.linkedin.com/in/ommore/" rel="noopener noreferrer"&gt;me&lt;/a&gt; and join discord &lt;a href="https://discord.com/invite/gitpod" rel="noopener noreferrer"&gt;server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding 👋&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>thegraph</category>
      <category>ipfs</category>
    </item>
  </channel>
</rss>
