diff --git a/_posts/2024-06-19-best-tool.md b/_posts/2024-06-19-best-tool.md new file mode 100644 index 0000000..91ed332 --- /dev/null +++ b/_posts/2024-06-19-best-tool.md @@ -0,0 +1,60 @@ +--- +layout: post +title: No Best Tool For The Job +image: /figma/og_best_tool.png +excerpt: How do you choose the best tool for the job? +tags: + - thinking +--- + +How do you choose the best tool for the job? + +Suppose you want to plant a tree in your backyard and need to dig a hole. You go to the nearby hardware supply store and see these options: + +![](/figma/graden_tools_options.png) + +You don’t have to be a PhD in Gardening to know which tool is best for the job. It’s self-evident from the size of the tool and its cost. + +The next day you decide to build a web app. You go to a catalog of website-building tools and you see this: + +![](/figma/web_app_tools_options.png) + +Let’s imagine for a moment that you are relatively new to programming. How would you pick the best tool for the job here? + +## All these programming tools look the same + +Unlike tools for digging holes, all these websites look the same. They all promise the same thing — build your web app. It’s not clear why you’d pick one tool over the other. So you dig a little deeper… + +## Infinite fractal of categorization + +…and discover an almost infinite amount of specialization. With hardware tools, the categories are more defined: here’s a shovel, and here’s an excavator. There’s nothing in between. With programming languages and frameworks, for any two tools, there seems to be another tool in between. + +The job of evaluating the tools becomes harder than the job of actually using the tool. + +You could just pick any tool and get started, but… + +## Too easy to choose the wrong tool + +With hardware tools, the price and the size of the tool give you a strong hint of what it is best for. Sure, using an excavator to dig a hole for a tree sounds like a ton of fun, but buying or renting one is way too expensive. Plus, you need to learn how to drive one, get a license, and it definitely doesn’t fit into your backyard. + +With software tools, it costs almost nothing to choose the wrong tool for the job. They all optimize for getting started quickly. Building a static website with GraphQL — easy. Use Kafka for a one-person backoffice app — no problem. You can spin up both in under 5 minutes, for free. + +So how are you supposed to make a good choice for your web app? Well, you could search for some advice on Reddit, X, or HackerNews… + +## Advice overload + +…and get overwhelmed with the amount of opposite opinions. “React is the best” / “React is the worst”, you should always render things on the server, you should make a single page app, use static types, use dynamic types, functional programming is the way, functional programming is too slow. The list of contradictions goes on and on. + +The people shouting the advice sound extremely confident. If you dig deeper, some of them are actually employed by the tech stack they are preaching, but even outside of obvious economic incentives, it’s just too much noise to sort through. + +Meta advice is just as polarized. “Pick a tool you already know” vs “learn new things”, “choose a popular tech stack with a large community” vs “choose niche tech stack with a great community”, “focus on clean code” vs “focus on business outcomes”. + +— + +So my mind gets [stuck](/side-projects-are-hard/) on this one. How do you pick the best tool for the job? + +The only way out of this pickle situation I found so far is to turn around and face the question itself. What does “the best” even mean? + +Back to the tree planting, the choice is simple, so it’s obvious which tool is the best. In programming, we no longer have [that luxury](https://youtu.be/0Ttw9ks05G4?si=XR4z-Jwj825p7fkI&t=222), thus maybe the concept of “the best” doesn’t work anymore. The options are just too close, too nuanced, and the consequences are too fuzzy. Even if you are an expert in these tools, there are still enough unknowns to make the choice non-trivial. + +When the options can’t be plotted on a single axis with clear “good” and “bad” fits, there’s no “best”. There’s only “good enough”. And if we give up chasing “the best tool for the job”, we might just free up enough mental space to use “the good enough tool” to actually plant that tree. diff --git a/figma/graden_tools_options.png b/figma/graden_tools_options.png new file mode 100644 index 0000000..384459c Binary files /dev/null and b/figma/graden_tools_options.png differ diff --git a/figma/og_best_tool.png b/figma/og_best_tool.png new file mode 100644 index 0000000..90c53ac Binary files /dev/null and b/figma/og_best_tool.png differ diff --git a/figma/og_disposable_software.png b/figma/og_disposable_software.png index 58558f2..3baf9c7 100644 Binary files a/figma/og_disposable_software.png and b/figma/og_disposable_software.png differ diff --git a/figma/og_hacker_gifts.png b/figma/og_hacker_gifts.png index ffadf58..b3c23e3 100644 Binary files a/figma/og_hacker_gifts.png and b/figma/og_hacker_gifts.png differ diff --git a/figma/og_js_gom_jabbar.png b/figma/og_js_gom_jabbar.png index 3a23049..8e4f2ea 100644 Binary files a/figma/og_js_gom_jabbar.png and b/figma/og_js_gom_jabbar.png differ diff --git a/figma/og_no_why.png b/figma/og_no_why.png index 7e35be9..de2799d 100644 Binary files a/figma/og_no_why.png and b/figma/og_no_why.png differ diff --git a/figma/og_opening_mail.png b/figma/og_opening_mail.png index 88d2eab..c72cd6b 100644 Binary files a/figma/og_opening_mail.png and b/figma/og_opening_mail.png differ diff --git a/figma/og_replace_jekyll.png b/figma/og_replace_jekyll.png index 93383ba..e30e88a 100644 Binary files a/figma/og_replace_jekyll.png and b/figma/og_replace_jekyll.png differ diff --git a/figma/og_shuhari.png b/figma/og_shuhari.png index a78f38a..ddc699e 100644 Binary files a/figma/og_shuhari.png and b/figma/og_shuhari.png differ diff --git a/figma/og_watchdog.png b/figma/og_watchdog.png index 371b051..21a2e2b 100644 Binary files a/figma/og_watchdog.png and b/figma/og_watchdog.png differ diff --git a/figma/web_app_tools_options.png b/figma/web_app_tools_options.png new file mode 100644 index 0000000..7d007c8 Binary files /dev/null and b/figma/web_app_tools_options.png differ diff --git a/scripts/build b/scripts/build index 59feba5..ee1af9a 100755 --- a/scripts/build +++ b/scripts/build @@ -2,7 +2,7 @@ set -o allexport source .env set -+o allexport +set +o allexport mkdir -p _build rm -rf _build/* diff --git a/scripts/make.js b/scripts/make.js index 24296fc..b4f84d1 100755 --- a/scripts/make.js +++ b/scripts/make.js @@ -18,7 +18,7 @@ const md = new MarkdownIt({ if (language && hljs.getLanguage(language)) { try { return hljs.highlight(code, { language }).value; - } catch (__) {} + } catch (__) { } } return ""; }, @@ -265,6 +265,7 @@ async function store(url, fileName) { } async function download() { + console.log("Downloading images from Figma"); const file = await figma("/v1/files/Nf5B58hyoTotF6XCs1AjHD?depth=2"); const frames = {}; const page1 = file.document.children[0]; @@ -284,4 +285,7 @@ async function download() { store(exports.images[id], path.join("figma", name + ".png")) ) ); + + const buildScript = path.join(__dirname, "build"); + execSync(buildScript); }