<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="https://noahwright.dev//feed.xml" rel="self" type="application/atom+xml" /><link href="https://noahwright.dev//" rel="alternate" type="text/html" /><updated>2023-02-18T02:21:33+00:00</updated><id>https://noahwright.dev//feed.xml</id><title type="html">Noah Wright</title><subtitle>Noah Wright's software developer blog and portfolio.</subtitle><author><name>Noah</name><email>noah@noahwright.dev</email></author><entry><title type="html">Recreating my old game</title><link href="https://noahwright.dev//remaking-my-game/" rel="alternate" type="text/html" title="Recreating my old game" /><published>2022-09-17T00:00:00+00:00</published><updated>2022-09-17T00:00:00+00:00</updated><id>https://noahwright.dev//remaking-my-game</id><content type="html" xml:base="https://noahwright.dev//remaking-my-game/"><![CDATA[<p>I’ve written before about how <a href="/_posts/2022-01-15-game-programming.md">making video games made me a better programmer</a>, and I’d like to continue that work.  I’ve also written about how <a href="/_posts/2021-12-18-long-lost-code.md">I lost all the code for my game</a> and many other projects.  If I want to work on my game, I’ll have to <em>re</em>create it from the ground up – and that’s exactly what I’m doing!</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>The good: I’ve grown <strong>*a lot</strong> as a programmer.</li>
    <li>The bad: my life is a lot more complicated these days.</li>
    <li>The same: I still like <em>playing</em> games more than <em>making</em> games.</li>
  </ul>
</blockquote>

<h2 id="i-know-a-thing-or-two-because-ive-seen-a-thing-or-two">I know a thing or two because I’ve seen a thing or two</h2>

<p>I’ve got roughly 10 years of professional experience and more like 20 years if you include all my personal programming time.  Sure, a lot of it was spent programming <em>business</em> software, but those skills still translate to games.</p>

<p>When I was young and first working on my game, I had to look up how to do <em>every.  Single.  Thing.</em>  Small development tasks took way too long because I was spending more time learning than doing.  I wasn’t sure how to structure my code (<em>nor did I think it through as a younger programmer</em>), so I had to break and refactor things all the time.  Now I crank out code in an hour that would’ve taken me a week of research and experimentation.  Why?  <em>Because I’ve done it before!</em></p>

<p>I’ve also learned not to fall for the classic trap of thinking I have to make <em>everything</em> myself.  Earlier on, I wouldn’t use open source libraries or game engines because I thought <strong><em>I</em></strong> had to do it all.  This time, I’m making my game in Unity.  I’m not having to figure out how to make hitboxes or handle physics because Unity handles that for me.  I’m not wasting time reinventing the wheel, and Unity’s “wheel” is likely better than what I would’ve made anyway!</p>

<p>Taken together, this means that I’m really productive when I work on my game.  However…</p>

<h2 id="youth-really-is-wasted-on-the-young">Youth really is wasted on the young</h2>

<p>…when am I supposed to work on my game?  I have a full time job that – like many of us – keeps me occupied beyond the usual business hours.  My wife and I want to spend time together, and watching me write code isn’t exactly an exciting group activity.  My kids need help with homework.  My kids have friends they want to hang out with and can’t drive themselves, so I have to do that sometimes.  Doctor’s appointments, parent-teacher conferences, dishes, laundry, taxes, and all that other adulting stuff.</p>

<p>In my 20’s, I had <em>so much free time</em>.  I could’ve done so much more, but all I wanted to do was have fun.  I wasn’t in a hurry to finish my bachelor’s degree (much less get a master’s), I wasn’t as concerned about my physical health, and I thought I’d have plenty of time to finish making a game.  I put a lot of important things off, and now I don’t have all that free time.  I’ve got all these important things to do, but I still want to have fun.</p>

<p>That’s exactly why, when I <em>do</em> work on my game, I fall back into a bad old habit.</p>

<h2 id="games-are-fun--too-fun">Games are fun!  Too fun…</h2>

<p>When you change software, it’s important to test that it works.  You write code to add a button, run your code, go to the changed page, try clicking your button, make sure input is validated, etc etc, and then you go back to coding.  But what happens when the change you made is creating a new laser weapon?</p>

<p><em>Man, this looks cool.  I wonder if I added <strong>more</strong> particle effects?</em>  Five minutes go by.  <em>All these particles are awesome.  I bet they’d look killer in slow motion!</em>  You set the game speed to 25%.  Ten more minutes go by.  <em>Okay, now what if the laser is green?  No, purple!  Let me try <strong>all</strong> the colors!</em>  Before you know it, you’ve wasted an hour playing with your new feature.</p>

<p>This is the one thing that hasn’t changed.  I have probably spent more time <em>playing</em> my games than actually creating them.  I also like to do, <em>ahem</em>, “market research”.  I’ll go play a bunch of other games in the same genre for “inspiration”.  <em>I’m not just playing games, I’m analyzing how they work and gathering ideas!</em>  Sure you are, Noah.  Keep telling yourself that.</p>

<h2 id="closing">Closing</h2>

<p>All that aside, I still want to work on my game.  I don’t have a ton of free time, and the urge to play games is really hard to fight, but I’m going to make it happen.  I’ll try to – like with this blog – commit a little bit of time throughout the week to tweak things.  Importantly, I’ll save the source code so that I can keep working on it long-term.  Maybe one of these days I’ll have a finished game.</p>

<p>But not anytime soon – I’ve got a lot of “market research” to do first! 😬</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><summary type="html"><![CDATA[I’ve written before about how making video games made me a better programmer, and I’d like to continue that work. I’ve also written about how I lost all the code for my game and many other projects. If I want to work on my game, I’ll have to recreate it from the ground up – and that’s exactly what I’m doing!]]></summary></entry><entry><title type="html">Six months at Google</title><link href="https://noahwright.dev//six-months-at-google/" rel="alternate" type="text/html" title="Six months at Google" /><published>2022-09-03T00:00:00+00:00</published><updated>2022-09-03T00:00:00+00:00</updated><id>https://noahwright.dev//six-months-at-google</id><content type="html" xml:base="https://noahwright.dev//six-months-at-google/"><![CDATA[<p>Six months in, and I still can’t believe I work at Google.  It’s been a lot to take in, and now that I’ve gotten used to it I want to share what it’s like working for Big G.</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>Everybody is great.  <em>Too great</em>.  I must be an imposter! 😭</li>
    <li>Onboarding was like drinking from a firehouse.</li>
    <li>Feature flags are so, so good!</li>
    <li>So much non-code work is required in a place this big.</li>
  </ul>
</blockquote>

<h2 id="-googlers-the-best-thing-about-google">🤓 Googlers: the best thing about Google</h2>

<p>It feels like I’m surrounded by rockstars, and it’s hard not to feel like an imposter.  When I meet a new coworker, I like to pull them up on LinkedIn.  With my Google coworkers, it feels like everybody graduated from Harvard and MIT.  They’ve all worked at multiple huge companies.  They’ve written books and hold patents.  I’ve seen more people with master’s degrees in the past few months than I saw in years at other companies.  The amount of talent inside of Google is outrageous.</p>

<p>You’d think that all these smart people would be narcissistic, arrogant jerks, but the opposite is true!  To get into Google, I had to pass 5 different interviews.  Every single interviewer was super nice to me.  The recruiters I talked to were pleasant.  Every single member of my team is incredibly helpful.  Anyone I ask for help is quick to jump in and help.  I ask if somebody can point me in the right direction and they give me a link to a specific doc or piece of code that answers 100% of my question.</p>

<p>I have yet to meet someone that isn’t incredibly smart <strong><em>and</em></strong> ridiculously nice.  People talk all kinds of trash about their strict interview process, but it clearly works.</p>

<h2 id="-everything-is-different-inside-google">😵‍💫 Everything is different inside Google</h2>

<p>Google has been around since 1998.  Many software tools didn’t exist back then, so Google had to make their own.  Some of those tools (Angular, Golang, Guava, etc) ended up being used outside of Google.  Other things split off and became their own thing.  For example: other organizations use Kubernetes but Google still uses Borg, the cluster manager that K8s was based on.</p>

<p>There is a convenient list in Google called “inside/outside” that lists all these things.  We use Piper, not Git.  Buganizer, not Jira.  Critique, not GitHub for code reviews.  We call them CLs (change lists) instead of PRs (pull requests).  I could go on – it’s kind of a big list.</p>

<p>Trying to learn all these internal tools and terminology was <em>a lot</em>.  The first weeks at Google involve going through an onboarding program, and it is often described as drinking out of a firehose.  Once I got inside, I understood why the interviews don’t test for a particular language.  It wouldn’t matter if you were an expert in Java, you would still have to learn all the internal libraries that only exist in Google.  It doesn’t matter how much you’ve used other tools, because Google’s tools are <em>just a little bit different</em> and you have to learn how to use them.  Prior knowledge helps you ramp up faster, but there’s no way you’ll come in and already know how everything works.</p>

<h2 id="-feature-flags-how-i-love-thee">🚩 Feature flags, how I love thee</h2>

<p>At other jobs, we all worked on pieces of a release and it all went out the door together.  Not at Google.  At Google, every change is scoped to be as small as possible and is gated by a feature flag.  Instead of doing an entire code release, you flip a switch to turn a flag on.  If your change unexpectedly breaks things, you turn it off and fix things.  As a result, nothing breaks for long.</p>

<p>Flags aren’t simply on/off switches, either.  You can turn a flag on gradually and ramp up to a 100% release slowly, checking for problems along the way.  You can define all kinds of characteristics (or combinations of characteristics) to determine which users get a feature.  Only want to test your code on users of certain products in a particular region?  No problem.  Want to run an A/B test to see which new design reduces the bounce rate?  Easy!</p>

<p>I’m so spoiled by feature flags now.  One of these days I’m going to work somewhere with a traditional release cycle, and I’m going to hate it.  Flags are so powerful, and I wish every place had a robust system to do it like Google does.</p>

<h2 id="programmers-do-more-than-program">Programmers do more than program</h2>

<p>I knew that my job at Google would involve writing code.  What I didn’t expect is how much <em>other</em> stuff I’d have to do.</p>

<p>Anything more than a trivial change requires a design document.  Each service is used by other teams, so you need to constantly update technical documentation and instructions.  If a change might affect multiple services, there might need to be a discussion to coordinate and make nobody’s changes have harmful side effects.</p>

<p>Legal reviews, accessibility reviews, security reviews, code reviews – lots and lots and lots of reviews.  Google is a huge international company that has to comply with a lot of regulations.  Hackers and fruadsters are constantly looking for ways to exploit Google for money.  You can’t let your code open a door for them.</p>

<p>You turn on your feature and watch for errors.  You review logs and data to make sure you haven’t broken anything.  Sometimes those feature flags power A/B experiments.  You have to review the results of such experiments and discuss them with your team.  Metrics have to be gathered to measure if each feature was a success.  Discussions about previous experiments guide future development.</p>

<p>There is <em>so much</em> that isn’t programming.  Unlike other places, where there were many unnecessary meetings, Google actively tries to cancel pointless toil.  All this extra is the <em>totally necessary</em> stuff that remains, and it’s <strong>a lot</strong>.</p>

<h2 id="closing">Closing</h2>

<p>Long story short: I love it here.  It’s been overwhelming and stressful, but it’s been great at the same time.  One day, when I’m out of Google, I’m going to miss all its weird quirks.</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><summary type="html"><![CDATA[Six months in, and I still can’t believe I work at Google. It’s been a lot to take in, and now that I’ve gotten used to it I want to share what it’s like working for Big G.]]></summary></entry><entry><title type="html">Automated Testing</title><link href="https://noahwright.dev//testing/" rel="alternate" type="text/html" title="Automated Testing" /><published>2022-08-20T00:00:00+00:00</published><updated>2022-08-20T00:00:00+00:00</updated><id>https://noahwright.dev//testing</id><content type="html" xml:base="https://noahwright.dev//testing/"><![CDATA[<p>Some people <strong><em>love</em></strong> automated tests and won’t stop singing their praises.  Other people <strong><em>hate</em></strong> automated tests and constantly point out what a waste of time they are.  My opinion?  Well, it’s complicated…</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>❤ I love automated testing.</li>
    <li>😡 I <strong><em>hate</em></strong> automated testing.</li>
    <li>🎓 Learn it early before you establish bad habits, and you’ll hate it less.</li>
  </ul>
</blockquote>

<h2 id="-automated-testing-is-a-lifesaver">🛟 Automated testing is a lifesaver</h2>
<h3 id="refactoring">Refactoring</h3>
<p>Consider this scenario: A serious flaw was just discovered in an important library your project uses.  The only way to fix it is to upgrade to the newest version, but there will be many breaking changes.</p>

<p>How can you know what will actually break?  <em>Automated tests</em>.</p>

<p>A third-party service you use just jacked up their prices, so your company has decided to switch vendors.  If things break in Production, it would cost the company tons of money for every minute that your product is broken.</p>

<p>How can you be confident that you won’t cost the company millions?  <em>Automated tests!</em></p>

<h3 id="unintended-consequences">Unintended consequences</h3>
<p>Your code and database have become bloated over time.  You’re pretty sure this code isn’t called by anything, and you don’t think we need these database tables anymore.</p>

<p>How can you be sure that these removals won’t crash the whole system?  *Automated tests.”</p>

<p>Your software architecture is a bunch of microservices.  As things expand, the number of possible connections between services grows exponentially.  Your company is successful and keeps growing, and now it’s so big that no single person could possibly know <em>every single thing</em> that might be calling any one piece of code.</p>

<p>How can you not worry that changing <em>literally anything</em> might break something in some faraway code?  <em>Automated <strong>integration</strong> tests!!</em></p>

<h2 id="-but-it-takes-so-long">🐢 but it takes <em>so long!</em></h2>
<h3 id="the-initial-setup">The initial setup</h3>
<p>“<em>Okay, so automated tests can really save your bacon, I get it.  But I’m just working on this small project, so I don’t need to write any tests right now.  I’m going to keep things simple and write my code in a simple way.</em>”</p>

<p>Well what happens when your “little project” proves useful and becomes its own fully fledged product in the company?  Suddenly you want all those benefits, but you have to refactor <em>literally everything</em> in your project.  You won’t know if it’ll break because (<em>obviously</em>) you don’t have any automated tests yet!</p>

<p>Getting started is hard enough.  Adding tests makes that even harder.  But adding tests when you’ve already got a complicated project is painful.  I understand why nobody really wants to do it.</p>

<h3 id="doing-it-right-is-hard">Doing it right is hard</h3>
<p><em>“Somebody’s boss decided automated testing is important, and now we have to raise our code coverage to 100%.  Now I have to write hundreds of tests to try *every single possibility</em> and make sure every line of code gets hit.  Ughhhh!”*</p>

<p>And what ends up happening is people write bad tests because they’re chasing an arbitrary metric.  Their test calls every path of the code, but they don’t check the part of the ouput that actually changes in that path.  They don’t use parameterized tests, so they create dozens of tests that only vary by one line.  Now nobody wants to maintain those when code changes.</p>

<h3 id="flakiness">Flakiness</h3>
<p><em>“I uploaded my code and ran all the tests.  They passed!  Somebody approved my pull request.  I try to complete it, the integration tests run again.  They failed!  Wait, they failed?  But I didn’t change anything!  And now I can’t complete my pull request!  Now what!?”</em></p>

<p>Sure, the integration tests help you make sure all your complicated services don’t break each other.  But starting a bunch of test services processing power and memory.  You don’t want to slow down Production, so those resources are given to tests at a lower priority.  So it’s no surprise when things take too long and time out.  Now you’re wondering, <em>“can I ignore this?  Do I have to fix <strong>their</strong> broken test?  Or is something actually wrong with my code?”</em>.</p>

<p>Flakiness is a huge frustration and wastes <em>so much time</em>.  The more it happens, the more legitimate test failures get ignored.  Because of the random nature of the errors, it can be a nightmare to diagnose the problem.</p>

<h2 id="bad-habits-are-hard-to-break">Bad habits are hard to break</h2>

<p>Automated tests are like exercise.  If you’re fit and in shape, it’s really easy to exercise.  But if you slack off for years and let yourself get <em>out</em> of shape, it suddenly becomes an uphill battle.  The longer you go without exercise, the more of a struggle it is.</p>

<p>I wish I’d learned about automated tests when I <em>first</em> learned to code.  I wish I started every project by writing tests that fail.  But I have bad habits.  I have to remind myself before I get too far to stop and write some tests.  I groan about it every time, but I’m always glad to have the tests when they’re done.</p>

<h2 id="summary">Summary</h2>
<p>If you’re reading this, are a computer programmer, and aren’t already writing automated tests, you need to start.  Don’t do anything else until you have written some tests for your code.  Trust me, it’s worth it.  The sooner you start, the better.  You might not see the point yet, but I promise you: one day an automated test is going to avert a disaster and you will be thankful for them.</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><summary type="html"><![CDATA[Some people love automated tests and won’t stop singing their praises. Other people hate automated tests and constantly point out what a waste of time they are. My opinion? Well, it’s complicated…]]></summary></entry><entry><title type="html">Digital Gardening Follow-up</title><link href="https://noahwright.dev//digital-gardening-followup/" rel="alternate" type="text/html" title="Digital Gardening Follow-up" /><published>2022-07-23T00:00:00+00:00</published><updated>2022-07-23T00:00:00+00:00</updated><id>https://noahwright.dev//digital-gardening-followup</id><content type="html" xml:base="https://noahwright.dev//digital-gardening-followup/"><![CDATA[<p>About 6 months ago I wrote a <a href="/_posts/2022-01-08-digital-gardening.md">blog post about digital gardening</a>.  The basic idea was that I don’t need to architect <em>every single aspect</em> of this site.  Instead, my plan was to let it slowly grow into something much bigger.  This is a follow-up to see how that went.</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>The good: “Digital gardening” is a decent way to get started</li>
    <li>The bad: It’s still easy to neglect your “garden”</li>
    <li>The bottom line: Be honest with yourself about how much time you have</li>
  </ul>
</blockquote>

<h2 id="-start-with-gardening">🌹 Start with gardening</h2>

<p>I have started <em>plenty</em> of projects, blogs, etc, only to have them go nowhere.  I didn’t want that to happen with this site, so I committed to doing it little by little.  In that regard, the digital gardening experiment was a huge success.  Rather than having a 90%-done site that nobody could see, the site got out immediately and grew into what it is now.</p>

<p>My plan was to use this “digital gardening” approach for my personal projects, too.  Rather than try to finish <em>every single thing</em>, I wanted to slowly work on it.  It turns out that it takes more discipline than I was prepared for, as I will get into next.</p>

<h2 id="-gardens-require-maintenance">🥀 Gardens require maintenance</h2>

<p>What happens when you create a garden and then walk away from it for months?  Things wilt, wither, and die.  Unfortunately, that’s what happened with me.</p>

<p>At several points I looked at my site and realized I hadn’t written a post in <em>a while</em>.  Suddenly, instead of “<em>I’ll work on this a little here and there</em>” it became “<em>I need to write 3 blog posts <strong>right now</strong>!</em>”  That defeated the whole point of a relaxed gardening-like experience.</p>

<h2 id="-how-much-time-do-you-have">⌚ How much time do you have?</h2>

<p>Originally, I told myself I’d write a post every week.  Then I decided every <em>two</em> weeks was better.  Two weeks turned into a month.  I severely underestimated how long it’d take me to write each post.</p>

<p>If you’re going to start a thing and promise yourself that you’ll work on it, be honest with yourself.  How much time do you really have to do this?  I’ve got a full time job and a house full of kids.  I’m busy <em>all the time</em>, so carving out 30 minutes to write something is harder than it sounds.  Everybody’s situation varies, so I can’t tell you how much work your digital garden will take.  All I can suggest is that you start small.</p>

<p>Gardens also don’t have to be perfect.  This is something I’m still struggling with.  I’m the type of person to write an email and then read and re-write it 100 times before I send it.  Simple messages that should take me 30 seconds to write end up taking 30 minutes because I’m overthinking it.  If you’re that type of person, you’ve got to relax and fire off posts without thinking so much.  You can always go back and make corrections later, after all.  As Voltaire said, “perfect is the enemy of good.”  Don’t let your perfectionism get in the way of progress.</p>

<h2 id="closing">Closing</h2>

<p>Digital gardening is a good idea, but it isn’t a silver bullet.  Whether you finish a project before putting it out there or let it grow slowly in public, you still have to put in the work.  Putting something out there half-finished may give you the motivation to keep going, or it might stress you out when you see that your half-done project looks, well, half-done.</p>

<p>The most important thing is to be honest with yourself.  Don’t commit to doing something every day if you only <em>really</em> have time to do it once a week, or once per month.  Any timeline is fine, but if you try to make yourself too much you’ll stress yourself out, whether gardening or not.</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><summary type="html"><![CDATA[About 6 months ago I wrote a blog post about digital gardening. The basic idea was that I don’t need to architect every single aspect of this site. Instead, my plan was to let it slowly grow into something much bigger. This is a follow-up to see how that went.]]></summary></entry><entry><title type="html">Programming on a Chromebook</title><link href="https://noahwright.dev//coding-in-chrome/" rel="alternate" type="text/html" title="Programming on a Chromebook" /><published>2022-06-25T00:00:00+00:00</published><updated>2022-06-25T00:00:00+00:00</updated><id>https://noahwright.dev//coding-in-chrome</id><content type="html" xml:base="https://noahwright.dev//coding-in-chrome/"><![CDATA[<p>When I started at Google, they gave me my assigned laptop and I was shocked to find out it was, <em>gasp</em>, a Chromebook!?  For a software engineer position?  How would that even work?  Well, let me tell you…</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>I do all my work at Google on a Chromebook, and it has worked surprisingly well.</li>
    <li>Have a GitHub repo?  Hit <code class="language-plaintext highlighter-rouge">.</code> on your keyboard to edit in your browser.</li>
    <li>Thanks to <a href="https://remotedesktop.google.com/">Chrome Remote Desktop</a>, I’ll never need a heavy laptop again!</li>
  </ul>
</blockquote>

<h2 id="-coding-in-the-cloud">☁ Coding in the cloud</h2>

<p>While it is possible to install VS Code directly onto a Chromebook, that’s not how I write code at Google.  Instead, I use a web-based editor directly in Chrome.  This is made possible by Google’s so-called <em>Client in the Cloud</em> (CitC).  Basically, instead of creating a local branch of the code repo, you create a new workspace that exists in the cloud to track your changes.  I make changes in a web-based editor, and those changes are immediately saved back to the cloud.</p>

<p>“<em>But I don’t have Google’s cloud to host my code!</em>” you say?  Maybe not, but you do have Github!</p>

<p>Go to any repo you have and press <code class="language-plaintext highlighter-rouge">.</code> (period) on your keyboard.  This will redirect you from Github<strong>.com</strong> to Github<strong>.dev</strong> and open a web version of VS Code.  You can edit your code directly in the browser and merge your changes without ever having to install an editor to your machine!  In fact, I’m writing this blog post in Chrome right now.</p>

<h2 id="-chrome-remote-desktop">🖥 Chrome Remote Desktop</h2>

<p>As cool as editting code in the web is, there are times when you need something more than Chrome OS can give you.  That’s where <a href="https://remotedesktop.google.com/">Chrome Remote Desktop</a> (CRD) comes in.  I have used all kinds of different software to remote into computers over the years, and CRD has been by far the easiest to set up and use.</p>

<p>Simply go to https://g.co/crd/setup from the computer you want to access remotely and install the software.  From another computer (<em>or your phone / tablet!</em>), visit https://remotedesktop.google.com/ and you’ll see any computers where you’ve set up CRD.  Click one, enter the PIN you choose when installing CRD, and you’re in – it’s really that simple.</p>

<p>If I want to do development that won’t work in the browser (game development in Unity, for example), I remote into my powerful desktop from my lightweight Chromebook.  Never again will I need a big, heavy gaming laptop to do development on the go – instead I can save money by having a tricked out desktop and a super lightweight Chromebook.</p>

<h2 id="-what-about-games">🎮 What about games?</h2>

<p>Unfortunately, Chrome Remote Desktop is <em><strong>not</strong> good for gaming</em>!  Things are responsive enough for programming and general computer use, but it was clearly not meant for running games.  For that, you’ll want to look into Steam Link or Moonlight – they take a little more to set up, but they’ll let you play games remotely just fine.  It’s important to note that the computer streaming the games should be hard-wired for best performance.  If you’re like me and have a big desktop sitting next to your router, this shouldn’t be a problem.</p>

<p>The other option is to use something like XBox Cloud Gaming.  If you have Game Pass, you may already have access to this without knowing it.  Go to https://www.xbox.com/en-us/play, sign in, and play games directly in your browser.  You’ll need a decent internet connection, but it works <em>surprisingly</em> well.</p>

<p>Since getting everything set up, I haven’t played video games on anything but my phone and Chromebook – and I’ll never go back.  I don’t miss my heavy gaming laptop at all.  I definitely don’t miss its bad battery life, loud fans, and the stream of hot air that burned my thighs if I played games for too long.  I’m all-in on cloud computing and gaming!</p>

<h2 id="closing">Closing</h2>

<p>I’ll be honest: I didn’t think we’d get to this point as fast as we did.  I remember having <em>serious</em> reservations about Google Stadia when it was first announced.  I never thought I’d be sitting here on a Chromebook, using it for serious tasks like programming or gaming.  It feels like it’s happened all of a sudden, but suddenly Chromebooks are more than a novelty or a cheap computer for students, and I love it.</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><summary type="html"><![CDATA[When I started at Google, they gave me my assigned laptop and I was shocked to find out it was, gasp, a Chromebook!? For a software engineer position? How would that even work? Well, let me tell you…]]></summary></entry><entry><title type="html">How do you start learning how to code?</title><link href="https://noahwright.dev//learning-to-code/" rel="alternate" type="text/html" title="How do you start learning how to code?" /><published>2022-05-28T00:00:00+00:00</published><updated>2022-05-28T00:00:00+00:00</updated><id>https://noahwright.dev//learning-to-code</id><content type="html" xml:base="https://noahwright.dev//learning-to-code/"><![CDATA[<p><em>“How did you get into programming?  Where should I start?  What’s the best way to learn?”</em></p>

<p>I get these questions <em>all the time</em>.  For a long time, I didn’t have a great answer.  I got started roughly 20 years ago - not only do I not remember exactly how it went, a lot has changed since then.  Since people keep asking, I took some time to write out some advice for those who are trying to get into programming.</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>Get started.  Taking that first step and doing <em>anything</em> is more important than having a perfect plan.</li>
    <li>Find something you <em>want</em> to make.  This will keep you motivated to keep going.</li>
    <li>Tackle your project in tiny little chunks and don’t get hung up on what’s going on under the hood.</li>
  </ul>
</blockquote>

<h2 id="get-started">Get started!</h2>

<p>Many of the people who ask me about this are trying to figure out how to get started with programming, but haven’t <em>actually started</em>.  They looked up resources and couldn’t decide which one to use, so they stalled out.  I get it - there are a TON of resources out there.  It’s hard to choose - so don’t!  Use the first learning resource you can find.  Stick with it for a little while and if you <strong>really</strong> hate it, switch to something else.  Just because you start off watching some person’s YouTube channel doesn’t mean that has to be your <em>only</em> learning resource.  You can use them all!</p>

<h3 id="but-what-language-do-i-use">But what language do I use!?</h3>

<p>Okay, so this is one area where you <em>do</em> need to make a decision.  When you’re first starting out, you’ll want to stick with one language and not hop around constantly.  Which language you work with will depend heavily on what you are trying to do.  Below, I’ll talk about the importance of having a passion project.  Knowing what that project is will help you decide what language to learn.  For example:</p>

<ul>
  <li><strong>Do you want to make websites?</strong>  You should probably learn JavaScript, HTML, CSS - you know, web stuff!</li>
  <li><strong>Are you going to make projects with a Raspberry Pi?</strong>  Project tutorials you find will likely use Python.</li>
  <li><strong>Will you make a Windows desktop app?</strong>  Something like C# will let you do this pretty easily.</li>
  <li><strong>What if you want to make phone apps?</strong>  Android apps are written in Java and Kotlin.  iPhone apps are written in Swift.</li>
</ul>

<p>Once you pick a project, look up similar projects and find out what language(s) they use.  The goal here is to make sure that there are plenty of resources for you to use.  Can you write a web app with C#?  Yeah, but you’re going to find <strong>a lot</strong> more information for web programming in JavaScript than you will for C#.  Make things easy for yourself by using the language that has the most tutorials / documentation for the thing you want to do.</p>

<p>Now for the real question: what project are you going to do?</p>

<h2 id="find-a-passion-project">Find a passion project</h2>

<p>I got into programming because I <strong>loved</strong> video games.  Not only did I find them fun and engaging, I was fascinated with how they were made.  I always wanted to make my own, so I’ve been tinkering with game design for as long as I can remember.  Game programming is not easy - it’s honestly not a very good place to start learning code at all - but because it was something I was passionate about, I kept going no matter how tough it got.</p>

<p>You need to find your own passion project.  It can be almost anything, but it should ideally have a few qualities:</p>

<ul>
  <li><strong>The project can start small and scale up</strong>.  For example: make a personal website  At first, it can literally be one page of static content.  From there, you can keep adding pages and functionality until you’ve built something more advanced.</li>
  <li><strong>The hard problems are already solved</strong>.  Everything you need to do for the project should be Google-able.  My early game design projects were clones of simple games (i.e.: stuff like Pong and Galaga) that I then expanded upon.  This gave me plenty of learning resources to lean on.</li>
  <li><strong>You’ll actually use it</strong>.  This is probably the most important thing - if you aren’t excited about using the finished product, you won’t be as motivated to work on it.  It needs to fulfill a need you have or solve a problem you can’t find existing solutions to.</li>
</ul>

<p>Almost every programmer I know of has little side projects.  They couldn’t find a tool to do a thing they wanted to do, so they made their own.  Existing solutions frustrated them, so they made something that worked for them.  Sometimes, these tools expand into actual products - like how Slack started as an internal tool for a game company - but often they are strange little things that are only useful to the person who made it, and <em>that’s totally fine!</em>  The important part is that YOU want to make the thing you’re making.</p>

<h2 id="stay-down-to-earth">Stay down to Earth</h2>

<p>Years ago, I started telling people that programming is like magic.  Harry Potter and I do the same thing - we recite some words in the correct sequence and magic happens.  I don’t know how it all works, and the students at Hogwarts have no idea how their magic happens - we just know what words to say!  Students who I have told this to say it makes it easier to learn to code.</p>

<p>Why?  Because many programming students fall into the same trap: we want to know how it all works.  Many of us are quick to dive deep and find out what makes things tick, but it quickly turns into a “can’t see the forest for the trees” situation.  When working on your project, you need to step back and look at the big picture.  If you’re not sure where to start in creating your app or building your website, follow these steps:</p>

<p>1) <strong>Forget about code</strong> and describe - in plain English sentences - what your program needs to do.  Write down what the user will do and what you expect to happen in response.  Once more, with emphasis: <em>you aren’t thinking in technical terms at this point</em>.
2) Break your steps into many, smaller steps - still as plain English.  Instead of <em>“the user logs in”</em> you want something like <em>“user clicks ‘log in’ link.  Login form loads.  User types in username and password.  System validates password.  Home page is loaded with user info in the corner.”</em>  The more you break it down, the easier step 3 becomes.
3) <strong>Now we think about code!</strong>  Solve each step you created above like its own tiny programming challenge.  Instead of having one big, daunting task, now you have a bunch of small, manageable tasks.</p>

<p>This is a great workflow for a few reasons.  Number one, if you ever work professionally as a programmer this is how work gets defined and divided up.  Secondly, there is the psychology effect.  If you only look at the peak of the mountain you’re climbing, it can feel overwhelming, like you’ll never climb that far.  Instead, you want to focus on getting to your next stopping point, your next handhold - whatever gets you one tiny step closer to the top.  As you complete each task, you can have the satisfying experience of scratching it off of your to-do list.  This will motivate you to keep going, and you’ll end up getting a <strong>ton</strong> more accomplished.</p>

<h2 id="summary">Summary</h2>

<p>When I learned to program, there were so few resources.  Now there are so many freely available tutorials, videos, tools, and people willing to help you get into software development.  There’s no need to wait around until you can take a programming class or attend a bootcamp - you can start teaching yourself <em>right now</em>.  If you have even a faint interest in programming, I highly suggest you go out there, pick a project, and start working on it!</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><category term="learning" /><summary type="html"><![CDATA[When I learned to program, there were so few resources. Now there are so many free resources - so get started!]]></summary></entry><entry><title type="html">Web 3.0</title><link href="https://noahwright.dev//web3/" rel="alternate" type="text/html" title="Web 3.0" /><published>2022-05-14T00:00:00+00:00</published><updated>2022-05-14T00:00:00+00:00</updated><id>https://noahwright.dev//web3</id><content type="html" xml:base="https://noahwright.dev//web3/"><![CDATA[<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>Predictions about Web 2.0 were deeply flawed</li>
    <li>Current predictions about Web 3.0 are probably just as flawed</li>
    <li>We don’t know what this tech will be used for</li>
    <li>Web 2.0 isn’t going anywhere.  Web 1.0-style pages (like this one) are still around, after all!</li>
  </ul>
</blockquote>

<p>I just completed my final for a college class, and it asked me to look at Web 3.0 trends and make some predictions.  After reading up on a lot of Web 3.0 stuff and looking back at the history of Web 2.0, I came to the following conclusion:</p>

<p><em>Everybody has got Web 3.0 all wrong!</em></p>

<p>Please, allow me to explain</p>

<h2 id="a-quick-history-lesson">A quick history lesson</h2>

<p>My assignment had me look at a piece of internet history known as the <a href="https://www.cluetrain.com/" target="_blank">Cluetrain Manifesto</a>.  That webpage (later turned into a book) was written by a handful of men who had some very opinionated ideas about the future of the internet.  Feel free to read through it, since it’s all available online, but I’ll summarize some of their thoughts:</p>

<p>1) “The man” is keeping the little guy down.  Web 2.0 is going to fix that!
2) Big business is trying to squeeze money out of the web.  Web 2.0 will make sure the individual is the one making money!
3) Companies don’t talk to us like people, but the internet will force them to be more human!</p>

<p>According to the Cluetrain Manifesto, the future was going to be all sunshine and rainbows.  We’d be able to speak out minds, make money, and be treated like people, and there would be <em>absolutely no downside at all!</em>  There are some pretty obvious problems with the things they specifically said would happen, such as:</p>

<p>1) Yeah, the internet circumvents censorship.  It also lets conspiracy theorists post misinformation, helps pedophiles form support groups, and enables the doxxing and harassment of people offline.
2) Sure, some individuals make money on the internet.  They do that on the backs of giant companies.  Influencers shill their products, free websites are powered by their ads, and our personal information is bought and sold on a massive scale without us seeing a dime.
3) While some companies try to talk to Fellow Kids™ online, individuals have adopted communication more like corporations.  We pick and choose what we share online and try to present our best selves, resulting in psychological harm to ourselves and others.</p>

<h2 id="web-30-aka-web-20-20">Web 3.0, aka Web 2.0 2.0</h2>

<p>Go watch <em>any</em> YouTube video about Web 3.0 or read any Medium article about it.  You’ll very quickly notice that, according to the proponents of Web 3.0, all our troubles will soon be solved thanks to new technology.  They claim that blockchain will allow us to break free of social media platforms and speak out minds, monetize our works by tokenizing them, and wrest control from the oppressive big companies.</p>

<p><em>Sound familiar?</em></p>

<p>Like the guys who wrote a manifesto over 20 years ago, these people think Web 3.0 will solve all our problems.  They also don’t seem to think it will cause any problems of its own.  Criminals using BitCoin?  <em>No way, people blow that out of proportion!</em>  Losing all your NFT’s because you forgot a password and there’s no central entity to recover it?  <em>I’m sure that won’t happen often!</em>  And there’s no telling what other harm may come, because it’s all too new.  In fact…</p>

<h2 id="nobody-knows-what-the-future-holds">Nobody knows what the future holds</h2>

<p>I think there will be a cool use for all this new technology, but I don’t think we’ve found it yet.  If you look at how the Cluetrain Manifesto describes the future, you’ll see that they’re basically describing communication as it was in 1999, but <strong>MORE!</strong>  They didn’t know that dynamic web pages would allow for endlessly scrolling social media, that high quality cameras on phones would allow <em>anybody</em> to create content, that AI would allow everybody to look like a dog in their photos, or that WebGL would allow a rich ecosystem of indie games on sites like itch.io.  The new tech hadn’t been around long enough for these great ideas to come up, and it turns out the future is hard to predict.</p>

<p>Similarly, I think all the Web 3.0 fancy schmancy stuff will result in something <em>really cool</em>.  I don’t think it’s going to be “Facebook… but with cryptocurrency!” or “YouTube, but your videos are NFTs!” or anything like that.  The average internet user has no use for these things in their current state, just like <em>most</em> people weren’t on internet forums in the 1990’s.  Nowadays, everybody and their grandma is on Facebook.  Somewhere, somebody is working on something using Web 3.0 tech that will become an ubiquitous part of every day life.  What is that thing?</p>

<p><strong><em>Nobody knows!</em></strong></p>

<h2 id="web-20-isnt-obsolete">Web 2.0 isn’t obsolete</h2>

<p>No matter what that cool thing is, it isn’t going to be a 1-to-1 replacement for what’s around right now.  How can I be so sure?  Web 1.0 was the age of the static web.  HTML was <em>just</em> markup - it arranged things and applied styles and that’s it.  Nothing changed, nothing was dynamic.  Web 2.0 changed that.</p>

<p>But static webpages didn’t go away.  You’re reading one right now.  I don’t need this page to be dynamic.  I also don’t need it to use blockchain.  No amount of Web 3.0 adoption is going to change that.  New technology will add to the internet ecosystem and, yes, some things will likely fall by the wayside, but others will persist.  Intelligent humans exist alongside the same dumb microorganisms that have been around for billions of years - survival of the fittest doesn’t mean absolute replacement of old with new.</p>

<h2 id="summary">Summary</h2>

<p>New technology is exciting.  I can’t wait to see the internet is like in 20 years.  But 20 years ago, I never could have predicted what today’s internet is like.  I’m not going to bother making predictions, I’ll just wait and see what excitement comes with new technology.  I’ll also keep an eye out for the new harm that the new technology will bring - hopefully we’ve learned our lessons from the past, but I honestly doubt it.</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><category term="rants" /><summary type="html"><![CDATA[I think there will be a cool use for all this new technology, but I don't think we've found it yet.]]></summary></entry><entry><title type="html">Working Remotely</title><link href="https://noahwright.dev//working-remotely/" rel="alternate" type="text/html" title="Working Remotely" /><published>2022-04-30T00:00:00+00:00</published><updated>2022-04-30T00:00:00+00:00</updated><id>https://noahwright.dev//working-remotely</id><content type="html" xml:base="https://noahwright.dev//working-remotely/"><![CDATA[<p style="font-size: 70%">NOTE: This post contains affiliate links.  More info available <a href="/terms/">here</a>.</p>

<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>Stop working so much!  Not just for your mental health, but because it will make you better when you <em>are</em> working.</li>
    <li>Communicate, communicate, communicate.  This is important in person, but it’s more important when remote.</li>
    <li>Invest in your setup.  Your company <em>might</em> cover some equipment costs.  Even if they don’t, it’s worth the money to have the stuff you’d have in a traditional office.</li>
    <li>Physical fitness.  Working from home makes it easy to over-snack and be lazy, but it also affords opportunities to stay fit that an office does not.</li>
  </ul>
</blockquote>

<p>In March of 2020 I started my first civilian job outside of the Air Force.  March of 2020 is also right about the time the entire world shut down due to COVID-19.  The day I was supposed to start was the day the company decided to have everybody work from home in order to limit spread of the virus.  I went into the office just long enough to get my laptop and some instructions, then I went home.</p>

<p>This was my first civilian job since joining the Air Force 9 years earlier.  I had never worked remotely before.  I also had four kids at home who were sent home on an early spring break that would end up lasting nearly two years.  These early days of remote work were a struggle, but I learned some lessons that I’d like to share.</p>

<h2 id="-boundaries-️">🛑 Boundaries 🙅‍♂️</h2>

<p>If you were in an office, you’d show up at 9am and go home at 5pm.  Maybe you stay a few minutes late to finish something you’re in the middle of.  Occassionally you might come in really early or on the weekend to do a code release.  Generally speaking, unless there is some sort of emergency, you stick to your core working hours.  When you have to work extra, your boss might let you go early the next day to compensate.</p>

<p>Working from home makes it really easy to never stop working.  This is because you never <em>really</em> leave the office if your office is at home.  You need to create boundaries, both with your coworkers and with yourself.</p>

<h3 id="setting-boundaries-with-work">Setting boundaries with work</h3>
<p>Make it obvious when you aren’t “at work”.  Set your online status to away at 5pm, set your core working hours in the calendar program, and have a recurring meeting at lunch time to block other calendar invites.  If somebody schedules something on top of those times and it isn’t <strong><em>really important</em></strong>, ask them to reschedule or see if you can miss it.  If you let them trump your existing meetings a few times, they’ll keep doing it forever.</p>

<p>When your phone buzzes at 9pm, don’t even look at it.  If it’s <em>really</em> important, they will call you.  In fact, turn work notifications off between certain hours.  Just because somebody else refuses to set boundaries doesn’t mean you should be dragged into it, too.</p>

<h3 id="setting-boundaries-with-yourself">Setting boundaries with yourself</h3>
<p>Many people use their commute to shift gears mentally.  On the drive in, you think about the day’s agenda and what you need to work on.  While driving home, you’re planning out dinner and what TV shows you want to watch with your family.  Give yourself a work-from-home “commute”.  For example: I listen to news podcasts and walk around my house - a direct replacement to driving into work and listening to news radio.  At the end of the day, I walk into the kitchen and see what we’re doing for dinner.</p>

<p>To help further separate work from home, add physical barriers.  Some people have a dedicated office, and when they finish work they shut the office door and do <strong><em>not</em></strong> go back in until the next day.  If nothing else, shut your computer down so you’d have to log back in.  The idea is to raise obstacles.  Driving back to the office at you get home is a pain, and you’ll only do it for emergencies.  Make getting back into work a pain, and you’re less likely to do it.</p>

<h3 id="the-benefits">The benefits</h3>
<p>This all might seem really selfish, but it will help you out.  Your brain and body need time to rest.  If you constantly work, you do not give yourself time to recharge.  In fact, a Stanford study showed that people who work 70 hours are no more productive than somebody who works 55 hours a week<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.  All they’re doing is robbing 15 more hours from their personal lives.</p>

<p>I have 4 kids, one of which who is profoundly disabled and requires full-time care.  I have no choice but to leave at quitting time and notot look back - my family needs me.  This worried me at first, but I noticed that that Stanford study found: I got just as much done as the people who were still sending emails at 9pm.  I started each day well-rested and clear-headed, and I cranked out all the work I needed to in the 8 hours I dedicated to work.  My family and the business were happier for it.</p>

<h2 id="-communication-">📩 Communication 🎤</h2>

<p>Not only is communication more important when remote, it’s more difficult.  This is especially true for management.  It’s really easy to walk over to an employee’s desk and see what they’re up to.  When you’re at home, your manager has no idea what you’re doing from moment to moment.</p>

<h3 id="be-proactive">Be proactive</h3>

<p>You aren’t going to run into people on the way to the bathroom or while eating lunch.  You need to make it a point to communicate with your team.  Get to know them both personally (to build trust and comraderie) and professionally (so you know who to ask for help).  Nobody is going to walk by and see you struggle - if you get stuck <strong><em>you</em></strong> have to reach out and ask for help.</p>

<h3 id="keep-notes">Keep notes</h3>

<p>Since your manager can’t see how hard you are working, you absolutely need to keep track of your accomplishments.  If your company has a formal review process, these notes will make that really easy to accomplish.  Otherwise, it’ll be your evidence to argue for the promotion or raise you want.  Best case scenario, you’ve got metrics that show impact.  Instead of “closed bug 1234” you want things like “restored access to the system for 1000 users”.  That impact shows how your contributions help the bottom line, aka: how much money are you worth.</p>

<h2 id="-setting-up-your-work-environment-">🖥 Setting up your work environment ⌨</h2>

<p>Offices have all kinds of nice stuff.  Fancy chairs with lumbar support, multiple monitors, great lighting, ergonomic everything - the whole nine yards!  When I started working from home, I was hunched over a laptop in a hard wooden chair at the dining room table.</p>

<p>Over time, I have added more and more to my home office set up.  I don’t have a huge desk, but I like having multiple monitors, so I got a <a href="https://amzn.to/38Jjvub" target="_blank">vertical stand to stack my monitors</a> <span title="This is an affiliate link" style="font-size: 80%"><sup>#ad</sup></span> and maximize space.  My kids generate a lot of background noise, so I broke down and got <a href="https://amzn.to/3MF8bOi" target="_blank">nicer headphones with noise cancelling</a> <span title="This is an affiliate link" style="font-size: 80%"><sup>#ad</sup></span> so my coworkers could hear me instead of my children.  If your company has a deal with an office furniture company and you can get a discount on a nice chair, do it!  Your back will thank you later.</p>

<p>My latest great purchase is a <a href="https://amzn.to/3lw5anJ" target="_blank">desk that sits on top of my treadmill</a> <span title="This is an affiliate link" style="font-size: 80%"><sup>#ad</sup></span>.  It was way cheaper than a standing desk, and it lets me stay more active, which brings me to my next point:</p>

<h2 id="-fitness-️">💪 Fitness 🏃‍♂️</h2>

<p>When I went into work, I brought my lunch.  In the morning, I could make good decisions about what I would eat.  I walked around the office to talk to different people, sometimes totalling more than a mile according to my fitness watch.  It was easy to control my diet and stay active.</p>

<p>At home, the pantry is 10 feet away from me.  There’s a fridge full of enough food to feed 6 people.  The only person to talk to is my wife, and I can see her just by leaning.  It’s <strong>so easy</strong> to over-eat and under-move, and my weight quickly started to rise once I started working from home.  Here’s how I got back into shape:</p>

<h3 id="make-it-part-of-your-commute">Make it part of your commute</h3>

<p>Some people get up extra early and hit the gym before going to the office.  That gives them time to drive the extra distance and shower off afterwards.  When you’re at home, you can just exercise there.  Get you some weights, or a treadmill, or a VR headset with some fitness games.  Look up yoga or calisthenics videos on YouTube (there are <em>tons</em> out there).  Burn some calories, get sweaty, and then go straight to work.  You’re at home where nobody can smell you or see the sweat pouring out of you - take advantage of that!</p>

<h3 id="a-little-goes-a-long-way">A little goes a long way</h3>

<p>That treadmill desk I talked about?  I set my laptop on that and set the treadmill to 1 MPH - pretty much <em>the slowest it can go</em>.  It’s basically just enough that I have to move <em>at all</em>, rather than sit in a chair all day.  I get in the zone and start coding, and before I know it I’ve clocked multiple hours on the treadmill and burned hundreds of calories.</p>

<p>You can do something similar without a treadmill.  Set a timer and every half hour get up and walk around or do some pushups.  It won’t seem like much, but even a tiny bit of exercise is better than zero exercise.  Start small and build up from there!</p>

<h3 id="be-deliberate-about-what-you-eat">Be deliberate about what you eat</h3>

<p>If you find yourself overeating, set some rules.  Do what you would do in the office - pack a lunch!  Plan your meal ahead of time and stick to it.  If you let yoursef raid the fridge when you’re hungry and piece together a meal, you’re probably going to make some bad decisions.</p>

<p>My biggest advice: get a calorie counting app and let it do the hard work of totaling things up.  Be honest and track <em>everything</em>, and see how that compares to what your in-office food intake would be.  A little data goes a long way towards driving better decisions.</p>

<h2 id="summary">Summary</h2>

<p>Working from home was a huge change for me, but it has overall been a great experience.  It’s certainly not for everybody, and it does take some extra work that in-person work doesn’t need, but the unique benefits are perfect for many people.  Hopefully these tips help you adjust to working from home and make you more effective in your remote work.</p>

<hr />
<h2 id="reference">Reference</h2>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p><a href="https://www.cnbc.com/2019/03/20/stanford-study-longer-hours-doesnt-make-you-more-productive-heres-how-to-get-more-done-by-doing-less.html">CNBC article featuring Stanford study</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><category term="career" /><category term="productivity" /><summary type="html"><![CDATA[My early days of remote work were a struggle, but I learned some lessons that I'd like to share.]]></summary></entry><entry><title type="html">Things College Didn’t Teach You</title><link href="https://noahwright.dev//things-college-did-not-teach/" rel="alternate" type="text/html" title="Things College Didn’t Teach You" /><published>2022-04-16T00:00:00+00:00</published><updated>2022-04-16T00:00:00+00:00</updated><id>https://noahwright.dev//things-college-did-not-teach</id><content type="html" xml:base="https://noahwright.dev//things-college-did-not-teach/"><![CDATA[<blockquote>
  <p>TL;DR:</p>
  <ul>
    <li>To work on a team you must be humble and be able to communicate with everybody, even non-technical folks.</li>
    <li>You are not your code.  It will be re-written, criticized, and sometimes abandoned.  Don’t take it personally.</li>
    <li>Production code is ugly.  “Why was it done <strong><em>this</em></strong> way!?”  The reason is…</li>
    <li>…time and money drive everything.  Customers can have unreasonable demands, and it’s never that your code should be elegant.</li>
  </ul>
</blockquote>

<p>You just graduated college with a shiny new Computer Science degree.  You’re excited to go out into the workforce and get paid to write software.  You aced all your classes and made some awesome little apps along the way.  Maybe you even paired up with a few other students to collaborate on a bigger project.  You nail the interview, get the job, and immediately realize:</p>

<p><em>There’s a lot college doesn’t teach you!</em></p>

<p>Don’t get me wrong: a CS degree is a great foundation on which to build a career.  The problem is that you can’t simulate the conditions of a work environment - not in a college, not in a bootcamp, not as a self-taught developer.  This post is about all the things you need to be a software engineer but won’t learn in school.</p>

<h2 id="-im-a-people-person-i-have-people-skills">🤝 “I’m a people person, I have people skills!”</h2>

<p>Working on a software development team is <em>not</em> like working alone.  It’s not even like working with a group of CS students on a project.  For starters:</p>

<h3 id="-not-everybody-is-a-programmer">👨‍👩‍👧‍👦 Not everybody is a programmer</h3>

<p>While learning, you’re surrounded by other people learning how to program.  You have jargon and inside jokes that everybody gets… until you start interacting with people who are <em>not</em> programmers.</p>

<p>Depending on the size of your company, you may have all sorts of roles on your team.  Product manager, program manager, UX designers, operations, product owners, quality assurance, and maybe even end users may all be part of your team.  You have to get comfortable with talking to all these people in order to get things done.  Some things to keep in mind:</p>

<ul>
  <li>You are not better than them.  Many programmers erroneously look down on non-technical roles.  Don’t do that, because…</li>
  <li>All their jobs are important.  If you don’t understand why, ask!  Play the “I’m a new grad” card and ask what each role does so you can understand how they fit in.  You’ll likely find that…</li>
  <li>You don’t want to do their jobs.  If you got into programming, you probably don’t want to manage a Jira board, gather requirements from customers, manage budgets, etc etc.</li>
</ul>

<h3 id="-git-conflicts-git-conflicts-everywhere">🚫 Git conflicts, git conflicts everywhere!</h3>

<p>Maybe you’ve never used Git.  Maybe you have a Github profile with all your projects on there.  Either way, using it on a team is a whole other beast.</p>

<p>It is incredibly rare for code and work to be so well-organized that each programmer is working on a different subset of the overall codebase.  You are almost guaranteed to, at some point, modify a file that another coder is also working on.  If you don’t commit first, it’ll be up to you to resolve those conflicts.  Sometimes, you’re referencing a file they changed and, when you pull down recent changes, it breaks all your stuff.</p>

<p>The breaking changes may not even come from somebody on <em>your</em> team.  You might have to reach out and talk with whoever made the change to understand it, which brings us to…</p>

<h3 id="-layers-of-communication">📞 Layers of communication</h3>

<p>The smaller the team, the shorter the distance is between any two people.  As organizations grow, it becomes impossible for everybody to have a direct line of communication to everybody else.</p>

<p>In the above example, where somebody else’s code broke yours, you might be able to look at the commit history and message that person directly.  Or you might have to talk to your project manager, who will talk to the other team’s product manager, who will determine if that coder has time to spare, and maybe then you’ll get to meet with them.  Unless you’re coming into software from a some place with a lot of red tape (like the Air Force) the bureaucracy can take you by surprise.</p>

<p>Make sure you understand the chain of communication <em>before</em> you need to use it.  If you wait to the last minute to try and talk to somebody and it turns out it’ll be a week-long process, it’s too late.  If you know that in advance, you can start the ball rolling at the first sign of trouble.</p>

<h2 id="-i-love-my-code-like-a-child-please-dont-touch-it">👶 “I love my code like a child, please don’t touch it”</h2>

<p>When you’re programming on your own or with a small team, it is easy to take 100% ownership of your code.  It’s your baby, and you nurture and care for it.  You get excited to see it grow up and go out in the world.  I’ve got bad news for you:</p>

<p><em>“Your baby” is going to get destroyed</em></p>

<h3 id="-code-reviews">🔍 Code reviews</h3>

<p>As the new kid on the block, you probably aren’t going to be committing code willy-nilly whenever you want.  There will almost certainly be a code review process which may include automated and human checks that stop you from making changes.</p>

<p>You need to be humble.  People with much more experience than you are going to look at your code and criticize it.  Don’t get offended - pay attention and <em>learn</em>.  Some of it may be best practices that you don’t know yet.  Some of it may be picky little preferences at that company.  You may not like those preferences, but if that’s the standard they are following you should go along with it.</p>

<p>Also: don’t be afraid to push back.  If you had a good reason to do something a weird way, feel free to explain that and see if their criticism stands.  You can head this off by including good comments around any strange code you make.</p>

<h3 id="-many-cooks-in-one-kitchen">👩‍🍳 Many cooks in one kitchen</h3>

<p>When you have many people in one codebase, it’s easy for things to become messy.  Not only that, but software engineers switch jobs pretty regularly.  The result is that you put code into the codebase and somebody else may almost immediately be changing it because of some requirement they have.</p>

<p>If your code broke their stuff, they may not even talk to you about it.  They might take it upon themselves to fix it - or worse “fix” it and break your stuff instead.  You may come back to code you wrote and find that it is drastically different a few months later.</p>

<p>I’ll say it again: <strong>don’t take it personally</strong>.  Every programmer has their quirks and their way of doing things.  Their changes may have been needed, or it may have been them “making the code cleaner” by asserting their personal preferences.  As long as it all works, brush it off and move along.</p>

<h3 id="-shifts-in-business-direction">📉 Shifts in business direction</h3>

<p>In college, you get an assignment and do it.  Imagine if halfway through completing a major assignment your professor told the class they “decided to go a different way” and assigned a completely different assignment.</p>

<p><em>Pretty frustrating, right?</em></p>

<p>This happens in the business world.  All.  The.  Time.  Trends change, business needs shift, and decisions are made <em>way</em> above your head that will affect what code you write.  Sometimes this means getting 90% done with something and then being told “nah, we don’t need that after all!”</p>

<p>My advice: try to keep your changes small and quick.  That keeps you from having some MASSIVE change that gets abandoned.</p>

<h2 id="-why-is-this-code-so-ugly">🤢 “Why is this code so <strong><em>ugly</em></strong>?!”</h2>

<p>Many programmers value <em>elegant</em> code.  We all want our code to look nice.  Programmers love to proudly post their one-line functions that do a million things.  <em>It’s so compact, it’s beautiful!</em>  I hate to break it to you, but that’s probably not going to happen on the job.</p>

<h3 id="-many-cooks-one-kitchen-part-2">👨‍🍳 Many cooks, one kitchen part 2</h3>

<p>I already said that everybody has their own quirks and preferences.  The business may have styles they enforce.  Individual teams may have their own standards.  All of those different quirks, standards, and preferences may exist in a single codebase simultaneously.  People come and go all the time, so a single file may contain the quirks and weird habits of dozens of different programmers.</p>

<p>Do your best to conform to the habits of those around you so the code base is consistent.  Not everybody will do this, because “I don’t like how <em>they</em> do it,” but that results in messy, inconsistent code.  Suck it up, and go with the flow to try and maintain some consistency.  If you really want to change the standards, talk about it as a team - don’t just up and decide to do things your way.</p>

<h3 id="-time-money-and-customers">💵 Time, money, and customers</h3>

<p>When you’re working for a business, you’re trying to produce value for its customers.  At the end of the day, money drives every decision that a business makes.  The faster they can make that money, the better.  The happier the customers are, the more money they will spend.  I’ve got bad news, bud:</p>

<p><em>Elegant code doesn’t make more money.</em></p>

<p>The customer can’t see your code.  The CEO isn’t looking at it (except maybe in a really tiny startup).  They want to know one thing: can the feature ship?  Yeah?  <strong>SHIP IT!! 🚀🚀</strong>  You didn’t have time to clean up the code?  Will that break things?  No?  Alright, we’ll come back and do it later when there’s time.  <strong>Spoiler alert: <em>there’s never time!</em></strong></p>

<h2 id="-the-bottom-line">🚩 The bottom line</h2>

<p>Colleges and bootcamps are about learning as an individual.  Business is about delivering value to customers as a team.  Aside from the fact that code is involved, these two environments are <em>completely</em> different.  Your first software job will be a rush of new things that you will feel unprepared for.  I hope this post helps you get past those initial bumps and onto a long, successful career as a software developer.  Thanks for reading, and good luck out there!</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><category term="career" /><category term="learning" /><summary type="html"><![CDATA[A CS degree is a great foundation on which to build a career. The problem is that you can't simulate the conditions of a work environment]]></summary></entry><entry><title type="html">The benefits of bad memory</title><link href="https://noahwright.dev//bad-memory/" rel="alternate" type="text/html" title="The benefits of bad memory" /><published>2022-04-02T00:00:00+00:00</published><updated>2022-04-02T00:00:00+00:00</updated><id>https://noahwright.dev//bad-memory</id><content type="html" xml:base="https://noahwright.dev//bad-memory/"><![CDATA[<p style="font-size: 70%">NOTE: This post contains affiliate links.  More info available <a href="/terms/">here</a>.</p>

<blockquote>
  <p>The TL;DR version:</p>
  <ul>
    <li>Write notes about action items</li>
    <li>Record instructions for complicated tasks</li>
    <li>Jot down what you’re doing at the end of the work day</li>
    <li>Put reminders in your path, physically and with technology</li>
    <li>Utilize search to find all of the above when needed</li>
  </ul>
</blockquote>

<p>Your CEO has called a meeting to lay out their master plan.  This is it, your chance to make a big impression and earn that promotion you want.  You walk out of the meeting, pumped about this big opportunity, and suddenly it hits you:</p>

<p><strong><em>You forgot half of what the CEO just said</em></strong> 😧</p>

<p>Bad memory is awful.  Trust me, I get it.  I’ve had bad memory for as long as I can remember, and the above scenario is my worst nightmare.</p>

<p>Over time, I’ve developed habits that compensate for my forgetfulness.  Here are some habits that work for me and will hopefully help you too:</p>

<h2 id="-notes">📝 Notes</h2>
<p>I know, it seems obvious, but seriously: <strong>write stuff down!!</strong>  A lot of people (myself included) end up missing details while trying to write down too much.  So what <em>should</em> you be writing down?</p>

<h3 id="-action-items">🎯 Action items</h3>
<p>If somebody assigns you something or you tell a person “I’ll get back to you about that,” write a note that says what you owe them and when.  You don’t need much - it can be as simple as a Jira ticket number that you can refer to later.  One way or the other, notate your action items!</p>

<h3 id="-instructions--documentation">🤔 Instructions / Documentation</h3>
<p>Documentation - the thing engineers love to read but hate to write.  That’s why documentation is usually lacking, to say the least.  But do yourself a favor: when somebody walks you through an undocumented process, write down the steps!  Even if it’s just shorthand, make sure it’s enough that you could repeat the process a second time.  Later, you can add more details and put your instructions somewhere official for your coworkers to use.  Helpful little actions like this make you seem like a rock star, and it definitely helps your case for promotions and raises! 💵</p>

<h3 id="-hand-off-to-future-you">🤝 Hand-off to Future You™</h3>
<p>It’s 5PM, you’ve been working on the same problem for hours, and you’re “<em>this close</em> to finishing!”  If you’ve been here before, you know that you will probably A) keep working on it all night and B) not make much progress.  For the sake of your mental health and for your productivity: <strong>please, stop doing that!</strong></p>

<p>Instead, write a little note to yourself.  Make a habit of it, even when you’re not in the middle of something intense.  Stop right at quitting time, save your code, then write down things like:</p>

<ul>
  <li>What you’re in the middle of</li>
  <li>Pain points you’re experiencing</li>
  <li>Deadlines you’re worried about</li>
</ul>

<p>This can be very brief.  It only needs to be enough to get you back on task when you return the next day.  I’ve been doing this for a while now, I’ve noticed something uncanny.  I usually wake up the next morning and <em>immediately</em> figure out the thing that had me blocked the day before.  That’s a subject for another blog post, but something magical happens when you get a good night’s rest.</p>

<h2 id="-reminders">⌚ Reminders</h2>
<p>So far you’re creating a lot of notes, but they aren’t much good if you don’t do anything with them!  This is where reminders come into play.</p>

<h3 id="-physical-tricks">🎀 Physical Tricks</h3>
<p>People put their grocery list on their fridge because they’ll see it without having to remember to look for it.  You can do the same thing with your notes and reminders.</p>

<p>That end-of-day note you leave yourself?  Place it on your keyboard so you can’t miss it!  Put sticky notes on you monitor.  Sandwich important papers into your closed laptop.  Make the important things unavoidable so you aren’t relying on your memory!</p>

<h3 id="-calendars-reminders">📅 Calendars Reminders</h3>
<p>Physical reminders are a hardware solution, but there are software solutions that serve the same purpose.  I know some people love the tactile feel of paper, but a paper calendar can’t send you a push notifications!  Put important dates in a calendar app.  When you do, make sure to set a notification so your phone will alert you <em>even if you don’t look at the calendar app!</em></p>

<p>I’ve been using <a href="https://todoist.com/" target="_blank">Todoist</a> for a while now, and it lets you set dates for your TODO items.  If you tend to make a giant TODO list and do none of it, it’s perfect.  You can quickly assign due dates in Todoist by putting text like “next Tuesday” in the TODO item.  Todoist then shows you the tasks due <em>just today</em> which makes it more likely that you actually do each thing!</p>

<h3 id="-smart-speakers">🔊 Smart Speakers</h3>
<p>Amazon is constantly running deals on their smaller smart speaker, the <a href="https://amzn.to/3vqN9LW" target="_blank">Echo Dot</a><span title="This is an affiliate link" style="font-size: 80%"><sup>#ad</sup></span>, and I may have a bit of a shopping problem 😅.  Over time, I have bought enough to have a smart speaker in every room, and I use them <em>extensively</em> for reminders.</p>

<p>They remind my kids to leave in time to catch the bus.  They tell me when to take my vitamins.  They are constantly blasting out little reminders that I have set up.  Any time I think “I better do that thing tomorrow,” I holler at the nearest smart speaker and set a reminder.  Don’t have a smart speaker?  Use Siri or Google Assistant on your phone to do the same thing!  A quick “<em>Hey Google, remind me every morning at 9 to do XYZ</em>” and you’re all set.</p>

<h2 id="-leave-a-paper-trail">📃 Leave a paper trail</h2>
<p>Alright, you’re in a meeting and you take notes.  <em>Easy</em>.  You’re completing a tricky, undocumented task and you document it.  <em>Makes sense</em>.  Now you’re in a one-on-one, verbal conversation with a coworker.  <em>What now?!</em></p>

<h3 id="-can-you-text-that-to-me">📲 Can you text that to me?</h3>
<p>A little bit of honesty goes a long way.  Don’t hide your bad memory - let <em>everybody</em> know.  Say “<em>Sorry, I’ll forget this if I don’t write it down!</em>” as you whip your phone out.  Instead of looking rude, people will appreciate your intent to help them out.</p>

<p>Another favorite of mine is to tell people I have bad memory and ask them to send me things in writing.  Have you ever said “<em>just text me the address</em>” when somebody was giving you directions?  Do that sort of thing at work.  If somebody asked you to do something during a meeting, ask them to pull their phone out and email/text what they needed and when they need it.  It puts a tiny bit of work on them, but I’ve found that most people will gladly send a text since it makes it more likely they will get what they need.</p>

<h3 id="-dear-future-me">📧 Dear Future Me™</h3>
<p>This may seem weird to you, but consider emailing yourself.  When I suddenly remember something for work at 9pm, I send a quick email to my work address.  I don’t even write a body to the email, I just put something like “Don’t forget about XYZ” in the subject line.  The next day I sit down at work and see an email (okay, usually several) from myself.  <em>Oh yeah, I need to do XYZ!</em>  Works like a charm!</p>

<h2 id="-organization-and-search-">📂 Organization and Search 🔍</h2>
<p>If you’re keeping track, you’re probably thinking that all of the above is going to generate a <strong>ton</strong> of notes.  You’re not wrong.</p>

<p>Two things:
1) You don’t have to do <em>everything</em> above.  These are the things that work for me, and you may have better memory than me and only need a couple of them.
2) If you did all of the above <em>on paper</em> it’d be overwhelming, but <strong>we live in the future, folks!</strong></p>

<p>Pretty much any Google product is searchable.  I have notes in Keep, Drive, and Gmail - all three of which are easily searchable.  If you’re deliberate about how you write your notes, they can become really easy to find.  As in code, I write <code class="language-plaintext highlighter-rouge">TODO</code> in my notes so I can search for “TODO” and quickly get tasks I may have forgotten.  In Gmail, you can enter searches like <code class="language-plaintext highlighter-rouge">from:personalemail@gmail.com to:workemail@work.com</code> to find those reminder emails you sent - better yet, you can save that search as a filter for later!</p>

<p>As your pile of notes grows, it becomes more and more important to get good at searching.  Put some effort into how you phrase your notes and keep that in mind when searching.  The one thing I <strong><em>do</em></strong> commit to memory is <em>how I write notes</em>, so I can quickly find anything I’ve written via search.</p>

<h2 id="-summary">🏁 Summary</h2>
<p>Don’t let bad memory hold you back.  We’re living in some sci-fi futuristic times, and there’s enough technology around you that you can use as a second brain.  Computers are <em>way</em> better at remembering things so you don’t have!</p>]]></content><author><name>Noah</name><email>noah@noahwright.dev</email></author><category term="productivity" /><summary type="html"><![CDATA[I have spent my whole life figuring out ways to keep things straight in my head. Over time, I've developed habits that compensate for my forgetfulness.]]></summary></entry></feed>