<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss-section-style.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Thought Eddies - Garden</title><description>Digital garden entries and evergreen notes</description><link>https://www.danielcorin.com/</link><item><title>Building With AI</title><link>https://www.danielcorin.com/garden/language-models/building-with-ai/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/language-models/building-with-ai/</guid><description>Building With AI</description><pubDate>Fri, 12 Sep 2025 19:13:17 GMT</pubDate><content:encoded>&lt;p&gt;Everyone these is &lt;em&gt;building with AI&lt;/em&gt;. Or wants to be. Or telling their employees they need to build with AI. Or shipping with AI. Or putting AI in their products.&lt;/p&gt;
&lt;p&gt;But what are people even talking about when they say you should build or ship with AI? I can think of at least three different approaches that make use of “AI” the proverbial way it is being referred to most of the time today and I think they’re worth discussing because I rarely hear the difference discussed.&lt;/p&gt;
&lt;h2 id=&quot;interacting-with-ai-to-figure-things-out&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#interacting-with-ai-to-figure-things-out&quot;&gt;Interacting with AI to figure things out&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s say I want to build a website but I’ve never built a website before.
I can have a conversation with a language model based chatbot and learn more about how to write HTML, style my site with CSS, and add interactivity with JavaScript.
I can learn about hosting options like WordPress or Github Pages, depending on my needs and the type of content I want to publish.&lt;/p&gt;
&lt;p&gt;The language model can take my prompts and feedback and steer me in a helpful direction.&lt;/p&gt;
&lt;p&gt;This doesn’t work for uncharted territory but it works pretty well for Solved Problems.
Many people know how to build websites and you can learn to.
With a language model, you don’t necessarily need to read a book on how to build a website, you can start wherever you want to in the process and the language model can help fill in gaps.&lt;/p&gt;
&lt;p&gt;If you try out the model’s suggestions, you’ll find a lot of suggestions work and some don’t.
Experimenting like this is a great way to develop an intuition for what the model you are working with can do.&lt;/p&gt;
&lt;h2 id=&quot;using-ai-to-make-things&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#using-ai-to-make-things&quot;&gt;Using AI to make things&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Coding agents like Claude Code and Cursor and “vibecoding” products like Lovable and v0 have become popular ways to build software.
Using these tools significantly lowers the barrier to entry for building software.
You may not build great software, bug-free software, or performant software, but you’ll probably build more than you would have without them.&lt;/p&gt;
&lt;p&gt;I also find the coding agents helpful for collaboratively building software.
If you know how to code, you can use the agent to quickly scaffold boilerplate code, implement architecture patterns, refactor code, and more.&lt;/p&gt;
&lt;p&gt;I think there is a wide range over which you can use these tools to build software.
Not everyone agrees.&lt;/p&gt;
&lt;p&gt;Either way, this is a second way to “build with AI”.&lt;/p&gt;
&lt;h2 id=&quot;building-software-with-ai-that-does-something-as-part-of-the-product&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#building-software-with-ai-that-does-something-as-part-of-the-product&quot;&gt;Building software with AI that does something as part of the product&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ChatGPT is an example of a product that uses the AI in the experience itself.
You send a message to ChatGPT and OpenAI uses your input as the input to their model.
They run inference with their model and stream the output to your browser.&lt;/p&gt;
&lt;p&gt;The product experience itself is made possible using the language model or AI (previously more commonly known as machine learning).&lt;/p&gt;
&lt;p&gt;Teams building chatbots on top of knowledge bases, Slack bots that answer frequently asked questions automatically, and agents that read your emails and schedule meetings are all examples of products that use AI in a way that is core to the product experience.&lt;/p&gt;
&lt;p&gt;Said differently, these products are made possible using the emergent capabilities of the language model.
The prior two examples of “building with AI” actually just use AI to do things we did before, but faster and with less friction than before (to say nothing of the tradeoffs of learning how the software works and not understanding your code).&lt;/p&gt;
&lt;p&gt;So the next time someone says “we’re building with AI”, ask them what they mean.
Getting on the same page will help save a lot of time, energy, and confusion.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>The AI adoption chasm in software engineering</title><link>https://www.danielcorin.com/garden/language-models/the-adoption-chasm/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/language-models/the-adoption-chasm/</guid><description>The AI adoption chasm in software engineering</description><pubDate>Thu, 22 Aug 2024 00:08:56 GMT</pubDate><content:encoded>&lt;p&gt;I’m seeing a pattern in AI discourse among enthusiastic adopters:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You’re cooked if you don’t use LLMs to write code&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is counterproductive and not helpful.&lt;/p&gt;
&lt;p&gt;I believe that all technologically minded folks, regardless of their stance on particular tools, have things they can learn from each other.&lt;/p&gt;
&lt;p&gt;There’s more value in working across these groups, inside and outside technology, rather than isolating ourselves.&lt;/p&gt;
&lt;h2 id=&quot;the-unproductive-discourse&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#the-unproductive-discourse&quot;&gt;The unproductive discourse&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To be specific, discourse gets unproductive when adopters project that other software practitioners are “cooked” or “not going to make it” because they’re not adopting AI.&lt;/p&gt;
&lt;p&gt;As someone who &lt;em&gt;has&lt;/em&gt; enthusiastically adopted several different applications of AI, most notably using AI as a coding partner and often as a coding driver, what I find most perplexing is the divide in experiences.
For every person who finds these tools incredibly useful, there are many who tried them and found them frustrating, tiresome, irritating, or ineffective.&lt;/p&gt;
&lt;p&gt;I am genuinely curious about what is different in the approaches and contexts of those folks that leads them to find something I think is really useful to be not that useful at all.&lt;/p&gt;
&lt;h2 id=&quot;tools-and-preferences&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#tools-and-preferences&quot;&gt;Tools and preferences&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In part, I wonder if it’s a bit like a Vim versus VS Code/full-fledged IDE divide.
I’ve never been able to be productive with Vim; it doesn’t fit how my brain works.
Plenty of folks swear by it, and I don’t deny its benefits for them.&lt;/p&gt;
&lt;p&gt;Nor would I say a Vim user couldn’t be a successful software engineer.
There are examples to the contrary, as there are examples of successful engineers who use more fully featured IDEs.&lt;/p&gt;
&lt;p&gt;To me, deciding whether to use AI to write software is similar to Vim vs. an IDE.
I find AI an incredibly powerful and useful tool, but it’s not uniformly or universally better than a person in every capacity.&lt;/p&gt;
&lt;h2 id=&quot;the-impact-of-feeling-the-pain&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#the-impact-of-feeling-the-pain&quot;&gt;The impact of feeling the pain&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You build new paradigms when the current ones block you.
For folks coding with language models today, one notable pain is parallelizing agents without them interfering with each other, performing more inference, and finding ways to agents to run independently for longer.&lt;/p&gt;
&lt;p&gt;I don’t see a ton of folks writing new programming languages using language models that meaningfully change the programming paradigm, at least not yet.
They don’t feel the same pain as someone struggling through writing in the language.&lt;/p&gt;
&lt;h2 id=&quot;a-long-term-perspective&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#a-long-term-perspective&quot;&gt;A long-term perspective&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We don’t know how all this will evolve, or which skills will be most conducive to enduring success.
That’s fine.&lt;/p&gt;
&lt;p&gt;If you plan to build software for decades, think long-term about craft, mentorship, and culture.
A posture of animosity toward non-adopters is not a durable strategy.&lt;/p&gt;
&lt;p&gt;Let people work how they think is best.
This technology is going to be around for a long time.&lt;/p&gt;
&lt;p&gt;What will best serve us right now is to understand why current tools don’t resonate with people who aren’t excitedly adopting them.&lt;/p&gt;
&lt;p&gt;I don’t yet have a good explanation for why one person finds AI compelling and another doesn’t.
To understand it, we need to keep telling and hearing more specific stories: what you tried, what hurt, what felt like magic, and what felt like a waste of time.&lt;/p&gt;
&lt;p&gt;Tell me where AI has failed you or saved you.
The specifics are how we close the gap.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Ongoing thoughts</title><link>https://www.danielcorin.com/garden/language-models/ongoing_thoughts/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/language-models/ongoing_thoughts/</guid><description>Ongoing thoughts</description><pubDate>Tue, 20 Aug 2024 01:26:08 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;It is currently kludgy and time consuming to iterate on a prompt for a language model to integrate some kind of inference into an engineering use case in a microservice environment. This is specifically difficult because it’s not yet clear where productive separation of concerns should be.&lt;/li&gt;
&lt;li&gt;Many frameworks are under development, but they typically get you off the ground quickly with a basic use case at the expense of scaling well with your use case.&lt;/li&gt;
&lt;li&gt;It’s not entirely clear what the most productive prompting approach is for a task or if you (prompt engineering) or a model (DSPy) should improve the prompt.&lt;/li&gt;
&lt;li&gt;We don’t always know whether we should try and use a single inference with approaches like Chain of Thought, multi-shot and structured outputs or if and how we should use multiple turns in a conversation.&lt;/li&gt;
&lt;li&gt;When we do pick an approach, it’s not clear how we test or monitor. We can write evals (ground truth prompt+output pairs that we validate), though it is only really easy to do for single-message inferences and usually structured output.&lt;/li&gt;
&lt;li&gt;How can we observe (especially to debug) the prompts/context and inference outputs across a conversation with a model? When we get a bad or wrong response, what were the inputs, how can we understand them and how can we improve the model performance for the use case? What if we can’t improve the performance and no prompting, fine-tuning or existing model seems to work well?&lt;/li&gt;
&lt;/ul&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Equity</title><link>https://www.danielcorin.com/garden/startups/equity/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/startups/equity/</guid><description>Equity</description><pubDate>Sat, 01 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Note: This is not financial advice.
I wrote this in 2021 as I tried to reason about, understand, and document some of the patterns I was seeing in tech startups/scale-ups.
I think much of this thought process is still relevant for private companies offering equity as part of their compensation packages. I mostly discuss my thought process through the lens of RSUs as that is what I am most familiar with. Some of this may apply to options, but I can’t say with confidence that all of it does.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;receiving-an-offer-with-startup-equity&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#receiving-an-offer-with-startup-equity&quot;&gt;Receiving an offer with startup equity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tech startups often offer stock options or RSUs as part of their compensation packages to make up for the fact that they (generally) want to pay lower cash salaries than other (usually public) companies competing to hire from the same pool of candidates.
This practice makes some sense.
The company is typically trying to grow quickly and has raised investor capital to do so.
Instead of giving you that cash, they want to invest their cash in the business and if the business is successful, you’ll (hopefully) be rewarded many times over with the value of your equity when you have the opportunity to sell it.&lt;/p&gt;
&lt;p&gt;There’s nothing inherently wrong or devious about this practice.
It’s a value tradeoff: less money today for a chance at more tomorrow.
However, the way these companies deliver these offers, particularly to junior engineers who don’t necessarily have experience with equity-based compensation, leaves a lot to be desired.
It usually looks something like this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey Dan, we’re excited to offer you the role of software engineer at NewCo.
We think you’ll be a huge addition to our team as we scale to additional markets.
We’d like to offer you a base salary of $123,456 per year and 3,700 RSUs vesting over 4 years.
We think this is a generous offer and above market rate for similar roles.
The offer expires on Wednesday, so be sure to get back to us soon!&lt;/p&gt;
&lt;p&gt;Best,&lt;/p&gt;
&lt;p&gt;Bart from recruiting&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While it’s a privilege to be offered a job, the way in which an offer like this is presented is extremely frustrating.
The recruiter has offered some number RSUs, knowing (or even worse, not knowing) that I now have to ask follow-up questions just to begin to understand the value of the offer.
I find this disrespectful.&lt;/p&gt;
&lt;p&gt;This practice is akin to a store placing a price tag on a t-shirt that reads &lt;code&gt;◆82&lt;/code&gt;.
What is the value of &lt;code&gt;◆&lt;/code&gt;?
I don’t really want to have to go to the register just to understand the dollar cost of the item I’m thinking about purchasing.
Bart is leaving me to do all the work to determine the worth of these RSUs.
There might be some public information available that help me infer the value of this equity, but most of the time, &lt;em&gt;everything&lt;/em&gt; is left to you, the candidate, to navigate and figure out on your own, often under the pressure of an offer with a deadline (sometimes referred to as an exploding offer).
When I visit a store, no one expects me to check the market value of a t-shirt so I can estimate the actual dollar price of &lt;code&gt;◆82&lt;/code&gt; in monetary terms I can comprehend.&lt;/p&gt;
&lt;p&gt;In reality, after all the time invested in sourcing candidates and conducting interviews, NewCo may want to hire me far more than the store wants to sell me a t-shirt.
So why are they making it so hard for me to figure out what’s in it for me if I work there?
Having gone through this dance multiple times, I usually give the benefit of the doubt and follow up once, or maybe twice if I’m really interested in the role.
But for folks without as much experience and/or in a tough job market (like in 2024 when I am posting this), you may not have better alternatives or the time to do this legwork.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-equity-worth&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#what-is-the-equity-worth&quot;&gt;What is the equity worth?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, what questions do you ask to figure out what the RSUs are actually worth? You could reply “Hi Bart, what are the RSUs worth?” but Bart’s incentives aren’t aligned with yours.
He wants to close you and will give you the biggest number he possibly can at which to value the RSUs.
The number you’re after is your percentage ownership of the company calculated from the number of RSUs you are being offered.&lt;/p&gt;
&lt;p&gt;If you can’t get that number specifically, you need to do some math.
The math isn’t hard, but getting the numbers might be.
The numbers you should ask for are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;total number of outstanding shares&lt;/li&gt;
&lt;li&gt;last 409a valuation of the company&lt;/li&gt;
&lt;li&gt;last preferred valuation of the company&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you know the total number of shares, you can calculate percentage ownership&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.ptga1.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#f8f8f2&quot;&gt;offered RSUs / total number of shares&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;offered RSUs / total number of shares&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now you can make your own determination of what you think the RSUs are worth.
Multiply percentage ownership by the amount you think the company is worth.
That’s the hypothetical of your RSUs (after they vest and minus taxes, sorry).&lt;/p&gt;
&lt;p&gt;I hear you, you have no idea how to value a private company.
The VCs are historically not great at this either, but we can use their behavior and investment terms to help us get a ballpark idea of what our shares &lt;em&gt;could&lt;/em&gt; be worth.&lt;/p&gt;
&lt;p&gt;The preferred valuation of the company is the most recent value at which some group of private investors bought shares in the company.
Take that valuation and multiply it by your percentage ownership (really big number times a very small one) and that’s one number to look at when valuing your equity.&lt;/p&gt;
&lt;p&gt;Do the same thing with the last 409a valuation, keeping in mind that this value per share will likely be lower than the preferred share price.
A 409a valuation is a theoretical valuation calculated by an independent auditor which aims to estimate what the company is approximately worth at that point in time.
Investors are usually thinking about what the company could be worth in the future, when the business is more mature.&lt;/p&gt;
&lt;p&gt;If the company raises more money, it’s possible the preferred valuation could change.
If the company receives another 409a valuation, that could change as well.
Ultimately, these numbers are all hopes and dreams.
You’ll only ever receive money from your equity if you can find someone to buy it from you.&lt;/p&gt;
&lt;h2 id=&quot;selling-startup-equity&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#selling-startup-equity&quot;&gt;Selling startup equity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can monetize your startup equity in several ways (this is not an exhaustive list):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You’re given the chance to sell your shares through a “tender offer”.
External investors approach your company with the intention to acquire shares.
Instead of issuing new shares or selling unallocated shares, the company allows employees to sell their (vested) shares to the investors, providing an opportunity for employee liquidity.
The investor sets the price at which they will buy your shares.
You can either accept or decline, and it’s typically a one-time event with restrictions on the number of units you can sell.&lt;/li&gt;
&lt;li&gt;The company is bought by a public company and your equity converts to shares of the acquiring company. You can then sell those converted shares in the public markets.
The conversion of your equity to shares of the new company stock is unpredictable.
It depends on the deal your leadership negotiates.&lt;/li&gt;
&lt;li&gt;Your company goes public (IPOs) and, after what is usually a 6-month employee lockup, you can sell your shares in the public market during an allowed trading window at the current market price.&lt;/li&gt;
&lt;li&gt;You can sell equity on secondary markets. However, there are several caveats.
You need to check if there are any restrictions in your offer against participating in secondary market sales (some companies explicitly prohibit it and many have the right of first refusal for a sale).
Most secondary market bids are for options only.
RSUs typically have conditions that make them unappealing for purchase on secondary markets.
Also, RSUs are not shares of the company.
They only become shares after they fully vest and in the case of most private companies at the time of this writing, that only happens after a liquidity event.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;where-to-go-from-here&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#where-to-go-from-here&quot;&gt;Where to go from here&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At this point, you might be justifiably overwhelmed by the entire process of valuing startup equity, and that’s understandable.
When accepting equity in a private company, there are no guarantees.
Be aware of what your opportunities for liquidity might look like and keep in mind that the “value” you perceive your shares to have may end up being pennies on the dollar and could even diminish to zero.&lt;/p&gt;
&lt;p&gt;This whole discussion is &lt;strong&gt;not&lt;/strong&gt; to suggest that you shouldn’t work at a private company.
Such companies can be some of the most exciting places to work with incredible opportunities for growth.
Like anything, there are tradeoffs and where there is higher risk, there can often be the opportunity for greater returns.
If you do accept an offer like this one, go in with your eyes wide open, understanding the risks, hoping for the best, and preparing for the worst.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Social Capital</title><link>https://www.danielcorin.com/garden/software-eng/social-capital/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/social-capital/</guid><description>Social Capital</description><pubDate>Tue, 07 May 2024 21:41:55 GMT</pubDate><content:encoded>&lt;p&gt;At my first engineering job, I was introduced to the idea of social capital in
the context of how to ask for help from other engineers and the consequences of
spending one’s social capital ineffectively. I don’t love the textbook
definitions of social capital but I think the following example is a good
illustration.&lt;/p&gt;
&lt;p&gt;When you contribute positively to a social group by respecting shared norms,
shared values, trust, cooperation, and reciprocity, you cultivate your social
capital. When you violate these norms and values, you squander or exhaust that
capital. Misusing social capital can lead you to lose trust of the group.&lt;/p&gt;
&lt;p&gt;Since moving on from this role, I’ve never heard the topic mentioned explicitly
in the same way in a workplace again but I think it’s one of the more important
things you can learn as an engineer. The concept of social capital has become
central to how I aim to operate as a positive individual contributor within a
broader engineering organization (though much of this applies for any group of
people).&lt;/p&gt;
&lt;p&gt;As an engineer, you consistently encounter unfamiliar things that you need to
learn to do your job effectively. If you’re lucky, there may be good
documentation or existing examples, but eventually you’ll come across something
you can’t quickly figure out or understand.&lt;/p&gt;
&lt;p&gt;There are several paths forward in this situation. You could start reading code
until you reach a deep understanding of what is happening. Under time
constraints, this approach could be too time consuming. You may need to ask
someone with more experience for help with your specific issue.&lt;/p&gt;
&lt;p&gt;When you ask for help, it’s important to demonstrate you value the time of the
person you are asking. My aim is to display I’ve made a good faith effort to
solve the issue myself and exhausted the resources I was able to find. It’s
likely the person who ends up helping me will have their own responsibilities
that my question pulls them away from. I aim to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;make it easy for them to help me or answer my question&lt;/li&gt;
&lt;li&gt;display my current level of understanding of what I am working on&lt;/li&gt;
&lt;li&gt;avoid wasting their time, by bringing everything I think is relevant to the
beginning of the conversation (see &lt;a href=&quot;https://www.nohello.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;No Hello&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach helps the responder use language that I understand (since I’ve
shown my level of understanding with my question). It also can reveal areas
where my understanding is flawed that can be corrected, which is exactly the
kind of help I need.&lt;/p&gt;
&lt;p&gt;If you’re posting a message in a community channel, you may not even know who
that person is when you’re articulating your question. My approach in this
situation is to concisely request for help with the following structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a brief introduction of who I am&lt;/li&gt;
&lt;li&gt;what I am trying to accomplish&lt;/li&gt;
&lt;li&gt;what I have attempted so far and what the results have been, including errors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I have lengthy explanations or examples, I will either try and link out to
them or prepare the entire message first then write a short message to start and
post a longer follow up message in a thread to avoid taking over the entire
conversation of a channel. In addition to valuing the time of the person
answering your question, you want to value the time of your peers who may have
questions and ongoing conversations of their own. Recognize that you’re not the
only person trying to get your job done and do your best not to monopolize
conversations.&lt;/p&gt;
&lt;h2 id=&quot;examples&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#examples&quot;&gt;Examples&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The above might be more theoretical than you’re comfortable with. If that’s the
case, here are some examples of what I would deem to be good and bad ways to
build social capital rather than squander it.&lt;/p&gt;
&lt;h3 id=&quot;good&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#good&quot;&gt;Good&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi, I’m Dan from the Risk team. My team is working on onboarding to the new
Streaming Platform. From the &lt;a href=&quot;https://example.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;documentation&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;, I
understand that I need to create a new Kafka topic for each of my services
that currently calls the RPC in &lt;code&gt;$old_service&lt;/code&gt;. Is it possible to create
these topics in bulk? I need to create topics for 10 services, but the
instructions only seem to support onboarding a single topic at a time. Thanks!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;why&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#why&quot;&gt;Why?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The person reading this can understand what you are trying to do and what you
have tried so far. If there is documentation you missed, they’ll likely happily
link it and might even recognize it’s not as discoverable as it might be since
you clearly made an effort to find it but couldn’t. I would expect a positive
interaction to result from this starting message.&lt;/p&gt;
&lt;h3 id=&quot;bad&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#bad&quot;&gt;Bad&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;How can I bulk onboard topics?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;why-1&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#why-1&quot;&gt;Why?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It’s ambiguous what you are talking about, so the person providing help may need
to ask follow up questions to figure out what you are trying to accomplish.
Follow-ups for clarity are inevitable sometimes but this attempt has made a poor
attempt at clarity. You’ve not explained what you’ve tried if anything, so the
person responding will need to ask something like “have you checked the docs?”.
They could link you to docs directly. They could assume you already know where
the docs are and suggest you read them. They could need to go search for the
docs themselves to then link to you. Generally, this cursory approach displays
disregard for the time of the person you are hoping will help you. I aim to
display respect for this individual’s time, energy and effort because I need
their help to be successful.&lt;/p&gt;
&lt;h2 id=&quot;when-it-goes-wrong&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#when-it-goes-wrong&quot;&gt;When it goes wrong&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At their worst, these types of conversation first require you to establish
common understanding through follow-up questions. In a chat-based environment
where it can be easy to get pulled away from one conversation into another or a
meeting, these lengthier exchanges become increasingly difficult to manage and
can often trail off and require reminder pings from both sides to answer the
last request. In my experience, the longer a conversation goes on, the more
complicated it typically becomes and the less likely all participants are on the
same page. Sometimes a long conversation is needed, but if one is, all the
better if you establish as much context up front. It makes it more likely you’ll
get the useful information you are looking for before the conversation trails
off.&lt;/p&gt;
&lt;h2 id=&quot;your-reputation&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#your-reputation&quot;&gt;Your reputation&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve been on both sides of asking and being asked for help. I value it
tremendously when someone asks a question with preparation. Unfortunately, those
who ask the least prepared questions are often the most memorable and
frustrating. As the individual providing help, you come to recognize regulars.
With a finite amount of time and energy, you may need to prioritize some asks
over others. In these situations, I prioritize people who use their social
capital effectively because I appreciate their efforts to value my time and do
my best to reciprocate.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Craft, constraints and software in the real world</title><link>https://www.danielcorin.com/garden/software-eng/craft-and-constraints/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/craft-and-constraints/</guid><description>Craft, constraints and software in the real world</description><pubDate>Sun, 21 Apr 2024 10:25:33 GMT</pubDate><content:encoded>&lt;p&gt;This article,
&lt;a href=&quot;https://www.deathbyabstraction.com/I-love-programming-but-I-hate-the-programming-industry?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;I love programming but I hate the programming industry&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;,
is a lively addition to the conversation on the expectations placed on software
developers in corporate environments. My experience working at medium-large
software companies has been that there is always a give and take between
building features that make money and satisfy business needs, and having a sense
that you’ve built software thoughtfully, that can endure and scale — software
built with craft. The balance between these two can vary widely but is a
necessary tension in a business environment.&lt;/p&gt;
&lt;p&gt;I’ve come to view the dissonance one feels as an author of software in a
money-making environment as a mismatch in what success looks like between an
author of software who cares about the craft of writing software and a business
operator who is responsible for engineering user behavior in service of an
organization’s goals (usually making money).&lt;/p&gt;
&lt;p&gt;Maybe it’s trite, but I think the comparison of a table made out of high-quality
wood and a mass-manufactured table made out of press board is apt. There is a
large overlap in function but only the one made with quality is likely to stand
the test of time. However, a lot of people need tables and lower quality table
can be made quickly, purchased more cheaply, and sold in larger volumes.&lt;/p&gt;
&lt;p&gt;It can be easy to convince yourself that the cheap things you get today are
going to work well enough for now and into the forseeable future. In practice,
there is a tradeoff between resources in the present and the future, time and
money often being some of the most often considered.&lt;/p&gt;
&lt;p&gt;Businesses typically operate in highly competitive environments where there is a
strong push to do things today because the future isn’t guaranteed. Software
developers for a business are not always aligned with this mentality. Someone
writing software might want to dedicate more time to considering whether a
system will be maintainable or scalable because if the business requires that,
it’s often easier to plan for it upfront rather than trying to retrofit into a
live system for a business whose systems are having scaling growing pains.&lt;/p&gt;
&lt;p&gt;This area is one where software developers and business operators often find
themselves at odds. Business operators frequently want to ship the minimal
viable product because the sooner something goes to market, the sooner you will
know if your ideas work and what to try next. Business operators also aren’t
directly responsible for making software scale, so they’re much more likely to
push for the thing they are responsible for — growing the business.&lt;/p&gt;
&lt;p&gt;Software developers are responsible for the systems. This is includes designing
architectures, building systems and shipping products to users and making sure
they scale (don’t break when a lot of people use them at the same time). If the
business they are a part of runs out of money and can no longer operate, there
won’t be anything to scale. If the business does succeed, the developers and the
business may pay a cost for corners they cut to get to where they are.&lt;/p&gt;
&lt;p&gt;One common difficult growing businesses encounter is when a single SQL data
store starts to fail under the load of too many use cases. These types of
databases can only scale vertically, meaning you can increase the size of the
machine you run your database on, but if you can’t find a bigger machine, you
will struggle to scale further without making larger changes to your application
architecture. Adopting a different type of database (like a NoSQL database&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;)
earlier requires a certain amount of foresight, but also is a tradeoff in
flexibility. With a NoSQL data base, you can’t run arbitrary queries against all
your data at the same time. You usually need to design your tables to support
known query patterns. This preparation for “scale” may end up being unnecessary
if you never actually &lt;em&gt;need&lt;/em&gt; to scale the product because it doesn’t achieve
success but it preparation for scale will likely slow down the pace at which you
can change the product in response to feedback from customers.&lt;/p&gt;
&lt;p&gt;You need to consider whether this tradeoff will undermine your ability to
succeed at building the product. I’ve seen teams struggle with quantifying these
tradeoffs, especially when the long-term existence of the business is in
question. Saying “we don’t know if we’re going to exist in the next &lt;code&gt;N&lt;/code&gt; months”
often wins the day when advocating against investing in software scalability in
favor of a leaner MVP. However, playing the “this will never need to scale” card
is also dangerous if it’s not necessarily true. Not taking any time to consider
technical challenges you might encounter in the future can lead to a lot of pain
and lost time down the road. Time is finite and you want to spend it doing the
most valuable work you can.&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;https://en.wikipedia.org/wiki/Zero_interest-rate_policy?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ZIRP&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; era, this
phenomenon occurred quite often. Companies deployed billions in capital to start
or compete in industries that (nearly) disappeared after just a few years. In
2018, Bird (among many other companies), began deploying thousands of electric
scooters in major cities around the world at single-digit dollar rental prices.
The startup achieved multi-billion dollar valuations at paces
&lt;a href=&quot;https://qz.com/1305719/electric-scooter-company-bird-is-the-fastest-startup-ever-to-become-a-unicorn?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;never seen before&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;.
Bird captured the attention of many in the technology world due to the breakneck
speed at which they were building, scaling and deploying. They were re-writing
the rules for how quickly a company could scale. At the time, Uber, the
incumbent king of blitzscaling, felt threatened enough by this business that it
decided to &lt;a href=&quot;https://www.wired.com/story/uber-acquires-jump-bike/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;acquire&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; the
electric bike share company, JUMP and launch an electric scooter service under
that brand. These companies were punting products out the door as fast they
could get employees to build something customers could use. These are not the
types of environment conducive to building with craft. The goal here was to get
customers to use a product as quickly as possible, then figure out everything
else later. Whether it was effective is a separate conversation — it was a
business strategy.&lt;/p&gt;
&lt;p&gt;On the other side of the argument, building beautiful, scalable systems for a
business that never acquires any customers may be an exercise in craftsmanship,
but software developers can only work for so long without needing money to
support themselves and getting paid typically requires you work for an
organization that can afford to pay its employees&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Business is messy and a competitive business environment imposes demands on
companies to produce in ways that are often at odds with high-quality
craftsmanship. Spend five minutes reading about how difficult it is to make a
living as an artist and that will be made clear.&lt;/p&gt;
&lt;p&gt;While the demand for skills in building software are high, the demand for
software craftsmanship less so, at least in the explicit sense. For most
businesses, software is a means to an end to deliver a product to users.&lt;/p&gt;
&lt;p&gt;Users do recognize craftsmanship in software&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;, even if they don’t exactly
know why they prefer well designed experiences to lean MVPs. It’s the feeling of
ease you get when you use something that just works. Or the absence of the
frustration you all to frequently experience in an age with countless mediocre,
carelessly constructed products. Apple built its empire or things Just
Working&lt;sup&gt;&lt;a href=&quot;#user-content-fn-4&quot; id=&quot;user-content-fnref-4&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I think demands of faster-than-ever pace placed upon businesses (both internally
by executives and externally by markets and investors) make it difficult to
invest in craftsmanship. This is not to say no one does it, but it requires more
upfront investment to continuously make decisions that prioritize the quality of
your product given the constraints of running a business. It requires vision for
why craftsmanship is essential to your business’s success.&lt;/p&gt;
&lt;p&gt;Craftsmanship implies quality — something that is difficult to preserve as one
does more of a thing. Craftsmanship takes times — if it were easy, it would be
undifferentiated. This is also not to say it’s impossible to scale something of
high quality, just that’s it harder than scaling if one doesn’t focus as much on
quality or makes too many compromises prioritizing scale or speed. Many more
businesses seem to prefer the pursuit of the largest possible total addressable
market over the highest quality product. I imagine this is because they perceive
this approach as the best way to make the most money.&lt;/p&gt;
&lt;p&gt;Writing software in a corporate setting, to some degree, does always reduce a
software developer down to a cog in a machine. You’re employed to empower the
organization to make more money. Hopefully your expertise is valued, but it
might not be. You may have been hired merely because someone with a budget was
able to staff a team to work on a project that recently was given funding. You
likely will be asked to do a lot given difficult constrains resulting in lower
software quality than you aspire to write.&lt;/p&gt;
&lt;p&gt;If what your doing has implications in the real world, it’s more complicated
than just software and it’s messy in one way or another. As someone who studied
Physics, I often find myself searching for simple and elegant solutions to
software problems that uniformly capture designed behavior and edge cases alike.
The author’s articulated desire resonates with me&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I want every how - from the programming language and paradigm, architecture,
down to every line of code and piece of syntax - to be informed by the why of
the system that is being built. And I want that why to be a reflection of a
genuine existing need, not some bullshit business metric which pretty much
exists for its own sake.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would argue that many small companies begin with this somewhat idealist
approach and goal in mind. The “genuine existing need” to be addressed are the
business’ customer needs. If a business is successful enough, it may try to do
more of what it is already doing or expand to do more related things. From these
ambitions it invents and borrows from prior art, systems to implement the
execution of its goals at a greater scale. Success in business seem to lead to
the proverbial “bullshit business metric”.&lt;/p&gt;
&lt;p&gt;It’s difficult to maintain a culture of building with craft. It many not be
flashy or attention grabbing and it inevitably will require compromise. A great
outcome would be if you can build something excellent, sell it at a fair price
and earn enough to live and continue to run your business.&lt;/p&gt;
&lt;p&gt;After writing this, I saw Karri’s tweet and felt like he expressed a lot of
similar sentiments in his comments:&lt;/p&gt;
&lt;astro-embed-tweet&gt;&lt;blockquote class=&quot;twitter-tweet&quot; data-dnt=&quot;true&quot; data-theme=&quot;light&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;What I talked about at Stripe Sessions:&lt;br&gt;Craft and Quality, and professional grade software at &lt;a href=&quot;https://x.com/linear?ref_src=twsrc%5Etfw&quot;&gt;@linear&lt;/a&gt; &lt;a href=&quot;https://t.co/HFpN4GTIkj&quot;&gt;pic.twitter.com/HFpN4GTIkj&lt;/a&gt;&lt;/p&gt;&amp;mdash; Karri Saarinen (@karrisaarinen) &lt;a href=&quot;https://x.com/karrisaarinen/status/1783976321854717985?ref_src=twsrc%5Etfw&quot;&gt;April 26, 2024&lt;/a&gt;&lt;/blockquote&gt;

&lt;/astro-embed-tweet&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#footnote-label&quot;&gt;Footnotes&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;A distributed database that can distribute and query data across more than
one machine and scale beyond the constraints imposed by a single machine that
SQL struggles with. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;During the ZIRP era, companies often paid employees with investor dollars
rather than company profits, because the companies weren’t actually making any
money. This was the model of the last decade in tech which has rapidly
disappeared with the increase in interests rates. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;This requires contributions not just from developers but everyone
participating in the product lifecycle. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-4&quot;&gt;
&lt;p&gt;Though there are times where it has failed to meet the quality bar it has
become known for. &lt;a href=&quot;#user-content-fnref-4&quot; data-footnote-backref aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Edit Links</title><link>https://www.danielcorin.com/garden/blog/edit_links/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/blog/edit_links/</guid><description>Edit Links</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Why I have “edit” links on my site:&lt;/p&gt;
&lt;p&gt;I use my site’s &lt;a href=&quot;/search&quot;&gt;search page&lt;/a&gt; as a public second brain in certain ways.
When I write something up as a &lt;a href=&quot;/til&quot;&gt;TIL&lt;/a&gt; it was probably useful enough to be something I’ll come back to again.
Because of this, occasionally I have updates or notice changes that need to be made to a particular page.
When I realize this, it is almost always the best time to make the change.
The fastest way to do that is to make a quick file edit in GitHub, a tool with a reasonable experience for quick and minor changes.
It opens in the app on my phone and as a logged-in session on my computer.
I make the edit, commit, the build runs and it’s live.
If &lt;em&gt;you&lt;/em&gt; click it, it will bring you to a page to create a PR to the site.
If you’re making a correction, thank you! It’s an honor to have you as a reader.
I hope you’ve gotten something positive out of my work or that it saved you time.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Structure</title><link>https://www.danielcorin.com/garden/blog/structure/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/blog/structure/</guid><description>Structure</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My blog has the following sections:&lt;/p&gt;
&lt;h2 id=&quot;search&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#search&quot;&gt;Search&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/search&quot;&gt;&lt;code&gt;/search&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Search functionality across all the content on this site.&lt;/p&gt;
&lt;h2 id=&quot;posts&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#posts&quot;&gt;Posts&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts&quot;&gt;&lt;code&gt;/posts&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I view these as complete or polished pieces.
They are of varied quality, but most have been edited by me several times over and occasionally by a few others.&lt;/p&gt;
&lt;h2 id=&quot;tils&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#tils&quot;&gt;TILs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/til&quot;&gt;&lt;code&gt;/til&lt;/code&gt;&lt;/a&gt; (short for “Today I Learned”)&lt;/p&gt;
&lt;p&gt;I’ve seen several other folks write these types of posts.
I sort of view them as notebooks.
I write ideas and things I learn in them, but they’re only a medium level of refinement at most, and some are just simple. straightforward things.
They usually have a medium amount of editing but quality varies.&lt;/p&gt;
&lt;h2 id=&quot;logs&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#logs&quot;&gt;Logs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/logs&quot;&gt;&lt;code&gt;/logs&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Logs are short notes, thoughts, links, and occasionally tweets.
They capture fleeting thoughts from the day.
Sometimes, they lead to writing in other sections but are generally unrefined, unedited, incomplete, and sometimes wrong.&lt;/p&gt;
&lt;h2 id=&quot;about&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#about&quot;&gt;About&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/about&quot;&gt;&lt;code&gt;/about&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Brief and general, high level things about me.&lt;/p&gt;
&lt;h2 id=&quot;projects&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#projects&quot;&gt;Projects&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/projects&quot;&gt;&lt;code&gt;/projects&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some of the more complete projects I’ve worked on.&lt;/p&gt;
&lt;h2 id=&quot;garden&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#garden&quot;&gt;Garden&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/garden&quot;&gt;&lt;code&gt;/garden&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A place for thoughts, ideas and essays I tend to.&lt;/p&gt;
&lt;h2 id=&quot;uses&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#uses&quot;&gt;Uses&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/uses&quot;&gt;&lt;code&gt;/uses&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The software and hardware I use.&lt;/p&gt;
&lt;h2 id=&quot;now&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#now&quot;&gt;Now&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/now&quot;&gt;&lt;code&gt;/now&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What I am up to “lately”.&lt;/p&gt;
&lt;h2 id=&quot;activity&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#activity&quot;&gt;Activity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/activity&quot;&gt;&lt;code&gt;/activity&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recent activity and updates on this site.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Links</title><link>https://www.danielcorin.com/garden/inspiration/links/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/inspiration/links/</guid><description>Links</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://simonwillison.net/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thesephist.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://thesephist.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xeiaso.net/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://xeiaso.net/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nikiv.dev/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://nikiv.dev/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://maggieappleton.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://maggieappleton.com&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.harrymackofficial.com/about?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://www.harrymackofficial.com/about&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://paulgraham.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://paulgraham.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sindresorhus.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://sindresorhus.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stephango.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://stephango.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://justjake.me/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://justjake.me/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://m15y.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://m15y.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.desmondrduggan.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://www.desmondrduggan.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.mollywhite.net/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://blog.mollywhite.net/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cassidoo.co/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://cassidoo.co/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://neal.fun/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://neal.fun/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chaidarun.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://chaidarun.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://haseebmajid.dev/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://haseebmajid.dev/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://martinheinz.dev/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://martinheinz.dev/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jxnl.github.io/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://jxnl.github.io&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://davi.sh/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://davi.sh/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://eugeneyan.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://eugeneyan.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.simplermachines.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://www.simplermachines.com&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://victoria.dev/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://victoria.dev&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.henrikkarlsson.xyz/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://www.henrikkarlsson.xyz/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://udara.io/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://udara.io/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jeremy.fast.ai/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://jeremy.fast.ai/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wattenberger.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://wattenberger.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sonnet.io/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://sonnet.io&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://david-peter.de/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://david-peter.de/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://interconnected.org/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://interconnected.org/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ghuntley.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://ghuntley.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://montasaurus.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://montasaurus.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://news.ycombinator.com/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fs.blog/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://fs.blog/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lucumr.pocoo.org/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://lucumr.pocoo.org/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vig.xyz/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://vig.xyz&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bradwoods.io/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://bradwoods.io/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timkellogg.me/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://timkellogg.me/&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>System Prompts</title><link>https://www.danielcorin.com/garden/language-models/system_prompt/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/language-models/system_prompt/</guid><description>System Prompts</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;section class=&quot;chat-section&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;chat-container&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;message-container&quot; data-astro-cid-txfww4py&gt;   &lt;div class=&quot;message system&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;bubble system-bubble&quot; data-astro-cid-txfww4py&gt; &lt;p&gt;Prose only. No lists. Format the output as follows&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a tl;dr summary of the body (Titled “Summary”)&lt;/li&gt;
&lt;li&gt;a thoughtful and measured response (“Response”)&lt;/li&gt;
&lt;/ul&gt;  &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class=&quot;message-container&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;message user&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;message-content&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;user-label&quot; data-astro-cid-txfww4py&gt;User&lt;/div&gt; &lt;div class=&quot;bubble user-bubble&quot; data-astro-cid-txfww4py&gt; &lt;p&gt;your question!&lt;/p&gt;  &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;/div&gt;&lt;div class=&quot;message-container&quot; data-astro-cid-txfww4py&gt;  &lt;div class=&quot;message assistant&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;message-content&quot; data-astro-cid-txfww4py&gt; &lt;div class=&quot;model-label&quot; data-astro-cid-txfww4py&gt;assistant&lt;/div&gt;   &lt;div class=&quot;bubble assistant-bubble&quot; data-astro-cid-txfww4py&gt; &lt;p&gt;the response!&lt;/p&gt;  &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; 
&lt;p&gt;with a prefill of “Here is your response:” for Anthropic models&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Ways I Use</title><link>https://www.danielcorin.com/garden/language-models/ways_i_use/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/language-models/ways_i_use/</guid><description>Ways I Use</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;code-generation&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#code-generation&quot;&gt;Code generation&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use language models to generate code following specific instructions.
Usually, this involves a short prompt.
I typically generate 30 lines of code or less.
I may use the model to write an script starting with nothing.
I more frequently use models to amend or augment code in an existing code base.
For example, I may highlight a list then prompt “write a function to remove falsy values then sort in descending order by field &lt;code&gt;date&lt;/code&gt;”&lt;/p&gt;
&lt;h2 id=&quot;a-web-search-alternative&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#a-web-search-alternative&quot;&gt;A web search alternative&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Instead of Google or alternative search engines, I use a language-model-first search engine like &lt;a href=&quot;https://www.perplexity.ai/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Perplexity&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;, &lt;a href=&quot;https://you.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;You&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; or just a model playground.
For a while I used the &lt;a href=&quot;https://platform.openai.com/playground?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OpenAI playground&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;.
Since the release of Claude 3, I’ve been using the &lt;a href=&quot;https://console.anthropic.com/workbench?new=1&amp;#x26;ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Anthropic workbench&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;.
I also use the &lt;a href=&quot;https://github.com/simonw/llm?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;llm&lt;/code&gt;&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; CLI to quickly invoke models, though I’m still building muscle memory for this approach.
The latter is nice because it maintains a local sqlite database of all model interactions.&lt;/p&gt;
&lt;h2 id=&quot;to-scaffold-examples-and-demos&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#to-scaffold-examples-and-demos&quot;&gt;To scaffold examples and demos&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whenever I need sample data for a demo or example, I’ll use a language model to either generate the sample or write a script to do so.
This my take the form a prompt like&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write a creative menu for a barbecue restaurant&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;which is an approach I’ve used to generate unstructured data to separately demonstrate the model’s capability to extract structured data.&lt;/p&gt;
&lt;h2 id=&quot;as-a-thought-partner&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#as-a-thought-partner&quot;&gt;As a thought partner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For me, writing about something helps clarify my understanding and highlight areas where I lack understanding.
I use a model to probe my understanding of topics with instructions to identify areas I might have overlooked.
This is useful when researching,&lt;/p&gt;
&lt;h2 id=&quot;proofreading-and-refining-my-writing&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#proofreading-and-refining-my-writing&quot;&gt;Proofreading and refining my writing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use language models to proofread my writing and suggest improvements based on my goals and audience.
I also use models to help refine specific sentences or paragraphs.
If a sentence doesn’t sound right, I’ll ask the model to suggest a clearer way to express it, then I’ll refine it further if needed.
It’s about as useful as getting a cursory pass on a first draft from a peer reviewer, but doesn’t take up a human’s time and I can run it as often as I want.
It’s pretty good at identifying issues.
I still need to find a good and fast way for a model to automatically propose fixes without needing to regenerate an entire document.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Caveats</title><link>https://www.danielcorin.com/garden/software-eng/caveats/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/caveats/</guid><description>Caveats</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Give yourself a break when you don’t hit all your goals for yourself and your team.
Even though we work with machines, people aren’t machines and shouldn’t be treated as such.
Lack of success today is opportunity for tomorrow. Try and view setbacks as stepping stones.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Architecture</title><link>https://www.danielcorin.com/garden/software-eng/architecture/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/architecture/</guid><description>Architecture</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;avoid-unproductive-complexity&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#avoid-unproductive-complexity&quot;&gt;Avoid unproductive complexity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It can be fun to play with new technology, but be thoughtful when picking spots to try something new. Consider who will need to support the system and whether the additional complexity unnecessarily increases the burden on your teammates.&lt;/p&gt;
&lt;h2 id=&quot;know-what-your-systems-cost-to-run&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#know-what-your-systems-cost-to-run&quot;&gt;Know what your systems cost to run&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you use cloud providers’ infrastructure, it’s easy to lose track of what you spend to run your systems. Periodically audit your spend as an engineering team. Knowing what you spend on infrastructure and why will position you well to answer any questions about your teams’ costs.&lt;/p&gt;
&lt;h2 id=&quot;adapt-your-code-to-be-vendor-agnostic&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#adapt-your-code-to-be-vendor-agnostic&quot;&gt;Adapt your code to be vendor-agnostic*&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;*Loosely held.
Design your system to agnostic to vendors wherever possible.
Avoid adopting nomenclature of a third party throughout your systems.
Keep this at the system’s edges.
For example, at the edge of your system, you may have a DynamoDB record.
In the internals of your app, map to a different type.&lt;/p&gt;
&lt;h2 id=&quot;design-self-healing-systems&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#design-self-healing-systems&quot;&gt;Design self-healing systems&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Expect things to break when you design them and decide how your system will behave &lt;em&gt;when&lt;/em&gt; they do. Use queues and retries to avoid involving your oncall for as long as tolerable by the business.
When broken systems are restored, all the system to proceed without requiring oncall intervention.
If oncall &lt;em&gt;must&lt;/em&gt; get involved, proactively write admin tools to assist with mitigation.
If you find you’re missing tools that would have helped after an incident, build them for next time.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Helpful Habits</title><link>https://www.danielcorin.com/garden/software-eng/helpful-habits/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/helpful-habits/</guid><description>Helpful Habits</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;take-breaks&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#take-breaks&quot;&gt;Take breaks&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I’m struggling to solve a problem, I can get pretty wrapped up in it. Historically, it’s not been uncommon for me to spend several hours, stubbornly grinding through some annoying code issue I’m running into.
More often than not, the moment I decide to take some kind of break, I come up with a new approach or the solution outright.&lt;/p&gt;
&lt;h2 id=&quot;keep-an-open-mind&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#keep-an-open-mind&quot;&gt;Keep an open mind&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Being for or against some technology or approach under all circumstances is very rarely a thoughtful position.
Pattern matching can help you move quickly but working from first principles or the baseline requirements needs to be in your wheelhouse as well.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Oncall</title><link>https://www.danielcorin.com/garden/software-eng/oncall/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/oncall/</guid><description>Oncall</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;page-only-if-actionable&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#page-only-if-actionable&quot;&gt;Page only if actionable&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Have oncall available and ready to respond if a customer is affected. If an issue can wait until business hours, don’t allow it to page outside business hours.&lt;/p&gt;
&lt;h2 id=&quot;invest-in-runbooks&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#invest-in-runbooks&quot;&gt;Invest in runbooks&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Make it as easy as possible for an oncall engineer to make the right decision when responding to an incident. These are often high stress and pressure events where we are more prone to make mistakes. We do not want the oncall engineer to need to be a hero to mitigate an issue. We want them to be an effective executor of a predetermined plan.&lt;/p&gt;
&lt;h2 id=&quot;escalate-when-it-will-make-an-impact&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#escalate-when-it-will-make-an-impact&quot;&gt;Escalate when it will make an impact&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On the best teams, members have each other’s backs. If an oncall engineer needs help mitigating an issue they were paged for, they should feel comfortable escalating to another engineer who can help. This approach requires a delicate balance. Engineers, particularly more junior ones, need to feel comfortable escalating to ensure issues are mitigated effectively and in a timely manner. However, if escalations are happening too frequently, it can put too much strain on more experienced team members. If escalations are occurring too frequently, you may need to increase your focus on training all team members to be effective at performing oncall duties.&lt;/p&gt;
&lt;h2 id=&quot;for-larger-incidents-appoint-an-incident-coordinator&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#for-larger-incidents-appoint-an-incident-coordinator&quot;&gt;For larger incidents, appoint an incident coordinator&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If an issue is high impact enough to declare a broader incident, have a (pretrained) incident coordinator who is responsible for reporting status and pulling the needed group of stakeholders together. The coordinator is directly responsible for determining whether an incident is ongoing and who is participating based on mitigation needs. The coordinator should rely on mitigating and engineers to communicate who and what they need, then makes this happen. The coordinator should also ensure an incident does not drag on past the point that mitigation is still occurring. Knowing how and when to close out an incident is as important as knowing when to open one.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Ramping up on a new language</title><link>https://www.danielcorin.com/garden/software-eng/ramping_up_language/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/ramping_up_language/</guid><description>Ramping up on a new language</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;koans&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#koans&quot;&gt;Koans&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whenever I start a project in a programming language with which I’m not familiar, I try and find “koans” to do in the language along with my daily work.
I’ll spend maybe an hour a day working on these until I complete them (assuming I’m liking the exercises and structure).
I think I worked edgecase’s &lt;a href=&quot;https://github.com/edgecase/ruby_koans?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;ruby_koans&lt;/code&gt;&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; when I first learned Ruby back when I joined Chime.
I found it by searching for “ruby koans”.
I couldn’t remember if it was this repo at first but then I recalled the “path to enlightenment” metaphor.
I personally found Ruby a very unapproachable language for how much “magic” there is — it just doesn’t resonate with me — but these exercises made me someone who can write (and read) Ruby.
You can find Koans in many languages easily with a search for “{language} koans”.&lt;/p&gt;
&lt;p&gt;Sort of related: &lt;a href=&quot;https://sitwon.github.io/code-koans/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Code Koans&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;h2 id=&quot;exercism&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#exercism&quot;&gt;Exercism&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I used &lt;a href=&quot;https://exercism.org/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Exercism&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; &lt;em&gt;a bit&lt;/em&gt;.
I liked it and was a fan of the experience but the exercises could be a touch too technically involved for me.
I generally learn a language better on easy exercises and then separately learn how to apply the language in project work with it.
Doing both at once slows down my high-level fluency because I don’t see enough language constructs as quickly as I need to to get familiarity.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Code</title><link>https://www.danielcorin.com/garden/software-eng/code/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/software-eng/code/</guid><description>Code</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;encode-your-standards&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#encode-your-standards&quot;&gt;Encode your standards&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Make your code look how you would want future contributions to look. Documentation of standards and scaffolding both help, but a lot of code is copy-pasted.
With this approach, when your code is copied, new contributions will adhere to your standards by default.
Supplement with a code formatter or linter that enforces rules automatically through an IDE, version control or builds.
This approaches also helps avoid discussion about style and formatting in code review.&lt;/p&gt;
&lt;h2 id=&quot;deploy-often&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#deploy-often&quot;&gt;Deploy often&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Deploy code when it merges.
If your deploy introduces an issue, it will be easier to identify the offending change.
Deploy automatically on merges if possible, but limit these to business hours to avoid unintentionally creating issues after hours.
An oncall engineer can always deploy manually if they need to.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Things I used to believe</title><link>https://www.danielcorin.com/garden/uncategorized/things-i-used-to-believe/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/uncategorized/things-i-used-to-believe/</guid><description>Things I used to believe</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;These are some things I believed about software engineering and personal development that proved not to be as true as I thought they were.
Most of this is written from the perspective of my experience working as a software engineering professional.&lt;/p&gt;
&lt;h2 id=&quot;im-not-the-type-of-person-who-is-good-at-x&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#im-not-the-type-of-person-who-is-good-at-x&quot;&gt;I’m not the type of person who is good at &lt;code&gt;X&lt;/code&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This mentality held me back.
I may not be a person who is good at X &lt;em&gt;yet&lt;/em&gt;, but this type of thought process has usually ensured I don’t get good at X for longer.
You’re generally the worst at a skill when you get started.
As you learn and apply a skill, you get better.
This is how you go from not being good or feeling confident to becoming more skilled and effective.
There are no shortcuts, only more and less effective ways to use your time.
Figure out what works for you, how you best learn, and what excites and motivates you.
Lean into that.&lt;/p&gt;
&lt;h2 id=&quot;there-is-generally-one-good-way-to-build-a-backend-microservice&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#there-is-generally-one-good-way-to-build-a-backend-microservice&quot;&gt;There is generally one good way to build a backend microservice&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My first job as an engineer building production software was at Uber in 2016.
Uber engineering had a highly opinionated approach to developing microservices that had been “battle tested at scale”.
It was heavily inspired by the Clean/Onion architecture, and there was a well written internal document on how to apply approach and reason about structuring an application such that you’d be flexible to scale and rapid change.
I internalized this approach as the &lt;em&gt;one true way&lt;/em&gt; to build.
I’m lucky it was a relatively good approach, but having had several more professional experiences since then, I no longer believe in applying such a one-size-fits all approach.
This type of architecture remains my favorite for production microservices, but it requires enough investment that if you’re prototyping or extremely time constrained, it’s likely more effort than it’s worth.
It’s a versatile pattern, but not one to be applied thoughtless.
Being willing to be less rigid in applying this pattern everywhere helped me grow as an engineer.&lt;/p&gt;
&lt;h2 id=&quot;if-wed-only-had-the-right-requirements-we-could-have-built-it-right-the-first-time&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#if-wed-only-had-the-right-requirements-we-could-have-built-it-right-the-first-time&quot;&gt;If we’d only had the right requirements, we could have built it right the first time&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This statement is true but also near impossible to accomplish in the real world.
If you work in a dynamic business, you will likely never have all the requirements you’d want to build a software system that will ship in several months.
Just as you as the engineer are figuring out how to design the system, the business is figuring out the business model, product and design are figuring out the user journey and experience, and other contributors are figuring out how their responsibilities fit into the greater whole of the project.
A change or new learning from any part of the team could trigger necessary adjustments elsewhere.
The team can either ignore these new learnings and ship a less effective product, or incorporate it and make adjustments to the initial plan as needed.
Unfortunately, a change like this can require many teams to rework existing assumptions and plans and this may feel wasteful, but if the goal is to build the best product possible, it can this be the right decision.
I’ve never seen a straight line journey to getting through a complex project.
Becoming comfortable and expecting changes to plans will save you frustration and help you design better, in anticipation of inevitable changes to original plans.&lt;/p&gt;
&lt;h2 id=&quot;you-need-100-unit-test-coverage&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#you-need-100-unit-test-coverage&quot;&gt;You need 100% unit test coverage&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At Uber, I was a member of a team with a 100% unit test coverage policy.
I didn’t have prior examples to compare to, so I just wrote tests for all my code.
Sometimes, getting to 100% required unusually testing approaches, and occasionally I would need to &lt;code&gt;nocover&lt;/code&gt; lines to ensure the build wouldn’t flag a decrease in coverage percentage.
There are pros and cons to this approach, but like any “best practice”, it’s not to be applied without consideration.
There are also diminishing returns to unit testing every line of code.
This is not to say you should skip testing edge cases or exception paths, but that not all tests are created equal.
If it takes you two hours to get that last line of test coverage, those two hours might have been better spent elsewhere.
I still am a proponent of 100% test coverage, but only to highlight unintentionally missed covered lines.
I support the use &lt;code&gt;nocover&lt;/code&gt; to make this approach more realistic along with comments as to why the test wasn’t worth writing, especially if you went down a rabbit hole trying.
This practice helps future you and future contributors.&lt;/p&gt;
&lt;h2 id=&quot;dynamically-typed-languages-are-better-than-statically-typed-languages&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#dynamically-typed-languages-are-better-than-statically-typed-languages&quot;&gt;Dynamically typed languages are better than statically typed languages&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first language I wrote code in was Java in college.
Several months later, I learned Python, and it was like a breath of fresh air.
Writing code was all of a sudden far easier.
I could mostly focus on logic without getting bogged down in types.
I was encountering so many new things at the same time that removing types from the picture allowed me to get more comfortable writing and running code.
What I didn’t have an appreciation for at the time was that a lack of compile time type checking introduces an entirely new class of errors to a program.
I couldn’t have an appreciation for this because I barely had a concept of the difference between an error at compile time versus an error at runtime.
By avoiding types, writing code became easier.
Maintaining the code would be harder, but I needed to learn that from experience.
For what it’s worth, Python is often still the first language I reach for when I need to code something up quickly.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>System</title><link>https://www.danielcorin.com/garden/note-taking/system/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/note-taking/system/</guid><description>System</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;my-criteria-for-note-taking&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#my-criteria-for-note-taking&quot;&gt;My criteria for note taking&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fast idea capture&lt;/li&gt;
&lt;li&gt;Flexible organization system that requires low maintenance or thought about where content should live&lt;/li&gt;
&lt;li&gt;Good search&lt;/li&gt;
&lt;li&gt;Plaintext&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;my-current-setup&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#my-current-setup&quot;&gt;My current setup&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://obsidian.md/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Obsidian&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; because everything is Markdown.
It has a plugin ecosystem, but I find many of these difficult to work with and time consuming to configure.
I use &lt;a href=&quot;https://github.com/scambier/obsidian-omnisearch?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Omnisearch&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; for searching notes.
I use an iOS shortcut to call the &lt;a href=&quot;https://github.com/ryanjamurphy/lumberjack-obsidian?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;lumberjack&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; plugin to quickly create new notes to capture an idea to be dealt with later.
I use the &lt;a href=&quot;https://fortelabs.com/blog/para/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PARA method&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; to organize my content, with an additional of an Inbox.
My top level folders are&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.ptga1.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#f8f8f2&quot;&gt;00 Inbox&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#f8f8f2&quot;&gt;10 Projects&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#f8f8f2&quot;&gt;20 Areas&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#f8f8f2&quot;&gt;30 Resources&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#f8f8f2&quot;&gt;40 Archive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;00 Inbox10 Projects20 Areas30 Resources40 Archive&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;I mostly like this because it minimizes the time I spend organizing and has a builtin structure for cleanup.
I am reasonably happy with this setup, but I find I don’t benefit much from the time I spend improving it.
It seems to be good enough for now.&lt;/p&gt;
&lt;h2 id=&quot;workflows&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#workflows&quot;&gt;Workflows&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Capture an idea on mobile, quickly using a shortcut app icon&lt;/li&gt;
&lt;li&gt;Create notes on Desktop with Obsidian&lt;/li&gt;
&lt;li&gt;Search notes on Desktop, mapped to &lt;kbd&gt;hyper&lt;/kbd&gt;+&lt;kbd&gt;space&lt;/kbd&gt;&lt;/li&gt;
&lt;li&gt;Edit blog drafts on mobile, synced via my Desktop using &lt;code&gt;unison&lt;/code&gt; from a local git repo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;current-complaints&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#current-complaints&quot;&gt;Current complaints&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Obsidian mobile app is slow to load&lt;/li&gt;
&lt;li&gt;Omnisearch occasionally seems to miss some matching files — maybe an issue with its index&lt;/li&gt;
&lt;li&gt;Sometimes, I fall behind moving things out of Inbox, but I prefer this to dealing with the overhead of classifying something when I just want to write an idea&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;desired-improvements&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#desired-improvements&quot;&gt;Desired improvements&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Solve the complaints&lt;/li&gt;
&lt;li&gt;A better blog post creation and editing processes for mobile, that doesn’t require sync between the git repo and Obsidian vault&lt;/li&gt;
&lt;/ul&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>My writing goals and systems</title><link>https://www.danielcorin.com/garden/writing/goals-and-systems/</link><guid isPermaLink="true">https://www.danielcorin.com/garden/writing/goals-and-systems/</guid><description>My writing goals and systems</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I wrote this on a plane reflecting on my experience becoming a more consistent writer over the past decade.
I intuitively knew writing was something I wanted to be doing, but I had to rearrange my thought process and habits to make it happen.&lt;/p&gt;
&lt;h2 id=&quot;goals-and-systems&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#goals-and-systems&quot;&gt;Goals and systems&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My goal is to write about my ideas and things I learn.
I aspire to do this and value it because it motivates further thinking and often provides the spark for new ideas and projects I will undertake.&lt;/p&gt;
&lt;p&gt;My brain does this thinking whether or not I write.
Writing both focuses that thinking process and creates some amount of order from my internal monologue.&lt;/p&gt;
&lt;p&gt;I also enjoy working on projects because I find it enjoyable to see ideas come to life and even when things don’t turn out exactly how I had hoped, usually I learn something, which is intrinsically enjoyable to me.&lt;/p&gt;
&lt;p&gt;For a long time I’d had the impulse to write and engage in a cycle of thinking and experimenting, but my systems held me back.&lt;/p&gt;
&lt;h2 id=&quot;creating-a-blog&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#creating-a-blog&quot;&gt;Creating a blog&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My first challenge was I didn’t have a lens through which to write the work.
Independently journaling never resonated with me.
There were times over the years where I’ve been able to journal consistently, but the systems that made that possible never seemed to put me in the frame of mind to think about interesting things.&lt;/p&gt;
&lt;p&gt;My focus was often what I was doing or more self reflective.&lt;/p&gt;
&lt;p&gt;Creating a blog was the first step to solving this challenge.
My blog is technical in focus, so it’s the obvious place for my writing about tinkering to go.
I created the first version of my blog about 12 years ago but if you look at my post history, just having the blog wasn’t enough to create a system where I was writing, experimenting, and learning.&lt;/p&gt;
&lt;h2 id=&quot;actually-writing&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#actually-writing&quot;&gt;Actually writing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve personally been quite influenced by the orange website and folks who share their work, projects, and interests.
I aspired to contribute my own thoughts and work to a community in a similar way.&lt;/p&gt;
&lt;p&gt;When I started writing on my blog or trying to, I often was faced with the Catch 22 of not feeling like I had anything to write about.
Occasionally, there would be projects I would do in personal time or at work that yielded interesting results, but I was often keenly aware and self-conscious that what I had to contribute to the conversation was either uninteresting, naive, or potentially wrong.&lt;/p&gt;
&lt;p&gt;I’ve since learned that &lt;em&gt;no one reads your blog&lt;/em&gt;.
This is never more true than when you start, so what you write hardly matters to anyone but you.
Just doing something is the best path forward.&lt;/p&gt;
&lt;p&gt;If I could go back in time, I would have focused on writing &lt;a href=&quot;/til&quot;&gt;Today I Learned&lt;/a&gt; posts consistently starting in 2013.
This type of writing and work has several positive functions.
It serves as a note to future you on how to do something, either for reference or to be superseded if you learn a new and better way.
It also serves as a solution for someone in the future with the same problem you had.
Most of the traffic my site receives is to these Today I Learned posts, presumably from people who want to do things like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2024/switching-from-pocket-to-raindrop&quot;&gt;Switch to Raindrop from Pocket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/til/deepseek/janus-pro-local&quot;&gt;Run the Janus image model on their Macbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/til/temporal/using-multiple-task-queues&quot;&gt;Setup multiple task queues for Temporal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;no-one-reads-your-blog&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#no-one-reads-your-blog&quot;&gt;No one reads your blog&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is no longer literally true for my blog.
I get mostly Google traffic with the occasional ChatGPT/Claude/Perplexity/Bing/LinkedIn/etc. but mostly for “how to do X posts”.&lt;/p&gt;
&lt;p&gt;Almost zero people have read my post on language models or how to use them.
In a way, this is liberating.
I have no audience and no expectations to fulfill.&lt;/p&gt;
&lt;p&gt;For some reason, having the blog and continuing to write on it and publish is part of a system that makes my process of writing and experimenting continue to work.
I write something and then I send it off.&lt;/p&gt;
&lt;p&gt;I don’t have to agonize over editing and refining if I don’t want to.
I can play with the thought and then move on.&lt;/p&gt;
&lt;h2 id=&quot;making-more-buckets-for-content&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#making-more-buckets-for-content&quot;&gt;Making more buckets for content&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I first created a blog, the site had &lt;code&gt;posts&lt;/code&gt;.
This was a bigger problem than I realized for about 10 years.&lt;/p&gt;
&lt;p&gt;A post felt like it needed to be formal.
A post needed to be well edited.
A post needed to say something interesting.
A post needed to be worth someone’s time.&lt;/p&gt;
&lt;p&gt;These internal preconceptions are the reasons I wish I’d started writing TIL posts earlier.
Something I learned today is not obviously interesting or useful to you.
It was for me.
That was the point I missed for a while.&lt;/p&gt;
&lt;h2 id=&quot;i-write-for-myself&quot;&gt;&lt;a class=&quot;heading-link-wrapper&quot; href=&quot;#i-write-for-myself&quot;&gt;I write for myself&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don’t write this blog for you, I write it for me.
I don’t mean that to be an insult if you are reading, but I’ve tried to write for other people or with a sponsorship focus and it doesn’t satisfy me in the same way.&lt;/p&gt;
&lt;p&gt;Once I realized creating additional content sections was helpful for making it easier to just write stuff and not worry about for whom or why, I added several more sections to the site.
&lt;a href=&quot;/logs&quot;&gt;Logs&lt;/a&gt; are like a digital pile of sticky notes with quotes from others and fleeting thoughts or exploration.
&lt;a href=&quot;/garden&quot;&gt;Garden&lt;/a&gt; contains longer essays that I am not finished working on and may never be.
&lt;a href=&quot;/feeds/link-blog&quot;&gt;Link blog&lt;/a&gt; is a collection of thought provoking things I’ve read.&lt;/p&gt;
&lt;p&gt;This multi-bucket system has grown organically to help me allow myself to just do stuff and have somewhere to put it if I want to.
&lt;a href=&quot;/logs&quot;&gt;Logs&lt;/a&gt; have been especially helpful for this and I’ve built tools that make it trivially easy to write a log entry from my machine.
Running&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.ptga1.css&quot;&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#A6E22E&quot;&gt;just&lt;/span&gt;&lt;span style=&quot;--0:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#E6DB74&quot;&gt;log&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;just log&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;from within my site project creates a new log entry for the day if one doesn’t exist already and opens it.
Then I just write.&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item></channel></rss>