<?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: Atul Sharma</title>
    <description>The latest articles on DEV Community by Atul Sharma (@atulify).</description>
    <link>https://dev.to/atulify</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%2F411358%2F5a7ce7c4-78d7-411f-b124-ee7a542987b4.jpeg</url>
      <title>DEV Community: Atul Sharma</title>
      <link>https://dev.to/atulify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/atulify"/>
    <language>en</language>
    <item>
      <title>Self-Reflection and Impact</title>
      <dc:creator>Atul Sharma</dc:creator>
      <pubDate>Sat, 10 Oct 2020 01:14:26 +0000</pubDate>
      <link>https://dev.to/atulify/self-reflection-and-impact-4pf3</link>
      <guid>https://dev.to/atulify/self-reflection-and-impact-4pf3</guid>
      <description>&lt;p&gt;As a software engineer/developer, it's very easy to get caught in the day-to-day tasks, and to not spend time reflecting on accomplishments and growth.&lt;/p&gt;

&lt;p&gt;There are a lot of disruptions that happen in a day between email/Slack, attending planning meetings, and triaging production issues. When none of those are occurring, a lot of time is spent on the craft of software engineering.&lt;/p&gt;

&lt;p&gt;But how can you accurately articulate the progress you've made?  Can you identify your areas where you've made great strides, and identify which ones you'd like to tackle next? &lt;/p&gt;

&lt;p&gt;This is where writing an annual accomplishments document can come in handy.&lt;/p&gt;

&lt;p&gt;I've found it's useful to reflect every 3-4 months or so on accomplishments since the context is still recent, but enough time has passed for impact to be visible.  &lt;/p&gt;

&lt;p&gt;A bonus of frequent reflections, is that there's no scramble to remember everything you've accomplished.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sample Accomplishments Document
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Major Projects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lead/Champion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Project X&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built functionality X with help from Sarah, Jane, and Tom &lt;/li&gt;
&lt;li&gt;Involved at conception, design, stakeholder feedback, etc.&lt;/li&gt;
&lt;li&gt;Metrics (more on this later)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Project YYZ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worked with John to see this project through&lt;/li&gt;
&lt;li&gt;Contributed items 1, 2, 3 to the project&lt;/li&gt;
&lt;li&gt;Metrics (see a trend?)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contributor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Minor feature 1&lt;/li&gt;
&lt;li&gt;Minor feature N&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Production Issues Identified/Resolved
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identified issue X that was affecting customers and came up with resolution by creating some thoughtful solution&lt;/li&gt;
&lt;li&gt;Started seeing performance degradation and solved by some advanced technique&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Customer Escalations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Major customer was experiencing issue ABC and helped jump on a call with them to help resolve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mentorship
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Started working with Mandy

&lt;ul&gt;
&lt;li&gt;She started by working on smaller items but now is contributing at the same level as other members.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Self development
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read books X,Y,Z&lt;/li&gt;
&lt;li&gt;Applied knowledge of that when building ....&lt;/li&gt;
&lt;li&gt;Attended conference on and shared discoveries with team &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Note
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Some things are obviously not the responsibility of a junior engineer like mentorship, or being the lead on a major feature.&lt;/p&gt;

&lt;p&gt;But looking at these gives you an idea of what a more experienced engineer is probably doing. This can help frame a discussion with a manager to understand what you need to do to get to work on these types of things and achieve career goals and aspirations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Metrics
&lt;/h2&gt;

&lt;p&gt;All software engineers (ideally) build important things.  But how important?  What impact is that feature having?&lt;/p&gt;

&lt;p&gt;When an individual is trying to get promoted or seek greater compensation, the first thing a manager will gauge is the person's impact.  And how will you stand out from others?&lt;/p&gt;

&lt;p&gt;Obviously with enterprise software it's a bit harder to gauge "impact", but with SaaS products, there's typically a data team.  Any credible SaaS company will have a process/team to measure just about anything.&lt;/p&gt;

&lt;p&gt;If nothing else you can contribute to that team by helping out.  You can learn about how data is analyzed at a company, and that could be a form of impact itself!&lt;/p&gt;

&lt;p&gt;I helped out the data team once for a couple of days, and by the end I was creating my own dashboard to track a number of my team's features using tools like Mode, Looker, and Snowflake.&lt;/p&gt;

&lt;p&gt;Here's a sample of a couple of metrics I've used in recent years:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Increased the number of things in a batch by 150%

- Reduced number of failures with partner X by 90% through better retry mechanisms and error handling

- Partner integration is now moving Y Million USD monthly, resulting in savings of 50% over old partner 

  -- Annualized savings of X hundred thousand dollars
  -- N payments are 1-2 days faster versus old partner

- Automated reconciliation process for X.  
  -- Saving X hours/day of manual work for finance team

- Enhanced reconciliation process by migrating it to use the data warehouse, thus reducing load on replica system.

- Feature X is now being used by 10,000+ customers with over 100M in gross volume this year.

- Improved performance of processing critical system event:
  -- Optimizing database query by X percent
  -- Caching data in an in-memory store 
  -- Increased durability of event using queueing technology 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Notes
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;It's always good to show an example of how these improvements are manifested in a system.  Have a local example to show your database speedup.&lt;/p&gt;

&lt;p&gt;Or if you are fortunate enough to work somewhere that uses APM tools like Datadog or New Relic, then most of this is discoverable for you and a breeze to show off!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>datascience</category>
      <category>management</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Git better with fixups</title>
      <dc:creator>Atul Sharma</dc:creator>
      <pubDate>Thu, 18 Jun 2020 01:29:55 +0000</pubDate>
      <link>https://dev.to/atulify/git-better-with-fixups-5bo7</link>
      <guid>https://dev.to/atulify/git-better-with-fixups-5bo7</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;By now I'm sure many of you are familiar with the &lt;a href="https://guides.github.com/introduction/flow/"&gt;Github Flow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before I introduce some clever git commands to help maintain a clean git history, it's helpful to review some good git principles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.koffeinfrei.org/2016/11/10/5-rules-to-git-better/"&gt;5 rules to Git Better&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If that link is not available the 5 rules are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make commits as small as possible&lt;/li&gt;
&lt;li&gt;Write meaningful commit messages&lt;/li&gt;
&lt;li&gt;Rebase always&lt;/li&gt;
&lt;li&gt;Don’t squash everything&lt;/li&gt;
&lt;li&gt;Commit instead of commenting out&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alright, now that we have that out of the way let's look at a common situation.&lt;/p&gt;

&lt;p&gt;Let's assume the following as a starting point for the suggested workflow in this post:&lt;/p&gt;

&lt;h2&gt;
  
  
  Preconditions
&lt;/h2&gt;

&lt;p&gt;You want a clean Git history&lt;/p&gt;

&lt;p&gt;You don't want to rewrite your git history consistently&lt;/p&gt;

&lt;h2&gt;
  
  
  Situation
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# coding the component&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add some component"&lt;/span&gt;

&lt;span class="c"&gt;# missed an edge-case&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix missing null check"&lt;/span&gt;

&lt;span class="c"&gt;# add component to service&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add component to service"&lt;/span&gt;

&lt;span class="c"&gt;# updating the component after service tests found a bug&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix component due to silly bug"&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;rubocop

&lt;span class="c"&gt;# fix linting errors&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix linting errors"&lt;/span&gt;

&lt;span class="c"&gt;# team members do a code review on the PR / MR&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fixes based on PR comments"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now this history isn't uncommon (in fact I can't think of many PRs of &lt;em&gt;real substance&lt;/em&gt; that don't go through something like this).  &lt;/p&gt;

&lt;p&gt;This will result in a Git history that looks like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;fixes based on PR comments
fix linting errors
fix component due to silly bug
add component to service
fix missing null check
add some component
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;But is that really reflective of the work?  We don't want the commit history to be littered with "fix linting" commits.&lt;/p&gt;

&lt;p&gt;This is actually representative of the work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;add component to service
add some component
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Let's go about these "fixes" in a different way.&lt;br&gt;
We'll use the familiar command &lt;code&gt;git commit&lt;/code&gt; but with an interesting flag called (appropriately) &lt;code&gt;fixup&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# coding the component&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add some component"&lt;/span&gt;

&lt;span class="c"&gt;# missed an edge-case&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;--fixup&lt;/span&gt; &amp;lt;COMMIT HASH OF THE COMMIT &lt;span class="s2"&gt;"add some component"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# add component to service&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add component to service"&lt;/span&gt;

&lt;span class="c"&gt;# updating the component after service tests found a bug&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;--fixup&lt;/span&gt; &amp;lt;COMMIT HASH OF THE COMMIT &lt;span class="s2"&gt;"add component to service"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;rubocop

&lt;span class="c"&gt;# fix linting errors&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;--fixup&lt;/span&gt; &amp;lt;COMMIT HASH OF THE COMMIT &lt;span class="s2"&gt;"add component to service"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# team members do a code review on the PR / MR&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;--fixup&lt;/span&gt; &amp;lt;COMMIT HASH OF THE COMMIT &lt;span class="s2"&gt;"add component to service"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now if we look at the git log we'll see&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;fixup! add component to service
fixup! add component to service
fixup! add component to service
add component to service
fixup! add some component
add some component
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Instead of regularly committing (and also writing a commit message) we use the &lt;code&gt;--fixup&lt;/code&gt; flag to create fixup commits.&lt;/p&gt;

&lt;p&gt;Now, before merging the merge request, we issue an interactive rebase with the &lt;code&gt;--autosquash&lt;/code&gt; flag.&lt;/p&gt;

&lt;h4&gt;
  
  
  Note:
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;GitLab marks MRs that include fixup commits as WIP, so &lt;br&gt;
merging is prevented if you haven't squashed.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git rebase --interactive --autosquash \
  &amp;lt;COMMIT HASH OF THE COMMIT "add some component"&amp;gt;~1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We'll enter interactive rebase mode with the relevant commits already marked for fixup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;fixup afa6970 fixup! add component to service
fixup 1da5d7c fixup! add component to service
fixup c998b08 fixup! add component to service
pick d9731b5 add component to service
fixup 33d6080 fixup! add some component
pick 73e8a6a add some component
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The resulting Git history looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;add component to service
add some component
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The final result is a very consistent and readable Git history, where every other developer knows what happens, without knowing about every bug on the journey to this final code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In summary, the following two Git commands are necessary to make use of the Git fixup workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; git commit --fixup &amp;lt;COMMIT THAT NEEDS FIXING&amp;gt;
&lt;span class="err"&gt;$&lt;/span&gt; git rebase -i --autosquash &amp;lt;FIRST COMMIT THAT NEEDS FIXING&amp;gt;~1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>git</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
