<?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: Jennifer Tran</title>
    <description>The latest articles on Forem by Jennifer Tran (@botanical).</description>
    <link>https://forem.com/botanical</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%2F165494%2Ff4e4571b-2bfb-454a-8ac5-8eb220fdace4.jpg</url>
      <title>Forem: Jennifer Tran</title>
      <link>https://forem.com/botanical</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/botanical"/>
    <language>en</language>
    <item>
      <title>Reprogram Your Mindset</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Mon, 15 Mar 2021 16:04:06 +0000</pubDate>
      <link>https://forem.com/botanical/reprogram-your-mindset-4mh3</link>
      <guid>https://forem.com/botanical/reprogram-your-mindset-4mh3</guid>
      <description>&lt;p&gt;Coming into learning with false notions can make the task harder. On my journey to leveling up, these were a few things I needed to reprogram in my own mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;programming should be easy → programming is not easy&lt;/li&gt;
&lt;li&gt;mistakes are fatal → there are no bad mistakes&lt;/li&gt;
&lt;li&gt;there is no place for emotions in learning → embrace your emotions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Letting go of harmful assumptions
&lt;/h2&gt;

&lt;p&gt;I needed to let go of the idea that programming was easy and that I should understand programming concepts straightaway.&lt;/p&gt;

&lt;p&gt;Learning in general is an effortful, challenging task. If you believe programming &lt;em&gt;should&lt;/em&gt; be easy, then every time it is &lt;em&gt;not&lt;/em&gt; easy, you may come to the conclusion that it implies you are not capable of programming or that &lt;em&gt;you&lt;/em&gt; are the problem. The truth is, &lt;strong&gt;programming is not easy&lt;/strong&gt; and you &lt;strong&gt;are&lt;/strong&gt; capable of programming, but like any kind of learning, there will be challenging days and that is to be expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reframing my relationship to failure
&lt;/h2&gt;

&lt;p&gt;Before babies can walk, they crawl. And part of that process includes falling down, getting hurt, and then getting back up again.&lt;/p&gt;

&lt;p&gt;You will inevitably run into hurdles as you pursue your programming ambitions. Every time you run into a hurdle, know that you are not failing. &lt;/p&gt;

&lt;p&gt;Any challenge is simply an opportunity to grow. So next time you make a programming "mistake", remember: &lt;strong&gt;there are no mistakes, just happy accidents&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embracing my emotions
&lt;/h2&gt;

&lt;p&gt;Before we are programmers, we are people with emotions. &lt;/p&gt;

&lt;p&gt;As you embark on our journey of leveling up, you will encounter frustrating days of learning. The key is to &lt;strong&gt;acknowledge those feelings&lt;/strong&gt;, whether they be feelings of frustration, overwhelm, stress, or powerlessness, &lt;em&gt;before&lt;/em&gt; they turn into &lt;strong&gt;hopelessness and burnout&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In order to become the best programmer you can be, it is important to reflect on your mindset and reprogram it if you need to. &lt;/p&gt;

&lt;p&gt;These are three points you can keep in mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let go of assumptions that may harm you&lt;/li&gt;
&lt;li&gt;Reframe your relationship to failure&lt;/li&gt;
&lt;li&gt;Embrace your emotions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As always, please share your thoughts, I would love to hear them.&lt;/p&gt;

</description>
      <category>culture</category>
      <category>beginners</category>
      <category>learning</category>
      <category>engineers</category>
    </item>
    <item>
      <title>Talk Less, Listen More</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Sun, 14 Mar 2021 16:33:25 +0000</pubDate>
      <link>https://forem.com/botanical/talk-less-listen-more-i89</link>
      <guid>https://forem.com/botanical/talk-less-listen-more-i89</guid>
      <description>&lt;p&gt;When you are in conversation with someone, are you usually eager to respond, or do you wait and listen to &lt;em&gt;understand&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;If you want to be a good communicator, it is important that you understand the value of &lt;strong&gt;active listening&lt;/strong&gt;. Active listening allows for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more trust&lt;/li&gt;
&lt;li&gt;faster conflict resolution&lt;/li&gt;
&lt;li&gt;improved productivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The act of &lt;a href="https://en.wikipedia.org/wiki/Active_listening" rel="noopener noreferrer"&gt;active listening&lt;/a&gt; doesn't only involve knowing what a person has said, but also observing non-verbal cues like body language and behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Things to avoid
&lt;/h3&gt;

&lt;p&gt;There are a few things you should avoid as an active listener: rehearsing, filtering, and problem solving.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rehearsing
&lt;/h4&gt;

&lt;p&gt;When you are focused on rehearsing, you are focused more on responding than listening. This can be counterproductive because you may not fully address what a person has said. &lt;/p&gt;

&lt;h4&gt;
  
  
  Filtering
&lt;/h4&gt;

&lt;p&gt;When you are filtering, you are only listening for what you want to hear. This can be counterproductive because you can be limiting the potential for bonding in a conversation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Problem Solving
&lt;/h4&gt;

&lt;p&gt;When you are problem solving, you are trying to give advice or feedback. This is counterproductive because you may be emphasizing solutions over a person's feelings.&lt;/p&gt;

&lt;p&gt;Try this in the next one on one you have and let me know what you think.&lt;/p&gt;

</description>
      <category>culture</category>
      <category>listening</category>
      <category>empathy</category>
      <category>engineer</category>
    </item>
    <item>
      <title>Be Openly Confused</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Sat, 13 Mar 2021 22:37:48 +0000</pubDate>
      <link>https://forem.com/botanical/be-openly-confused-3601</link>
      <guid>https://forem.com/botanical/be-openly-confused-3601</guid>
      <description>&lt;p&gt;Fostering a culture in your software engineering team where people can share openly that they are confused is &lt;strong&gt;productive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sharing when you are confused provides an opportunity for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;team bonding&lt;/li&gt;
&lt;li&gt;knowledge sharing&lt;/li&gt;
&lt;li&gt;clarification of potential ambiguity&lt;/li&gt;
&lt;li&gt;transparency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others on your team might be confused too but may not feel confident enough to share it. &lt;strong&gt;Value vulnerability and truth over comfort and the guise of understanding because the team will benefit as a whole.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>vulnerability</category>
      <category>engineering</category>
      <category>teams</category>
      <category>culture</category>
    </item>
    <item>
      <title>Three Ways to Prepare Your Pull Request for a Great Review</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Tue, 28 Apr 2020 03:20:53 +0000</pubDate>
      <link>https://forem.com/botanical/three-ways-to-prepare-your-pull-request-for-a-great-review-23ol</link>
      <guid>https://forem.com/botanical/three-ways-to-prepare-your-pull-request-for-a-great-review-23ol</guid>
      <description>&lt;h1&gt;
  
  
  Three Ways to Prepare Your Pull Request for a Great Review
&lt;/h1&gt;

&lt;p&gt;Some software engineering teams use &lt;a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests"&gt;pull requests&lt;/a&gt; to perform code reviews. In a pull request (sometimes referred to as &lt;strong&gt;PR&lt;/strong&gt;), you have the chance to get feedback or approval on your code and make any additional changes before merging your code.&lt;/p&gt;

&lt;p&gt;The review process can be dependent on the personalities of reviewers, but I will describe the &lt;strong&gt;three&lt;/strong&gt; ways I try and prepare my pull requests so that I can ensure that it is of the best quality before submitting it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Review your own PR first
&lt;/h3&gt;

&lt;p&gt;Try to take on the perspective of whoever might review your code. Do you have a mental checklist for what you think they might be looking for during the code review? For example, you can check for typos, formatting, or failing tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Add a description of what you prioritize in the review
&lt;/h3&gt;

&lt;p&gt;When I am reviewing code, I find it helpful when the person who requested a review points out specific parts of the code they want me to look at more closely. Making note of a particular section you might want greater feedback on will help speed up the time it takes to receive a review. For example, if you are unsure of the way you mocked certain objects in your test, you can point that out!&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Explain the changes made
&lt;/h3&gt;

&lt;p&gt;Explaining why code changes were made along with &lt;em&gt;what&lt;/em&gt; changes were made will help provide context to your reviewer. I find it better to provide some context than none at all. For example, if you are working in an open source repository and you submit a pull request, you can link the corresponding issue that was opened for the project.&lt;/p&gt;

&lt;p&gt;You can improve your pull requests &lt;strong&gt;right now&lt;/strong&gt; by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reviewing your own PR first&lt;/li&gt;
&lt;li&gt;Adding a description of what you want reviewed first&lt;/li&gt;
&lt;li&gt;Explaining why you made the changes you did&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let me know if you use any of these methods or share some other practices you follow before submitting your pull request! 🙂&lt;/p&gt;

</description>
      <category>pullrequest</category>
      <category>codereview</category>
      <category>beginners</category>
      <category>botanical</category>
    </item>
    <item>
      <title>Demystifying Development Environments</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Fri, 24 Apr 2020 04:32:40 +0000</pubDate>
      <link>https://forem.com/botanical/demystifying-development-environments-3phe</link>
      <guid>https://forem.com/botanical/demystifying-development-environments-3phe</guid>
      <description>&lt;p&gt;To ensure that software is reliable and robust, it is important to consider using multiple environments in the process of software development. The environment setup I am most familiar with is one that has a &lt;strong&gt;development&lt;/strong&gt;, &lt;strong&gt;staging&lt;/strong&gt;, and &lt;strong&gt;production&lt;/strong&gt; environment, sometimes referred to in their condensed form: &lt;strong&gt;Dev Env&lt;/strong&gt;, &lt;strong&gt;Staging Env&lt;/strong&gt;, and &lt;strong&gt;Prod Env&lt;/strong&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  🖌️ Dev Env
&lt;/h4&gt;

&lt;p&gt;The development environment would be the first stage where a developer could deploy and test their code. It's like a sketchbook with existing sketches, where you can draw your first drafts of an illustration. This would be the first stage where potential bugs are found and fixed before moving onto the next environment: staging.&lt;/p&gt;

&lt;h4&gt;
  
  
  🎨 Staging Env
&lt;/h4&gt;

&lt;p&gt;The staging environment is the next stage where code is deployed for additional testing. This is also the stage where Quality Assurance testing is performed. Staging is the environment where developers can test interactions between dependencies and is meant to mimic a production environment. Staging is where a variety of test cases are performed which either reveal bugs or affirm that the code is operating as intended. Once the code and all the test cases are verified, the code is deployed to the final stage: production.&lt;/p&gt;

&lt;h4&gt;
  
  
  🖼️ Prod Env
&lt;/h4&gt;

&lt;p&gt;The production environment is the stage where code is live to users and fully functioning. Although, that doesn't mean there &lt;strong&gt;aren't&lt;/strong&gt; bugs. 🐛😉&lt;/p&gt;

</description>
      <category>environments</category>
      <category>programming</category>
      <category>juniorengineers</category>
      <category>devops</category>
    </item>
    <item>
      <title>Ruby's attr_reader and attr_writer</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Tue, 21 Apr 2020 03:09:38 +0000</pubDate>
      <link>https://forem.com/botanical/ruby-s-attrreader-and-attrwriter-133g</link>
      <guid>https://forem.com/botanical/ruby-s-attrreader-and-attrwriter-133g</guid>
      <description>&lt;p&gt;Imagine you are writing a program to help your local cat animal shelter, so you start by defining a Cat Class in Ruby 😺&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you go ahead and make a call to create a new Cat with a name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Telemakhos"&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; NoMethodError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You run into &lt;code&gt;NoMethodError&lt;/code&gt; 🙀. Well, that is expected since we haven't written a method to define a cat's name. We've just written the &lt;em&gt;getter&lt;/em&gt; method. We also need to write a _setter_method.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a getter and setter method?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Getter&lt;/strong&gt; methods are used to retrieve the value of an instance variable from an object and &lt;strong&gt;Setter&lt;/strong&gt; methods are used to set the value of an instance variable. In many languages, you can read and write the value of an instance variable directly but in Ruby you have to specify a getter and setter.&lt;/p&gt;

&lt;p&gt;Let's have a second pass at our Cat Class. Say you create a new instance of Cat attached to a variable &lt;code&gt;tabby&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;#getter method&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#setter method&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;tabby&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Telemakhos'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;tabby&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "Telemakhos"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With our new getter and setter methods, we can now &lt;em&gt;get&lt;/em&gt; and &lt;em&gt;set&lt;/em&gt; the name of a cat 😼&lt;/p&gt;

&lt;p&gt;Now imagine if you had more properties to a Cat than just &lt;code&gt;name&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
    &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
    &lt;span class="vi"&gt;@breed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;
    &lt;span class="vi"&gt;@weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you wanted to &lt;strong&gt;get&lt;/strong&gt; or &lt;strong&gt;set&lt;/strong&gt; any of those properties, it would require &lt;em&gt;eight&lt;/em&gt; more getter and setter methods! 😿&lt;/p&gt;

&lt;h3&gt;
  
  
  There is a better alternative: &lt;strong&gt;attr_reader&lt;/strong&gt; and &lt;strong&gt;attr_writer&lt;/strong&gt;!
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;attr_reader&lt;/code&gt; and &lt;code&gt;attr_writer&lt;/code&gt; are Ruby methods that can be used to replace getter and setter methods and mimic the accessing of instance variables seen in other languages such as TypeScript. Using &lt;code&gt;attr_reader&lt;/code&gt; and &lt;code&gt;attr_writer&lt;/code&gt; is especially useful when you want to read and manipulate the values of a Class that has many instance variables.&lt;/p&gt;

&lt;p&gt;Here is an example of it's utility in depth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# cat.rb&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:breed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:weight&lt;/span&gt;
  &lt;span class="nb"&gt;attr_writer&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:breed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:weight&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
    &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
    &lt;span class="vi"&gt;@breed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;
    &lt;span class="vi"&gt;@weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Julie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Tabby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Julie"&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;age&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 3&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;breed&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Tabby"&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weight&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 8&lt;/span&gt;
&lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weight&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 10&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;In conclusion, &lt;code&gt;attr_reader&lt;/code&gt; and &lt;code&gt;attr_writer&lt;/code&gt; can replace a bunch of getter and setter methods in just a single line! 😻&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>basics</category>
      <category>beginners</category>
      <category>introduction</category>
    </item>
    <item>
      <title>Questions to Ask Your Engineering Team</title>
      <dc:creator>Jennifer Tran</dc:creator>
      <pubDate>Fri, 10 Jan 2020 03:47:10 +0000</pubDate>
      <link>https://forem.com/botanical/questions-to-ask-your-engineering-team-346i</link>
      <guid>https://forem.com/botanical/questions-to-ask-your-engineering-team-346i</guid>
      <description>&lt;p&gt;As I reflect on my first year as a software engineer, I realize there are many questions I wish I had asked at the start of my career. I have narrowed down this infinite list into a set of ten questions I think anyone currently on or newly joining an engineering team will find useful. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Who looks after applications?
&lt;/h2&gt;

&lt;p&gt;In this context, I am using "application" to describe a self-contained unit of functionality. As a new engineer, my main code contributions were initially to existing codebases. It wasn't until I gained more experience and started building out whole solutions from scratch that I had realized the importance of determining who was responsible for the application. This question gets to the root of responsibility: who is responsible for monitoring applications and who is responsible for handling any incident that may occur? Who is responsible for maintaining the application? Who is responsible for responding to an alert about the system being down at 2 in the morning?&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What is the team's deployment process like?
&lt;/h2&gt;

&lt;p&gt;Knowing how to deploy your code is just as important as writing code. Deploying code is the process of moving code from one environment to another. Typically, programmers write and test code in a development environment, and the code eventually makes its way to a production environment where real users actually interact with it! Firstly, knowing how to deploy your code is important so that you can actually make changes that eventually reach real users. Secondly, asking this question is important because it will clarify the actual deployment process which could range from something like running a single command to performing a manual process that is long and arduous.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What does the average path to production look like for a service or application?
&lt;/h2&gt;

&lt;p&gt;This question is somewhat related to the previous question in the sense that it lies in the same domain, but the main difference is that it captures the steps you may need to go through before you are able to deploy your code to the production environment. For example, is there a board of people who need to approve code changes before deploying to production? The question encourages the team to consider the steps they take when they want to deploy code to production and whether those steps are clear to someone on-boarding. As a Junior Engineer, asking this question helped me to understand if there was a standard process or if the process varied depending on the application. This question will engage the team to really define the process. This is also inherently important for any developer to get clarity on because all developers hope that their code reaches user. One day, you may be responsible for managing releases for services or applications, which is sometimes not a trivial task.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Does the team practice continuous integration?
&lt;/h2&gt;

&lt;p&gt;Continuous Integration (CI) is a practice where developers consistently merge their code into a central repository where automated builds are created and automated tests are typically run. CI is important because it helps mitigate bugs and merge conflicts early on. The idea is, when code from a separate branch is frequently integrated into a master branch, it has fewer chances of breaking what exists in the master branch. This question can be fairly straightforward with a yes or no answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How often does the team release to production?
&lt;/h2&gt;

&lt;p&gt;This is a great question you could ask prior to joining an engineering team in general! You get two major pieces of information out of this question:&lt;br&gt;
When will you get to see your code in the field.   One of the more fulfilling aspects of writing code is knowing that it will actually be used, and seeing it in action!&lt;br&gt;
How quickly does your code need to be turned around. The more infrequent the releases, the more important each release and the more important it is that your code be working by that time.  &lt;/p&gt;

&lt;h2&gt;
  
  
  6. How closely do engineers work with business stakeholders or customers?
&lt;/h2&gt;

&lt;p&gt;This is also a great question to ask prior to joining an engineering team because it will give you perspective on how you, as an engineer, will be going about your work and provide clarity on who you may collaborate with. The more closely you work with stakeholders and customers, the stronger your interpersonal skills will become which will help you in doing your job and growing your career. &lt;/p&gt;

&lt;h2&gt;
  
  
  7. How does work come into the team?
&lt;/h2&gt;

&lt;p&gt;The question will help clarify how tasks are assigned to engineers. Does it come in the form of tickets? If so, who assigns those tickets? Can this process be negotiated? Does it vary by quarter?  The more you know how work is assigned, the better you’ll be able to manage your time and ensure that work is distributed fairly.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. How involved are engineers with deciding what to build?
&lt;/h2&gt;

&lt;p&gt;This question is great to ask in interviews or on the first day of a new engineering job so that you can have an understanding of how much say you can have on the engineering solutions you build. Some people are content to fulfill the specifications of other people. Some love to take a more involved approach. Figuring out the standards of the business will help you decide if their expectations match your preferences.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. How do you spin up a new service?
&lt;/h2&gt;

&lt;p&gt;This question will really encourage the engineering team to distill their practices into a coherent and easy-to-follow process which is good for the on-boarding engineer and the team in general!&lt;/p&gt;

&lt;h2&gt;
  
  
  10. How are architectural decisions made?
&lt;/h2&gt;

&lt;p&gt;Is there a formal process? Is it open-ended? This will help you understand the standards and process of designing new solutions in your new team. &lt;/p&gt;




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

&lt;p&gt;In summary, these are ten questions I wish I knew to ask before I started my first software engineering job. I also believe each team should be able to answer these questions definitively and could even provide them to new engineers who are on-boarding!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who looks after applications?&lt;/li&gt;
&lt;li&gt;What is the team's deployment process like?&lt;/li&gt;
&lt;li&gt;What does the path to production look like for a service or application?&lt;/li&gt;
&lt;li&gt;Does the team practice continuous integration?&lt;/li&gt;
&lt;li&gt;How often does the team release to production?&lt;/li&gt;
&lt;li&gt;How closely do engineers work with business stakeholders or customers?&lt;/li&gt;
&lt;li&gt;How does work come into the team? &lt;/li&gt;
&lt;li&gt;How involved are engineers with deciding what to build?&lt;/li&gt;
&lt;li&gt;How do you spin up a new service? &lt;/li&gt;
&lt;li&gt;How are architectural decisions made?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What are some other questions you would ask your team? 🙂&lt;/p&gt;

&lt;h6&gt;
  
  
  Cover Image by Jennifer Tran
&lt;/h6&gt;

</description>
      <category>engineering</category>
      <category>onboarding</category>
      <category>questions</category>
      <category>juniorengineer</category>
    </item>
  </channel>
</rss>
