<?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>DEV Community: Cully</title>
    <description>The latest articles on DEV Community by Cully (@flossypurse).</description>
    <link>https://dev.to/flossypurse</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%2Fuser%2Fprofile_image%2F496029%2Fd3212bb5-d605-400d-a43d-c4b35d2e7b8b.jpeg</url>
      <title>DEV Community: Cully</title>
      <link>https://dev.to/flossypurse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flossypurse"/>
    <language>en</language>
    <item>
      <title>Shifting info arch to match user personas</title>
      <dc:creator>Cully</dc:creator>
      <pubDate>Mon, 10 May 2021 16:30:07 +0000</pubDate>
      <link>https://dev.to/temporalio/shifting-info-arch-to-match-user-personas-5f3i</link>
      <guid>https://dev.to/temporalio/shifting-info-arch-to-match-user-personas-5f3i</guid>
      <description>&lt;p&gt;A few weeks ago, around the end of March 2021, I set my focus on finally refreshing the information around Temporal's core concepts. Refreshing the core concepts documentation area had become a major priority in my mind. The area had largely gone untouched in the last couple of years, and user feedback suggested it consisted of far too many industry terms laden with heavy connotations and lacking in practical purpose and use case.&lt;/p&gt;

&lt;p&gt;I figured the best place to start was with Workflows. As I tried to wrap my head around the best approach to introduce this concept to a new user, I fell back on a first principle to writing documentation, asking myself "what does it do?"&lt;/p&gt;

&lt;p&gt;And this is when a wave of realization crashed over me. Like a surfer working their way past the break line, I had been bobbing about in between sets and another had just rolled in.&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%2F6witjd5btc24eaghaa5l.gif" 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%2F6witjd5btc24eaghaa5l.gif" alt="Duck dive" width="490" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had to take a breath, duck under the wall of white water and try and find my angle of approach, suddenly aware that if we didn't get past the break line soon, we may be stuck here for awhile.&lt;/p&gt;

&lt;p&gt;The realization was that the answer to my question was already fairly well defined across any number of resources; A "workflow" is a sequence of processes, from initiation to completion, through which a piece of work passes. A Temporal Workflow is just that, hence the name. Within the context of Temporal, it is &lt;em&gt;how&lt;/em&gt; that happens, and &lt;em&gt;why&lt;/em&gt; it happens in the way that is does that is the secret sauce.&lt;/p&gt;

&lt;p&gt;However, one must learn not only of Temporal's overall strategy, but also language specific implementation details simultaneously to get a taste of that secret sauce. At the time of writing this, we supported three implementation languages with a fourth on the way, with each language presenting its own unique way of defining and writing Workflows. My instinct was that something fundamental was off in the current approach to presenting this information.&lt;/p&gt;

&lt;p&gt;I needed to think.&lt;br&gt;
So, I went for a run.&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%2Fcx1rlwu771y8ogxt2dcz.gif" 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%2Fcx1rlwu771y8ogxt2dcz.gif" alt="Run gif" width="320" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With my legs pumping freshly oxygenated blood through my brain, my heart, and my veins, I set my mind to the task at hand. I tried to come at the problem from a new user's perspective. This is how I discovered a problem that I hadn't fully noticed before.&lt;/p&gt;
&lt;h2&gt;
  
  
  User personas
&lt;/h2&gt;

&lt;p&gt;The thing is, not all users are after the same information. Unlike many other technologies, we don't offer a single service or API endpoint. Temporal's boundaries are high and wide, and there are at least four unique user groups accessing the documentation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure and operations engineers&lt;/strong&gt; looking to deploy and operate their own Temporal Server cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers and software engineers&lt;/strong&gt; looking to start building applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operators and SREs&lt;/strong&gt; looking to troubleshoot, debug, or generally monitor the system's health.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business decision makers&lt;/strong&gt; evaluating the technology as a whole or considering the use of our cloud service (still in beta).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A single person may bridge multiple personas, but while embodying one, they won't want to be bogged down by information directed at the other. This particular aspect of our users convinced me that in order to meet our user's information needs, separating content based on our user's personas was the first step towards a fundamentally sound base to build off of.&lt;/p&gt;

&lt;p&gt;Building documentation is an iterative process.&lt;br&gt;
And, up until that point, we had iterated our documentation such that this is what our landing page looked like:&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fdocumentation-landing-page-march-2021.png" 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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fdocumentation-landing-page-march-2021.png" alt="Temporal docs landing page March 2021" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's not entirely bad. But, as you can see, it doesn't provide a very clear path for a new user with a particular agenda.&lt;br&gt;
Someone might spend a good deal of effort wading through the full spectrum of information to potentially find what they are looking for. Thus, I decided, information architecture was a key variable in this equation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Now you're speaking my language
&lt;/h2&gt;

&lt;p&gt;Now that I was convinced that changes were needed to our information architecture to address our user's personas more appropriately, I revisited the problem of our core concepts.&lt;/p&gt;

&lt;p&gt;At this stage, I was able to make the following connections:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From an application development perspective, everything boils down to about six core concepts:

&lt;ul&gt;
&lt;li&gt;Workflows&lt;/li&gt;
&lt;li&gt;Activities&lt;/li&gt;
&lt;li&gt;Workers&lt;/li&gt;
&lt;li&gt;Task Queues&lt;/li&gt;
&lt;li&gt;Signals&lt;/li&gt;
&lt;li&gt;Queries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The developer/software engineer persona is the one who is primarily concerned with internalizing and fully understanding these concepts.&lt;/li&gt;
&lt;li&gt;One can only fully describe any of these concepts within the context of a particular language.&lt;/li&gt;
&lt;li&gt;A developer is almost certainly only going to be interested in learning in a single language.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Look at how a Workflow is defined across each language:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;SimpleWorkflow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;someArg&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// Do something&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@WorkflowInterface&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;SimpleWorkflow&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@WorkflowMethod&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;simpleWorkflowMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someArg&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimpleWorkflowImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;SimpleWorkflow&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

   &lt;span class="nd"&gt;@Override&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;simpleWorkflowMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;someArg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// Do the stuff&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="na"&gt;#[WorkflowInterface]&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;SimpleWorkflowInterface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="na"&gt;#[WorkflowMethod]&lt;/span&gt;
    &lt;span class="na"&gt;#[ReturnType("string")]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;simpleWorkflowMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$someArg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimpleWorkflow&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;SimpleWorkflowInterface&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Do stuff&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;simpleWorkflowMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$someArg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;\Generator&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Do stuff&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While, one could tabulate between languages within a concept like above, as you get into the details, it becomes much more complicated. Additionally, not all features are available across each language, like &lt;a href="https://dev.to/docs/go/sessions"&gt;Sessions in Go&lt;/a&gt; for example. And, because the implementation details and terminology can be so different from language to language, the obvious solution presented itself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Each language should be visually separated from the others as its own topic area.&lt;/li&gt;
&lt;li&gt;We must present each of these core concepts within the context of each language specifically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At the same time, we couldn't just abandon a high-level concepts section, because from a practical perspective we need to be able to offer a linkable landing page for each concept that is still independent of a specific language. Imagine trying to share Temporal with someone but only having a language specific link to provide. That would create a bit of a conundrum for those trying to share our page links.&lt;/p&gt;

&lt;p&gt;Thus, our core concepts section would become a sort directory for each of the languages, directing developers to language specific concept pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  April 2021 changes
&lt;/h2&gt;

&lt;p&gt;In April, the Temporal Product Team set about iterating towards these solutions. And we are excited with the results!&lt;/p&gt;

&lt;p&gt;We redesigned our documentation landing page, &lt;a href="https://docs.temporal.io" rel="noopener noreferrer"&gt;docs.temporal.io&lt;/a&gt;:&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fdocumentation-landing-page-april-2021.png" 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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fdocumentation-landing-page-april-2021.png" alt="Temporal documentation landing page April 2021" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We implemented a new SDK landing page, &lt;a href="https://docs.temporal.io/application-development" rel="noopener noreferrer"&gt;docs.temporal.io/application-development&lt;/a&gt;:&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fdocumenation-app-dev-landing-page-april-2021.png" 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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fdocumenation-app-dev-landing-page-april-2021.png" alt="Temporal documentation app dev landing page April 2021" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And we created a much more immersive experience for the user personas that we identified above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go developers for example, &lt;a href="https://docs.temporal.io/go" rel="noopener noreferrer"&gt;docs.temporal.io/go&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fgo-topic-area.png" 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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fgo-topic-area.png" alt="Go topic area" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infra engineers for example, &lt;a href="https://docs.temporal.io/server" rel="noopener noreferrer"&gt;docs.temporal.io/server&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fserver-topic-area.png" 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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fserver-topic-area.png" alt="Server topic area" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And we started converting the &lt;a href="https://docs.temporal.io/docs/concepts/introduction" rel="noopener noreferrer"&gt;core concepts&lt;/a&gt; into a directory for new users learning about Temporal:&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fconcepts-topic-area.png" 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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation%2Fmaster%2Fstatic%2Fimg%2Fconcepts-topic-area.png" alt="Core concepts area" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Still day one
&lt;/h2&gt;

&lt;p&gt;We have finally arrived at a place where there is an information architecture that fundamentally matches our user's personas. With this change in focus, our hope is that learning about the how and why of a particular concept becomes a much more rewarding and informative experience.&lt;/p&gt;

&lt;p&gt;We know we have a LOT more work to do. We still lack full coverage of the concepts within each language, and the navigation and search experience can be made more intuitive.&lt;br&gt;
If you have ideas for how to improve them, &lt;a href="//mailto:docs@temporal.io"&gt;email us&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>temporal</category>
      <category>documentation</category>
      <category>concepts</category>
      <category>personas</category>
    </item>
    <item>
      <title>The process of creating SDK tutorials for new users</title>
      <dc:creator>Cully</dc:creator>
      <pubDate>Thu, 12 Nov 2020 17:34:58 +0000</pubDate>
      <link>https://dev.to/temporalio/the-process-of-creating-sdk-tutorials-for-new-users-3cmh</link>
      <guid>https://dev.to/temporalio/the-process-of-creating-sdk-tutorials-for-new-users-3cmh</guid>
      <description>&lt;p&gt;In early September it was clear that V1 of Temporal would be ready by the end of that month. This also meant that we would be announcing our funding shortly thereafter. From a documentation perspective, we felt that it was important to coordinate changes in a way that would support the announcement. As with any product launch, we were hoping to create some buzz and see a surge in new users. Considering that documentation is one of the most important aspects of new user adoption, we had our work cut out for us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uphill challenges
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Fhiker.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Fhiker.png" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In terms of our documentation, there were at least three challenges we were facing. Two of those challenges stemmed directly from the fact that our docs started as a fork of the docs from Temporal's predecessor.&lt;/p&gt;

&lt;p&gt;The first challenge is that the information we inherited lagged behind in fully describing Temporal's capability and feature set. One of the reasons for this is that documentation is typically offered a secondary level of prioritization. While Temporal now prioritizes documentation, this was not always true from where Temporal originated as Cadence.&lt;/p&gt;

&lt;p&gt;The second challenge was that there have been many core changes to the system, terminology, and SDKs in the time since Temporal forked from its predecessor. Back in early September, many of these changes had yet to be propagated throughout the docs as well. So, not only was there missing information but some of the existing information was just plain incorrect.&lt;/p&gt;

&lt;p&gt;The final and biggest challenge of documenting Temporal is that it is fundamentally new. Temporal presents a different approach to application development. Users are faced with a set of familiar terms and concepts but must comprehend them in an entirely new context and landscape.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking a path
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Ftemporal-server-and-sdk-icons.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Ftemporal-server-and-sdk-icons.png" width="340" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At a high level, there are two parts to Temporal: the backend and a client-side SDK. Configuring, deploying, and operating the Temporal backend for a live environment is no small task. On the other hand, it is really easy to &lt;a href="https://dev.to/docs/install-temporal-server"&gt;get Temporal running on your local machine&lt;/a&gt; in a Docker container. In fact, you can do it with just two terminal commands.&lt;/p&gt;

&lt;p&gt;The Docker route definitely simplifies running the backend, which means the majority of friction for new users comes from our SDKs (&lt;a href="https://github.com/temporalio/sdk-go" rel="noopener noreferrer"&gt;Go&lt;/a&gt;, &lt;a href="https://github.com/temporalio/sdk-java" rel="noopener noreferrer"&gt;Java&lt;/a&gt;). While an SDK is meant to abstract the complexities of interacting with the server API, Temporal flips a lot of the preconceived notions of modern application development on their head. The SDK docs needed to do more than just provide example usage. They also needed to show the "why" to enable the user to grasp the concepts that Temporal is promoting. So we went about scoping something that we could realistically accomplish within that time frame and still be relatively effective.&lt;/p&gt;

&lt;p&gt;We decided that the best thing for us to focus on was a great new user experience. We wanted something that would enable a developer to start using the product right away but also leave them with an understanding of the value Temporal provides. We wanted to cultivate that "aha!" moment.&lt;/p&gt;

&lt;p&gt;We started as most might, by trying to envision what the ideal new user experience would look like. We then identified as many of the steps it would take to get there as possible. Looking back, I would contend that we managed to lock onto three ideas that we thought would get us closer to the ideal experience. The hope was that once these three ideas were combined they would result in a set of effective SDK tutorials for new users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snipsync
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Fsync.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Fsync.png" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was around this time (early September), that I was testing out a NodeJS tool I had built to improve the experience of creating and maintaining documentation. It downloads Github repos, scrapes code snippets that exist between specific comment wrappers, and writes the snippets to their corresponding comment wrappers in Markdown files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @@@SNIPSTART unique-name-of-snippet&lt;/span&gt;
&lt;span class="n"&gt;SomeFunc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="c"&gt;// @@@SNIPEND&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!--SNIPSTART unique-name-of-snippet--&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--SNIPEND--&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We borrowed the idea from &lt;a href="https://github.com/GoogleCloudPlatform/golang-samples/blob/master/secretmanager/get_secret.go#L17" rel="noopener noreferrer"&gt;Google's proprietary version&lt;/a&gt; they use for their &lt;a href="https://cloud.google.com/docs" rel="noopener noreferrer"&gt;Google Cloud documentation&lt;/a&gt;. The concept is fairly simple, and I am still surprised that there was no existing open-source solution. So we made one!&lt;/p&gt;

&lt;p&gt;A tool that automates the synchronization of code with the docs from any given repository has several key benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Code snippets in the documentation are guaranteed to work as they are continuously tested. This also means that they can be reliably copied and pasted into the user's editor.&lt;/li&gt;
&lt;li&gt;We control exactly which lines of code are shown and can also target a specific branch or commit. This is a great safeguard against bugs which might be introduced to the main branch.&lt;/li&gt;
&lt;li&gt;We never have to commit source code into the docs. The code is merged into the Markdown at build time. This ensures that the code is already reviewed and approved from the repo it resides in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Snipsync does come with a few considerations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Embedded code needs to have carefully reviewed comments, structure, and make sense within the context of the documentation. For example, if the code snippet is coming from a working repo it may include additional variables or function calls. These must be minimized and optimized out so they don’t cause unnecessary confusion.&lt;/li&gt;
&lt;li&gt;In the same way that the code must be optimized for the docs, the docs must also be optimized for the code. In essence, the docs are being “driven” and "defined" by the underlying code. And if no one has coined the term yet, I think the credit for “code-driven documentation” should go to our Head of Product, Ryland Goldstein, as he pinged me one afternoon to share that epiphany with me.&lt;/li&gt;
&lt;/ol&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Faddimage%2Fstatic%2Fcode-driven-docs-post.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Faddimage%2Fstatic%2Fcode-driven-docs-post.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We decided to embrace &lt;a href="https://github.com/temporalio/snipsync" rel="noopener noreferrer"&gt;Snipsync&lt;/a&gt; as the challenges it introduced were minimal compared to the value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/snipsync" rel="noopener noreferrer"&gt;Snipsync on npm&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Template repos
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Ftemplates.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Ftemplates.png" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We now had a way to synchronize code with our documentation. But from where will the code be synchronized? We know users will likely want to view the source file and relative file path of the code snippet for added context. They will also be likely to clone the repo and try to run the sample.&lt;/p&gt;

&lt;p&gt;We actually already had repositories of code samples for the &lt;a href="https://github.com/temporalio/samples-go" rel="noopener noreferrer"&gt;Go SDK&lt;/a&gt; and &lt;a href="https://github.com/temporalio/samples-java" rel="noopener noreferrer"&gt;Java SDK&lt;/a&gt;. While we desired to see more samples, there were already quite a few of them in each repository. But, we discovered that shared sample repositories tend to have two issues that made them less ideal for synchronizing with docs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;While convenient, colocating multiple samples in a single repo is far less approachable compared with storing samples in self-contained repos.&lt;/li&gt;
&lt;li&gt;In shared sample repositories, it is harder to retain the idiomatic nature of any language and mirror the functionality of any sample across different languages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So for each of the sample applications we planned on using to drive our documentation, we created a corresponding template repo. These template repos can be easily copied, built, and run in a matter of minutes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/temporalio/money-transfer-project-template-go" rel="noopener noreferrer"&gt;Go money transfer template repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/temporalio/hello-world-project-template-go" rel="noopener noreferrer"&gt;Go hello world template repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/temporalio/money-transfer-project-template-java" rel="noopener noreferrer"&gt;Java money transfer template repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/temporalio/hello-world-project-template-java" rel="noopener noreferrer"&gt;Java hello world template repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The tutorial
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Ftutorials.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Ftutorials.png" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the goal of our documentation changes was to help with new user acquisition, we decided to aim for a "tutorial" style of documentation. The first iterations aimed to build upon and replace the existing SDK “quick start” pages that maintained the status quo and printed “Hello World!” to the console. As you may have guessed, this route wasn’t sufficient enough to show users the real value Temporal offers.&lt;/p&gt;

&lt;p&gt;Once it became clear that a standard approach wasn't going to cut it, we brought in our co-founder and CEO, Maxim Fateev. We asked him to give us a demonstration that he typically uses to introduce engineers to Temporal for the first time. The scenario represents a money transfer from one bank account to another and during the demo Maxim demonstrates what happens if one of the steps in the transfer fails. The money transfer sample was a great way to introduce the values of Temporal. For if you understand the ramifications of losing money from a failed financial transaction, several values of Temporal become immediately apparent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The state of running code is maintained even through hardware failures, server crashes, and network outages.&lt;/li&gt;
&lt;li&gt;There is deep visibility into the state of code execution out of the box via the CLI or UI.&lt;/li&gt;
&lt;li&gt;Function calls come with automatic and retries and configurable timeouts.&lt;/li&gt;
&lt;li&gt;Bugs can be hot fixed in running code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For someone that is new to Temporal the attraction doesn’t come from using the SDK to print “Hello World!”. Instead it comes from witnessing the inherent benefits that Temporal offers by running simulations using a pre-built application.&lt;/p&gt;

&lt;p&gt;This is the direction that we decided to send new users. If a user can wrap their heads around the value that Temporal brings to their application right out of the box, then spending time and energy on application setup and learning the SDK becomes a non-blocker.&lt;/p&gt;

&lt;p&gt;Check out these finished tutorials and see for yourself!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/docs/go-run-your-first-app"&gt;Go: Run your first Temporal application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/docs/java-run-your-first-app"&gt;Java: Run your first Temporal application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Fsteps.png" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ftemporalio%2Fdocumentation-images%2Fmain%2Fstatic%2Fsteps.png" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Temporal we understand that our documentation plays a very important role in our users' experience. And to get our docs into a world class state we have lots of work in front of us. In the near future we will be looking at the end-to-end journey through our documentation and how we can provide the best experience for every user. To validate any direction we take, we will be engaging with the community to hear what you think and help us dial things in. Any user can &lt;a href="https://calendly.com/cully-temporal/schedule-feedback-session" rel="noopener noreferrer"&gt;schedule a 15 minute feedback session&lt;/a&gt; with me directly! We will also be preparing for all the new and exciting features around our hosted cloud offering that will enable all developers to build invincible applications.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>temporal</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
