<?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: Corey McCarty</title>
    <description>The latest articles on DEV Community by Corey McCarty (@xanderyzwich).</description>
    <link>https://dev.to/xanderyzwich</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%2F116770%2F1f7b2e17-1233-4110-8edd-0772af5dc32e.jpg</url>
      <title>DEV Community: Corey McCarty</title>
      <link>https://dev.to/xanderyzwich</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xanderyzwich"/>
    <language>en</language>
    <item>
      <title>Hacktoberfest</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Wed, 06 Oct 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/hacktoberfest-59dj</link>
      <guid>https://dev.to/xanderyzwich/hacktoberfest-59dj</guid>
      <description>&lt;h2&gt;
  
  
  What is Hacktoberfest?
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest is an effort by Digital Ocean to increase involvement in Open Source projects. &lt;a href="https://coreydmccarty.dev/posts/2021_10_06_hacktoberfest/hacktoberfest.digitalocean.com"&gt;Sign up here.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Open Source?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;Open source is source code that is made freely available for possible modification and redistribution. Products include permission to use the source code, design documents, or content of the product. The open-source model is a decentralized software development model that encourages open collaboration. A main principle of open-source software development is peer production, with products such as source code, blueprints, and documentation freely available to the public. The open-source movement in software began as a response to the limitations of proprietary code.&lt;/p&gt;

&lt;p&gt;It's commonly pointed out about open source that it's "Free as in freedom, not as in beer".&lt;/p&gt;

&lt;p&gt;Projects can be big or small, and developers free or paid. Any software project can be made open source by adopting an appropriate license and allowing public contribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of proprietary or closed source software
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Windows&lt;/li&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;li&gt;Oracle SQL Server&lt;/li&gt;
&lt;li&gt;Java programming language&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  examples of open source software
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;Wikipedia&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Chromium&lt;/li&gt;
&lt;li&gt;pip&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;Go lang&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why is open source software important
&lt;/h3&gt;

&lt;p&gt;Because open source software has freely available source code, if the maintainer ever stops providing updates (or closes the source after a certain point) then the community can take the source and continue development of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is contributing to open source is important, and what do I get out of doing this FREE work?
&lt;/h3&gt;

&lt;p&gt;Learning is important, and it can be difficult to learn about long term software maintenance in a small single person project. Working on open source software allows you to step into long term support of software even before having a job in the field. You need to read through the docs and figure out what's going on before you can contribute. This is VERY much like what happens in the real world.&lt;/p&gt;

&lt;p&gt;Also, if you have issues with the software then you can go and make a fix yourself instead of waiting for the maintainer to schedule and write the change.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the most minimal thing I can do to contribute?
&lt;/h3&gt;

&lt;p&gt;Contributions can be any submission to a code repository. It can be to the code itself, tests, build process, or even documentation. It can also be quite valuable to larger projects to even have someone that will ask clarifying questions in new issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  How are my contributions tracked in a way I can get the swag?
&lt;/h3&gt;

&lt;p&gt;You Register with Digital Ocean at the Hacktoberfest website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where can I contribute at (I don't understand GitHub)?
&lt;/h3&gt;

&lt;p&gt;If you go to the resources section on their webpage there are resources for contibuting no matter your level. There are ways to search for repositories in Github and GitLab. Dev.to has a topic and there is discussion on Twitter. This is one of the few events that manages to permeate throughout dev culture.&lt;/p&gt;

&lt;h3&gt;
  
  
  I don't know how to download the codebase so I can contribute?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/the-beginners-guide-to-git-github/"&gt;Free Code Camp - Git Guide&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I find the issues to be fixed?
&lt;/h3&gt;

&lt;p&gt;Issues are listed on Github for a given repository. You can also use &lt;a href="http://issuehub.pro/"&gt;issuehub.pro&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Who do I talk to in a codebase to make sure I'm doing it correctly?
&lt;/h3&gt;

&lt;p&gt;This will vary pretty widely depending on the project. There will usually be some type of information on the project's README.md and often a CONTRIBUTING.md&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;h2&gt;
  
  
  How do I contribute?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Register&lt;/li&gt;
&lt;li&gt;Make 4 PR's&lt;/li&gt;
&lt;li&gt;Get shirt (or have a tree planted in your name)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you'd like to find more open source software to use checkout &lt;a href="https://sourceforge.net/directory/os%3Awindows/"&gt;SourceForge&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Pitching Ideas to Developers</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Tue, 21 Sep 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/pitching-ideas-to-developers-11af</link>
      <guid>https://dev.to/xanderyzwich/pitching-ideas-to-developers-11af</guid>
      <description>&lt;p&gt;There's a trope among developers of the people that have a "great idea" for an app or website, but no coding skills or knowledge. It's quite common for those people to come to a developer or community looking to find someone interested in putting in the work of creating the thing that they envision. Most of the time it comes as a startup pitch where they expect the developer to put in work with no promise of ever receiving payment. This is basically asking someone to work for free on the gamble that there will one day be more income than the cost of infrastructure. Many developers tend towards a skeptical or cynical reaction towards this. There was even a whole plot point in the show Silicon Valley about it. One developer's &lt;a href="https://medium.com/the-mission/so-you-have-an-app-idea-eh-cbe73d15c997"&gt;reaction can be read here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll share with you some of the information that came out in one such conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think of this like a startup
&lt;/h2&gt;

&lt;p&gt;If you were starting any other type of business than tech you would put together a specific plan before bringing in any other people. Consider "I have an idea for a business" and put effort into modeling out, describing, and planning how your business works and get lots of feedback.&lt;/p&gt;

&lt;p&gt;If you had a restaurant idea and went to a chef saying "I have an idea for a restaurant, but I can't cook and I'm looking for someone to handle the kitchen part." You had better have a strong business case for why a chef would want to invest their time in your idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning
&lt;/h2&gt;

&lt;p&gt;There are lots of things that you can plan out without a developer or writing any code at all. You can write the business cases(s), draw out the screens in all sorts of user friendly tools (or on paper), get feedback from potential users about what features they would want, etc.&lt;/p&gt;

&lt;p&gt;When you come to the point of sitting down with a developer, then you would be handing over a bunch of specifications and they can just build it. The best way to do this would be to have some amount of money to invest to pay the developer to deliver a some bit of the product, This is exactly like you would do if you were prototyping a physical invention.&lt;/p&gt;

&lt;p&gt;More often than not, devs find that when/if they get involved with this type of thing they aren't just developers they're also expected to be designers, marketing, search engine optimization (SEO) experts, and product managers. Suddenly they are doing the work of a whole team (or more) with no promise of ever being paid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;You may very well have an amazing idea and find the perfect developer that both believes in the idea, and has endless free time to devote to it, but keep in mind that what you're asking is basically "I had this idea in the shower that I've put no effort into and I'd love for you to spend all of your spare time building this thing for me so that I might be able to make lots of money without doing anything." If you've put in lots of effort and have a well laid out plan for this company that you are starting, you are much more likely to find a developer that's interested.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href="https://georgespake.com/blog/"&gt;George Spake&lt;/a&gt; for assisting with this content.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>freelance</category>
      <category>programming</category>
      <category>planning</category>
    </item>
    <item>
      <title>Coding Challenge with Clean Code</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Fri, 20 Aug 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/coding-challenge-with-clean-code-2hp2</link>
      <guid>https://dev.to/xanderyzwich/coding-challenge-with-clean-code-2hp2</guid>
      <description>&lt;p&gt;After studying Uncle Bob's Clean Code and trying to practice it as much as possible, I find that it can make a huge improvement to the maintainability or even just readability of a piece of code.&lt;/p&gt;

&lt;p&gt;This coding challenge came up in one of my favorite coding communities:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Length of the Last Word&lt;br&gt;&lt;br&gt;
Given a string s consisting of some words separated by some number of spaces, return the length of the last word in the string.&lt;br&gt;&lt;br&gt;
A word is a maximal substring consisting of non-space characters only.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, because I like to do challenges with tests, I put together this bit of unit test using Python's built in unittest package based on the three examples that were given with the challenge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestCase&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;last_word_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestLastWordLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
        &lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_word_length_golf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello World'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; 
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_two&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
        &lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_word_length_golf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' fly me to the moon '&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_three&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
        &lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_word_length_golf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'luffy is still joyboy'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, I knew that I could pull this off with a single line of Python. I quickly wrote this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;last_word_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;'[\W]+'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does everything that the challenge asks for, but part of the goal of doing these challenges in my community is that we use several different languages and it allows everyone to get more familiar with the language that you used, whether they have ever written it before or not. One liners like this are not usually a good idea for long term maintenance OR teaching. So, I took a minute to clean it up a bit. Having tests laid out made it really easy to know that I'd not introduced any errors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;last_word_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
    &lt;span class="n"&gt;indefinite_whitespace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;'[\W]+'&lt;/span&gt; 
    &lt;span class="n"&gt;clean_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
    &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indefinite_whitespace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clean_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, it's pretty easy for anyone with a moderate amount of coding ability to understand what's going on. We have a regex that matches any clustering of whitespace. We have an input string that gets trimmed/stripped of it's surrounding whitespace. That string gets split according to the regex. And then we return the length of the last word.&lt;/p&gt;

&lt;p&gt;There are two main things that this technique improves. Breaking the pieces apart reduces the mental overhead of understanding each piece. Naming the variable helps to document the intention of that line. It also makes the later lines significantly easier to understand by offering those names. That benefit will help you both with the reading and the writing of your code. The other major benefit comes long after this code has been put into version control. The history of this code allows you to tell which part of this was changed when. Instead of a diff showing that something in this block was changed at a, b, c, and d commits, you can see that the regex changed in commit a, the input cleaning changed in b and d and maybe the split call changed in c. This is especially helpful if you have IDE/editor functionality that helps you to see the git blame info for each line.&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>programming</category>
      <category>cleancode</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Career Advancement</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Thu, 10 Jun 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/career-advancement-4nf</link>
      <guid>https://dev.to/xanderyzwich/career-advancement-4nf</guid>
      <description>&lt;p&gt;Once you have figured out a way into your first software development role, it is only logical that you would consider how you can move forward in your career. But it's not always clear what the next steps are beyond completing the tasks that you are given.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning
&lt;/h2&gt;

&lt;p&gt;Firstly, I'd like to say that setting your focus on climbing the ladder quickly is not exactly the best use of your time. No doubt that you've figured out that learning is a pretty important part of our career field, and that doesn't change after getting hired. Having a job does provide a significant amount of direction for your learning. It's a good first step to get comfortable with the language, frameworks, and tools that your team uses; focus first on what's relevant to your current project. Learning things that seem small may be greatly helpful when making decisions later.&lt;/p&gt;

&lt;p&gt;When you are learning your first language the biggest thing that you are really learning is what computer programming really is. You learn how a programming language can be used to complete tasks. When you learn your second programming language, then the most important thing that you are learning is how you learn best. You will also learn how much the learning of your first language carries over into using a new language. There should be significant overlap in techniques. The language after all is just a tool at your disposal. By the time that you learn your third programming language you are really learning how esily you can pick up new things. I highly encourage people to take languages one at a time. You will learn more by getting into a deeper knowledge of your first language than by trying to learn three languages at the same time (like one of my coworkers). Allow yourself to become fluent in your first langauge to the point that you can think in that language the same way that you would a spoken language. If for some reason you find yourself working in a new language before you believe that you have reached the necessary depth in your first language then you should work to bring that new language to the level of understanding that you had in your first language, and continuing in this new language from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know Yourself
&lt;/h2&gt;

&lt;p&gt;The biggest part of your career, throughout all phases of it, is you. If you are anything like me then you may have managed to reach a suprising age before actually understanding WHO you are, and what your strengths are. Branding is something that gets discussed a lot in some dev circles, and the short version is that you have to know what's important to you, and what you're good at. I highly recommend asking your coworkers that know you best what they think your strengths are. For me personally this is asking questions and just talking to people. I really enjoy learning about things, whether those things are relevant to my job or not. The thing that has been the central pivot of any acknowledgement that I've received are about taking part in discussions and asking questions that move towards goals. Your strengths aren't likely the same as mine, but it's very important that you know what they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Play to Your Strenghths
&lt;/h2&gt;

&lt;p&gt;Once you know what things set you apart from your peers and where your largest amount of value lies, you need to keep these in mind during your work. For me this means that I make sure to ask questions about things that don't seem to make sense. Sometimes this reveals that I'm just the only one in the room that didn't know something, other times it reveals that the entire team had assumed something wrongly. If your strengths lie directly in code work then perhaps you would be able to provide special value in your code reviews or pair/team programming where you could make an impact with the overall code quality. Whatever you do with your streghths, remember that every person on your team also has some strength and you should never assume that you are better than they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remember Your Team
&lt;/h2&gt;

&lt;p&gt;The best engineers not only provide value in their work, but improve the skills of those around them. This comes in the forms of teaching and of motivating those around them to learn more. Developing a culture of improvement and learning is paramount if a team is going to get better over time. As learning is such a pivotal part of our industry a team/person that is not interested in improvement is a liability to their company as our tools continue to improve. Our languages get new features and flaws are discovered. If we don't grow with our tools then our productivity is actually reducing over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advancement Path
&lt;/h2&gt;

&lt;p&gt;In order to become a junior developer you need to learn how to write code. These are the basic skills that everyone in the field should have. I expect that everyone reading this understands some amount of computer programming basics and knows that it is the vocabulary that we use to discuss solutions.&lt;/p&gt;

&lt;p&gt;In order to move on to a mid level then you need to understand the tooling itself and how tradeoffs work. Every tool has its strengths and weaknesses. As you work on different projects you will learn about the weaknesses of the tools that you use and the problems that can happen because of this. There is no such thing as a 'best programming language' or 'best framework'. Every tool has an area where it accels. Understanding tradeoffs is what will help you to move into this space.&lt;/p&gt;

&lt;p&gt;As you move toward senior or lead, your skills need to spread more into team culture and dynamics. It becomes important that you be able to mentor other developers. Mentorship doesn't always imply that the mentor knows more than the mentee. We all have gaps in our knowledge and in my experience a mentorship relationship can actually go both ways. The developer that has been in the industry longer can provide direction from that knowledge, and the developer that's been in the industry less time can provide information about different practices or tools that the more experienced dev has no experience with. Being able to identify where your knowledge gaps are and who around you knows the most are very important. In order to make the important decisions that come with more responsibility and title you must be able to evaluate the necessary factors and this often means asking the people that have the most knowledge.&lt;/p&gt;

</description>
      <category>career</category>
      <category>coding</category>
      <category>learning</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Uncle Bob - Lesson One</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Tue, 18 Aug 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/uncle-bob-lesson-one-52mk</link>
      <guid>https://dev.to/xanderyzwich/uncle-bob-lesson-one-52mk</guid>
      <description>&lt;p&gt;This material is a summary of a &lt;a href="https://www.youtube.com/watch?v=7EmboKQH8lM"&gt;talk by Uncle Bob that I watched on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Regardless of age, race, gender as developers we share a passion for something, and can communicate about it in a way that most other people can't.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction to Clean Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--idt2htoB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://coreydmccarty.dev/img/wtfpm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--idt2htoB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://coreydmccarty.dev/img/wtfpm.jpg" alt="The only valid measurement of code quality: wtf's per minute"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this comic the door on the right must contain some pretty terrible code with five simultaneous WTF's, but how do we move from that to the left with only two? How do we avoid driving coworkers mad trying to understand our code?&lt;/p&gt;

&lt;p&gt;In the lecture room there are thousands of processors. Your smartphone alone contains more computing power than the the planet Earth in 1980. Computers/processors are in a huge amount of things around us. Airbuds, cameras, lights, speakers, smoke detectors, and even exit signs contain small processors. In speakers and microphones, a small audio processor is used for removing audio hum. It's become less expensive than using a traditional capacitor and inductor. Trickle charge in emergency exit signs is probably being monitored by a processor. Any given person in our society interacts with a software system at least once every minute. There is software running in your refrigerator, dishwasher, stove, tv, remote, and even your car. Modern cars run over a hundred million lines of code running in the entertainment system, gps, and even in the engine controller. When you push on the brake pedal there are if statements that decide whether or not to slow/stop the car. This means that there are likely dozens of people that have died because software controlling the brake and accelerator failed for some stupid reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;You and I are killing people. We didn't get into this business to kill people. We became programmers because we had some experience with a cool machine somewhere that we were able to make do something fun, and we decided that we wanted to do that for the rest of our life. Now you can kill people with software, or lose 450 million of dollars in 45 minutes. There is nothing that you can do in our society without software. Society doesn't realize just how dependent everything is on software. And developers control that. The people that believe that they rule the world bring their rules to us and we write the software that governs the machines that actually run the world. Society doesn't yet comprehend how dependent they are upon developers. They won't until some dumb programmer does one dumb thing and kills 10,000 people at once. When that occurs the politicians of the world will rise up and point a finger at US.&lt;/p&gt;

&lt;p&gt;The CEO of Volkswagen North America testified before the American congress about why &lt;a href="https://www.epa.gov/enforcement/volkswagen-clean-air-act-civil-settlement"&gt;their software was cheating EPA regulations in California&lt;/a&gt;. He said "It was just a couple of software developers that did this for whatever reason." It _ &lt;strong&gt;was&lt;/strong&gt; _ a couple of developers that did it. They are now in jail. But when the politicians of the world come to hold us accountable for our actions they will ask "How could you let this happen?" and if our answer is "&lt;em&gt;Boss said that it had to get done by Tuesday&lt;/em&gt;" then they will be forced to regulate us and tell us what languages we can use, what courses we must take, what books we must read, what process we must follow, and what signatures that we must get to do anything.&lt;/p&gt;

&lt;p&gt;How do we avoid this? We avoid it by getting there first. We have to establish an ethics of software development. We are not a profession as there is nothing that we profess. We have to build our own set of standards so that when the politicians of the world come to hold us accountable we can respond with proof that it is not neglegence because we have standards, morals, and ethics that have been maintained. They will come to us to looking for those standards that they can enforce, and we had better have a good definition of what it is that we hold dear as a profession. One of those had better be cleanliness of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are Programmers so slow?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt; wrote a book called &lt;a href="https://en.wikipedia.org/wiki/Special:BookSources/978-0321413093"&gt;Implementation Patterns&lt;/a&gt;. In its introduction it stated that the book was based on a '_ &lt;strong&gt;fragile premise&lt;/strong&gt; &lt;em&gt;' that '&lt;/em&gt; &lt;strong&gt;good code matters&lt;/strong&gt; _.' This seems pretty solid. If we work on a green field project with no existing code then we can get features completed extremely fast. By the time a year has past, a request for similarly sized feature may take six months. The speed at the beginning is done at the cost of a bit of mess. Over time this slows progress down to around 1% of the original rate.&lt;/p&gt;

&lt;p&gt;You have to figure out how to go faster. Adding more people to the team makes the team slower. The experienced people have to slow down to train the new people, and you have to hope that the new peole come up to speed in time to become helpful. The new people then wind up being trained by the old code, and they emulate it. The problem of messy code becomes worse.&lt;/p&gt;

&lt;p&gt;If programmers didn't make a mess then they'd be faster. You could add new features in a reasonable amount of time as long as the code was able to be maintained in an orderly way. We make the mess so that we can go fast. Then once the code finally works there can be a fear of breaking it that prevents it being touched again. Having gotten it work is only first part. Nobody writes clean code. Once it works it will be a mess. Once it works, it should then be cleaned. That should take roughly the same amount of time that it took to write it. Nobody wants to put that time in, and that's the problem. You aren't done when it works, you're done when it's right. With that attitude it would always stay clean and you'd never experience the slow down.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Clean Code?
&lt;/h2&gt;

&lt;p&gt;Uncle Bob says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The only way to go fast is to go well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;Bjarne Stroustrup&lt;/a&gt; - creator of C++
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;I like my code to be elegant and efficient ... clean code does one thing well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But, what does "one thing" mean? Uncle Bob has a theory.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://en.wikipedia.org/wiki/Grady_Booch"&gt;Grady Booch&lt;/a&gt; - writer of Object Oriented Software Design with Applications
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Clean code is simple and direct. It reads like well-written prose...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What does it mean for code to resemble well-written prose? Uncle Bob's theory on this will be shared as we go forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://michaelfeathers.silvrback.com/"&gt;Michael Feathers&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Clean code always looks like it was written by someone who cares.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When's the last time that you read a module and thought that the author cared about you and everyone that would be reading that code?&lt;/p&gt;

&lt;p&gt;Your job is only half to get code to work. &lt;em&gt;The more important half of your job is to write code that other people can understand and maintain&lt;/em&gt;. Understandable code that doesn't work can be made to work, but working code that can't be understood will become useless as soon as the requirements change. It is more important to communicate with your peers using a programming language than it is for the computer to understand you.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://en.wikipedia.org/wiki/Ward_Cunningham"&gt;Ward Cunningham&lt;/a&gt; - inventor of wiki
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;You know you are working on clean code when each routine you read turns out to be pretty much what you expected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Very first wiki is still alive at &lt;a href="http://c2.com/"&gt;c2.com&lt;/a&gt; and was built in 19 lines of Perl in 1990. It's full of desing patterns, extreme programming and agile stuff.&lt;/p&gt;

&lt;p&gt;Everything is pretty much what you expect or &lt;strong&gt;ZERO&lt;/strong&gt; WTF per second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analyzing some lines of code
&lt;/h2&gt;

&lt;p&gt;Uncle Bob gives a few minutes to read and understand some example code that stretches across three slides and is far from being easily understood. The code is explained for handling his testing tool called Fitness which has tests defined on wiki pages. The code fetches setup and teardown pages for a test and creates html. &lt;code&gt;TestableHTML&lt;/code&gt; is the function name which he calls horrible as functions should have verbs for names because they do something.&lt;/p&gt;

&lt;p&gt;The first line of the function is creating a wiki page and the next is creating a string buffer which takes you crashing immediately from the highest level of abstraction into the lowest. Every line of a function should be at the same level of abstraction, which is one level below the name. We write code in a very rude way. We oscillate from high level to very low level as we think about things. There is nothing wrong with writing things this way, but you must come back and clean it up so that it can be easily understood.&lt;/p&gt;

&lt;p&gt;The function follows four repetitions of the form: null check, page crawler, and three appends with one of the blocks having an extra append for a new line. Getting something done and then using copy and paste is common enough of a technique to follow for getting code to work, but not something that should be left.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long code is not Good Code
&lt;/h3&gt;

&lt;p&gt;A cursory cleanup of this code brings it into a single page where it becomes visible that the entire function body is enclosed in a single &lt;code&gt;if&lt;/code&gt; statement. The control of that &lt;code&gt;if&lt;/code&gt; statment has been moved into a boolean variable whose only purpose is to explain the state that it contains. &lt;code&gt;if(isTestPage)&lt;/code&gt; reads more like well-written prose. The four similar blocks have been brought into one single block. This is much easier to understand by the simple fact that it's smaller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Good Code / Refactored Function
&lt;/h3&gt;

&lt;p&gt;If smaller is better then let's go a step further.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functions should not be 100 lines long&lt;/li&gt;
&lt;li&gt;functions should hardly ever be 20 lines long&lt;/li&gt;
&lt;li&gt;prior refactor was too long even in one screenful
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static String renderPageWithSetupsAndTeardowns( PageData pageData, boolean isSuite) throws Exception { if (isTestPage(pageData)) includedSetupAndTeardownPages(pageData, isSuite); return pageData.getHtml(); })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function takes no time to understand. It is very polite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polite Code / Rules for writing a news paper article
&lt;/h2&gt;

&lt;p&gt;If you read the news there is an expected format.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with a headline&lt;/li&gt;
&lt;li&gt;Synopsis/abstract paragraph that describes the entire content&lt;/li&gt;
&lt;li&gt;...more detailed...&lt;/li&gt;
&lt;li&gt;...even more detailed ...&lt;/li&gt;
&lt;li&gt;so on&lt;/li&gt;
&lt;li&gt;so forth&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most detailed bit is at the very end. This allows you to read a bit and decide whether you are still interested, and that is polite. It allows for early exit as soon as you get bored of the detail. In code this allows you to read through what is going on without getting into unneccessary detail.&lt;/p&gt;

&lt;p&gt;Having short functions with a single level of abstraction allows &lt;em&gt;politely&lt;/em&gt; for you to dig as deep as you need to and to understand the purpose from each level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shrunk Code / The Rules of Functions
&lt;/h2&gt;

&lt;p&gt;What's the proces of refactoring the long code into something shorter?&lt;/p&gt;

&lt;p&gt;The rules of functions are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Functions should be small.&lt;/li&gt;
&lt;li&gt;They should be smaller than that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How many lines should a funciton be? It should fit on your screen. Originally a screen (once they were available in the 80's) would have been 24 lines by 72 columns. this follows from the fact that punch card had 80 holes per line and 8 were used for sequence numbers. This led to functions of 20 lines or less. But Uncle Bob's rule is that a function should do one thing.&lt;/p&gt;

&lt;p&gt;In IntelliJ you can use the refactoring menu with an entry called extract method. If you cannot meaningfully extract another function then your function does exactly one thing. This means that you should extract methods as far as you can to have tiny little functions.&lt;/p&gt;

&lt;p&gt;Before you say that this would lead to your drowning in thousands of little, tiny functions, you will not drown because you will have to give them names. As they are named they should be moved into appropriately named classes in appropriately names packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shrunk Code / Drawing a Function
&lt;/h2&gt;

&lt;p&gt;Long ago Uncle Bob wrote this function called gi. GI stood for graphic interpreter. It was 3000 lines long, but this was the general shape of it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fYrSe8v---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://coreydmccarty.dev/img/uncle_bob_code_shape.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fYrSe8v---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://coreydmccarty.dev/img/uncle_bob_code_shape.png" alt="Code form with an inconsistent sawtooth shape with many varying depths of nesting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If some part of your brain relaxes when you see this shape then it's because you've come to know similar code it by it's landmarks. If rotated 90 degrees then it would resemble the horizon. This is something our brains became accustomed to over time. It certainly isn't because nested code is enjoyable to read or maintain.&lt;/p&gt;

&lt;p&gt;If you have a couple of variables &lt;code&gt;int i,j;&lt;/code&gt; that are manipulated in the first indent section. Extract method on this section. If &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt; are both local variables then you can make them global for the time being. Now you can extract method on all of the funcionality that manipulates &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt;, and you now have a bit of data and a set of functions that operate on that data. This is what we call a class. This refactoring method can help you to discover the true object oriented structure of the system that you are trying to design.&lt;/p&gt;

&lt;h2&gt;
  
  
  When and why was Java invented?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/James_Gosling"&gt;James Gosling&lt;/a&gt; in 1991 invented Java at Sun Microsystems in the Contract Programming division and there was a contract for a cable television set top box. Sun was dedicated to C++ at the time, but he hated the language so he made his own. He called it Oak, and he used it for the project and it worked and the contract ended which cast Oak to the garbage bin.&lt;/p&gt;

&lt;p&gt;Sun Microsystems was a hardware company and their marketing scheme was selling hardware. They realized that if they wanted to be successful then they should win over programmers due to their feedback provided for buying systems. It would be really great if they could provide "the language of the internet" (whatever that might be). As they looked around found James Gosling had Oak. They took Oak and renamed it something more stimulating like coffee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prose Code
&lt;/h2&gt;

&lt;p&gt;Indenting&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smallness also implies:

&lt;ul&gt;
&lt;li&gt;functions should not be large enough to hold nested structures.&lt;/li&gt;
&lt;li&gt;1-4lines would be ideal, 6 might happen occasionally&lt;/li&gt;
&lt;li&gt;therefore, the indent level of a function should not be greater than one or two&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;This, of course, makes the functions easier to read and understand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you keep refactoring out chunk by chunk then you can make the body of if statements into function calls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if(cupIsEmpty){ fillCup();}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reads like well-written prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arguments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Count
&lt;/h3&gt;

&lt;p&gt;The best case for argument count to a function is zero as that is the easiest to understand. One is very straight forward as well. Two arguments can only be arranged two ways, but with three then there are 6 possibilities for ordering your arguments as it follows by N-Factorial. With 4 there are 24 options. Uncle Bob's personal rule is that a function shouldn't include more than 3 argments out of politeness to the reader. If you have a function and you want to pass six things into it, then if those six things are so cohesive that they should be passed in together why aren't they already collected into an object?&lt;/p&gt;

&lt;h3&gt;
  
  
  Booleans
&lt;/h3&gt;

&lt;p&gt;If you are passing a boolean into a function then there is likely an if-else in that function. Pull that out and have a function of the if and a function for the else. &lt;code&gt;doThis(4, 5, 6, true)&lt;/code&gt; is rude. What does that &lt;code&gt;true&lt;/code&gt; mean? If it is really important then you would benefit from a method name that denoted what was being done if it is &lt;code&gt;true&lt;/code&gt;. The exception to this rule is something like &lt;code&gt;setFlag(true)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if(boolIsTrue) doFirstThing();else doSecondThing();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isn't that easy to read?&lt;/p&gt;

&lt;h3&gt;
  
  
  Output Control
&lt;/h3&gt;

&lt;p&gt;Arguments passed into a function for the purpose of collecting the output. It doesn't make sense when you are reading it. Your vertical momentum leads you to try to pass it over, but it demands that you come back and understand that out of place argument. It's a double take. It demands that you return to figure it out. If code causes you to do a double take that is rude. It forces you to stop what you are reading and go back.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure that your code is not surprising.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Avoid Switch Statements
&lt;/h2&gt;

&lt;p&gt;Switch statements are bad. If you have a switch statement that is on the type of a shape, then there must be an &lt;code&gt;ENUM&lt;/code&gt; somewhere that defines those types. Switch statements will need to surround similar usages throughout your code. If you add a new type to the &lt;code&gt;ENUM&lt;/code&gt; then you need to find all of the switch statements and make a change. Don't forget the if/else statements. When you need to add a new type, THEN you must go through and find all of the right places to add your new shape. This is overly complex.&lt;/p&gt;

&lt;p&gt;Instead you should use polymorphism (inheritance) with a base class that contains the definition of the common functionality. Then each child class implements its own functionality and when you need to add a new shape then you only need to make changes in the new class for that shape, and it can be used by all of the other code that manipulates the different types of shapes. All of the draw, rotate, area, and other functions are wrapped inside the class and it manipulates its own data.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Open/Close Principle&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A module should be open for extension,&lt;br&gt;&lt;br&gt;
but closed to modification&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Switch statements cluster together dependency. There is a single module that has dependency on all of these outside modules. The switch statement is then used by some other modules. If there is a change in one of these dependencies of the switch statement then the switch code and everything dependent ON the switch code must be recompiled and redeployed. This breaks the ability to independently deploy parts of the system. Keeping interdependency minimal allows for independent deployment such as being able to deploy your GUI separate from your business logic. One really nice way to do this is to avoid switch statements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side Effects
&lt;/h2&gt;

&lt;p&gt;A side effect is a change to the state of the system. The function &lt;code&gt;open()&lt;/code&gt; has a side effect as it leaves an open file. Another such is &lt;code&gt;new&lt;/code&gt; that allocates some memory. These side effect functions come in pairs, and we are really bad at remembering to call the second part of the pair. Garbage collection is a hack that allows us to forget about cleaning up the memory that we use. We still have to deal with opening and closing files and some other such pairs. Forgetting to let go of the resources that you allocate will eventually result in a system failure once the resources are depleted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Lambdas To
&lt;/h3&gt;

&lt;p&gt;A lambda is basically a class with one function called execute. We can use it to make &lt;code&gt;open()&lt;/code&gt; safe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void open(String fn, Lambda proc){ File f = File.open(fn); proc.(f); File.close(f); return;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We now have a function that has no side effect. You pass a lambda into the function and the open and close are paired to prevent unintended side effects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Command and Query Separation
&lt;/h3&gt;

&lt;p&gt;A function that returns &lt;code&gt;void&lt;/code&gt; must have a side effect, otherwise it is useless. A function that returns something shouldn't have any side effect. This is a convention called &lt;strong&gt;Command and Query Separation&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prefer Exceptions to returning error codes
&lt;/h3&gt;

&lt;p&gt;Exceptions provide the opportunity to handle expliticly expected breakage states. Error codes are considerably easier to overlook.&lt;/p&gt;

&lt;p&gt;If you are going to have a &lt;code&gt;try&lt;/code&gt; block inside of a function then it is best to have &lt;strong&gt;ONLY&lt;/strong&gt; the &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;catch&lt;/code&gt;/&lt;code&gt;finally&lt;/code&gt; and no pre or post blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  DRY Principle (Don't Repeat Yourself)
&lt;/h2&gt;

&lt;p&gt;We want to avoid duplication as much as possible because it's sloppy. Move the duplicated code into a function, and if it is slightly different then you need to include an argument that allows you to know when to execute the different part. That works great for code that is duplicated.&lt;/p&gt;

&lt;p&gt;Sometimes you find the manipulation of a complex data structure requires duplication of a looping structure. If you have lambdas then you can use them here, as you create a looping method that can be passed in a lambda for what to execute inside that looping structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured Programming
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Edsger Dijkstra's Vision
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Edsger_W._Dijkstra"&gt;Edsger Dijkstra&lt;/a&gt; was the first programmer in the Netherlands, and one of the first in the world. He survived Nazi occupation. He went into school and wanted to become a nuclear physicist. He saw the very first computer in the Netherlands, and went to his adviser and complained that there was no body of knowledge, formalism, or discipline in computers. He didn't think that his peers would take him seriously if he studied computers. The adviser suggested that he might be one of the ones that helps to define that formalism and body of knowledge. Dijkstra took this as a challenge and became the first programmer in the Netherlands. When he was married in the 1950's he had to list his profession. He tried to list that he was a programmer, but they denied him because that wasn't a known profession. He changed it to nuclear physicist. He said that he made the more difficult choice of programming over nuclear physics.&lt;/p&gt;

&lt;p&gt;He &lt;a href="https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF"&gt;wrote a letter in 1968&lt;/a&gt; saying that &lt;code&gt;goto&lt;/code&gt; was considered harmful which was extremely disruptive. This was rejected for years, and people wrote scathing letters in professional publications debating his argument. All these years later we don't have &lt;code&gt;goto&lt;/code&gt;. His argument was that software should be like mathematics. There should be postulates and theorems that have been proven. These would be proven software that would be adapted by simple lemmas utilizing these proven pieces. He built up a mathematical structure of proof around if statements, loops, and many things. He discovered that certain algorithms cannot be proven correct because they have unrestricted &lt;code&gt;goto&lt;/code&gt;'s. This is basically &lt;a href="https://en.wikipedia.org/wiki/Alan_Turing"&gt;Alan Turing&lt;/a&gt;'s &lt;a href="https://en.wikipedia.org/wiki/Halting_problem"&gt;Halting Problem&lt;/a&gt;. Every algorithm can be composed of from three structures: Sequence, Selection, and Iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reality of Programming
&lt;/h3&gt;

&lt;p&gt;We don't prove anything. Dijkstra's vision failed. We do lean on and risk our lives everyday on something else that cannot be proven. That thing is science. Science is made up of things that cannot be proven correct, but can be proven incorrect. We can surround something with enough tests that it's assumed correct. We can do similarly and demonstrate the non-failing qualities of software with tests. We may not be able to prove our software correct, but we can provide that it isn't incorrect by surrounding it with sufficient tests.&lt;/p&gt;

</description>
      <category>career</category>
      <category>codequality</category>
      <category>cleancode</category>
      <category>development</category>
    </item>
    <item>
      <title>Who is Uncle Bob</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Wed, 12 Aug 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/who-is-uncle-bob-53he</link>
      <guid>https://dev.to/xanderyzwich/who-is-uncle-bob-53he</guid>
      <description>&lt;p&gt;After spending several hours listening to his talks, it occured to me that this information is needed by all developers and perhaps may be beyond the immediate consideration of beginners. In order to do my part to share the message of a man named Robert C Martin I will be writing a summaries of his talks as I watch them.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Man
&lt;/h1&gt;

&lt;p&gt;Robert C Martin is an American software engineer who writes wonderful books about writing code as well as teaching and talking on the material of his books. &lt;a href="https://coreydmccarty.dev/posts/2020_08_12_uncle_bob/cleancoder.com"&gt;His website&lt;/a&gt; contains a great deal of information, and you have likely heard about these books as many are considered required reading for career developers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Special:BookSources?isbn=978-0132038379"&gt;Designing Object-Oriented C++ Applications Using the Booch Method&lt;/a&gt; 1995&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Special:BookSources/978-0135974445"&gt;Agile Software Development&lt;/a&gt; 2002&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Special:BookSources/978-0132350884"&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt; 2009&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Special:BookSources/978-0137081073"&gt;The Clean Coder: A Code of Conduct For Professional Programmers&lt;/a&gt; 2011&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Special:BookSources/978-0134494166"&gt;Clean Architecture: A Craftsman's Guide to Software Structure and Design&lt;/a&gt; 2017&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Special:BookSources/978-0135781869"&gt;Clean Agile: Back to Basics&lt;/a&gt; 2019&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uncle Bob is credited with cretion of the &lt;a href="https://en.wikipedia.org/wiki/SOLID"&gt;SOLID principles&lt;/a&gt;, was a founder of the &lt;a href="https://en.wikipedia.org/wiki/Agile_Manifesto"&gt;Agile Manifesto&lt;/a&gt;. He served as editor-in-chief of &lt;a href="https://en.wikipedia.org/wiki/C%2B%2B_Report"&gt;C++ Report&lt;/a&gt; magazine and served as the first charman of the &lt;a href="https://www.agilealliance.org/"&gt;Agile Alliance&lt;/a&gt;. His writing can be found at &lt;a href="https://blog.cleancoder.com/"&gt;blog.cleancoder.com&lt;/a&gt; and you can find many of his talks on YouTube if you don't have the ability to attend one in person. He runs a consulting company as as a company that provides training videos.&lt;/p&gt;

&lt;p&gt;In the coming weeks I will be writing beginner level summaries of his publicly available videos.&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;

</description>
      <category>career</category>
      <category>codequality</category>
      <category>cleancode</category>
      <category>development</category>
    </item>
    <item>
      <title>Use the Tools To Your Advantage</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Wed, 05 Aug 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/use-the-tools-to-your-advantage-2j10</link>
      <guid>https://dev.to/xanderyzwich/use-the-tools-to-your-advantage-2j10</guid>
      <description>&lt;p&gt;I see several content creators doing things in their posts that are easily done with the tools built into the DEV/Forem tooling. I've commented to several people about how they can make use of these tools to streamline their content publication without loss of functionality (and maybe even improve their brand quality/SEO in the process). Overall,&lt;/p&gt;

&lt;h1&gt;
  
  
  Links to Blogs
&lt;/h1&gt;

&lt;p&gt;I 100% support people owning their content and publishing first on their own site. I do this as well. There are tools to utilize RSS and to link back to the original article on your site that are included in the DEV platform. In the &lt;code&gt;settings&lt;/code&gt; menu there is a &lt;code&gt;Publishing from RSS&lt;/code&gt; section wher you can add your Atom feed url. There are also option to &lt;code&gt;Replace self-referenctial links with DEV-specific links&lt;/code&gt; which will bridge your dev articles on the same platform in a similar way to how you might link your blog posts together on your personal site. The other option on this page is &lt;code&gt;Mark the RSS source as canonical URL by default&lt;/code&gt; which will provide a link to the blog post on your site in a special way that search engines will acknowledge your site as the origin of the material. This helps with SEO as search engines will remove listings of duplicate data and without a cononical reference it will prioritize the one with higher SEO/reputation and likely remove your original link.&lt;/p&gt;

&lt;h1&gt;
  
  
  Social links
&lt;/h1&gt;

&lt;p&gt;I often see people providing a short bio and social links at the end of their post which is something that is common enough that the platform actually does this automatically using a card of your primary profile information. Firstly, you should make sure that you have filled out your profile information so that your profile doesn't give a '404 profile not found', but you can also add whatever links that you would like along with a short summary for display. The links will be listed on your profile card with their appropriate logo.&lt;/p&gt;

&lt;p&gt;Links supported via Settings&amp;gt;Profile&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Website&lt;/li&gt;
&lt;li&gt;Facebook&lt;/li&gt;
&lt;li&gt;YouTube&lt;/li&gt;
&lt;li&gt;Stack Overflow&lt;/li&gt;
&lt;li&gt;LinkedIn&lt;/li&gt;
&lt;li&gt;Behance&lt;/li&gt;
&lt;li&gt;Dribble&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;GitLab&lt;/li&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;Mastadon&lt;/li&gt;
&lt;li&gt;Twitch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a Github integration where you can login to DEV using your Github account and pin certain repositories to your DEV profile page.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lists of posts
&lt;/h1&gt;

&lt;p&gt;There are a couple of versions of this that have different solutions. First is a list of all posts that you have. This can be easily omitted by asking people to check out your other posts from your profile (which has a link at the bottom of the article). The other type is for sets of articles to link to the other entries. The DEV platform has builtin functionality for this as well. Among the &lt;code&gt;Front Matter&lt;/code&gt; information available in the &lt;a href="https://dev.to/p/editor_guide"&gt;editor guide&lt;/a&gt; is the &lt;code&gt;series&lt;/code&gt; entry. This actually has some really awesome functionality. It will automatically generate a list of the all posts published in this series in order of publication. It will be updated once there is a new part published so that you don't have to go back and edit previous posts.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;It pays to learn your tools in order to make better use of them. I highly recommend taking a look through the settings pages and the editor guide that is available via the &lt;code&gt;i&lt;/code&gt; logo on comment and post editors. The DEV team has included a LOT of cool functionality that you can harness in order to spend less time on the tools and more time on the actual content. Honestly the only thing that I worry with in between posting on my site and posting on dev is finding a &lt;code&gt;cover_image&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://undraw.co/illustrations"&gt;Cover image by undraw.co&lt;/a&gt;&lt;/p&gt;

</description>
      <category>meta</category>
      <category>watercooler</category>
      <category>blog</category>
      <category>tools</category>
    </item>
    <item>
      <title>New Tools</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Thu, 30 Jul 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/new-tools-5676</link>
      <guid>https://dev.to/xanderyzwich/new-tools-5676</guid>
      <description>&lt;p&gt;Over the last couple of weeks I've had various people that I respect suggesting different tools to me and I've been really happy with the results. I'll share them with you below, but I'd also love to hear about whatever tools you have that might help others in their daily life.&lt;/p&gt;

&lt;h1&gt;
  
  
  ZSH
&lt;/h1&gt;

&lt;p&gt;There are several option in shells for Linux command line and if you are anything like me then you may have just learned Bash as it was already there and gotten used to it. After years of seeing Zsh recommended, I decided to give it a try along with &lt;a href="https://ohmyz.sh/"&gt;Oh-My-Zsh&lt;/a&gt; that is usually recommended for additional functionality. The command line experience is just given more power and polish with Zsh over Bash. This recommendation came to me along with the &lt;a href="https://commandlinepoweruser.com/"&gt;Command Line Power User&lt;/a&gt; course.&lt;/p&gt;

&lt;p&gt;Features (as &lt;a href="https://en.wikipedia.org/wiki/Z_shell#Features"&gt;listed on Wikipedia&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programmable command-line completion that can help the user type both options and arguments for most used commands, with out-of-the-box support for several hundred commands&lt;/li&gt;
&lt;li&gt;Sharing of command history among all running shells&lt;/li&gt;
&lt;li&gt;Extended file globbing allows file specification without needing to run an external program such as find&lt;/li&gt;
&lt;li&gt;Improved variable/array handling&lt;/li&gt;
&lt;li&gt;Editing of multi-line commands in a single buffer&lt;/li&gt;
&lt;li&gt;Spelling correction and autofill of command names (and optionally arguments, assumed to be file names)&lt;/li&gt;
&lt;li&gt;Various compatibility modes, e.g. Zsh can pretend to be a Bourne shell when run as /bin/sh&lt;/li&gt;
&lt;li&gt;Themeable prompts, including the ability to put prompt information on the right side of the screen and have it auto-hide when typing a long command&lt;/li&gt;
&lt;li&gt;Loadable modules, providing among other things: full TCP and Unix domain socket controls, an FTP client, and extended math functions.&lt;/li&gt;
&lt;li&gt;The built-in where command. Works like the which command but shows all locations of the target command in the directories specified in $PATH rather than only the one that will be used.&lt;/li&gt;
&lt;li&gt;Named directories. This allows the user to set up shortcuts such as ~mydir, which then behave the way ~ and ~user do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Oh-My-Zsh
&lt;/h2&gt;

&lt;p&gt;This is a framework for managing your Zsh configuration with helpers, plugins, and themes. It adds to the already wonderful Zsh experience and have found several included plugins that are very nice. My current configuration makes use of &lt;code&gt;colored-man-pages&lt;/code&gt;, &lt;code&gt;extract&lt;/code&gt;, &lt;code&gt;alias-finder&lt;/code&gt;, &lt;code&gt;common-aliases&lt;/code&gt;, &lt;code&gt;zsh-interactive-cd&lt;/code&gt;, &lt;code&gt;z&lt;/code&gt;, and &lt;code&gt;fzf&lt;/code&gt;. I'm really enjoying them.&lt;/p&gt;

&lt;h1&gt;
  
  
  MobaXterm with WSL2
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://mobaxterm.mobatek.net/"&gt;MobaXterm&lt;/a&gt; is a terminal emulator for windows. It can be used with different bash emulators. If you have the &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/about"&gt;Windows Subsystem for Linux&lt;/a&gt; installed on Windows 10 then it will work together without any additional configuration. MobaXterm also worked flawlessly with my 'agnoster' theme for Zsh when the standard WSL2 Ubuntu terminal required additional fonts. If you aren't familiar with MobaXterm, it is a tabbed terminal emulator with split screen and MultiExec modes which can be a huge help when you are working remotely on different servers. I have used this to kickoff scripts on different servers at the same time or to jump through a gateway server into a build box to execute several scripts at the same time. I can ssh and enter passwords on several terminals at the same time to cut down on the setup time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Notable
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/notable/notable"&gt;Notable&lt;/a&gt; is a note keeping tool for markdown files. This is a free product with a single developer maintaining it. It has a &lt;a href="https://www.reddit.com/r/Notable/"&gt;subreddit&lt;/a&gt; for support and the developer is very active there. I currently use this tool primarily for reading my notes as there are some things that I'd like to see added before I use it as my primary markdown editor. All of those changes have been acknowledged by the developer as being in planning. The biggest benefits that I see in Notable is the interface that allows you to add tags to your markdown files, collect them in notebooks, and quickly go between different groups. When a document is opened the default view is the 'preview' or 'rendered' html that results from the markdown, but there is an edit view that is easily entered in the same frame. Once the new editing features are added then this will be my primary markdown environment, until then I keep VSCode on deck with the Markdown-All-In-One plugin for composing markdown files quickly during meetings.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cascadia Code Font
&lt;/h1&gt;

&lt;p&gt;Really it's just having ligatures in general. I picked up &lt;a href="https://github.com/microsoft/cascadia-code"&gt;Cascadia Code&lt;/a&gt; initially, but after adopting it for use in VSCode, I found that &lt;code&gt;JetBrains Mono&lt;/code&gt; actually supports ligatures as well. It's a really small touch that I feel makes the development experience feel nicer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://undraw.co/illustrations"&gt;Cover image by undraw.co&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tools</category>
      <category>discuss</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>New Job New Tools</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Fri, 17 Jul 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/new-job-new-tools-8jm</link>
      <guid>https://dev.to/xanderyzwich/new-job-new-tools-8jm</guid>
      <description>&lt;p&gt;I recently started a new job, and it's only the second that I've had in my dev career. With a fresh look into how different it can be between companies, I thought that I'd share a few thoughts. I'd also love to hear yours in the comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Old Busted
&lt;/h2&gt;

&lt;p&gt;I started off as a full time employee of a vendor company providing onsite/offshore model software development and support for a large logistics company. As such I never had much say in the tools that were being used. The company decided against allowing anyone to have admin rights on their local machine, and their 'official' take on IDE availability was that "Eclipse is the corporate standard and we will not consider making any alternatives available." Which was fun. This was even more fun when the vendors lost their desktop licenses for Microsoft Office when we moved to 365. It was also especially cumbersome to work from home when the vendors could not access the code repository or the test servers via VPN. Instead, you had to connect to vpn, then log in to a virtual server (after many failed attempts), and use whatever software was installed there to do your work. Overall, it seems like there was more concern with being secure than being productive.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Hottness
&lt;/h2&gt;

&lt;p&gt;I can't adequately communicate the glee that I experienced in my first week of work. I was given the option to have full license of IntelliJ IDEA or Eclipse. I got GitKraken, desktop applications for Office, local admin on my machine, the full Atlassian tool stack [Jira, BitBucket, Confluence, Bamboo] that auto-magically works together, and an account with Pluralsight matched with a standing calendar block to study every week.&lt;/p&gt;

&lt;p&gt;While it has been a bit weird transitioning jobs during the pandemic, I have had the greatest experience with getting help with things. Everyone that I've asked for help is willing to stop and assist as needed. The work tasks are well defined, small units of effort with recommendations for solution. All that was necessary was to apply the change as recommended and then test. As I've needed access to an system I've been able to quickly request it and have it granted within 24 hours.&lt;/p&gt;

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

&lt;p&gt;It's amazing how much different life can be in a new position/place. If you are in a tough spot, keep at it. Build your experience as you look for work, and eventually you will find a place that works well for you. Currently I can't imagine a reason that I'd leave my current role.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://undraw.co/illustrations"&gt;Cover image by undraw.co&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>watercooler</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What Makes a Good Developer?</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/what-makes-a-good-developer-3k4n</link>
      <guid>https://dev.to/xanderyzwich/what-makes-a-good-developer-3k4n</guid>
      <description>&lt;p&gt;I hear questions like this one at least once per week. To be fair, that may have something to do with the Code Connector community and it's culture. There are a great many people with non-traditional backgrounds in this group, and it has really helped me to better focus and realize the how little the schooling bit really influences ability as a developer.&lt;/p&gt;

&lt;p&gt;I have come across a greatly diverse group of people that have a zeal for development. Many of those people are self taught. That zeal is really the only commonality that I see between all of the people that I would consider to be really good with coding. There is a drive and a passion with which they approach things. It makes sense to me. Having gone through college for computer engineering, during my schooling I would have told you the same thing about engineering students. You see, when your work includes fighting with stupid errors and working potentially long hours in order to correct errors that you didn't understand in the beginning, you will require a great deal of drive and motivation. That motivation will likely also allow you to dig around in documentation for things which you were never trained. The documentation will take some time to figure out by itself, but you will likely find something interesting in the documentation aside from the thing that will help with your issue at hand. Those little tidbits of information that you pickup over the course of time are the things that pile upon one another becoming the depth of your knowledge.&lt;/p&gt;

&lt;p&gt;There is one level of programming work that can be done by anyone with a minimal skill set in development. These are the types of things that paid interns and fresh junior devs get assigned. Often times there are piles of this around any given project. You see anybody in this field can search the internet, documentation, and Stack Overflow for answers to these 'code monkey' tasks. These are the things that allow us to cut our teeth in this business and to become familiar. Our familiarity grows with the language, the framework, the IDE, the code base, and the process itself of development. Code monkey work is great for new devs (whether that be new to a project or to the profession), but doesn't ever actually stop during your career. These things can be pretty frustrating and not very exciting and in order to get through it you need to have a solid interest.&lt;/p&gt;

&lt;p&gt;I see the same approach used in life and hobby of many developers. Common interests may include sports, video games, tablestop games, computer building, mechanical keyboards, traditional wet shaving or any of a million things with a depth of information that may be necessary to dig through in order to fully enjoy. This passion and excitablity is what allows these people to be good developers, games, and stewards of their chosen hobby.&lt;/p&gt;

&lt;p&gt;The people that make great developers want to know how 'it' works; whatever it may be. They dig to figure out strategies for complex games. They spend hours on Massdrop looking for deals on really cool equipment that might not ever be available again. There IS a little bit of hipster in there for many. There is enjoyment in finding a thing that nobody else knows about. Even with programming that is a powerful position to be in. You might be the only one in the group that knows a given language or framework. This not only enables you to work on things where other may not be capable, but it also allows you to have the opportunity to help others with their issues. The sheer knowledge that a library or framework exists can be massively impactful to the direction of a project.&lt;/p&gt;

&lt;p&gt;In what other profession can you have a long standing war such as 'vim or emacs' when both of them are a pain to use the first time? We have the ability to dig into difficult things and develop a love for them. There is a satisfaction in it.&lt;/p&gt;

&lt;p&gt;The passion that we have enables us to sit and listen to someone talk about a project that we know nothing about and to follow along with the concepts being discussed. It isn't just a story of their current work, it is a knowledge entry for the use case of whatever tech stack they may be using.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;tl;dr: anyone can be a great developer if they really want to be.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://undraw.co/illustrations"&gt;Cover image by undraw.co&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>development</category>
      <category>learning</category>
      <category>programming</category>
    </item>
    <item>
      <title>Productive Mentoring</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Wed, 27 May 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/productive-mentoring-21j3</link>
      <guid>https://dev.to/xanderyzwich/productive-mentoring-21j3</guid>
      <description>&lt;p&gt;In order to advance as a developer you need more than just online resources. The most common question that I see in programming forums from juniors is about what they should learn. This touches on one of the primary needs for mentorship. There is so much information on the internet about software development that it is overwhelming without clear direction. Knowing what languages, frameworks, tools, and best practices are worthy of investing time is paramount. Even the people that have advised me about looking into job listings in my market to see what things to group together are what I would consider mentors in my career.&lt;/p&gt;

&lt;p&gt;Personally I have had several mentors over my five years in the industry. Unfortunately the first four years were in the same team, and that's one thing that would offer me particular insights into the needs of mentorship relationships to evolve and eventually move on. The team that I spent the majority of my software career with had been together for a number of years before I joined. They were all excellent developers working with several technologies and managing a high volume CRUD system with a solid design and a homegrown build/deploy process. One of the first things that I learned in this team was that interacting with the Linux command line on the server was the most faultless way to interact with a system. This hands on approach permeated the entire deployment process. This Java web service was being deployed entirely by the team from the Java used by the applciation to the Tomcat servlet container that served it. Everything was managed and scripted by the hands of the team. At the time I didn't know any different approach so being so hands on with the bash scripting, building, deployment, database management (we had an AMAZING DBA that worked with us and trusted us to not break things).&lt;/p&gt;

&lt;p&gt;It wasn't until I moved into a new team that I realized that, while I remained a junior within my old team, I had grown to a point that I could stand as a more senior developer with select skills that were not universal. My next mentor taught me a LOT about working in a much more complex environment. We tackled many things. While he heard and answered all of my questioning of the entire world, he helped me to understand that sometimes you have more work than you can get done, and the massive refactoring to make life better has tremendous value WHEN YOU HAVE TIME TO DO IT. There are times when urgent business needs require your focus over the cleaning of code.&lt;/p&gt;

&lt;p&gt;It was only after working with the new team that I came to understand that I had outgrown my previous mentors. We had become peers as our skillsets grew to be very much the same. It is also important to note that none of my mentors had been 'assigned' as there was no direct program aligning juniors with seniors, instead it was my latching onto whatever more senior developers were around me in order to get whatever information that I could from them. I was being pretty intentional about acquiring the information, but many of them weren't intentional about providing information beyond the minimum needed for me to get a task done.&lt;/p&gt;

&lt;p&gt;One of my best mentors probably count herself as such as we would become close peers as time drew on. What really made the mentorship so beneficial to me was that we would learn from one another and many times neither of us had the answers. At some point, one of us shared the Humble Bundle sale of No Starch Press books on Python. Even though we worked in a Java shop this was a great opportunity to learn something and the inclusion of Automate the Boring Stuff with Python made the bundle a steal. We would actually start using Python for some internal scripting as it was a bit more maintainable that a list of Bash one-liners to achieve similar results. We wound up going through a period of Humble Bundle acquisitions while talking together about different things. It was this learning and discussing that helped to motivate me to learn more. Due to some specifics of our software we had both become quite stagnant and aware that our skills were becoming increasingly difficult to market while looking for more work as we had both become bored of the work we were doing.&lt;/p&gt;

&lt;p&gt;In order for a mentorship to work out well you need both people to be working to grow their skills. The skills of the mentor will eventually become known to the mentee if they are not growing.&lt;/p&gt;

&lt;p&gt;The other major factor that will determine how well a mentoring relationship works is typically an assumption made of senior developers that they have good communication skills. The trope of 'good communication skills' is typically misunderstood. A wonderful quote that I've heard attributed to Albert Einstein is paraphrased as "If you cannot explain something to a five year old, then you don't truly understand it." This translates in tech as "If you cannot explain it to someone with substantially less technical knowledge then you don't know it well enough." That somebody with substantially less technical knowledge can be a junior developer, a business partner, or a client. Being able to communicate technical hurdles and determining factors in a way that enables knowledgable discussion is necessary for developers to advance. This actually comes back to my motivation for writing this as I heard someone say in Slack that they were being given the opportunity to be a mentor to some interns. My response (however poorly worded) was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Teaching is the best way to cement your learning. Please be aware that if you haven't mentored before that you probably suck at it. That isn't a judgement or saying that you shouldn't do it, but instead that you should be aware of how what you are doing may be working well or not. Be conscious of how well your mentees are understanding things. There is a certain amount of their not knowing things, but if it seems to be taking them longer than you think it should to grasp something then try to loop back and explain it in better ways. We can ALWAYS improve our communication skills, particularly when it comes to relaying technical information to people with less technical knowledge (whether that is a junior developer or a business owner). Good luck! You will get out of it as much as you put in, and if done well then you will have the opportunity to help form the way that these mentees approach development for the entirety of their career.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After having typed and sent that realized that it was a bit blunt, and the topic required significantly more information than I had initially provided. I hope that this elaboration has been helpful to you as you move forward in your career, hopefully carrying on relationships as both mentor and mentee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://undraw.co/illustrations"&gt;Cover image by undraw.co&lt;/a&gt;&lt;/p&gt;

</description>
      <category>learning</category>
      <category>career</category>
      <category>advice</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Carpe Diem</title>
      <dc:creator>Corey McCarty</dc:creator>
      <pubDate>Thu, 07 May 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/xanderyzwich/carpe-diem-i09</link>
      <guid>https://dev.to/xanderyzwich/carpe-diem-i09</guid>
      <description>&lt;p&gt;&lt;a href="https://undraw.co/illustrations"&gt;Cover image by undraw.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jobs come and go, and the long reaching career is each of our goals. How we handle each job will influence our own growth and professional reputation. It's easy to fall into doing the expected minumum. If you are anything like me, then you will find yourself looking back on our time with a team and question whether your impact was sufficient. I'm currently facing some changes in my job and I feeling reflective. Honestly I'm facing a fleeting situational depression and this is my therapy, so buckle up.&lt;/p&gt;

&lt;p&gt;I've been in my current job for five and a half years and it's my first in this career. First project was six months, next four years, and most recent will be ending at exactly one year. I know that I've grown a great deal while working with each team, but in my reflection it dawned on me to consider how much growth I've been able to influence in my teams. If we are to be truly great at what we do then we should strive to become constantly better and to constantly help to make things better.&lt;/p&gt;

&lt;p&gt;In my first role, I performed requirement illicitation for a fresh web service build. I was able to guide the questioning of the product owner and see to it that the development team (onsite and offshore) understood the requirements as work moved forward. I didn't get to see this one move into production, but I know that I wrote some utilities that enabled levels of abstraction that were honestly a bit absurd, but accomplished what was requested. I can confidently say that I made sure that this project stayed on course and made it quickly to production with minimal issues. Win!&lt;/p&gt;

&lt;p&gt;In my second role, I did a LOT of support and configured our web service to accommodate new adopters as well as old ones needing additional functionality. I was able to assist with data modeling and best practices to help conform adopters to the patterns that best fit our application. I can remember being on 50+ count production support calls with customer facing impact and represtenting my team (while having the shortest tenure of the team) in resolving issues in a timely manner with VP's and directors all watching on. I can confidently say that I did meaningful work to keep the enterprise on track and minimize impact to the bottom line.&lt;/p&gt;

&lt;p&gt;In my most recent role I seemed to find my voice as I had understanding on topics that other didn't and I was able to contribute more to the leadership and decision making. In a year's time I managed to make myself a subject matter expert for the new devops work that began not long after I joined, and subsequently never had to become extremely knowledgeable on the 16 actual applications that I was working with. I learned about cloud native springboot applications, Jenkins build pipelines, and groovy scripting of libraries for those pipelines and I was able to write pipeline scripts from scratch within that time. I know that I have created tools that will impact this team and their devops usage for possibly years to come. I continued to find things needing improvement and push for fixing any difficulty that wasn't a massive undertaking, and I feel good about it.&lt;/p&gt;

&lt;p&gt;This reflection will surely stick with me as I move forward in my career and drive me to insure that when the time comes to move forward again that I can always see the positive impacts that I've had during my time there. I'd love to hear any thoughts and stories on the topic from your experience.&lt;/p&gt;

</description>
      <category>career</category>
      <category>mentalhealth</category>
      <category>teamwork</category>
      <category>journey</category>
    </item>
  </channel>
</rss>
