<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>advice &amp;mdash; Nat Knight</title>
    <link>http://natknight.xyz/tag:advice</link>
    <description>Reflections, diversions, and opinions from a progressive ex-physicist programmer dad with a sore back.</description>
    <pubDate>Sat, 30 May 2026 04:34:30 -0700</pubDate>
    <item>
      <title>Optimize Your Learning According to What is Scarce</title>
      <link>http://natknight.xyz/optimize-your-learning-according-to-what-is-scarce</link>
      <description>&lt;![CDATA[#learning #advice #priorities&#xA;&#xA;One of the nice things about being a professional software developer is that you&#39;re always learning things. On a given day, you might be learning about&#xA;&#xA;A programming language or framework&#xA;Your computer or operating system&#xA;Your tools (like editors, build systems and IDEs)&#xA;The domain you&#39;re working in (finance, biology, energy, games, etc.)&#xA;How to communicate with your collaborators&#xA;How to effectively manage the projects you&#39;re working on&#xA;&#xA;There are many things to learn. Indeed, one of the problems you might have is finding all of the things that you want to learn about.&#xA;&#xA;!--more--&#xA;&#xA;There are lots of ways to try to explore these topics: aggregators like Lobsters or the disappointingly neoliberal orange website; following the blogs or Twitter feeds of programmers you like; the many, many podcasts devoted to various facets of the profession. I partake in my fair share of these things, but I&#39;ve come to see a lot of it as futile or counterproductive.&#xA;&#xA;[hn]: http://news.ycombinator.com&#xA;&#xA;I collect things from these channels with the intention of coming back to them later when I have time and energy to invest in them &#34;properly&#34;. This would be a very useful thing to do if I was about to enter a period of my life with a surplus of free-time and vigour, where I&#39;d have time and energy for sitting down with a new tool to engage in deliberate, effortful practice so that I can develop and retain a mental model of how it works and gain some fluency in the skills I need to operate it.&#xA;&#xA;Of course, I&#39;m not about to enter a magical period of free-time and vigour. It feels like I might; it&#39;s human nature to underestimate how much effort things in the future will take. A more realistic assessment is that tomorrow will be just as difficult and today, and I won&#39;t miraculously have time for all these conference talk videos and neat looking blog posts. In the meantime, the aggregation sites and social media feeds will be happy to enable my browsing and collecting habit for as long as I care to click on the links they put in front of me.&#xA;&#xA;I suspect that I&#39;m not the only software developer who experiences this. I also suspect that, like me, other software developers also feel fear-of-missing-out and anxiety that they&#39;re being left behind. As you can probably guess, these feelings are entirely detrimental, with no discernible benefit to my professional effectiveness or personal well-being. I&#39;m sure they&#39;re just as helpful to the industry at large.&#xA;&#xA;Though I have expressed a desire to learn things, my behaviour reveals a desire to collect URLs and then never look at them again. There&#39;s a dangerous combination of hyperbolic discounting, FOMO, and operant conditioning by websites that want me to click on one more link standing between me and that sweet, sweet personal/professional development.&#xA;&#xA;[revealed-preference]: https://en.wikipedia.org/wiki/Revealedpreference&#xA;[fomo]: https://en.wikipedia.org/wiki/Fearofmissingout&#xA;[hyperdisc]: https://en.wikipedia.org/wiki/Hyperbolicdiscounting&#xA;[op-con]: https://en.wikipedia.org/wiki/Operantconditioning_chamber&#xA;&#xA;How to approach learning with an accurate view of what&#39;s scarce&#xA;&#xA;Here are the things that help me overcome my shortage of time and energy and actually learn stuff. Naturally, these are all subjective and may not work for you, but hopefully they&#39;ll be a useful starting place.&#xA;&#xA;Don&#39;t pretend that browsing the web is helping you learn. Try to do something that will let you accrue time and energy instead. This is quite hard, because you need at least a little bit of time and energy to figure out how to gain more time and energy later, and it&#39;s usually not obvious how you should go about doing it.&#xA;&#xA;Recognize that learning will take resources, and allocate them. You&#39;re not going to master a new technology in two hours with a video course and a coffee. Be realistic about the time and effort you need to achieve your goals; carve out a place for them rather than trying to achieve them with whatever you happen to have at your disposal.&#xA;&#xA;In my experience, the best way to learn technical skills is to use them. Write programs with that language; build a thing with that framework; spin up and operate that database. The best way I&#39;ve found to do that (given the constraints on time and energy that we&#39;re trying to overcome) is to pick a project, scope it down until it will only take a few hours, execute it, and then re-evaluate. This makes the up-front commitment achievable and taps into all those delicious goal-setting incremental progress dopamine productivity hacks that we humans are so susceptible to.&#xA;&#xA;If you can, get a book. I usually learn more effectively from an old fashioned pulp-and-pigment book than from an equivalent website or PDF. There might be a deep, neurological or social reason for this, or it might be because &#34;reaching for my phone&#34; is enough of a barrier that the usual digital temptations are less appealing than turning the page.&#xA;&#xA;Choose things that you don&#39;t want to learn. I find that the huge pile of things I want to learn is less scary if I periodically take chunks off of it and throw them into the pile of things I don&#39;t need to learn. Even if deciding that I don&#39;t care to learn assembly language, RISC-V, blockchain, PHP, and the Unity game engine won&#39;t free up all the time and energy it would take to learn all the things I want to learn, it nevertheless makes me feel better.&#xA;&#xA;Your time is valuable. Thanks for spending some of it with me. I hope something you&#39;ve read will help you make good choices about learning.&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://natknight.xyz/tag:learning" class="hashtag"><span>#</span><span class="p-category">learning</span></a> <a href="http://natknight.xyz/tag:advice" class="hashtag"><span>#</span><span class="p-category">advice</span></a> <a href="http://natknight.xyz/tag:priorities" class="hashtag"><span>#</span><span class="p-category">priorities</span></a></p>

<p>One of the nice things about being a professional software developer is that you&#39;re always learning things. On a given day, you might be learning about</p>
<ul><li>A programming language or framework</li>
<li>Your computer or operating system</li>
<li>Your tools (like editors, build systems and IDEs)</li>
<li>The domain you&#39;re working in (finance, biology, energy, games, etc.)</li>
<li>How to communicate with your collaborators</li>
<li>How to effectively manage the projects you&#39;re working on</li></ul>

<p>There are many things to learn. Indeed, one of the problems you might have is finding all of the things that you want to learn about.</p>



<p>There are lots of ways to try to explore these topics: aggregators like <a href="https://lobste.rs">Lobsters</a> or the <a href="http://news.ycombinator.com">disappointingly neoliberal orange website</a>; following the blogs or Twitter feeds of programmers you like; the many, many podcasts devoted to various facets of the profession. I partake in my fair share of these things, but I&#39;ve come to see a lot of it as futile or counterproductive.</p>

<p>I collect things from these channels with the intention of coming back to them later when I have time and energy to invest in them “properly”. This would be a very useful thing to do if I was about to enter a period of my life with a surplus of free-time and vigour, where I&#39;d have time and energy for sitting down with a new tool to engage in deliberate, effortful practice so that I can develop and retain a mental model of how it works and gain some fluency in the skills I need to operate it.</p>

<p>Of course, I&#39;m <em>not</em> about to enter a magical period of free-time and vigour. It <em>feels</em> like I might; it&#39;s <a href="https://en.wikipedia.org/wiki/Hyperbolic_discounting">human nature</a> to underestimate how much effort things in the future will take. A more realistic assessment is that tomorrow will be just as difficult and today, and I won&#39;t miraculously have time for all these conference talk videos and neat looking blog posts. In the meantime, the aggregation sites and social media feeds will be happy to enable my browsing and collecting habit for as long as I care to click on the links they put in front of me.</p>

<p>I suspect that I&#39;m not the only software developer who experiences this. I also suspect that, like me, other software developers also feel fear-of-missing-out and anxiety that they&#39;re being left behind. As you can probably guess, these feelings are entirely detrimental, with no discernible benefit to my professional effectiveness or personal well-being. I&#39;m sure they&#39;re just as helpful to the industry at large.</p>

<p>Though I have expressed a desire to learn things, my behaviour <a href="https://en.wikipedia.org/wiki/Revealed_preference">reveals a desire</a> to collect URLs and then never look at them again. There&#39;s a dangerous combination of <a href="https://en.wikipedia.org/wiki/Hyperbolic_discounting">hyperbolic discounting</a>, <a href="https://en.wikipedia.org/wiki/Fear_of_missing_out">FOMO</a>, and <a href="https://en.wikipedia.org/wiki/Operant_conditioning_chamber">operant conditioning</a> by websites that want me to click on one more link standing between me and that sweet, sweet personal/professional development.</p>

<h2 id="how-to-approach-learning-with-an-accurate-view-of-what-s-scarce" id="how-to-approach-learning-with-an-accurate-view-of-what-s-scarce">How to approach learning with an accurate view of what&#39;s scarce</h2>

<p>Here are the things that help me overcome my shortage of time and energy and actually learn stuff. Naturally, these are all subjective and may not work for you, but hopefully they&#39;ll be a useful starting place.</p>
<ul><li><p>Don&#39;t pretend that browsing the web is helping you learn. Try to do something that will let you accrue time and energy instead. This is quite hard, because you need at least a little bit of time and energy to figure out how to gain more time and energy later, and it&#39;s usually not obvious how you should go about doing it.</p></li>

<li><p>Recognize that learning will take resources, and allocate them. You&#39;re not going to master a new technology in two hours with a video course and a coffee. Be realistic about the time and effort you need to achieve your goals; carve out a place for them rather than trying to achieve them with whatever you happen to have at your disposal.</p></li>

<li><p>In my experience, the best way to learn technical skills is to use them. Write programs with that language; build a thing with that framework; spin up and operate that database. The best way I&#39;ve found to do that (given the constraints on time and energy that we&#39;re trying to overcome) is to pick a project, scope it down until it will only take a few hours, execute it, and then re-evaluate. This makes the up-front commitment achievable and taps into all those delicious goal-setting incremental progress dopamine productivity hacks that we humans are so susceptible to.</p></li>

<li><p>If you can, get a book. I usually learn more effectively from an old fashioned pulp-and-pigment book than from an equivalent website or PDF. There might be a deep, neurological or social reason for this, or it might be because “reaching for my phone” is enough of a barrier that the usual digital temptations are less appealing than turning the page.</p></li>

<li><p>Choose things that you don&#39;t want to learn. I find that the huge pile of things I want to learn is less scary if I periodically take chunks off of it and throw them into the pile of things I don&#39;t need to learn. Even if deciding that I don&#39;t care to learn assembly language, RISC-V, blockchain, PHP, and the Unity game engine won&#39;t free up all the time and energy it would take to learn all the things I want to learn, it nevertheless makes me feel better.</p></li></ul>

<p>Your time is valuable. Thanks for spending some of it with me. I hope something you&#39;ve read will help you make good choices about learning.</p>
]]></content:encoded>
      <guid>http://natknight.xyz/optimize-your-learning-according-to-what-is-scarce</guid>
      <pubDate>Tue, 16 Jul 2019 07:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Have a Hypothesis</title>
      <link>http://natknight.xyz/have-a-hypothesis</link>
      <description>&lt;![CDATA[#advice #problemsolving #debugging&#xA;&#xA;The comparison between debugging and the scientific method has been made before.  Originally, I understood this to be a cyclical process where you proceed based on observations of your program using things like interactive debuggers, lots of print statements, and a short iteration cycle. A recent experience with some buggy code has convinced me that this is the wrong way to look at the scientific method as it applies to debugging--at least for the beginner.&#xA;&#xA;As part of my thesis research I&#39;m working on tracing sources of emissions of carbonaceous aerosols using a general circulation model. This involves having an optimization routine modify emissions to bring them into agreement with observations. My results were obviously wrong, but they had a pattern that matched the spatial distribution of the biogenic emissions source in the model to the pixel. Clearly this observation implied that the biogenic emissions were to blame. (Spoilers: that wasn&#39;t the problem.)&#xA;&#xA;What followed was a downward spiral of frustration and ineffectual iteration in the observe-edit-run cycle. That madness only stopped when I settled down and remembered a part of the scientific process that I&#39;d left out (as the astute reader will have noticed). The essence of the scientific method and the most important insight it offers into debugging is:&#xA;&#xA;Have a hypothesis.&#xA;&#xA;Before you load the debugger, before you go crazy with print statements, before you do anything but carefully review the information about why your program is failing, have a hypothesis. Doing so ensures you spend some time thinking about your code, helps structure your investigation and keep it moving forward, and steers you away from bad some habits. In retrospect it&#39;s an obvious oversight, but it&#39;s essential to making the process work efficiently.&#xA;&#xA;To have a hypothesis, you have to understand how your program works. Without a solid grasp of its overarching structure, an accurate mental model of how it executes, and at least an inkling of where the problem is, you can&#39;t form a hypothesis about your program. You also probably can&#39;t debug it effectively. If you find that can&#39;t easily come up with a hypothesis or two, it&#39;s probably time to pause and learn about the parts you don&#39;t understand. Having a brief space to think without the distraction of furiously interrogating the source code can also be enough to bring about that vivid flash of insight. It&#39;s important to have the right ratio of thinking, coding, and refining your ideas, but striking that balance is no mean feat even for an experienced developer. Having a hypothesis is a shortcut, an easy thing to keep in mind to get the mix just about right.&#xA;&#xA;One of the motivations for applying the scientific method to debugging is to simplify an otherwise overwhelming task. Trivial examples aside, bugs arise in obscure and unexpected ways, so it&#39;s never obvious how to tackle them. Through a combination of optimism, desperation, and the apparent lack of alternatives, it&#39;s easy to escalate into logging, simulations, elaborate visualizations, flushing out the problem through sheer force of print statements etc. There are a multitude of activities that can help you understand how your code works, and you can pour hours into them achieving nothing but a frantic, buzzed half-instinct about what&#39;s going on. By putting the hypothesis first, you focus on the goals of your analysis and have a clear endpoint: the hypothesis stands, doesn&#39;t, or reveals another hole in your thinking. Having a hypothesis isn&#39;t as good as a detailed plan or solid good habits and instinct, but it lifts you out of the weeds and demands that you proceed in light of the bigger picture.&#xA;&#xA;I&#39;ve noticed a number of transparently bad habits in my debugging: poring over source code unrelated to my problem, belabouring preliminary points, relentless logging and printing, and (in times of truly dire frustration) the `change-a-line-and-pray-it-compiles&#39; method of code validation. Each of these behaviours has its own trigger, it&#39;s own destructive cycle, it&#39;s own threats to watch for. Each is also inconsistent with having a hypothesis. Perhaps the most beneficial effect of having a hypothesis is that it&#39;s a tight, simple defense against seductive bad habits.&#xA;&#xA;In my Carbonaceous Aerosols case, it turns out there was a bug in my optimization algorithm; the extra source was a red herring. I arrived at this conclusion after a large amount of inefectual flailing, followed by a walk, a few deep breaths, and a focused effort to keep my hypothesis in mind as I tracked down the problem. It&#39;s a useful brain-hack; coming to it on my own (at least in this instance) has made it particularly sticky. Now if only I&#39;d had it two months ago ...&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://natknight.xyz/tag:advice" class="hashtag"><span>#</span><span class="p-category">advice</span></a> <a href="http://natknight.xyz/tag:problemsolving" class="hashtag"><span>#</span><span class="p-category">problemsolving</span></a> <a href="http://natknight.xyz/tag:debugging" class="hashtag"><span>#</span><span class="p-category">debugging</span></a></p>

<p>The comparison between debugging and the scientific method has been <a href="https://www.c2.com/cgi/wiki?DebuggingAndTheScientificMethod">made before</a>.  Originally, I understood this to be a <strong>cyclical</strong> process where you proceed based on <strong>observations</strong> of your program using things like interactive debuggers, lots of print statements, and a short iteration cycle. A recent experience with some buggy code has convinced me that this is the wrong way to look at the scientific method as it applies to debugging—at least for the beginner.</p>

<p>As part of my thesis research I&#39;m working on tracing sources of emissions of <a href="http://en.wikipedia.org/wiki/Particulates#Black_carbon">carbonaceous aerosols</a> using a <a href="http://en.wikipedia.org/wiki/General_Circulation_Model">general circulation model</a>. This involves having an optimization routine modify emissions to bring them into agreement with observations. My results were obviously wrong, but they had a pattern that matched the spatial distribution of the biogenic emissions source in the model to the pixel. Clearly this observation implied that the biogenic emissions were to blame. (Spoilers: that wasn&#39;t the problem.)</p>

<p>What followed was a downward spiral of frustration and ineffectual iteration in the observe-edit-run cycle. That madness only stopped when I settled down and remembered a part of the scientific process that I&#39;d left out (as the astute reader will have noticed). The essence of the scientific method and the most important insight it offers into debugging is:</p>

<p>Have a hypothesis.</p>

<p>Before you load the debugger, before you go crazy with print statements, before you do anything but carefully review the information about why your program is failing, have a hypothesis. Doing so ensures you spend some time <em>thinking</em> about your code, helps structure your investigation and keep it moving forward, and steers you away from bad some habits. In retrospect it&#39;s an obvious oversight, but it&#39;s essential to making the process work efficiently.</p>

<p>To have a hypothesis, you have to understand how your program works. Without a solid grasp of its overarching structure, an accurate mental model of how it executes, and at least an inkling of where the problem is, you can&#39;t form a hypothesis about your program. You also probably can&#39;t debug it effectively. If you find that can&#39;t easily come up with a hypothesis or two, it&#39;s probably time to pause and learn about the parts you don&#39;t understand. Having a brief space to think without the distraction of furiously interrogating the source code can also be enough to bring about that vivid flash of insight. It&#39;s important to have the right ratio of thinking, coding, and refining your ideas, but striking that balance is no mean feat even for an experienced developer. Having a hypothesis is a shortcut, an easy thing to keep in mind to get the mix just about right.</p>

<p>One of the motivations for applying the scientific method to debugging is to simplify an otherwise overwhelming task. Trivial examples aside, bugs arise in obscure and unexpected ways, so it&#39;s never obvious how to tackle them. Through a combination of optimism, desperation, and the apparent lack of alternatives, it&#39;s easy to escalate into logging, simulations, elaborate visualizations, flushing out the problem through sheer force of <code>print</code> statements etc. There are a multitude of activities that can help you understand how your code works, and you can pour hours into them achieving nothing but a frantic, buzzed half-instinct about what&#39;s going on. By putting the hypothesis first, you focus on the goals of your analysis and have a clear endpoint: the hypothesis stands, doesn&#39;t, or reveals another hole in your thinking. Having a hypothesis isn&#39;t as good as a detailed plan or solid good habits and instinct, but it lifts you out of the weeds and demands that you proceed in light of the bigger picture.</p>

<p>I&#39;ve noticed a number of transparently bad habits in my debugging: poring over source code unrelated to my problem, belabouring preliminary points, relentless logging and printing, and (in times of truly dire frustration) the `change-a-line-and-pray-it-compiles&#39; method of code validation. Each of these behaviours has its own trigger, it&#39;s own destructive cycle, it&#39;s own threats to watch for. Each is also inconsistent with having a hypothesis. Perhaps the most beneficial effect of having a hypothesis is that it&#39;s a tight, simple defense against seductive bad habits.</p>

<p>In my Carbonaceous Aerosols case, it turns out there was a bug in my optimization algorithm; the extra source was a red herring. I arrived at this conclusion after a large amount of inefectual flailing, followed by a walk, a few deep breaths, and a focused effort to keep my hypothesis in mind as I tracked down the problem. It&#39;s a useful brain-hack; coming to it on my own (at least in this instance) has made it particularly sticky. Now if only I&#39;d had it two months ago ...</p>
]]></content:encoded>
      <guid>http://natknight.xyz/have-a-hypothesis</guid>
      <pubDate>Mon, 25 Aug 2014 07:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>