<?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: Koma/こま</title>
    <description>The latest articles on DEV Community by Koma/こま (@koma_koma_d).</description>
    <link>https://dev.to/koma_koma_d</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%2F1433783%2F997fc3da-f242-430e-9933-78d0f0cf4166.jpg</url>
      <title>DEV Community: Koma/こま</title>
      <link>https://dev.to/koma_koma_d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/koma_koma_d"/>
    <language>en</language>
    <item>
      <title>Reflecting on “Technical Leadership and Glue Work” / “Being Glue”</title>
      <dc:creator>Koma/こま</dc:creator>
      <pubDate>Fri, 19 Apr 2024 16:23:55 +0000</pubDate>
      <link>https://dev.to/koma_koma_d/reflecting-on-technical-leadership-and-glue-work-being-glue-52g0</link>
      <guid>https://dev.to/koma_koma_d/reflecting-on-technical-leadership-and-glue-work-being-glue-52g0</guid>
      <description>&lt;p&gt;There is a talk by &lt;a href="https://twitter.com/whereistanya" rel="noopener noreferrer"&gt;Tanya Reilly&lt;/a&gt; called “Technical leadership and glue work” and a blog post transcribing it called “Being Glue.” (From here on, I will refer to it as “the article” unless specifically mentioning the talk).&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/KClAPipnKqw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.noidea.dog/glue/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fstatic1.squarespace.com%2Fstatic%2F5a05ececd55b4165f250f032%2Ft%2F5cc9ed1ec830253749518ae4%2F1556737311165%2Fboat-1297042_1280%2B%25281%2529.png%3Fformat%3D1500w" height="auto" class="m-0"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.noidea.dog/glue/" rel="noopener noreferrer" class="c-link"&gt;
          Being Glue — No Idea Blog
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Slides and notes for the Being Glue talk.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.squarespace-cdn.com%2Fcontent%2Fv1%2F5a05ececd55b4165f250f032%2F1517839521640-6WOSTDGLZNUI4GTBG6F6%2Ffavicon.ico"&gt;
        noidea.dog
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Career as an Individual Contributor, not a Manager
&lt;/h2&gt;

&lt;p&gt;Tanya Reilly, the author, is a former Staff Systems Engineer at Google and currently works as a Principal Software Engineer at Squarespace. As her job titles suggest, she has been successful in her career by advancing as an engineer rather than a manager.&lt;/p&gt;

&lt;p&gt;There are several books on engineering management such as “The Manager’s Path” and “The Making of a Manager,” but there are not many books geared toward senior Individual Contributor (IC) positions. One such book is “Staff Engineer: Leadership beyond the management track.” And Tanya Reilly published her own book “The Staff Engineer’s Path” in 2022.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glue Work and its dangers
&lt;/h2&gt;

&lt;p&gt;“Glue Work” is the main topic of the article and refers to tasks like helping unblock other team members, reviewing design documents, and onboarding new members. These tasks may seem non-technical at first glance, but according to the author, they are part of “technical leadership” and are expected of senior developers. However, focusing too much on these tasks before reaching a senior level can harm one’s career, as it leaves less time for more “technical” tasks like coding and hinders the development of the technical skills required for promotion to senior positions.&lt;/p&gt;

&lt;p&gt;In the article, a story of a female engineer is used to illustrate this point. It seems that many people can relate to her story. The author also mentions that women tend to be asked to do more of this type of work that doesn’t lead to promotions compared to men.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should and shouldn’t I be doing?
&lt;/h2&gt;

&lt;p&gt;So far, I have introduced the article. From here, I will share my own experience. I have spent a significant portion of my work hours on Glue Work throughout my career. I don’t dislike coding or lack interest in technology, but I tend to choose opportunities that allow me to contribute to projects and teams in ways other than coding.&lt;/p&gt;

&lt;p&gt;I have made these choices because I felt that they were the most significant contributions I could make at the time, or because I found them the most interesting. However, upon reflection, I wonder if some aspects of my career choices have been less than optimal. For example, I consider my slowness in getting tasks done compared to other engineers around me to be a significant weakness as an engineer, and I believe that this is a result of my past choices.&lt;/p&gt;

&lt;p&gt;I have been in the industry for six years now, and engineering management has become a popular topic in Japan since I entered the field. I have always thought that I might eventually move toward that direction, so I didn’t prioritize spending more time on “technical” tasks like coding. However, the article on Glue Work has made me reconsider the importance of the work I choose to do daily in shaping my career.&lt;/p&gt;

&lt;p&gt;Lately, I have been thinking that continuing to work in the same way might not be the best for my team either. I would like to discuss my work and approach with my team members, manager, or even people outside my company to gain new perspectives.&lt;/p&gt;

</description>
      <category>gluework</category>
    </item>
    <item>
      <title>Reading "A Philosophy of Software Design"</title>
      <dc:creator>Koma/こま</dc:creator>
      <pubDate>Fri, 19 Apr 2024 16:20:49 +0000</pubDate>
      <link>https://dev.to/koma_koma_d/reading-a-philosophy-of-software-design-il2</link>
      <guid>https://dev.to/koma_koma_d/reading-a-philosophy-of-software-design-il2</guid>
      <description>&lt;p&gt;I recently read "A Philosophy of Software Design," highly praised on my favorite Japanese podcast &lt;a href="https://e34.fm/"&gt;e34.fm&lt;/a&gt;. The first edition was published in 2018, and I read the second edition released in 2021.&lt;/p&gt;

&lt;h2&gt;
  
  
  What kind of book is it?
&lt;/h2&gt;

&lt;p&gt;The theme of the book is the complexity of software. Complexity is defined as something that makes it difficult to understand or modify a system. Symptoms of complexity include simple changes forcing many code modifications, increased cognitive load (as mentioned in &lt;a href="https://teamtopologies.com/"&gt;"Team Topologies"&lt;/a&gt;), and most critically, the occurrence of "unknown unknowns." These unknown unknowns are troublesome because they can easily lead to the introduction of bugs, but by definition, their existence cannot be noticed.&lt;/p&gt;

&lt;p&gt;The book introduces various design principles to reduce such complexity. Although it may seem like a catalog of design principles, the development of the discussion is systematic, and it has the impression of a book written by a researcher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memorable sections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Deep Modules and Shallow Modules
&lt;/h3&gt;

&lt;p&gt;This is a frequently mentioned part of the book, but it was refreshing to talk about modules in terms of Deep/Shallow. The book argues that Deep modules are better. This distinction appears in Chapter 4, but it is repeatedly mentioned in subsequent chapters as a framework (e.g., "doing this will make the module deeper").&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---------------------------------
|       | Interface | Functionality |
---------------------------------
| Deep  | Few       | Many          |
---------------------------------
| Shallow | Many   | Few           |
---------------------------------

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;※ The term "many interfaces" refers to the number of methods or many arguments for a given method.&lt;/p&gt;

&lt;h3&gt;
  
  
  General-purpose and Special-purpose
&lt;/h3&gt;

&lt;p&gt;This axis appears around Chapter 6, advocating for designing software that is somewhat more general-purpose than just meeting immediate needs.&lt;br&gt;
Related to this axis, the advice to consider whether a process (code) is general-purpose or special-purpose and to ensure they do not mix, and the advice to remove special-purpose processes from the critical path in the chapter on performance (Chapter 20) were memorable.&lt;/p&gt;

&lt;h3&gt;
  
  
  About comments
&lt;/h3&gt;

&lt;p&gt;It's often said that code shouldn't require comments, but in this book, the author discusses what kind of comments are good, assuming there are things that can only be done with comments.&lt;/p&gt;

&lt;p&gt;Personally, I found the discussion about comments to be full of useful advice, but what stood out most was the distinction between comments explaining details more than the code or comments explaining more abstract concepts than the code. It's often said not to write comments that merely repeat the code, but considering the degree of detail and which direction to lean toward when writing comments seems very helpful.&lt;/p&gt;

&lt;p&gt;Also, it was memorable that the book suggested writing comments first, as a means of design, rather than later. If you try to write comments later, they may end up repeating the implementation or not being written at all. By writing comments first, they become part of the design activity, making it more enjoyable and leading to design improvements by considering abstractions.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Increments should be abstractions, not features"
&lt;/h3&gt;

&lt;p&gt;In Chapter 19, the author discusses object-oriented programming (especially inheritance), Agile development, unit testing, test-driven development, design patterns, and getters/setters.&lt;/p&gt;

&lt;p&gt;There were many familiar stories, but it was striking to find the statement "the increments of development should be abstractions, not features" in the discussion on Agile development. When doing incremental development, how to think about design is a major topic, and this was the first time I saw advice in this form. In the following text, it says, "When you realize the need for abstraction, don't take time to create it bit by bit; design it all at once." Although this is still based on "when you realize the need," the direction of highlighting abstraction as the main focus in the development unit is quite convincing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Regarding the overall stance
&lt;/h2&gt;

&lt;p&gt;I've introduced several memorable points above. Although there were many individual pieces of advice that made me think, "I see, that's an interesting way of thinking," overall, I was left with a strong impression that the style was quite different from what I've been accustomed to so far.&lt;/p&gt;

</description>
      <category>softwaredesign</category>
    </item>
    <item>
      <title>How to create a link between two spans in OpenTelemetry</title>
      <dc:creator>Koma/こま</dc:creator>
      <pubDate>Fri, 19 Apr 2024 16:16:12 +0000</pubDate>
      <link>https://dev.to/koma_koma_d/how-to-create-a-link-between-two-spans-in-opentelemetry-424i</link>
      <guid>https://dev.to/koma_koma_d/how-to-create-a-link-between-two-spans-in-opentelemetry-424i</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Span links are another way to express relationship between spans.&lt;/li&gt;
&lt;li&gt;It is easy to create one in C# with the OpenTelemetry toolkit.&lt;/li&gt;
&lt;li&gt;Datadog currently supports span links as a beta feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is a span link?
&lt;/h2&gt;

&lt;p&gt;In OpenTelemetry, there is another type of relationship between spans other than parent/child relationship. It is called &lt;strong&gt;Span Link&lt;/strong&gt;. These are related documentations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/concepts/signals/traces/#span-links"&gt;https://opentelemetry.io/docs/concepts/signals/traces/#span-links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/specs/otel/overview/#links-between-spans"&gt;https://opentelemetry.io/docs/specs/otel/overview/#links-between-spans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/specs/otel/trace/api/#link"&gt;https://opentelemetry.io/docs/specs/otel/trace/api/#link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to documents above, span links can be used in cases below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when you want 2 separate traces rather than a single trace&lt;/li&gt;
&lt;li&gt;when you want to connect multiple spans onto a span&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to create a span link in C#?
&lt;/h2&gt;

&lt;p&gt;It is easy to create a span link with the OpenTelemetry toolkit. All you have to do is, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Propagate SpanContext of the proceeding span.&lt;/li&gt;
&lt;li&gt;Create an ActivityLink and pass it to StartActivity method.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Producer side */&lt;/span&gt;
&lt;span class="c1"&gt;// add SpanContext onto the message&lt;/span&gt;
&lt;span class="n"&gt;Propagators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultTextMapPropagator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PropagationContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&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;Baggage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MessageAttributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MessageAttributeValue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DataType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StringValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Consumer side */&lt;/span&gt;
&lt;span class="c1"&gt;// extract SpanContext&lt;/span&gt;
&lt;span class="kt"&gt;var&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;Propagators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultTextMapPropagator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MessageAttributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryGetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="k"&gt;value&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;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringValue&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;span class="c1"&gt;// start a new span with a link to the producer's span&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;activity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;activitySource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"ConsumeMessage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ActivityKind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;default&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="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ActivityLink&lt;/span&gt;&lt;span class="p"&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;ActivityContext&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Datadog supports Span Link
&lt;/h2&gt;

&lt;p&gt;Datadog currently supports span links as a beta feature. You can see your span links in span view and move to linked spans with few clicks. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/DataDog/datadog-agent/releases/tag/7.45.0"&gt;https://github.com/DataDog/datadog-agent/releases/tag/7.45.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DataDog/datadog-agent/pull/15767"&gt;https://github.com/DataDog/datadog-agent/pull/15767&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.datadoghq.com/tracing/trace_explorer/trace_view/?tab=spanlinksbeta#more-information"&gt;https://docs.datadoghq.com/tracing/trace_explorer/trace_view/?tab=spanlinksbeta#more-information&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opentelemetry</category>
      <category>observability</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
