{"id":916,"date":"2021-08-16T08:20:50","date_gmt":"2021-08-16T08:20:50","guid":{"rendered":"https:\/\/deberker.com\/archy\/?p=916"},"modified":"2021-11-06T16:27:08","modified_gmt":"2021-11-06T16:27:08","slug":"minimal-viable-developer-acing-your-first-month-in-software","status":"publish","type":"post","link":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/","title":{"rendered":"Minimal Viable Developer: acing your first month in software"},"content":{"rendered":"\n<p>It&#8217;s easy to be overwhelmed by the novelty and demands of your first software role, whether that&#8217;s an internship or a full-time position. <\/p>\n\n\n\n<p>This is a guide to the tools, skills, and rituals you&#8217;ll encounter in a real software shop. It assumes that you already know the mechanics of coding, and focuses on the key differences between working on school projects and contributing to a business-critical codebase. <\/p>\n\n\n\n<p>It&#8217;s applicable to data science, backend, or frontend roles; it&#8217;s about everything that&#8217;s <em>not<\/em> writing your favourite flavour of code.<\/p>\n\n\n\n<p>This guide is going to be more useful for people joining startups than established companies. FAANG <span id='easy-footnote-1-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-1-916' title='Facebook, Apple, Amazon, Netflix, Google: the big boys'><sup>1<\/sup><\/a><\/span> companies will put you through 4+ weeks of formal onboarding. In a startup you&#8217;re more likely to be handed a laptop and a t-shirt, and asked to join your colleagues in desperately trying to steer a sinking ship towards profitability. Let&#8217;s get you from deadweight to oarsman in the briefest time possible.<br><\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a03e2024ba4e\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a03e2024ba4e\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#The_Software_Lifecycle\" >The Software Lifecycle<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#0_How_do_I_get_the_code_working_on_my_computer\" >How do I get the code working on my computer?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#1_Where_are_tasks_organized\" >Where are tasks organized?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Standups_planning_and_retros\" >Standups, planning, and retros<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Selecting_your_first_tasks\" >Selecting your first tasks<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#2_Setting_up_to_write_code\" >Setting up to write code<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Choosing_an_IDE\" >Choosing an IDE<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#3_Pushing_code_to_version_control\" >Pushing code to version control<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#4_How_do_people_review_my_work\" >How do people review my work?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Continuous_integration\" >Continuous integration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Submitting_your_code_for_review\" >Submitting your code for review<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Reviewing_others_code\" >Reviewing others&#8217; code<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#5_Deployment\" >Deployment<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Continuous_deployment\" >Continuous deployment<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Hosting_environments\" >Hosting environments<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Wrapping_up_the_cycle\" >Wrapping up the cycle<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_Software_Lifecycle\"><\/span>The Software Lifecycle<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p>When you join your first company, you&#8217;ll be confronted with a dizzying amount of information. You&#8217;re going to have to make some hard choices about where you should focus your energy. <\/p>\n\n\n\n<p>Rather than setting aside a week to read the entire codebase, learn about users, or sitting down with everybody in the organization to understand their role, I suggest you focus on understanding the <strong>code lifecycle<\/strong>: the process whereby code gets written and incorporated into the product.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"433\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle-940x617.png?resize=660%2C433&#038;ssl=1\" alt=\"\" class=\"wp-image-935\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle.png?resize=940%2C617&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle.png?resize=580%2C381&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle.png?resize=768%2C504&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle.png?w=1524&amp;ssl=1 1524w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/lifecycle.png?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>The Code Lifecycle. Move through this loop as quickly as possible to maximize your learning on the job. The ship corresponds to deployment (also known as shipping). Source: author<\/figcaption><\/figure>\n\n\n\n<p>Software building is an iterative process. We decide what needs to be done, write code to do it, have it reviewed by our peers, and deploy it, and then do it all again. The faster you are able to iterate, the faster you will learn and the more you will get done <span id='easy-footnote-2-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-2-916' title='This idea is closely related to Agile practices, but was really &lt;a href=&quot;https:\/\/deberker.com\/archy\/the-customer-is-the-enemy\/&quot; data-type=&quot;URL&quot; data-id=&quot;https:\/\/deberker.com\/archy\/the-customer-is-the-enemy\/&quot;&gt;pioneered in the military&lt;\/a&gt;, by fighter pilots like &lt;a href=&quot;https:\/\/en.wikipedia.org\/wiki\/John_Boyd_(military_strategist)&quot;&gt;John Boyd&lt;\/a&gt;'><sup>2<\/sup><\/a><\/span>.&nbsp;<\/p>\n\n\n\n<p>Your goal should be to <strong>maximize the number of these cycles<\/strong> that you go through in your first few months of the job. It&#8217;s good for <strong>you<\/strong> to optimize for this, because it maximizes your learning, and it&#8217;s good for the <strong>organization<\/strong>, because they get lots of chances to nudge you towards valuable outcomes.<\/p>\n\n\n\n<p>Here are the steps we&#8217;re going to discuss, and you should figure out fast:<\/p>\n\n\n\n<p>0. <strong>Setup<\/strong>: How do I get the code on my computer and run it? Hopefully you only need to do this once, so it&#8217;s not part of the core loop.<\/p>\n\n\n\n<p>1. <strong>Tasks<\/strong>: Where are tasks organized, and how are they allocated?<\/p>\n\n\n\n<p>2. <strong>Code<\/strong>: How do I write and test code?<\/p>\n\n\n\n<p>3. <strong>Git<\/strong>: How do I push code to version control?<\/p>\n\n\n\n<p>4. <strong>Review<\/strong>: How do people review my work?<\/p>\n\n\n\n<p>5. <strong>Deploy<\/strong>: And how does it finally get deployed? <span id='easy-footnote-3-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-3-916' title='Deploying is also known as &amp;#8220;shipping&amp;#8221; software '><sup>3<\/sup><\/a><\/span><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why should you focus on executing this lifecycle?<\/h4>\n\n\n\n<p>Fresh from university with a head full of algorithms, you might think that your time is best spent sitting with the cleverest programmers you can find, picking up tips on how to efficiently implement travelling salesmen algorithms.<\/p>\n\n\n\n<p>Please don&#8217;t do this. Instead, get really fast at navigating the systems you need to understand to go through this cycle quickly.<\/p>\n\n\n\n<p>If you&#8217;d like to shadow somebody, pick the person on the team who seems to get through the most tasks, even if they&#8217;re not the most sexy or interesting ones. They&#8217;ve figured out how to go through this cycle quickly.<\/p>\n\n\n\n<p>Why is it so important to get quick at these steps? Those 5 steps are a fixed cost to any change you want to make to the codebase. Their cost doesn&#8217;t scale with the complexity of the code you&#8217;re writing<span id='easy-footnote-4-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-4-916' title='Review does typically take longer for more complex work, so this is only sort-of true'><sup>4<\/sup><\/a><\/span> . This means that they take roughly the same amount of time whether you&#8217;re fixing a typo or rewriting an entire API. <\/p>\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"131\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time-940x186.png?resize=660%2C131&#038;ssl=1\" alt=\"\" class=\"wp-image-937\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?resize=940%2C186&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?resize=580%2C115&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?resize=768%2C152&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?resize=1536%2C303&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?resize=2048%2C404&amp;ssl=1 2048w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?w=1320 1320w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/cycle-time.png?w=1980 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>It takes roughly the same time to go through the code lifecycle for big or small changes to the codebase. If it takes a long time for you to go through these steps, small tasks are prohibitively slow. Source: author<\/figcaption><\/figure>\n\n\n<p>If you can reduce the cost of executing them to a tiny amount, you&#8217;re able to pick up small pieces of work and execute them efficiently. Small pieces of work have a much higher chance of being deployed quickly, and you will complete a full cycle faster. You will get more feedback, earlier, and you&#8217;ll gather momentum faster than a cheese rolling down a hill.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"133\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week-940x189.png?resize=660%2C133&#038;ssl=1\" alt=\"\" class=\"wp-image-939\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?resize=940%2C189&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?resize=580%2C116&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?resize=768%2C154&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?resize=1536%2C308&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?resize=2048%2C411&amp;ssl=1 2048w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?w=1320 1320w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/good-week.png?w=1980 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>You want to pick up lots of small tasks and execute them quickly. If you struggle with the basics, you&#8217;ll be tempted to pick up more complex tasks to compensate for the long cycle time, and finish the week without anything deployed &#8211; a bad week.  Source: author<\/figcaption><\/figure>\n\n\n\n<p>The rest of this post is a step by step guide to these steps, and the tools you&#8217;ll need to work with them, and how to execute them efficiently.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">What if I get stuck?<\/h4>\n\n\n\n<p>The bad news: you won&#8217;t have been taught most of this stuff at school or university. <\/p>\n\n\n\n<p>The good news: nobody you&#8217;re working with learned it at university either!<\/p>\n\n\n\n<p>Everybody who works in software figures things out via roughly the same three tactics:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Google<\/strong> stuff (usually resulting in Stack Overflow)<\/li><li>Read a book if they&#8217;re old school, or a blogpost if they have a short attention span <span id='easy-footnote-5-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-5-916' title='I&amp;#8217;m in this category'><sup>5<\/sup><\/a><\/span><\/li><li>Ask somebody who might know<\/li><\/ol>\n\n\n\n<p>Please don&#8217;t feel anxious or embarrassed about leaning heavily on #3.<\/p>\n\n\n\n<p>The people around you have spent hours feeling confused and frustrated by software problems, and they would love to share the benefits of those experiences with you. <\/p>\n\n\n\n<p>Here&#8217;s some advice from my friend <a href=\"https:\/\/www.linkedin.com\/in\/jonny-linton-7b18bb132?originalSubdomain=ca\">Jonny<\/a>, who progressed from intern to a central pillar of one of the product teams at Element AI in a matter of months:<\/p>\n\n\n\n<p style=\"padding: 0px 20px 0px\"><em>&#8220;In my experience that <\/em>[getting stuck]<em> is the biggest slow-down for beginners. They feel like they need to prove themselves, and therefore don&#8217;t want to admit mistakes or gaps in knowledge &#8211; which ironically prevents them from iterating and learning fast. My advice is to timebox how long you go before asking for help. Also, get familiar with the internal documentation tool (eg Confluence) and give that a search before asking. Asking for help all the time is 100% the only reason that I am the developer I am today. This could be your assigned &#8220;buddy&#8221;, a member of your team, whoever modified the code last (check via git blame) or literally anyone! Just don&#8217;t let yourself get blocked and stay there.&#8221;<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"0_How_do_I_get_the_code_working_on_my_computer\"><\/span>0. How do I get the code working on my computer?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Most companies use&nbsp;<strong>version control&nbsp;<\/strong>to keep track of their code. This allows multiple people to work on the same project without overwriting each others work, whilst keeping a bulletproof log of previous versions so that it&#8217;s easy to recover old work if you need to. Multiple copies of the code are stored on the internet, in a structure called a&nbsp;<strong>repository<\/strong>.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-6.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"513\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-6-940x731.png?resize=660%2C513&#038;ssl=1\" alt=\"\" class=\"wp-image-943\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-6.png?resize=940%2C731&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-6.png?resize=580%2C451&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-6.png?resize=768%2C597&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-6.png?w=1286&amp;ssl=1 1286w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>A version control program such as Github (who have this weird octocat character as a mascot, pictured in the centre) allows multiple developers to develop independently, periodically updating the shared copy of the code that lives on the internet. Source: author.<\/figcaption><\/figure>\n\n\n\n<p>In the 21st century this version control usually means using a technology called&nbsp;<strong>git<\/strong>. Developers copy an online git repository to their local machine &#8211; this is called&nbsp;<strong>cloning<\/strong>&nbsp;&#8211; and then make changes, before copying them back to the server&nbsp;<strong>&#8211; pushing<\/strong>&nbsp;their work.<br>Although the underlying technology &#8211; <strong>git<\/strong> &#8211; is open source and standard, there are a bunch of different websites who will host your git repositories for you. Github, Gitlab, and Bitbucket are the main three.<\/p>\n\n\n\n<p>I&#8217;m going to assume you&#8217;re using Github for brevity, but everything below applies equally to the other providers.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Get access to the online code repository<\/h4>\n\n\n\n<p>Create a Github account if you don&#8217;t already have one. Ask your supervisor to give you access to the project.<br><br>Alright, that was an easy one. We&#8217;re off to a fast start.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Install an SSH key<\/h4>\n\n\n\n<p>To save you having to authenticate every time you want to push or pull code, you should set up an SSH key for your version control system. <a href=\"https:\/\/jumpcloud.com\/blog\/what-are-ssh-keys\">SSH keys<\/a> allow your computer to identify you to the server, and confirm that you should be granted access.<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.github.com\/en\/github\/authenticating-to-github\/connecting-to-github-with-ssh\">Github<\/a>&nbsp;has a good guide to generating and uploading your key.<\/p>\n\n\n\n<p>Each SSH key pair consists of a public key and a private key. The public key is the one that you upload to Github, and it looks something like.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>$ cat ~\/.ssh\/id_rsa.pub\nssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom\/BWDSU\nGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3\nPbv7kOdJ\/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK\/7XA\nt3FaoJoAsncM1Q9x5+3V0Ww68\/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw\/Pb0rwert\/En\nmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z\/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx\nNrRFi9wrf+M7Q== schacon@mylaptop.local<\/code><\/pre><\/div>\n\n\n\n<p><br>The private key stays, encrypted, on your computer. Github will send data encoded with the public key that can only be decrypted using the private key. <span id='easy-footnote-6-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-6-916' title='Frankly I find it all a bit confusing; thanks to &lt;a href=&quot;https:\/\/www.linkedin.com\/in\/joshua-greenhalgh-ab337090\/&quot;&gt;Josh&lt;\/a&gt; for his pointers on this section'><sup>6<\/sup><\/a><\/span>. <a href=\"https:\/\/www.hostinger.co.uk\/tutorials\/ssh-tutorial-how-does-ssh-work\">Here&#8217;s an overview of SSH<\/a> for more detail.<\/p>\n\n\n\n<p>I would advise&nbsp;<em>against<\/em>&nbsp;setting a passphrase on your SSH key. Your computer is already password protected (right?) and I don&#8217;t think it&#8217;s helpful to have this additional barrier to iteration.&nbsp;<span id='easy-footnote-7-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-7-916' title='This is probably not best practice and against convention at many companies, but if given a choice, opt for speed'><sup>7<\/sup><\/a><\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Use a terminal to clone the repo&nbsp;<\/h4>\n\n\n\n<p>Now you need to <strong>copy<\/strong> the repositories &#8211; or repos &#8211; that you&#8217;ll be working on to your local machine. This is called <strong>cloning<\/strong>, because you&#8217;re creating an exact copy, like <a href=\"https:\/\/dolly.roslin.ed.ac.uk\/facts\/the-life-of-dolly\/index.html\">Dolly the sheep<\/a>.<\/p>\n\n\n\n<p>To do so, you&#8217;ll need some kind of terminal, which will use a language like <code>bash<\/code>, <code>zsh<\/code>, or&nbsp;<code>fish<\/code>&nbsp;to handle basic system-level operations. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/iterm2.com\/img\/screenshots\/split_panes.png?w=660&#038;ssl=1\" alt=\"\"\/><figcaption>iTerm, the most popular Mac OSX terminal. Source: <a href=\"https:\/\/iterm2.com\/features.html\">iTerm<\/a><\/figcaption><\/figure>\n\n\n\n<p>Most people I know on a Mac use&nbsp;<a href=\"https:\/\/iterm2.com\/\">iTerm<\/a>&nbsp;instead of the built in Terminal, which gives you various nice features like&nbsp;<a href=\"https:\/\/iterm2.com\/features.html\">split panels<\/a>.<\/p>\n\n\n\n<p>In my experience universities aren&#8217;t very good at teaching people how to use the terminal, and lack of basic proficiency here will really slow you down. I suggest you spend a few hours practising how to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Navigate directories (<code>cd<\/code>, <code>ls<\/code>, <code>pwd<\/code>)<\/li><li>Make and delete files and directories (<code>touch<\/code>, <code>rm<\/code>, <code>mkdir<\/code>)<\/li><li>Display the contents of files and search within them (<code>cat, grep<\/code>)<\/li><li>Reverse search to find commands you&#8217;ve previously used (<code>ctrl+r<\/code>)<\/li><\/ul>\n\n\n\n<p>Unix (the language that most shells are based on) is an incredibly powerful and flexible computing environment, of which most users (like me) barely scratch the surface. In fact, most developers will be more impressed if you are an&nbsp;<code>awk<\/code>&nbsp;ninja than if you&#8217;ve completed an online Tensorflow certificate: consider investing some time here rather than flashier options. <a href=\"https:\/\/www.amazon.co.uk\/dp\/B0043GXMSY\/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1\">This book<\/a> is good, if you want to go deep.<\/p>\n\n\n\n<p>Ok, let&#8217;s assume you&#8217;re running something like<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-git\" data-lang=\"Git\"><code>git clone git@github.com\/mycompany\/myrepo.git<\/code><\/pre><\/div>\n\n\n\n<p><br>And you&#8217;ve seen a message something like<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>Cloning into &#039;my-first-repo&#039;...\nremote: Enumerating objects: 58, done.\nremote: Counting objects: 100% (58\/58), done.\nremote: Compressing objects: 100% (43\/43), done.\nremote: Total 58 (delta 8), reused 54 (delta 8), pack-reused 0\nReceiving objects: 100% (58\/58), 48.83 KiB | 200.00 KiB\/s, done.\nResolving deltas: 100% (8\/8), done.<\/code><\/pre><\/div>\n\n\n\n<p>And now you have a repo ready to go.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Get it running<\/h4>\n\n\n\n<p>The specific instructions for getting your project running should be described within the project, traditionally in a file called&nbsp;<code>README.md<\/code>. If they aren&#8217;t, ask somebody to walk you through getting the code running and offer to write the&nbsp;<code>README.md<\/code>&nbsp;for the repo &#8211; this is a very high value task!&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"489\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?resize=660%2C489&#038;ssl=1\" alt=\"\" class=\"wp-image-919\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?w=1958&amp;ssl=1 1958w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?resize=580%2C430&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?resize=940%2C697&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?resize=768%2C570&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?resize=1536%2C1139&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image.png?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>An example README, from https:\/\/github.com\/huggingface\/transformers. If you include a file called README.md at the root of your repository, it&#8217;s typically rendered by your version control system when people navigate to the code online, as a user guide. All those brightly coloured badges relate to various build and test statuses for the repo. Source: <a href=\"https:\/\/github.com\/huggingface\/transformers.\">HuggingFace<\/a><\/figcaption><\/figure>\n\n\n\n<p>Getting a new repo set up for the first time can be a thorny challenge, because many projects have dependencies on external systems, such as Amazon Web Services (AWS) or Google Cloud Platform (GCP).&nbsp;<\/p>\n\n\n\n<p>You&#8217;re probably also going to need logins for them, and perhaps to install a command line interface (CLI) to work with them more smoothly. <strong>Ask for all the logins you<\/strong> <strong>might possibly need as early as possible<\/strong>, because it might take people a while to get around to giving you access. We&#8217;ll return to these deployment environments in section 6.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>Ask for all the logins you<\/strong> <strong>might possibly need as early as possible<\/strong>, because it might take people a while to get around to giving you access<\/p><\/blockquote>\n\n\n\n<p>In many contexts, you&#8217;re probably also going to use a tool called <strong>Docker<\/strong>. <\/p>\n\n\n\n<p><strong>Docker<\/strong> is a tool for creating isolated, repeatable computing environments, like little virtual machines running within your computer with a tightly controlled environment. These environments &#8211;&nbsp;<strong>containers<\/strong>&#8211; solve the common issue of environmental discrepancies &#8211; some people work on Mac 10.13, others on Mac OSX 10.9, various different Linux distributions or even (shock horror) Windows.<\/p>\n\n\n\n<p>The best analogy I&#8217;ve been able to conceive of is musical. Docker starts with a <strong>Dockerfile<\/strong>, which is like a piece of sheet music specifying a song. When it&#8217;s compiled by Docker, it becomes a <strong>Docker Image<\/strong>, which is somewhat like an MP3 of that song.  Whenever we want to launch a computing job from the docker image the result is a <strong>Docker container<\/strong>, which is a ephemeral (meaning short-lived), consistent (it&#8217;s always the same) computing environment that&#8217;s specified by the image &#8211; in the same way that playing your MP3 produces a short experience that&#8217;s exactly the same each time you do it.<span id='easy-footnote-8-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-8-916' title='If this analogy doesn&amp;#8217;t make sense to you, &lt;a href=&quot;https:\/\/twitter.com\/fishnets88\/status\/1426609875078033409&quot;&gt;here&amp;#8217;s an alternative one from Vincent Warmerdam&lt;\/a&gt;: the Dockerfile is like the blueprint for a machine in a factory, the Docker images are the machines, and the containers are the thousands of identical widgets made by the machines  '><sup>8<\/sup><\/a><\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"343\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-940x488.jpg?resize=660%2C343&#038;ssl=1\" alt=\"\" class=\"wp-image-958\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?resize=940%2C488&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?resize=580%2C301&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?resize=768%2C398&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?resize=1536%2C797&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?resize=2048%2C1062&amp;ssl=1 2048w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?w=1320 1320w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams.jpg?w=1980 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>Docker (logo is a blue whale) is a tool for creating consistent runtimes. It starts with a written description of your computing environment, like sheet music. This is then compiled into an image, a bit like the music being recorded as a file. From this image we can launch containers, which are short-lived, identical computing jobs, a bit like each play of an MP3 produces exactly the same experience for the listener. Source: author<\/figcaption><\/figure>\n\n\n\n<p>If your environment uses Docker then it&#8217;s worth wrapping your head around the fundamentals of creating and destroying Docker containers. Comfort with these concepts will reduce the friction of development and enable you to get your code to review faster. In particular, try and understand:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>The difference between an image and a container<\/li><li>How images are stored<\/li><li>What <code>docker compose<\/code> is and why it&#8217;s useful<\/li><\/ul>\n\n\n\n<p>Let&#8217;s assume that your project is nicely organized in Docker compose and has a single entrypoint, in which case you&#8217;re going to run something like:<br><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>docker compose up -d<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Where_are_tasks_organized\"><\/span>1. Where are tasks organized?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Teams need a way to keep track of what work needs doing, when it will be done, and who will do it.<\/p>\n\n\n\n<p>Most modern software teams are described as &#8220;agile&#8221; which basically means that they work in 1-4 week cycles, after which they pause and figure out what to do next. This consists of choosing a bunch of tasks &#8211; often referred to as&nbsp;<strong>tickets <\/strong>or&nbsp;<strong>issues<\/strong>&#8211; to work on for the next cycle.&nbsp;<br><br>The most frequently used &#8211; but deeply unpopular, amongst developers &#8211; system is called Jira. There are lots of others, and many version control systems have their own issue trackers built in.<\/p>\n\n\n\n<p>There are 3 main types of tickets to wrap your head around:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Tasks<\/strong>: bits of work that need to be done, typically taking 1 &#8211; 12 hours<\/li><li><strong>Bugs<\/strong>: things that are broken<\/li><li><strong>Epics<\/strong>: meta-tickets representing a big chunk of work, comprising multiple tasks<\/li><\/ul>\n\n\n\n<p>The most important property of a ticket is its <strong>status<\/strong>, which is usually one of:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>To Do<\/strong> or <strong>Backlog<\/strong>: Stuff that needs doing<\/li><li><strong>Doing<\/strong>: Being worked on<\/li><li><strong>In Review<\/strong>: The work is done, others are reviewing it<\/li><li><strong>Done<\/strong>: It&#8217;s finished<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"388\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7-940x553.png?resize=660%2C388&#038;ssl=1\" alt=\"\" class=\"wp-image-945\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?resize=940%2C553&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?resize=580%2C341&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?resize=768%2C452&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?resize=1536%2C904&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?w=1700&amp;ssl=1 1700w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-7.png?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>A typical setup: lots of tasks live in the backlog, which means they&#8217;re not going to get done soon. Tasks which are selected end up on &#8220;the board&#8221;, where they move through To Do, into Doing, then In Review, and finally Done. The ticket is then finished, or &#8216;closed&#8217;. Source: author<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Standups_planning_and_retros\"><\/span>Standups, planning, and retros<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Most software teams have 3 regular meetings in which progress is reviewed and decisions are made. In these meetings you&#8217;ll choose or be assigned your tasks, report your progress on them, and reflect on how they could have been accomplished more smoothly.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Planning<\/h4>\n\n\n\n<p><strong>Frequency: <\/strong>once per sprint<\/p>\n\n\n\n<p><strong>Duration: <\/strong>1hr +<\/p>\n\n\n\n<p><strong>Purpose: <\/strong>a big meeting where the team, or sometimes just its leadership team, decides what should be worked on next sprint. There&#8217;s lots of techniques people use to prioritize work and estimate how much can be done. More <a href=\"https:\/\/www.atlassian.com\/agile\/project-management\/estimation\">here from Atlassian.<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Standups<\/h4>\n\n\n\n<p><strong>Frequency<\/strong>: usually daily<\/p>\n\n\n\n<p><strong>Duration: <\/strong>10 minutes<\/p>\n\n\n\n<p><strong>Purpose: <\/strong>Daily check in on who is doing what, what got done (or didn&#8217;t get done) yesterday, and any problems that people are stuck on.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Retros<\/h4>\n\n\n\n<p><strong>Frequency: <\/strong>once per sprint<\/p>\n\n\n\n<p><strong>Duration:<\/strong> ~30 mins<\/p>\n\n\n\n<p><strong>Purpose:<\/strong> this is a chance for the team to reflect about what has gone well and what hasn&#8217;t. These can be really useful when the team is mature and trusts each other. A lot of the time, however, they&#8217;re rather awkward. Still worth doing, though. A couple of popular techniques are <a href=\"https:\/\/www.teamretro.com\/retrospectives\/start-stop-continue-retrospective\/\">Start, Stop, Continue<\/a> and the <a href=\"https:\/\/www.agilealliance.org\/how-to-improve-the-speedboat-retrospective\/\">speedboat<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Selecting_your_first_tasks\"><\/span>Selecting your first tasks<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Companies like to talk about &#8220;shipping fast&#8221; and &#8220;iterating quickly&#8221;, and this is generally accepted to be a good practice in software engineering.&nbsp;<\/p>\n\n\n\n<p>Shipping fast allows you to rapidly discover imperfections in your understanding of what needs to be built and the best way to build it. Particularly in startups, we have imperfect knowledge of our users and the business often develops in unexpected ways. The best way to deal with this uncertainty is to ship things fast.<\/p>\n\n\n\n<p>These principles are even more critical for you as a new developer, because there is&nbsp;<em>so much<\/em>&nbsp;you don&#8217;t know. The best way to learn about the use case, the software development tradition, and how to write good code is to ship loads of it, get feedback on it, and improve. <\/p>\n\n\n\n<p>Remember, your objective is to <strong>maximize the number of cycles<\/strong> you go through, and to do that, you need to pick small tasks.<\/p>\n\n\n\n<p>Try and find the&nbsp;<strong>smallest possible<\/strong>&nbsp;contribution you can make, and then do that. It&#8217;s better if it&#8217;s a&nbsp;<em>bug fix<\/em>&nbsp;than a new feature, because developers don&#8217;t really enjoy bug fixes so you&#8217;ll be doing everybody a favour.<\/p>\n\n\n\n<p>Small tasks which have relatively isolated solutions (meaning that you don&#8217;t have to code change in too many places) are excellent because:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>They help you build momentum and trust<\/strong>: it&#8217;s good for you and your team to feel like you&#8217;re making a contribution early<\/li><li><strong>They are easy for others to review<\/strong>: it can be very time consuming to review code, and you need to earn the right for people to spend hours trying to help you improve &#8211; keep it simple and the start and limit cognitive overhead for your colleagues<\/li><li><strong>You are less likely to do them incorrectly<\/strong>: there&#8217;s less room for error in small tasks, and it&#8217;s easier for your incorporate feedback on smaller pieces of work<\/li><\/ol>\n\n\n\n<p>So let&#8217;s assume you find yourself a nice, small task, to make a button bigger. It&#8217;s got a reference&nbsp;<strong>MP-910<\/strong>&nbsp;, which we&#8217;ll use later to associate your work with the problem your code is solving.<\/p>\n\n\n\n<p>Here&#8217;s what your JIRA ticket might look like:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"353\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910-940x503.png?resize=660%2C353&#038;ssl=1\" alt=\"\" class=\"wp-image-923\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?resize=940%2C503&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?resize=580%2C310&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?resize=768%2C411&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?resize=1536%2C822&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?w=1914&amp;ssl=1 1914w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/mp-910.png?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>The Acceptance Criteria should be a clear description of when this ticket can be considered &#8220;done&#8221;. If you open a pull request which doesn&#8217;t satisfy these criteria, your colleagues will probably reject it. Source: author<\/figcaption><\/figure>\n\n\n\n<p>You signal your intent to complete that ticket by setting yourself as the Assignee, and move it into &#8220;In Progress&#8221;, and we&#8217;re ready to roll.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Setting_up_to_write_code\"><\/span>2. Setting up to write code<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Armed with a functioning local version of the application and a task of our own, it&#8217;s time to write some code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Choosing_an_IDE\"><\/span>Choosing an IDE<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In order to work on&nbsp;MP-910&nbsp;you&#8217;re going to need to write code, and to write code, you&#8217;re going to need a text editor.<\/p>\n\n\n\n<p>More traditional developers use editors built into their terminal, such as&nbsp;<strong>vim<\/strong>&nbsp;or&nbsp;<strong>emacs<\/strong>. Watching somebody who&#8217;s proficient at this can be dazzling, as they hammer out obscure keyboard shortcuts and flick through files without their hands ever leaving the keyboard. <\/p>\n\n\n\n<p>However, the learning curve is extremely steep, and I would highly advise avoiding trying to learn these tools in your first year of writing software.&nbsp;<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/imgs.xkcd.com\/comics\/real_programmers.png?w=660&#038;ssl=1\" alt=\"\"\/><figcaption>Less sophisticated text editors come with a certain cachet, but don&#8217;t get sucked into the idea that you have to use 1970s software to prove you&#8217;re hardcore. Source: <a href=\"https:\/\/xkcd.com\/378\/\">XKCD<\/a><\/figcaption><\/figure>\n\n\n\n<p><br>Instead, you should use an Integrated Development Environment, or&nbsp;<strong>IDE<\/strong>, which is a separate application on your computer specifically for writing code. They have lots of helpful features for navigating and manipulating code, and they&#8217;re often supported by a rich ecosystem of plugins written by the community which add useful functionality like file previews and code linting (more on this shortly). They usually have built in terminals and version control integrations, so you can write, run, and commit code within a single application.<\/p>\n\n\n\n<p>If you&#8217;re writing Python, then I would recommend <a href=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a>, which has the best code navigation for Python. The Java equivalent is <a href=\"https:\/\/www.jetbrains.com\/idea\/\">IDEA<\/a>, which is also excellent.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blog.jetbrains.com\/wp-content\/uploads\/2020\/04\/pycharm-Blog-New-VSC-commit-Window.gif?w=660&#038;ssl=1\" alt=\"\"\/><figcaption>Pycharm is a great Python IDE. You can commit code and push to version control without leaving the editor. Source: <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2020\/04\/new-vcs-features-in-pycharm-2020-1\/\">JetBrains<\/a><\/figcaption><\/figure>\n\n\n\n<p>For more or less anything else, I&#8217;d suggest <a href=\"https:\/\/code.visualstudio.com\">Visual Studio Code<\/a>, which is very extensible, fast, and growing in popularity. You can also <a href=\"https:\/\/code.visualstudio.com\/docs\/remote\/codespaces\">use it in the browser<\/a>, so it gives you a very portable toolbox.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Setting up an automatic linter<\/h4>\n\n\n\n<p><strong>Linting<\/strong> is a funny word that has nothing to do with the pieces of fluff you find in your belly button.<\/p>\n\n\n\n<p>It describes formatting your code in a consistent way, making it easier for others to read. It&#8217;s essentially a set of rules which should be followed to keep things standardized. These rules vary by language and organization, but they&#8217;re things like:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>class names should be capitalized:&nbsp;<code>class MyClass<\/code>&nbsp;not&nbsp;<code>class my_class<\/code><\/li><li>quotation marks should be double, not single&nbsp;<code>const name = &quot;Archy&quot;<\/code>&nbsp;not&nbsp;<code>const name= &#039;Archy&#039;<\/code><\/li><li>maximum line lengths, to keep code compact and legible<\/li><\/ul>\n\n\n\n<p><strong>It&#8217;s very easy to irritate your colleagues by not following these kind of guidelines<\/strong>. Many companies will run a&nbsp;<strong>linter<\/strong> which checks whether your code conforms to their rules and prevent you submitting code which doesn&#8217;t.<\/p>\n\n\n\n<p>To make everybody&#8217;s life easier, I suggest installing a code formatter which you can configure to autoformat your code inline with your company guidelines and make it pass linter inspection.<\/p>\n\n\n\n<p>Here&#8217;s the pitch from <a href=\"https:\/\/prettier.io\">Prettier<\/a>, one of the most popular Javascript formatters, which expresses the virtues of a formatter nicely:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"236\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2-940x336.png?resize=660%2C236&#038;ssl=1\" alt=\"\" class=\"wp-image-927\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?resize=940%2C336&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?resize=580%2C207&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?resize=768%2C274&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?resize=1536%2C549&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?w=1618&amp;ssl=1 1618w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-2.png?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>Source: <a href=\"https:\/\/prettier.io\">Prettier<\/a><\/figcaption><\/figure>\n\n\n\n<p><a href=\"https:\/\/prettier.io\">Prettier<\/a> works very well and integrates with linters like ESLint and TSLint.<br>If you&#8217;re in Python, I suggest using&nbsp;<a href=\"https:\/\/github.com\/psf\/black\">Black<\/a>. You can install this as a plugin for PyCharm and then add a keyboard shortcut to format your code for you. It&#8217;s magic.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Using your IDE to execute and debug code<\/h4>\n\n\n\n<p>Most IDEs include functionality for executing code that you&#8217;re writing.<\/p>\n\n\n\n<p>It&#8217;s worth setting this up properly, because being able to get quick feedback on whether your code compiles or runs without errors is very helpful. This is another feedback loop that you should aim to make as fast as possible.<\/p>\n\n\n\n<p>A second big advantage is that this gives you access to a visual debugger, allowing you to pause code execution and inspect the state of your code to identify problems. This is much much better than&nbsp;<code>print<\/code>&nbsp;or&nbsp;<code>console.log<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/code.visualstudio.com\/assets\/docs\/editor\/debugging\/variables.png?w=660&#038;ssl=1\" alt=\"\"\/><figcaption>Debuggers allow you to pause execution and inspect the state of a program at a particular point. Source: <a href=\"https:\/\/code.visualstudio.com\/docs\/editor\/debugging#_data-inspection\">Visual Studio<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Testing your code<\/h4>\n\n\n\n<p>One of the biggest differences with school or academia is that companies don&#8217;t expect that your code is correct because it <em>seems<\/em> correct: they expect you to prove it with tests.<\/p>\n\n\n\n<p>These tests are run every time somebody tries to contribute a change to the main body of the codebase, and before new code is deployed. They ensure that everything is working as expected. The basic format of a software test is something like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def test_when_country_is_England_then_language_is_English():\n    lang = get_language_for_country(&#039;England&#039;)\n    assert lang == &#039;English&#039;<\/code><\/pre>\n\n\n\n<p>This is a fantastically good idea, because:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>It&#8217;s easy to make mistakes when programming<\/strong>: automated testing guards against this<\/li><li><strong>Automated testing allows us to edit the codebase more freely<\/strong>, because we&#8217;ve got a set of alarms that will tell us if changing something in place A affected some functionality in place B we didn&#8217;t know about.  This allows us to move faster &#8211; and get through that darned lifecycle more quickly.<\/li><li><strong style=\"background-color: var(--go--color--background,0,0,100%); color: var(--go--color--text); font-family: var(--go--font-family); font-size: var(--go--font-size); letter-spacing: var(--go--letter-spacing,normal);\">Tests provide &#8220;live&#8221; documentation of how the software works<\/strong><span style=\"background-color: var(--go--color--background,0,0,100%); color: var(--go--color--text); font-family: var(--go--font-family); font-size: var(--go--font-size); font-weight: var(--go--font-weight,400); letter-spacing: var(--go--letter-spacing,normal);\">: well-designed tests trace out the major routes of information flow through the system<\/span>. It&#8217;s often easier to figure out how something works from reading the tests than reading the documentation.<\/li><li><strong>Testing enforces certain good programming habits<\/strong>: it forces you to structure your code in small chunks and encourages you to separate different pieces of functionality wherever possible. If you write spaghetti code, you&#8217;ll find it very hard to test.<\/li><\/ol>\n\n\n\n<p>Moreover, as a newbie in the firm, you can greatly increase your colleague&#8217;s confidence in your first batch of changes by writing good tests. It&#8217;s often easier to verify the logic of the tests than that of the underlying implementation: a well-written set of tests says to your colleagues <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>I&#8217;ve thought carefully about the ways this thing could go wrong, and I&#8217;ve written tests to ensure that they don&#8217;t<\/p><\/blockquote>\n\n\n\n<p>As discussed below in Code Review, your colleagues are busy humans prone to the regular frailties of stress, exasperation, and intolerance. You can make their lives much easier by writing good tests. In turn, they&#8217;re more likely to provide high quality, interesting feedback like &#8220;you could refactor this piece to improve the time complexity&#8221; rather than boring feedback like &#8220;I can&#8217;t tell whether this will work or not, write some tests&#8221;, or &#8220;does this actually work?!&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Pushing_code_to_version_control\"><\/span>3. Pushing code to version control<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ok, you&#8217;re now in a position to make this button bigger! You can run the project locally and use the debugger to fix problems, whilst autoformatting your code to the company&#8217;s specification. Sweet.<\/p>\n\n\n\n<p>Remember when we <code>git cloned<\/code> the repo to get a current version of the code? We also use git to record our changes to the codebase, and submit them to the rest of the team for review. We will do this by <strong>checking out <\/strong>a new branch from the <code>main<\/code> branch, adding some <code>commits<\/code>, then opening a <code>pull request<\/code> in which we ask colleagues for feedback before <code>merging<\/code> the work back into the <code>main branch<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"348\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8-940x496.png?resize=660%2C348&#038;ssl=1\" alt=\"\" class=\"wp-image-947\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?resize=940%2C496&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?resize=580%2C306&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?resize=768%2C405&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?resize=1536%2C810&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?w=1897&amp;ssl=1 1897w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-8.png?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>A basic workflow. We create a new branch for our feature, and add commits (black dots) before merging back into the main branch (white dots). Source: author<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ultimately, your work will form part of a series of atomic changes to the codebase which are layered on top of one another to form a (hopefully) great product with an informative history of how the code has changed over time. It&#8217;s worth making sure your part of the story is written in a way that does your proud.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"382\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3-940x544.png?resize=660%2C382&#038;ssl=1\" alt=\"\" class=\"wp-image-929\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?resize=940%2C544&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?resize=580%2C335&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?resize=768%2C444&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?resize=1536%2C888&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?resize=2048%2C1184&amp;ssl=1 2048w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?w=1320 1320w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-3.png?w=1980 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>This is the git history for pandas, a popular Python data analysis library. Each row here is a <code>commit<\/code> to the <code>master<\/code> branch, along with a message about what changes that commit introduces. The current code in <code>master<\/code> is the result of applying all of those changes in turn. Source: <a href=\"https:\/\/github.com\/pandas-dev\/pandas\/commits\/master\">Github<\/a><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Basic git commands<\/h4>\n\n\n\n<p>You&#8217;re going to need some basic proficiency with&nbsp;<code>git<\/code>&nbsp;in order to contribute to a collaborative codebase. <code>Git<\/code> can be overwhelming, but there&#8217;s lots of good content already:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/guides.github.com\/introduction\/git-handbook\/\">Github<\/a>: Git Handbook<\/li><li><a href=\"https:\/\/cs.lmu.edu\/~ray\/notes\/introgit\/\">Loyola Marymount University<\/a>: Intro to Git<\/li><li><a href=\"https:\/\/www.freecodecamp.org\/news\/what-is-git-and-how-to-use-it-c341b049ae61\/\">Free Code Camp<\/a>: What is Git and How to Use It<\/li><\/ul>\n\n\n\n<p>The commands you need to understand well are:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>branch<\/code>&nbsp;&#8211; create copies of the code that will evolve independently of one another<\/li><li><code>commit<\/code>&nbsp;&#8211; a chunk of work in which you changed some things<\/li><li><code>add<\/code>&nbsp;&#8211; add modifications or new files to a particular commit<\/li><li><code>pull<\/code>&nbsp;&#8211; grab changes to the code from the server<\/li><li><code>push<\/code>&nbsp;&#8211; copy your local changes onto the server<\/li><\/ul>\n\n\n\n<p>Although it can be daunting and unintuitive, the good news it that <code>git<\/code> is your insurance policy. It&#8217;s a safety net which makes it extremely unlikely that you will permanently break something. This means you&#8217;re free to mess around, try stuff, and break things for yourself without impacting the rest of the team.<\/p>\n\n\n\n<p>Here&#8217;s the minimal two step workflow:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Organize your work in a branch<\/h4>\n\n\n\n<p>The&nbsp;<strong>branch<\/strong>&nbsp;is a core <code>git<\/code> concept which describes a copy of the code to which changes can be made independently of the rest. Most repositories have a few special branches which you can&#8217;t push code to directly, with names like&nbsp;<strong>master, main<\/strong>, <strong>production,&nbsp;<\/strong>or&nbsp;<strong>develop.&nbsp;<\/strong>Different organizations adopt different strategies for organizing work in version control.<\/p>\n\n\n\n<p>In all cases, the intention is to segregate the stable body of the code from new, unstable functionality, which is then incorporated into the main codebase once it&#8217;s passed the necessary review and testing steps. This is the basic model outlined in&nbsp;<a href=\"https:\/\/guides.github.com\/introduction\/flow\/\">Github Flow<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"216\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4-940x307.png?resize=660%2C216&#038;ssl=1\" alt=\"\" class=\"wp-image-931\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?resize=940%2C307&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?resize=580%2C190&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?resize=768%2C251&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?resize=1536%2C502&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?w=2036&amp;ssl=1 2036w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?w=1320 1320w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/07\/image-4.png?w=1980 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>A simple branching model. The straight line at the top is the <code>main<\/code> branch. We branch off into a feature branch, add some commits (white circles), open a pull request (big circle with arrows), then after reviews (speech bubbles) it gets deployed (squirrel, for some reason), and merged into the <code>main<\/code> branch again. Source: <a href=\"https:\/\/guides.github.com\/introduction\/flow\/\">Github Flow<\/a><\/figcaption><\/figure>\n\n\n\n<p><br>In order to make your changes, you&#8217;re going to need your own branch. There are a variety of branch naming conventions: some companies use a prefix like&nbsp;feature&nbsp;or&nbsp;bugfix&nbsp;to denote the category of the branch. Figure out the convention, and checkout a branch from the main branch to get working on your first task:<br><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>git checkout -b feature\/MP-910-make-button-bigger<\/code><\/pre><\/div>\n\n\n\n<p><br>That&nbsp;&nbsp;<code>MP-910<\/code>&nbsp;is the reference to the task you&#8217;ve picked up. By including it in the branch name you&#8217;re giving your version control and your task management system a chance to communicate, and move tickets automatically when code is pushed (which hopefully somebody in your company has set up &#8211; if not, that&#8217;s a good small task for you \ud83d\ude09).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Split your work into commits<\/h4>\n\n\n\n<p>A&nbsp;<strong>commit<\/strong>&nbsp;is a set of changes to the existing code, associated with a message explaining the logic behind the change.<\/p>\n\n\n\n<p>Ideally your commits represent intuitive steps in your process of accomplishing the task. It&#8217;s sometimes helpful to break up the work before you begin, and then use that as a guide to your commits.<\/p>\n\n\n\n<p>What&#8217;s the point of organizing your work in commits? <\/p>\n\n\n\n<p>Firstly, if your work introduces a bug, it&#8217;s easy to work backwards through a series of commits to figure out at what point the problem was introduced. <\/p>\n\n\n\n<p>Secondly, if at some point you want to re-use\u00a0<em>some<\/em>\u00a0of your work but not the rest, you can take the commits that you want and put them somewhere else (this is called <a href=\"https:\/\/git-scm.com\/docs\/git-cherry-pick\">cherry-picking<\/a>, and it&#8217;s a bit of an advanced topic). <\/p>\n\n\n\n<p>Thirdly, and most importantly, the commits describe the logic of your code changes, breaking up your work into a series of bite-size chunks that are more intelligible to others (and your future self).<\/p>\n\n\n\n<p>In our example we want to make a button bigger, which probably only requires adding code in one place. But we might actually need to make two changes, one to the button and another to a screenshot in the README which depicts the button in question. In this case, it would be good to break the work into two commits:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-git\" data-lang=\"Git\"><code>(43a1r1) Increase sign up button size to accomodate new text\n(71282e) Update README screenshot to show new button<\/code><\/pre><\/div>\n\n\n\n<p><br>Those numbers in brackets are the <strong>hash<\/strong> of the commit &#8211; a unique identifier that Git uses to identify the commits and handle merging work together. The sentences are the commit messages which describe in simple terms the work done in that commit.<br><br>Writing good commit messages is an art form, but three pointers:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Start with a Capital letter<\/li><li>Write in the present tense: &#8220;Increase&#8221;, not &#8220;Increased&#8221;. This describes&nbsp;<em>what will happen when somebody applies the changes associated with this commit to the code<\/em><\/li><li>Try and communicate the&nbsp;<em>intention<\/em>&nbsp;of what you&#8217;re doing, not the mechanics. People can read the changes to the code themselves: the commit messages allow you to capture additional detail about&nbsp;<em>why<\/em>&nbsp;you&#8217;re making those changes<\/li><\/ol>\n\n\n\n<p>More on good commit messages from <a href=\"https:\/\/chris.beams.io\/posts\/git-commit\/\">Chris Beams<\/a>.<\/p>\n\n\n\n<p>Ok, you&#8217;re now ready to push your commits!&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_How_do_people_review_my_work\"><\/span>4. How do people review my work?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Before your edits to the code are merged into the main branch of the project, your colleagues will want to review it.<\/p>\n\n\n\n<p><strong>Code review<\/strong> is a tremendously helpful exercise which helps maintain code quality and keeps everybody aware of how the code base is developing. Most importantly for you, it&#8217;s a great opportunity for you to learn from your colleagues.<\/p>\n\n\n\n<p>Unlike in the majority of professional situations, during code review people are really incentivised to give you high quality feedback. This is because you&#8217;re writing and editing code that they&#8217;re probably going to work on in the future, so it&#8217;s in their interest to make sure it&#8217;s good.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Continuous_integration\"><\/span>Continuous integration<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The first reviewer you have to satisfy is usually automated: a so-called <strong>Continuous Integration<\/strong> system such as <a href=\"https:\/\/www.jenkins.io\/\">Jenkins<\/a>, <a href=\"https:\/\/circleci.com\/docs\/\">CircleCI<\/a>, or <a href=\"https:\/\/github.com\/features\/actions\">Github Actions<\/a>. The name is a nod to the idea that automated testing gives us higher confidence that our changes won&#8217;t break anything, allowing us to move towards continuous (as opposed to sporadic) deployments.<\/p>\n\n\n\n<p>These check that the code can be built and tested successfully. Typically, the version control system is configured such that you <em>can&#8217;t<\/em> merge code that fails these checks.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/image.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"339\" height=\"149\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/image.png?resize=339%2C149&#038;ssl=1\" alt=\"How to setup continuous integration and deployment workflows using Github  actions - Coletiv Blog\" class=\"wp-image-952\"\/><\/a><figcaption>A PR which has been built and tested successfully, Source: <a href=\"https:\/\/www.coletiv.com\/blog\/how-to-setup-continuous-integration-and-deployment-workflows-for-reactjs-using-github-actions\/\">Coletiv<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>Some systems will also create a test deployment for you. This is a really nice feature, allowing your reviewers to actually play with your code without requiring them to set it up locally.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/devcenter2.assets.heroku.com\/article-images\/1506430656-Screen-Shot-2017-09-18-at-12.04.55.png?w=660&#038;ssl=1\" alt=\"Pipelines | Heroku Dev Center\"\/><figcaption>Review apps on Heroku. The boxes on the left correspond to ephemeral deployments created when a Pull Request was opened. Source: <a href=\"https:\/\/devcenter.heroku.com\/articles\/pipelines\">Heroku<\/a>.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Submitting_your_code_for_review\"><\/span>Submitting your code for review<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>It can be pretty nerve wracking to go through your first code review. Try not to take any feedback personally, and don&#8217;t be surprised if people find errors that you had missed &#8211; another pair of eyes is often very useful.<\/p>\n\n\n\n<p>Here are a few pointers to keep your first code review buoyant rather than bruising:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Document your PR properly<\/h4>\n\n\n\n<p>Start with a succinct description of why you&#8217;re making this change, and any additional background the reviewer of the code needs to understand what&#8217;s going on.<\/p>\n\n\n\n<p>If there&#8217;s stuff you thought about but didn&#8217;t do, this can be a good place to include it, so reviewers don&#8217;t waste time writing &#8220;have you thought about&#8230;&#8221;.<\/p>\n\n\n\n<p>If you&#8217;re making a change to the way something looks, include a screenshot or even a video of how the thing has changed! We&#8217;re trying to make life easy for the reviewers. Don&#8217;t make them checkout your branch to see the effect that changing a margin by 10px has on a button!<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/images.ctfassets.net\/m1px4cv57vle\/5ezjnaNrIhJRLs2LJiA7WM\/e015a07a09ccadfdf2afce2a3ce2da16\/ok.png?w=660&#038;ssl=1\" alt=\"Adding a Loom to a recent pull request screenshot\"\/><figcaption>Add as much context as possible to your PR: maybe even a video. Loom is a useful tool for this. Source: <a href=\"https:\/\/www.loom.com\/blog\/loom-github-chrome-extension-integration\">Loom<\/a><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Run the freaking linter<\/h4>\n\n\n\n<p>As mentioned above, it&#8217;s really helpful to automatically format your code before submitting it to review.<\/p>\n\n\n\n<p>This will catch lots of stupid errors &#8211; like commented code, unused imports, or weirdly-named variables &#8211; that will otherwise simply frustrate your reviewer. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Check that everything runs locally<strong> <\/strong><\/h4>\n\n\n\n<p>This sounds stupid, but you&#8217;d be surprised how often we don&#8217;t properly check that the code runs locally.<\/p>\n\n\n\n<p>Particularly if you&#8217;re working with a multicomponent system &#8211; frontend, backend, and database &#8211; please do just check that everything still plays nicely together as you expect.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Check that tests pass<\/h4>\n\n\n\n<p>Another surprisingly common error is to fail to run the tests locally.<span id='easy-footnote-9-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-9-916' title='This is so common that many repos will have a pre-commit hook that checks that unit tests and linting passes before allowing you to commit your code. It&amp;#8217;s a bit painful, but it works. '><sup>9<\/sup><\/a><\/span><\/p>\n\n\n\n<p>You then push your code, go and do something else, and realize 30 minutes later that the tests have failed when the continuous integration system has attempted to run them. By this point you&#8217;re working on something else, and reviewing your code has slid to the bottom of your reviewer&#8217;s to do list.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Review your own PR<\/h4>\n\n\n\n<p>Your version control system will display your Pull Request with helpful highlights showing what you changed.<\/p>\n\n\n\n<p>It&#8217;s a really good idea to have a look at these yourself! I often find that I&#8217;ve changed a file I didn&#8217;t mean to, or added a file to the Pull Request which was irrelevant.<\/p>\n\n\n\n<p>Sometimes looking at your code from the reviewer&#8217;s perspective helps you spot changes that clarify or clean up the code. Putting yourself in your reviewer&#8217;s shoes can help you assess your own work more objectively.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/i.stack.imgur.com\/IPwTf.gif?w=660&#038;ssl=1\" alt=\"Change github diff to be side by side comparison? - Stack Overflow\"\/><figcaption>Git diffs: red for deletions, green for additions. You can view these in a unified or split style on Github. Source: <a href=\"https:\/\/stackoverflow.com\/questions\/15048958\/change-github-diff-to-be-side-by-side-comparison\/15713918\">StackOverflow<\/a><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Reviewing_others_code\"><\/span>Reviewing others&#8217; code<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>When it comes to reviewing other people&#8217;s code, try to remember how scary it was to submit your own code to review, and how even the gentlest suggestion felt like a fundamental challenge to your worth as a human being.<\/p>\n\n\n\n<p>Some pointers on humane code review:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Avoid<\/strong> &#8220;<strong>you&#8221;<\/strong>. Try &#8220;we&#8217;re missing a comma&#8221; rather than &#8220;you&#8217;re missing a comma&#8221;<\/li><li><strong>Phrase as suggestions, not instructions<\/strong>. Try &#8220;maybe this would be better&#8221; rather than &#8220;you should change this&#8221;<\/li><li><strong>Be constructive<\/strong>. If you&#8217;re suggesting a change, consider offering a piece of working code that does what you&#8217;re suggesting &#8220;If we use a dictionary instead like <code>a = dict(A=1)<\/code> that will be more efficient&#8221;<\/li><li><strong>Is it wrong or different? <\/strong>Sometimes people will complete a task in a way you didn&#8217;t expect. The knee jerk reaction is to tell them this. Before you do so, consider whether their approach is actually worse, or just different from what you had in mind.<\/li><li><strong>Use emojis <\/strong>to soften the tone of your critical comments \ud83e\udd28 \ud83d\ude4b\ud83d\udca1<\/li><li><strong>Not everything has to be negative<\/strong> in a code review! If you think something is cool, or you learned something, say so. <span id='easy-footnote-10-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-10-916' title=' You might see the acronym TIL &amp;#8211; Today I Learned &amp;#8211; used in this context '><sup>10<\/sup><\/a><\/span><\/li><li><strong>You can ask questions<\/strong>! The review doesn&#8217;t have to unidirectional &#8211; the person who wrote the code is probably more than happy to explain in depth the neat way they found to reduce time complexity from O(n) to O(1) &#8211; take advantage of this.<\/li><\/ol>\n\n\n\n<p>For more tips, checkout <a href=\"https:\/\/google.github.io\/eng-practices\/review\/reviewer\/\">Google&#8217;s Engineering Best Practices on Code Review<\/a> <span id='easy-footnote-11-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-11-916' title='Thanks Jonny Linton for this reference'><sup>11<\/sup><\/a><\/span>.<\/p>\n\n\n\n<p>Finally, remember that it&#8217;s much easier to fix a broken function than it is to fix a broken relationship. Particularly if you&#8217;re an engineer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_Deployment\"><\/span>5. Deployment<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Deployment is where the rubber hits the road: your code becomes part of the product that  is exposed to users.<\/p>\n\n\n\n<p>This is often a two stage process. Most companies have one or more <strong>staging<\/strong> environments, which allow you to check how your changes behave when they&#8217;re let loose in a sandbox before sending them out into the wide world. Once you&#8217;ve tested functionality in staging, it&#8217;s deployed into <strong>production<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"225\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1-940x321.jpeg?resize=660%2C225&#038;ssl=1\" alt=\"\" class=\"wp-image-964\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?resize=940%2C321&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?resize=580%2C198&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?resize=768%2C263&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?resize=1536%2C525&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?w=1886&amp;ssl=1 1886w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/IMG_C2DFE0039E52-1.jpeg?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>A typical deployment flow. Often staging will be referred to as &#8220;dev&#8221;, or &#8220;development environment&#8221;. In some flows, staging is associated with one git branch (often <code>develop<\/code>) whilst production is associated with another (<code>main<\/code> or <code>master<\/code>). Source: author<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Continuous_deployment\"><\/span>Continuous deployment<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The sibling of the <strong>continuous integration<\/strong> discussed above is <strong>continuous deployment<\/strong>. This is the automation of deployment of your code: when you merge a PR into a given branch, the code is deployed to a specified environment. <\/p>\n\n\n\n<p>This is typically handled by the same service as your CI, either your version control system (e.g. Github), a third party service (e.g. CircleCI), or your hosting environment (e.g. AWS).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Hosting_environments\"><\/span>Hosting environments<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>When people talk about software being deployed &#8220;on the cloud&#8221;, they really mean that it&#8217;s deployed in a big data centre owned by a company that doesn&#8217;t pay much tax.<\/p>\n\n\n\n<p>Amazon Web Services (AWS) and Google Cloud Platform (GCP) are the most popular, with Microsoft Azure and Heroku favoured by old school companies and hobbyists respectively <span id='easy-footnote-12-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-12-916' title=' I really, really like Heroku, and I wish AWS was 1\/10th as usable '><sup>12<\/sup><\/a><\/span>.<\/p>\n\n\n\n<p>The alternative is local or&nbsp;<strong>on premise<\/strong>&nbsp;deployment, where code is running in a specific, named data centre &#8211; this is rare, and typically only used in very sensitive contexts (e.g. healthcare) or when there are unusual hardware requirements (e.g. deep learning).<\/p>\n\n\n\n<p>If you&#8217;re lucky, you won&#8217;t have to tangle very much with the hosting environment in your first role. Configuring and maintaining deployment environments is an art unto itself, giving rise to the discipline of DevOps, which is 50% people slick consultants in blazers talking about boosting velocities and 50% dudes <span id='easy-footnote-13-916' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#easy-footnote-bottom-13-916' title='Yes, I&amp;#8217;m sorry, it is mostly dudes'><sup>13<\/sup><\/a><\/span> in Metallica t-shirts who have a supernatural ability to figure out why your build is failing. <\/p>\n\n\n\n<p>Broadly speaking, your hosting environment is going to have to help you:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Deploy stuff<\/strong>: take the code that runs on your computer and get it running in a data centre somewhere, usually either on a Linux instance or as a Docker container.<\/li><li><strong>Make it accessible to other people<\/strong>: expose it to the web and allow you to route users to it. When you have lots of different services, you&#8217;ll use tools to organize their interfaces with the internet neatly, like Virtual Private Clouds and API Gateways.<\/li><li><strong>But not all the people<\/strong>: your hosting environment will often help you with authenticating your users and managing what permissions they have.<\/li><li>&#8230;<strong>And occasionally lots more than you expect<\/strong>: a big advantage of cloud computing is that it&#8217;s easy to scale your services to deal with more demand. This can be handled automatically if your credit card limit is high enough &#8211; this is known as autoscaling.<\/li><\/ol>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wrapping_up_the_cycle\"><\/span>Wrapping up the cycle<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p>Bonza. Your code is now deployed. If the task management automation hasn&#8217;t done it for you already, you get to move your ticket from <em>In Review -&gt; Done!<\/em><\/p>\n\n\n\n<p>Hopefully the product is now a tiny bit better, and you&#8217;re a tiny bit wiser.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"377\" src=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1-940x537.jpg?resize=660%2C377&#038;ssl=1\" alt=\"\" class=\"wp-image-962\" srcset=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?resize=940%2C537&amp;ssl=1 940w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?resize=580%2C331&amp;ssl=1 580w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?resize=768%2C438&amp;ssl=1 768w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?resize=1536%2C877&amp;ssl=1 1536w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?w=1818&amp;ssl=1 1818w, https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?w=1320 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption>It can be helpful to note down things you learned each sprint. The first of these lessons is a genuine one; a few weeks into a new job I managed to accidentally create a local folder called ~ and then wipe my entire home directory in the course of attempting to delete the directory. Source: author<\/figcaption><\/figure>\n\n\n\n<p>Consider noting down anything you learned whilst completing this piece of work. A logbook can come in handy when you hit problems you&#8217;ve seen before, and it provides a great stock of examples for those pesky behavioural questions in interviews.<\/p>\n\n\n\n<p>Finally, if you get a chance, try to <strong>demo<\/strong> your work. This could be just to your dev colleagues, to the rest of the company, or even (ideally) to a customer. Not only might this result in some useful feedback, but it&#8217;s fulfilling to solve somebody&#8217;s problem and then show them the solution.<\/p>\n\n\n\n<p>Hopefully the buzz you get from demoing your work will have you reaching for the next ticket in no time.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p>Hopefully this guide has given you enough of a mental model to get started with writing code and accumulating feedback from your peers.<\/p>\n\n\n\n<p>If you&#8217;re looking to read more about succeeding in your first tech role, the next topic I&#8217;d suggest digging into is how tech companies, and the teams within them, work.<\/p>\n\n\n\n<p>Here are some pieces I liked:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/pragprog.com\/titles\/tpp20\/the-pragmatic-programmer-20th-anniversary-edition\/\">The Pragmatic Programmer<\/a>: a classic. Useful programming tips, but the notes on how to understand your role in the company and interact with your colleagues and users are even more valuable<\/li><li><a href=\"https:\/\/www.kalzumeus.com\/2011\/10\/28\/dont-call-yourself-a-programmer\/\">Don&#8217;t Call Yourself a Programmer<\/a>: a fantastic essay on how to conceive of yourself as somebody who solves business problems, rather than a code monkey<\/li><li><a href=\"https:\/\/basecamp.com\/books\/rework\">Rework<\/a>: it turns out that Basecamp <a href=\"https:\/\/www.theverge.com\/2021\/5\/3\/22418208\/basecamp-all-hands-meeting-employee-resignations-buyouts-implosion\">might not be quite as idyllic<\/a> as its founders make out in this book, but I still think these principles for sane, calm, productive teamwork are bang on<\/li><li><a href=\"https:\/\/randsinrepose.com\/dont-skip-this\/\">Rands In Repose<\/a>: a great tech blog with plenty of war stories and advice on having an enjoyable life in tech<\/li><\/ul>\n\n\n\n<p>And if you&#8217;re interested in other stuff I&#8217;ve written, here are a few more pieces:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/towardsdatascience.com\/rookie-errors-in-machine-learning-bc1c627f2789\">Avoiding rookie errors in machine learning<\/a><\/li><li><a href=\"https:\/\/deberker.com\/archy\/organizing-applied-machine-learning-research\/\" data-type=\"post\" data-id=\"627\">Organizing applied research<\/a><\/li><li><a href=\"https:\/\/deberker.com\/archy\/dodging-pitfalls-when-transitioning-from-academia-to-industry\/\" data-type=\"post\" data-id=\"779\">Avoiding pitfalls when transitioning from academia to industry<\/a><\/li><li><a href=\"https:\/\/deberker.com\/archy\/things-i-didnt-understand-about-starting-a-company-until-i-tried\/\" data-type=\"post\" data-id=\"708\">Things I didn&#8217;t understand about starting a company until I tried<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><br><\/h2>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Get fast at contributing code and flourish in your first software role<\/p>\n","protected":false},"author":1,"featured_media":962,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"hide_page_title":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[19,10,12],"tags":[],"class_list":["post-916","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-machine-learning","category-software","category-startups"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Minimal Viable Developer: acing your first month in software - Archy de Berker<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Minimal Viable Developer: acing your first month in software - Archy de Berker\" \/>\n<meta property=\"og:description\" content=\"Get fast at contributing code and flourish in your first software role\" \/>\n<meta property=\"og:url\" content=\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\" \/>\n<meta property=\"og:site_name\" content=\"Archy de Berker\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-16T08:20:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-11-06T16:27:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1818\" \/>\n\t<meta property=\"og:image:height\" content=\"1038\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"archy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@archydeb\" \/>\n<meta name=\"twitter:site\" content=\"@archydeb\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"archy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"38 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\"},\"author\":{\"name\":\"archy\",\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\"},\"headline\":\"Minimal Viable Developer: acing your first month in software\",\"datePublished\":\"2021-08-16T08:20:50+00:00\",\"dateModified\":\"2021-11-06T16:27:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\"},\"wordCount\":7681,\"publisher\":{\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\"},\"image\":{\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1\",\"articleSection\":[\"Machine Learning\",\"Software\",\"Startups\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\",\"url\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\",\"name\":\"Minimal Viable Developer: acing your first month in software - Archy de Berker\",\"isPartOf\":{\"@id\":\"https:\/\/deberker.com\/archy\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1\",\"datePublished\":\"2021-08-16T08:20:50+00:00\",\"dateModified\":\"2021-11-06T16:27:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1\",\"width\":1818,\"height\":1038},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/deberker.com\/archy\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Minimal Viable Developer: acing your first month in software\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/deberker.com\/archy\/#website\",\"url\":\"https:\/\/deberker.com\/archy\/\",\"name\":\"Archy de Berker\",\"description\":\"Building things with data\",\"publisher\":{\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/deberker.com\/archy\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\",\"name\":\"archy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1\",\"width\":359,\"height\":311,\"caption\":\"archy\"},\"logo\":{\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/archydeb\"],\"url\":\"https:\/\/deberker.com\/archy\/author\/archy\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Minimal Viable Developer: acing your first month in software - Archy de Berker","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/","og_locale":"en_US","og_type":"article","og_title":"Minimal Viable Developer: acing your first month in software - Archy de Berker","og_description":"Get fast at contributing code and flourish in your first software role","og_url":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/","og_site_name":"Archy de Berker","article_published_time":"2021-08-16T08:20:50+00:00","article_modified_time":"2021-11-06T16:27:08+00:00","og_image":[{"width":1818,"height":1038,"url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1","type":"image\/jpeg"}],"author":"archy","twitter_card":"summary_large_image","twitter_creator":"@archydeb","twitter_site":"@archydeb","twitter_misc":{"Written by":"archy","Est. reading time":"38 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#article","isPartOf":{"@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/"},"author":{"name":"archy","@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d"},"headline":"Minimal Viable Developer: acing your first month in software","datePublished":"2021-08-16T08:20:50+00:00","dateModified":"2021-11-06T16:27:08+00:00","mainEntityOfPage":{"@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/"},"wordCount":7681,"publisher":{"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d"},"image":{"@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1","articleSection":["Machine Learning","Software","Startups"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/","url":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/","name":"Minimal Viable Developer: acing your first month in software - Archy de Berker","isPartOf":{"@id":"https:\/\/deberker.com\/archy\/#website"},"primaryImageOfPage":{"@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage"},"image":{"@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1","datePublished":"2021-08-16T08:20:50+00:00","dateModified":"2021-11-06T16:27:08+00:00","breadcrumb":{"@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#primaryimage","url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1","contentUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1","width":1818,"height":1038},{"@type":"BreadcrumbList","@id":"https:\/\/deberker.com\/archy\/minimal-viable-developer-acing-your-first-month-in-software\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/deberker.com\/archy\/"},{"@type":"ListItem","position":2,"name":"Minimal Viable Developer: acing your first month in software"}]},{"@type":"WebSite","@id":"https:\/\/deberker.com\/archy\/#website","url":"https:\/\/deberker.com\/archy\/","name":"Archy de Berker","description":"Building things with data","publisher":{"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/deberker.com\/archy\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d","name":"archy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/","url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1","contentUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1","width":359,"height":311,"caption":"archy"},"logo":{"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/x.com\/archydeb"],"url":"https:\/\/deberker.com\/archy\/author\/archy\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/08\/Diagrams-1-1.jpg?fit=1818%2C1038&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4cGwe-eM","jetpack-related-posts":[],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts\/916","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/comments?post=916"}],"version-history":[{"count":34,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts\/916\/revisions"}],"predecessor-version":[{"id":1203,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts\/916\/revisions\/1203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/media\/962"}],"wp:attachment":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/media?parent=916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/categories?post=916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/tags?post=916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}