<?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: Josh Buckland</title>
    <description>The latest articles on DEV Community by Josh Buckland (@buck06191).</description>
    <link>https://dev.to/buck06191</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%2F178227%2F5e959533-d06d-496f-90ed-ec307869d0f6.jpeg</url>
      <title>DEV Community: Josh Buckland</title>
      <link>https://dev.to/buck06191</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/buck06191"/>
    <language>en</language>
    <item>
      <title>Brag about it: Writing a brag doc </title>
      <dc:creator>Josh Buckland</dc:creator>
      <pubDate>Thu, 19 Aug 2021 10:20:44 +0000</pubDate>
      <link>https://dev.to/buck06191/brag-about-it-writing-a-brag-doc-3ddf</link>
      <guid>https://dev.to/buck06191/brag-about-it-writing-a-brag-doc-3ddf</guid>
      <description>&lt;p&gt;You can find a Brag Doc template file in &lt;a href="https://github.com/buck06191/brag-doc-template/tree/main"&gt;this Github repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is based on a &lt;a href="https://jvns.ca/blog/brag-documents/"&gt;blog post by Julia Evans&lt;/a&gt; that is well worth a read in addition to what is written here.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What the heck is a "brag doc"?
&lt;/h3&gt;

&lt;p&gt;A Brag Doc is a document you use to keep track of all your work that you do&lt;br&gt;
throughout the quarter/year/period so that you can look back on it at the end when doing reflective work and asking for feedback. As mentioned in the blog post linked to above &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There’s this idea that, if you do great work at your job, people will (or should!) automatically recognize that work and reward you for it with promotions/increased pay. In practice, it’s often more complicated than that – some kinds of important work are more visible/memorable than others. It’s frustrating to have done something really important and later realize that you didn’t get rewarded for it just because the people making the decision didn’t understand or remember what you did.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Being recognised for your work though isn't just about promotions or getting raises (though these things are both still important). This document can also help you reflect on what you learn and work on, the things that are important to you, or where you'd like to go next. &lt;/p&gt;

&lt;h3&gt;
  
  
  But why should I bother?
&lt;/h3&gt;

&lt;p&gt;Let's start by considering some of the more specific reason for why it's worth making a brag doc, and this should then help us understand what we want to put in it.&lt;/p&gt;

&lt;h4&gt;
  
  
  You won't remember everything you did
&lt;/h4&gt;

&lt;p&gt;You're going to be doing so much in your job, both big and small, that remembering all of it is going to be difficult, if not impossible. Maybe you can go through a bunch of pull requests on Github. But what if you were pairing on a piece of work? If you're lucky you'll have remembered to use &lt;a href="https://docs.github.com/en/free-pro-team@latest/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors"&gt;co-authored-by commits&lt;/a&gt; to try and keep track of that work, but that won't necessarily help with the Pull Requests or with work that isn't coding. Maybe you'll rely on Trello boards or similar to capture that work but, again, there will be so many times where some one-off mentoring or code reviewing would go uncaptured that you'll fail to capture all the really important "other work" that you do. &lt;/p&gt;

&lt;p&gt;Instead, try make a habit of writing down all that work in your brag doc at the end of the day/week. There are some great ways to build this into your routine that I'll discuss below, but one of the key features of a brag doc is its function in ccapturing &lt;strong&gt;all&lt;/strong&gt; of the work you do. So try remember to stick it all in there!&lt;/p&gt;

&lt;h4&gt;
  
  
  Your manager won't remember everything you did
&lt;/h4&gt;

&lt;p&gt;This is basically a repeated of the previous, but with some added caveats. There's a good chance that your line manager won't necessarily be on the same team as you. Maybe you'll mention to them in your 1:1 sessions some of the work you did, but without a written record they probably won't remember it all. Working with your manager is one of the best ways to fat track your career and your development, so making sure that they have an up to date reference of everything you've been doing is a great way to facilitate this. &lt;/p&gt;

&lt;p&gt;Remember to share it with your manager! &lt;/p&gt;

&lt;h4&gt;
  
  
  your colleagues won't remember everything you did
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;See above.&lt;/strong&gt; (Feedback from colleagues is a key part of your development. Help them out and do yourself a favour at the same time by sharing your doc with them when it comes to feedback time.) &lt;/p&gt;

&lt;h3&gt;
  
  
  Writing your brag doc
&lt;/h3&gt;

&lt;p&gt;At its simplest, your doc is just a list of your accomplishments over the course of your time in the job. So stick everything you do and everything you're remotely proud of in it./ Presentations, focus group work, documentation, mentoring, code review. Anything and everything should go in here. This might be enough for you but if you want to get the most out of it it's worth doing a bit more than that. &lt;/p&gt;

&lt;p&gt;Build a bigger picture. What are you focussing on currently? Maybe you're wanting to build out your understanding of client-side development and have focussed on work around that. Or maybe you've tried really hard to tackle accessibility or internal process, so there's more conceptual work happened recently. By giving a general idea of what you're aiming for it helps you and anyone else reading the document to understand why you've highlighted or expanded on some work over others. &lt;/p&gt;

&lt;p&gt;Try to notice patterns as you update your document. What kind of things are you most proud of? What do you wish featured more in your day-to-day work? What projects had the effect you wanted? What didn't work even if you're proud of it? All these question can really help with breaking down that bigger picture and with fleshing out the individual sections. &lt;/p&gt;

&lt;p&gt;Finally, and arguably most importantly, &lt;strong&gt;don't forget the fuzzy work!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;What is "fuzzy work"? Fuzzy work is a lot of the work that you do that feels harder to quantify. It's the kind of stuff that doesn't always feature on a Trello card or that falls outside of your team's current weekly focus. &lt;/p&gt;

&lt;p&gt;This can include stuff like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving code quality or making code reviews a bit easier by establishing some guidelines around coding style. &lt;/li&gt;
&lt;li&gt;Mentoring work. - Doing code reviews for your team and others. &lt;/li&gt;
&lt;li&gt;Writing documentation! Everyone forgets how important this is because it doesn't produce a fancy product at the end, but it's &lt;em&gt;really&lt;/em&gt; important. &lt;/li&gt;
&lt;li&gt;Getting rid of a bit of tech debt without it being part of a health week/healthcard. &lt;/li&gt;
&lt;li&gt;Design docs. Spending a few days sketching out your future work is really important and will help the team and anyone else you work with to understand what you're aiming for. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As Julia Evans says in the original blog post: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One way to approach this is to, for each goal: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;explain your goal for the work (why do you think it’s important to refactor 
X piece of code?) &lt;/li&gt;
&lt;li&gt;list some things you’ve done towards that goal &lt;/li&gt;
&lt;li&gt;list any effects you’ve seen of the work, even if they’re a little indirect &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you tell your coworkers this kind of work is important to you and tell them what you’ve been doing, maybe they can also give you ideas about how to &lt;br&gt;
do it more effectively or make the effects of that work more obvious! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Where should I start?
&lt;/h4&gt;

&lt;p&gt;Wherever you like! I'd recommend something digital because it's easier to share, but after that it's really up to you. A Google doc is a good way to share it but keep it semi-private. You could also just stick it in a Git repo. It might be quite scary to make it (potentially) so public but, as long as none of the work is confidential, you should be proud of it and it can really help if you ever decide to move on from your current place of work and need evidence for interviews. &lt;/p&gt;

&lt;p&gt;There are also some really fun ways of making this collabroative and supporting your co-workers. Start a regular brag session where you and a few others get together to update your brag docs and hype each other up. It can be a really nice morale boost to be reminded of and praised for a piece of work you'd forgotten all about. These are particularly useful around performance review time when having someone to bounce off and work with can make the process of self-reflection much less intimidating. &lt;/p&gt;

&lt;h3&gt;
  
  
  Structure
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Below lifted directly from the &lt;a href="https://jvns.ca/blog/brag-documents/"&gt;blog post by Julia Evans&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  Goals for this year:
&lt;/h4&gt;

&lt;p&gt;List your major goals here! Sharing your goals with your manager &amp;amp; coworkers is really nice because it helps them see how they can support you in accomplishing those goals!&lt;/p&gt;

&lt;h4&gt;
  
  
  Goals for next year
&lt;/h4&gt;

&lt;p&gt;If it’s getting towards the end of the year, maybe start writing down what you think your goals for next year might be. &lt;/p&gt;

&lt;h4&gt;
  
  
  Projects
&lt;/h4&gt;

&lt;p&gt;For each one, go through: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What your contributions were (did you come up with the design? Which components did you build? Was there some useful insight like “wait, we can cut scope and do what we want by doing way less work” that you came up with?) &lt;/li&gt;
&lt;li&gt;The impact of the project – who was it for? Are there numbers you can attach to it? (saved X dollars? shipped new feature that has helped sell Y big deals? Improved performance by X%? Used by X internal users every day?). Did it support some important non-numeric company goal (required to pass an audit? helped retain an important user?) 
Remember: don’t forget to explain what the results of you work actually were! It’s often important to go back a few months later and fill in what actually happened after you launched the project. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Collaboration &amp;amp; mentorship Examples of things in this category:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Helping others in an area you’re an expert in (like “other engineers regularly ask me for one-off help solving weird bugs in their CSS” or “quoting from the C standard at just the right moment”) &lt;/li&gt;
&lt;li&gt;Helping new team members get started - Writing really clear emails/meeting notes - Foundational code that other people built on top of - Improving monitoring/dashboards/on call - Any code review that you spent a particularly long time on/that you think was especially important&lt;/li&gt;
&lt;li&gt;Important questions you answered (“helped Risha from OTHER_TEAM with a lot of questions related to Y”) - Mentoring someone on a project (“gave Ben advice from time to time on leading his first big project”) - Giving an internal talk or workshop &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Design &amp;amp; documentation List design docs &amp;amp; documentation that you worked on:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Design docs: I usually just say “wrote design for X” or “reviewed design for X”&lt;/li&gt;
&lt;li&gt;Documentation: maybe briefly explain the goal behind this documentation (for example “we were getting a lot of questions about X, so I documented it and now we can answer the questions more quickly”) &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Company building
&lt;/h4&gt;

&lt;p&gt;This means “things you did to help the company overall, not just your project/team”. Some things that go in here: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Going above &amp;amp; beyond with interviewing or recruiting (doing campus recruiting, etc.)&lt;/li&gt;
&lt;li&gt;Improving important processes, like the interview process or writing better onboarding materials &lt;/li&gt;
&lt;li&gt;Working groups e.g. diversity, hiring etc. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What you learned
&lt;/h4&gt;

&lt;p&gt;Try listing important things you learned or skills you’ve acquired recently (bonus points if you did a write up on it after)! Some examples of skills you might be learning or improving: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to do performance analysis &amp;amp; make code run faster &lt;/li&gt;
&lt;li&gt;Internals of an important piece of software (like the JVM or Postgres or Linux) &lt;/li&gt;
&lt;li&gt;How to use a library (like React) &lt;/li&gt;
&lt;li&gt;How to use an important tool (like the command line or Firefox dev tools) &lt;/li&gt;
&lt;li&gt;About a specific area of programming (like localization or timezones) &lt;/li&gt;
&lt;li&gt;A new area like product management/UX design/software engineering &lt;/li&gt;
&lt;li&gt;How to write a clear design doc &lt;/li&gt;
&lt;li&gt;A new programming language &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s really easy to lose track of what skills you’re learning, and usually when I reflect on this I realize I learned a lot more than I thought and also notice things that I’m not learning that I wish I was. &lt;/p&gt;

&lt;h4&gt;
  
  
  Outside of work
&lt;/h4&gt;

&lt;p&gt;It’s also often useful to track accomplishments outside of work, like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blog posts&lt;/li&gt;
&lt;li&gt;Talks/panels - Open source work - Industry recognition 
I think this can be a nice way to highlight how you’re thinking about your career outside of strictly what you’re doing at work. These things are not compulsory though and you shouldn't feel pressured to do more than your day-to-day work.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>help</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Learning Go by making a Todo List app [Part 1]</title>
      <dc:creator>Josh Buckland</dc:creator>
      <pubDate>Sun, 09 Aug 2020 16:40:31 +0000</pubDate>
      <link>https://dev.to/buck06191/learning-go-by-making-a-todo-list-app-1ck6</link>
      <guid>https://dev.to/buck06191/learning-go-by-making-a-todo-list-app-1ck6</guid>
      <description>&lt;p&gt;Hello and welcome to my journey on becoming a Golang developer. I'll be doing this by creating the now-overused Todo List app. To try and learn as much about Go in the process, I want to handle as much of the logic in Go as possible, including parsing the form request from the web page.&lt;/p&gt;

&lt;p&gt;To make this happen I'll be using the resources listed below, as well as lots of googling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://golang.org/doc/"&gt;Go Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livebook.manning.com/book/go-in-practice/"&gt;Go in Practice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gobyexample.com/"&gt;Go by Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's start though by defining what we want from our Todo List app by defining a number of user stories.&lt;/p&gt;

&lt;h2&gt;
  
  
  User Stories
&lt;/h2&gt;

&lt;p&gt;As a user I want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To add items to and remove items from my todo list using a web interface and form.&lt;/li&gt;
&lt;li&gt;To add items for either myself or a team I belong to. There will be multiples of either.&lt;/li&gt;
&lt;li&gt;For my personal items to be hidden from the team I belong to.&lt;/li&gt;
&lt;li&gt;For my todo list to persist between sessions.&lt;/li&gt;
&lt;li&gt;To be able to set an optional due date for an item.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using Go
&lt;/h2&gt;

&lt;p&gt;We'll start by making a file to put all of the code in&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then add in a few basic requirements for starting out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from your new todo list app"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then build the program using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go build github.com/buck06191/todo-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before running the binary that this creates:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g-9jwYxr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/05jundbhjo15gnfz3qcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g-9jwYxr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/05jundbhjo15gnfz3qcn.png" alt="Picture of the command line output from the initial basic hello world file."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading from the command line
&lt;/h2&gt;

&lt;p&gt;Let's get started on the Todo List app by starting as simple as possible. I'll begin by making a CLI for the ToDo list in Go. Ideally a lot of the logic used to make the CLI work will transfer over to handling requests from the web page interface that will come later. The command line needs to accept a JSON string of the form&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"todo task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"due"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"optional due date (yyyy-mm-dd)"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should then be given a unique ID by Golang or the database. For example,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Practice Go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"due"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-02-02"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's start by reading that in and echoing it back to the user on the CLI.&lt;/p&gt;

&lt;p&gt;We begin by using the &lt;code&gt;flag&lt;/code&gt; package to set up command line flags and read in values.&lt;/p&gt;

&lt;p&gt;We then need to make a function to read this value and print it back out to the terminal. The &lt;code&gt;flag.String&lt;/code&gt; function gives us an address to the value, meaning we'll need to access it as a pointer.&lt;/p&gt;

&lt;p&gt;Finally we add in a &lt;code&gt;main()&lt;/code&gt; function that parses the arguments using &lt;code&gt;flag.Parse()&lt;/code&gt; and then echoes back the item.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Package todo contains a basic CLI todo app&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"flag"&lt;/span&gt;
  &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;todoItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"add"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Something worth doing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Item to add to todo list.&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;todo&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;: task to do, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;due&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;: date due (YYYY-MM-DD)}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;// EchoItem echoes back the command line input.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;PrettyPrintItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You entered:&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s"&gt;%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;todoItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="n"&gt;PrettyPrintItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should give the following:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FcIdAQpA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5qvy19ybfcga3lnz6rvd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FcIdAQpA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5qvy19ybfcga3lnz6rvd.png" alt='Screenshot of command line output. The entered string is echoed out below the phrase "You entered:"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, we need to make sure that we parse the command line input to check for anything that doesn't fit our desired JSON structure. We need to deserialise our JSON into a &lt;code&gt;struct&lt;/code&gt; and then parse it in order to convert it into a usable format.&lt;/p&gt;

&lt;p&gt;First, we need to define our &lt;code&gt;TodoItem&lt;/code&gt; type which we can then parse as required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="s"&gt;"encoding/json"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// TodoItem is the internal type used to store the JSON data that is&lt;/span&gt;
&lt;span class="c"&gt;// deserialised by the app.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;TodoItem&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Todo&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"todo"`&lt;/span&gt;
  &lt;span class="n"&gt;Due&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"due,omitempty"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we have used struct tags to define the json field names, as well as allowing for an empty &lt;code&gt;Due&lt;/code&gt; field. Next we need to define a type for our &lt;code&gt;ParsedTodoItem&lt;/code&gt; where we convert the &lt;code&gt;Due&lt;/code&gt; field to use the &lt;code&gt;time.Time&lt;/code&gt; type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// ParsedTodoItem is the same as the TodoItem type, albeit with the `Due` field&lt;/span&gt;
&lt;span class="c"&gt;// parsed to due the `time.Time` struct.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;ParsedTodoItem&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Todo&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
  &lt;span class="n"&gt;Due&lt;/span&gt;  &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then parse our command line input with the end goal of producing a &lt;code&gt;ParsedTodoItem&lt;/code&gt;. First, we deserialise the string from the command line using &lt;code&gt;json.Unmarshal&lt;/code&gt;, giving us a &lt;code&gt;TodoItem&lt;/code&gt;. Next we take the &lt;code&gt;Due&lt;/code&gt; field of this deserialised JSON and parse it to a &lt;code&gt;time.Time&lt;/code&gt; using the &lt;code&gt;parseDueDate&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;If the field is empty, we return a zero-value for the &lt;code&gt;time.Time&lt;/code&gt; type. Otherwise, we then check if we can parse it from our correct format. Go uses a particular way of defining a datetime string format, as described in the &lt;a href="https://golang.org/pkg/time/#Time.Format"&gt;&lt;code&gt;time.format&lt;/code&gt; docs&lt;/a&gt;. If the format is incorrect, we tell the user and exit the program. Moving forwards we'll want to handle this more gracefully, but for now (when only handling single tasks from the command line), this works fine. If the passed date can be parsed, it is returned from the function.&lt;/p&gt;

&lt;p&gt;Finally, we build our &lt;code&gt;ParsedTodoItem&lt;/code&gt; from our original &lt;code&gt;Todo&lt;/code&gt; and our new &lt;code&gt;parsedDueDate&lt;/code&gt; and return that from this function. I've purposefully chosen to build a new variable here as I'm trying to avoid side effects that could potentially come from mutating the value in place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;parseDuedate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dueDate&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parseddueDate&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dueDate&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;dueDataFormat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2006-01-02"&lt;/span&gt;

  &lt;span class="n"&gt;parsedDueDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parseErr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dueDataFormat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dueDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;parseErr&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Badly formed due date."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parsedDueDate&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// ParseInput parses the input into something more usable.&lt;/span&gt;
&lt;span class="c"&gt;// This includes checking for empty input and parsing the&lt;/span&gt;
&lt;span class="c"&gt;// `due` field.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;ParseInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ParsedTodoItem&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;todoItem&lt;/span&gt; &lt;span class="n"&gt;TodoItem&lt;/span&gt;

  &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;todoItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid JSON passed to ./todo-app"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;parsedDueDate&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parseDuedate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Due&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;parsedItem&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ParsedTodoItem&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Todo&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;todoItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Due&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;parsedDueDate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parsedItem&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We now need to modify our &lt;code&gt;PrettyPrintItem&lt;/code&gt; function to take this new type. First we convert the &lt;code&gt;struct&lt;/code&gt; back to a JSON string, and we use &lt;code&gt;json.MarshalIndent&lt;/code&gt; to format the output into something slightly easier to read.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// PrettyPrintItem echoes back the parsed command line input.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;PrettyPrintItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="n"&gt;ParsedTodoItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;formattedItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MarshalIndent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You entered:&lt;/span&gt;&lt;span class="se"&gt;\n\n\t&lt;/span&gt;&lt;span class="s"&gt;%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formattedItem&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compiling and running this final code with a number of example JSON strings gives us the following:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eWn8Yiyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/82jdal6mngq0n6ylx5cz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eWn8Yiyv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/82jdal6mngq0n6ylx5cz.png" alt="Command line output of the newly parsed data. The first example shows the parsed output when the Due field is missing. The string version of the zero value for a time.Time struct is shown. The second example shows the output for a given date time. This is shown as a string in the Due field."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next part we'll look at introducing testing into the codebase so that we don't need to continually run against command line examples in order to check that the code is working. (Ideally I'd have done this from the start and followed test-driven development ideals.)&lt;/p&gt;

</description>
      <category>go</category>
      <category>learning</category>
    </item>
    <item>
      <title>What  are some examples of less obvious web development features/technologies worth learning?</title>
      <dc:creator>Josh Buckland</dc:creator>
      <pubDate>Mon, 03 Aug 2020 10:44:20 +0000</pubDate>
      <link>https://dev.to/buck06191/what-are-some-examples-of-less-obvious-web-development-features-technologies-worth-learning-2o5k</link>
      <guid>https://dev.to/buck06191/what-are-some-examples-of-less-obvious-web-development-features-technologies-worth-learning-2o5k</guid>
      <description>&lt;p&gt;I've been working as a bona fide junior developer for almost 6 months now and I've got a reasonably good handle on the foundations of web dev stuff and know the big obvious things to learn.&lt;/p&gt;

&lt;p&gt;But what are some useful but maybe lesser-known technologies worth looking into? One example I saw would be WebSockets which I only really noticed after seeing them in an interview task example. Another would be looking deeper into ES Modules and trying to understand how they actually work.&lt;/p&gt;

&lt;p&gt;Love to hear what you think and recommend!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>help</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Automating my WSL Setup</title>
      <dc:creator>Josh Buckland</dc:creator>
      <pubDate>Fri, 31 Jan 2020 16:53:57 +0000</pubDate>
      <link>https://dev.to/buck06191/automating-my-wsl-setup-4863</link>
      <guid>https://dev.to/buck06191/automating-my-wsl-setup-4863</guid>
      <description>&lt;h1&gt;
  
  
  Setting up WSL
&lt;/h1&gt;

&lt;p&gt;A few months ago I got rid of my old laptop that I had dual booted Linux and Windows on and decided to get something much smaller and much more portable. I managed to find an ex-display 13" HP laptop and hey-ho, my portability increased ten-fold. &lt;/p&gt;

&lt;h3&gt;
  
  
  However
&lt;/h3&gt;

&lt;p&gt;This tiny-but-mighty bargain has nowhere near enough hard drive space for me to dual boot Linux and I'm too far down the Unix path to even attempt relearning my workflow on Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  In walks WSL to save the day
&lt;/h2&gt;

&lt;p&gt;There are so many blog posts about WSL that are based on a way deeper understanding than I have, but the general idea is that it's a Linux OS inside Windows 10 and it means I don't have to dual boot. &lt;/p&gt;

&lt;p&gt;Over the last few months I've used WSL in its various incarnations on both my tiny laptop and my desktop PC, using different terminals, settings, configurations etc. And every time I have to reinstall it or just want a clean slate to work from, I have to try and remember everything I did last time I set it all up.&lt;/p&gt;

&lt;p&gt;This is a massive waste of time and I always end up forgetting what I did. I've also stumbled across loads of little bugs, the most recent being that the excellent &lt;a href="https://github.com/denysdovhan/spaceship-prompt"&gt;spaceship prompt&lt;/a&gt; that I happily use on my work Mac does not get on well with WSL. For whatever reason (probably already documented &lt;a href="https://github.com/microsoft/WSL/issues/4197"&gt;read/write speed issues&lt;/a&gt;) changing directory would take upwards of 7 seconds. &lt;/p&gt;

&lt;p&gt;In an attempt to fix this I ended up reinstalling WSL from scratch and loading in different configurations until I found a solution that worked. But setting this all up on two different computers was a massive pain and I &lt;em&gt;really&lt;/em&gt; don't want to have to do this again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Automation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kind of.&lt;/p&gt;

&lt;p&gt;I decided to hack together a script that basically automated all the steps I had to take after installing Ubuntu 18 on WSL.&lt;/p&gt;

&lt;p&gt;The resulting script and config can be found in a &lt;a href="https://github.com/buck06191/wsl-setup"&gt;github repo&lt;/a&gt; along with instructions on how to run it all and the end result can be seen below:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hVnpJ19J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bn2d7qsu11jjb7268ywu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hVnpJ19J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bn2d7qsu11jjb7268ywu.PNG" alt="Picture of the final terminal window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I decided to use &lt;a href="https://github.com/romkatv/powerlevel10k"&gt;&lt;code&gt;powerlevel10k&lt;/code&gt;&lt;/a&gt; as it gave me enough functionality without slowing the whole thing down. I'm also using &lt;a href="https://github.com/microsoft/terminal"&gt;Windows terminal&lt;/a&gt; with the &lt;a href="https://www.nerdfonts.com/"&gt;FuraCode Mono Nerd Font&lt;/a&gt; as I found these gave me the best experience in terms of nice Powerline symbols and readability. &lt;/p&gt;

&lt;h3&gt;
  
  
  Inevitable Problems/Bugs
&lt;/h3&gt;

&lt;p&gt;I did have a few problems that I would love someone to solve for me. The main one is that I install &lt;code&gt;zsh&lt;/code&gt; inside the script, followed by &lt;code&gt;oh-my-zsh&lt;/code&gt;. After this step &lt;code&gt;oh-my-zsh&lt;/code&gt; kicks me back out to prompt, requiring me to then run the script again where it can then skip to the following steps and then run through to completion.&lt;/p&gt;

&lt;p&gt;It's not a deal breaker but it is annoying.&lt;/p&gt;




&lt;p&gt;I hope that if anyone else is using WSL and is needing a responsive and easy to run set up that this can help them. &lt;/p&gt;

&lt;p&gt;If you find anything that can be improved or needs fixing, please do raise an issue on Github and I'll give it a look when I get chance.&lt;/p&gt;

&lt;p&gt;You can follow me on Twitter at &lt;a href="https://twitter.com/itsJoshB"&gt;@itsJoshB&lt;/a&gt; for occasional ramblings about tech and other things.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>You Got This 2020</title>
      <dc:creator>Josh Buckland</dc:creator>
      <pubDate>Mon, 20 Jan 2020 18:51:31 +0000</pubDate>
      <link>https://dev.to/buck06191/you-got-this-2020-50ek</link>
      <guid>https://dev.to/buck06191/you-got-this-2020-50ek</guid>
      <description>&lt;p&gt;I've just got back from what must be one of the best tech conferences going, and what makes it so special is that it isn't even really about tech. YouGotThis is an annual, single-stream, "tech" conference which focusses on the oft-forgotten "core skills" that are key to working in tech in a way that is both healthy and productive. It's aimed at early career developers, be those junior devs or people that are still looking for that first role, but I actually think that much more senior developers and managers could really benefit from attending. In fact, I think that a lot of what was covered in the talks is relevant far outside of tech specific roles and everyone could benefit from attending!&lt;/p&gt;

&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;The Event&lt;/li&gt;
&lt;li&gt;
Topics

&lt;ul&gt;
&lt;li&gt;Your needs ≠ your workplace's needs
&lt;/li&gt;
&lt;li&gt;Build a personal brand&lt;/li&gt;
&lt;li&gt;Make a brag doc&lt;/li&gt;
&lt;li&gt;Work with your manager&lt;/li&gt;
&lt;li&gt;Be part of the community&lt;/li&gt;
&lt;li&gt;You're more than your job&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h1&gt;
  
  
  The Event &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--inK9D-5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.venuesofexcellence.co.uk/wp-content/uploads/2019/06/Platform-5-672x372.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--inK9D-5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.venuesofexcellence.co.uk/wp-content/uploads/2019/06/Platform-5-672x372.jpg" alt="Picture of the inside of Millennium Point in Birmingham"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo: &lt;a href="https://www.venuesofexcellence.co.uk/wp-content/uploads/2019/06/Platform-5-672x372.jpg"&gt;Venues of Excellence&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This year the conference took place in Birmingham at Millennium Point. It was really great to see a conference like this take place outside of London, shining a light on the tech world outside of Silicon Roundabout. Underland, who organised the event, did a fantastic job at making the event truly accessible. The toilets inside the event area were all gender neutral, with typical toilet facilities available elsewhere in the venue, and attendees all wore name badges with a pronouns field. All of the food was vegan and the event was a &lt;em&gt;dry event.&lt;/em&gt; They also offered a couple of schemes to widen the event up to under represented groups. Ticket scholarships were offered for these groups which included, but wasn't limited to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;LGBTQIA+ people, people of colour, women, non-binary people, and those with disabilities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This was funded in part by other attendees buying an extra ticket alongside their own which could then be used in this scholarship scheme. Underland also offered full scholarships which covered travel and accommodation alongside the ticket cost. &lt;/p&gt;

&lt;p&gt;These little touches do a great job of making the event far more accessible to people who might otherwise feel excluded. All of the information about their inclusion work for the event can be found at &lt;a href="https://2020.yougotthis.io/inclusion"&gt;https://2020.yougotthis.io/inclusion&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Topics&lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ktx80q5J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/EOlQGztXkAA7D4t%3Fformat%3Djpg%26name%3D4096x4096" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ktx80q5J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/EOlQGztXkAA7D4t%3Fformat%3Djpg%26name%3D4096x4096" alt="Photo of the conference stage and screen showing the You Got This logo."&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo: &lt;a href="https://twitter.com/underlandevents/status/1218593260505063424/photo/1"&gt;Underland Events&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There were 9 separate talks on at the event:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It's not your job to love your job - Keziyah Lewis &lt;a href="https://twitter.com/KeziyahL"&gt;@KeziyahL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Learning to invest in your future - Matthew Gilliard &lt;a href="https://twitter.com/maximumgilliard"&gt;@MaximumGilliard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How to find your perfect mentor - Amina Adewusi &lt;a href="https://twitter.com/a_adewusi"&gt;@a_adewusi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;So good they can't ignore you! - Gargi Sharma&lt;/li&gt;
&lt;li&gt;Level up: Developing developers - Melinda Seckington &lt;a href="https://twitter.com/mseckington"&gt;@mseckington&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Making your first days count - Nathaniel Okenwa &lt;a href="https://twitter.com/chatterboxCoder"&gt;@chatterboxCoder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Company culture, performance reviews and you - Ruth Lee &lt;a href="https://twitter.com/yoursruthlessly"&gt;@yoursruthlessly&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Unions got this: Organising the tech trade - Dan Parkes&lt;/li&gt;
&lt;li&gt;Real talk about when to walk away - Amy Dickens &lt;a href="https://twitter.com/RedRoxProjects"&gt;@RedRoxProjects&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm not going to write up all of these talks word for word, because that feels a lot like plagiarism and I honestly couldn't do them justice. What I would like to do though is summarise the key themes that I found across all the talks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your needs ≠ your workplace's needs&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Now, this one isn't always true, especially if you're a freelance developer that works for themselves. But for a lot of developers, we're working for companies that want to sell themselves to their employees, investors and customers are being revolutionary, game changing forces for good. The reality though is that we live in a capitalist world and the company doesn't care about you. Your manager might care about you. Your colleagues might care. Even the CEO might care. But the company is an entity whose sole purpose is to maximise its own value above all else. Keziyah Lewis, Ruth Lee and Amy Dickens all covered this in great detail. &lt;/p&gt;

&lt;p&gt;This isn't to say that your company is your enemy. What it does mean though is that you need to make sure to look after yourself, because the company won't do it for you. For example, a performance review is not a ground truth, objective analysis of your skills. What  it is, is a way for your colleagues, managers and other associates to provide feedback that then assesses how you fit the company's culture. A well established company or team will have different values and a different culture to something like a start up. Remembering this is the best way to make sure you're both in the right role and company for you, and to properly assess how your strengths suit the needs of that role/company. &lt;/p&gt;

&lt;h2&gt;
  
  
  Build a personal brand&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So it should be noted that I'm both British and introverted, so things like "building a personal brand" trigger some sort of deep rooted suspicion inside me, and before attending YouGotThis I'd probably have listened to it. But so many people mentioned it and extolled its virtues that I think I need to give it a second chance.&lt;/p&gt;

&lt;p&gt;For me, building a personal brand seems to be about establishing and defining who you are. Your values, your goals, your needs. It's only after you've started to sketch these things out that you can really start to put in the time required to make sure you're both being your best and getting the best out of your job. Once you've started to work on this you can find the right company to work for, find your working style, figure out the best way to learn, make sure you're being recognised for the work you do, and then so much more. It helps you in &lt;strong&gt;planning for the future, assessing the present and reflecting on the past.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Make a Brag Doc&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I had never heard of a brag doc before attending this conference, but following Gargi Sharma's talk where she mentioned it, almost every speaker afterwards brought it up.  There's a really great blog post about building a brag doc by Julia Evans  that Gargi mentioned. I'll leave that here (&lt;a href="https://jvns.ca/blog/brag-documents/"&gt;https://jvns.ca/blog/brag-documents/&lt;/a&gt;) instead of writing it all out again and you should definitely give it a read.&lt;/p&gt;

&lt;p&gt;By building a brag doc, you're highlighting your skills and your work. There are all sorts of tasks that you do every day, big and small, that might go unrecognised unless you point them out and &lt;em&gt;brag about them&lt;/em&gt;. Also, you won't remember everything you did in the last week/month/quarter unless you make a note of them. Maybe put together some important documentation or made a small improvement to the codebase that fixed a security hole. Write it down, share it with your manager and your colleagues that give you feedback. They're just as human as you and they're bound to forget most of the work you've done recently. All you're doing by sharing your doc is reminding them of the things you so that they can be reminded of how awesome you are!&lt;/p&gt;

&lt;h2&gt;
  
  
  Work &lt;em&gt;with&lt;/em&gt; your manager&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Your manager is there to help support you in your journey as a developer. A great example of this is from Melinda Seckington's talk about how your engineering manager can help you to  develop by using ideas from game design. Right the way from starting a new game (joining the company) through to leveling up (developing your skills), your manager is in a great position to help you out through fast and constructive feedback and providing plenty of opportunities for you to develop your skills. &lt;/p&gt;

&lt;p&gt;Nathaniel Okenwa's talk about settling into a new role and then accelerating your growth highlighted &lt;strong&gt;building a productive working relationship&lt;/strong&gt; with your manager as a key component of the first of three phases in starting a new role. (The three phases he focused on were &lt;em&gt;Observe&lt;/em&gt;, &lt;em&gt;Understand&lt;/em&gt; and &lt;em&gt;Create&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;So with all that in mind take some time to build a &lt;strong&gt;good relationship&lt;/strong&gt; with your manager. They're not just there to tell you what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be part of the community&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Maybe this comes in part from being at a conference, but there was definitely a running background theme across the talks about being involved in the tech community. Whether it was Amina Adewusi's talk about the benefits of finding and being a mentor, Matthew Gilliard's advice to use social learning as a way to improve, or Gargi's tips for networking as an introvert by writing a blog or leveraging one on one conversations to build connection, being part of the tech community is a great way to "level up" as a developer. &lt;/p&gt;

&lt;p&gt;This blog is actually my first step towards doing this. I'm hoping that by writing this blog, I can build up my network and contribute towards the tech community. With that in mind, I'll be posting in the next few weeks about other steps I want to take towards giving back to the community and being part of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;You are more than your job!&lt;/strong&gt; &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;One of the most important things to come out of this conference was about respecting yourself and your needs. You need to make sure that whatever you do in your job, you're doing it for you as well as your company, and that you're maintaining a healthy work/life balance. The value that you gain from this benefits you &lt;strong&gt;and&lt;/strong&gt; them. &lt;/p&gt;

&lt;p&gt;And the best way to do this is to implement some of the ideas above. Figure out who you are, build a brag doc to highlight your strengths and the work you do, work with your manager to develop yourself and be part of the community. &lt;/p&gt;




&lt;p&gt;I'm going to follow up this blog post with some of the specific things I'm going to be doing in 2020 to try and follow through on what I've learnt.&lt;/p&gt;

&lt;p&gt;I'm also going to (eventually) get this up on my own blog. So when that happens I'll keep you posted about it :)&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Josh&lt;/p&gt;

</description>
      <category>career</category>
      <category>inclusion</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
