<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ned Twigg</title>
    <description>The latest articles on DEV Community by Ned Twigg (@nedtwigg).</description>
    <link>https://dev.to/nedtwigg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F304688%2F13cb31fd-80fc-4ce2-ad59-3f19bc8a01dd.jpeg</url>
      <title>DEV Community: Ned Twigg</title>
      <link>https://dev.to/nedtwigg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nedtwigg"/>
    <language>en</language>
    <item>
      <title>Incremental progress feels futile...</title>
      <dc:creator>Ned Twigg</dc:creator>
      <pubDate>Wed, 22 May 2024 04:42:20 +0000</pubDate>
      <link>https://dev.to/nedtwigg/incremental-progress-feels-futile-4jgp</link>
      <guid>https://dev.to/nedtwigg/incremental-progress-feels-futile-4jgp</guid>
      <description>&lt;p&gt;I spent a lot of my career building a git client - I was laser focused on enabling and accelerating incremental progress. But in the age of LLMs that approach feels inadequate. In this piece I tried to figure out why "business-as-usual" feels so broken right now, and also tried to work through my hangups getting fully on board with the new stuff.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/thecontextwindow/the-new-stuff-is-always-simple-5epk"&gt;https://dev.to/thecontextwindow/the-new-stuff-is-always-simple-5epk&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The new stuff is always simple</title>
      <dc:creator>Ned Twigg</dc:creator>
      <pubDate>Wed, 22 May 2024 04:40:12 +0000</pubDate>
      <link>https://dev.to/thecontextwindow/the-new-stuff-is-always-simple-5epk</link>
      <guid>https://dev.to/thecontextwindow/the-new-stuff-is-always-simple-5epk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A simple system may or may not work. A complex system that works is invariably found to have evolved from a simple system that worked. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over with a working simple system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This assertion is known as Gall’s law. It implicitly defines “simple system” to mean “a system that may or may not work”. A good example of such a system is a biological cell that senses light. Can the cells on your fingernails detect light? Nope. Broken, doesn’t work. How about the cells at the back of your eyes? Yes! …hopefully. If they work at all, then we can stack complexity on top - sink the cells below a pinhole for angular resolution, make the pinhole diameter adjustable for dynamic range, cover the pinhole with a flexible membrane for near or far focus, wrap that in a cover for protection, put glass and polycarbonate over that for more protection and more focus.&lt;/p&gt;

&lt;p&gt;Gall’s law implies that time operates only on complex systems. If you have a system that works, then you can apply some time to it, and if you ensure that it still works at every step along the way, then you have followed the only recipe that can produce a complex system that works. If it ever stops working, there’s no amount of time you can use to get it working again unless you revert back to the last working checkpoint.&lt;/p&gt;

&lt;p&gt;But of course, time operates on simple systems too - because the complex systems that originate novel systems are evolving. A good example here is the Wright Flyer - people had tried to make flying machines &lt;a href="https://en.wikipedia.org/wiki/Ader_Avion_III"&gt;far more complex&lt;/a&gt; than the Wrights’ for a long time, but they hadn’t had high-precision machine shops for very long, and no one had ever had a high-precision machine shop and a wind tunnel before.&lt;/p&gt;

&lt;p&gt;And so, as we refine and accumulate the capacities of our existing complex systems, we find that the space of "simple” working systems - those that simply, magically work - is growing.&lt;/p&gt;




&lt;p&gt;The problem with novel simple systems is that they almost never happen. All our heuristics are tuned for coevolving with other relatively ancient and complex systems that we have already adapted to. So we apply the classic heuristic “it’s like a stochas-” WRONG. STOP STOP STOP. NOTHING IS LIKE ANYTHING ELSE.&lt;/p&gt;

&lt;p&gt;You have to take a novel system on its own terms, not in terms of some other thing. But Gall’s Law brings good news! If it’s novel and it works, it’s probably still simple! It hasn’t had enough time to become complex, so it’s not too late to draw it out on a single sheet of paper! For yourself — looking at a blogpost of someone else’s sheet of paper doesn’t count. Yours is the hand that must draw the boxes. What pieces does the system have? How are they connected?&lt;/p&gt;

&lt;p&gt;Once you’ve stopped trying to pretend that the necessarily simple novel system isn’t actually simple enough for you to draw, you have a chance to see what it does. Again, on its own terms. Does it perform better or worse than - STOP! STOP STOP STOP! Don’t try to find out if it does better or worse. Just see what it does. If you contemplated the system well enough to draw it, then you already noticed some places where you wanted to poke it. Poke! Empty yourself of all concern for utility, soak yourself in the jiggles of the poke, and let the jiggles evaporate slowly enough for their residue to crystallize undeformed by your preconceptions.&lt;/p&gt;

&lt;p&gt;In general, we developers get old and crusty. If you spend thirty years analogizing to what it was like when you were twenty, your world model seizes up. John Carmack was inventing &lt;a href="https://en.wikipedia.org/wiki/John_Carmack#Career"&gt;new programming techniques&lt;/a&gt; before you were born, and he can still touch his elbows to his toes without bending his knees. I don’t know the exact cause of your rigor mortis or of his flexibility, but it’s notable how frequently he checks-in on even &lt;a href="https://twitter.com/ID_AA_Carmack/status/1745958215940980932"&gt;the simplest aspects of reality&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F912urrwr7jabsw1dyo47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F912urrwr7jabsw1dyo47.png" alt="a screenshot of John Carmack's tweet, linked above" width="800" height="1241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh but you’re too busy making cutting edge webpages to burn time on frivolities like weighing things with a postage scale? THAT IS WHY you ended up in the position of frantically updating derelict webpages. Because you don’t know what anything is! John Carmack keeps inventing the future because he keeps finding out what’s here in the present.&lt;/p&gt;

&lt;p&gt;And more than ever, I think what’s going to be here in the present are brand new, simple systems. Thinkpieces and explainers keep trying to tell us what ChatGPT is like, while Andrej Karpathy is on YouTube begging us to &lt;a href="https://www.youtube.com/watch?v=kCc8FmEb1nY"&gt;just take a couple hours and literally make one&lt;/a&gt;. If you’re not gonna do that, at least let Nishant Aklecha show you &lt;a href="https://github.com/naklecha/llama3-from-scratch"&gt;the actual concrete steps&lt;/a&gt; that the LLM is taking.&lt;/p&gt;

&lt;p&gt;The problem for our heuristics is that this wave of generative AI systems is so powerful, we assume it must also be complex. The most powerful web browser in the world is an evolution of the last browser. Chrome’s version number has passed a hundred because it has a lineage measured in decades, not years. Its power came from tackling complexity, and complex systems always have some antecedent we can analogize from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over with a working simple system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That law still holds, but the sweet aftertaste of &lt;a href="http://www.incompleteideas.net/IncIdeas/BitterLesson.html"&gt;the bitter lesson&lt;/a&gt; is that it has never been easier to start over and discover something simple that works. If you enjoyed obsessing over &lt;a href="https://thecontextwindow.ai/p/version-equals-f-of-changelog"&gt;semantic versioning&lt;/a&gt; and &lt;a href="https://martinfowler.com/articles/branching-patterns.html"&gt;git branching conventions&lt;/a&gt;, I hope you got that all out of your system. It’s true that a 10-year-old SaaS website that works is inevitably found to have evolved from a 9-year-old SaaS website that also worked. But pretty soon you might find that every category leader is inevitably found to be a novel arrangement of novel categories of intelligence. The good news is that they’ll be simple. The bad news is that the process which creates them is going to involve way more abject, unsalvageable failure than most “engineers” signed up for.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Working with junior programmers</title>
      <dc:creator>Ned Twigg</dc:creator>
      <pubDate>Thu, 09 May 2024 22:45:25 +0000</pubDate>
      <link>https://dev.to/nedtwigg/working-with-junior-programmers-57oj</link>
      <guid>https://dev.to/nedtwigg/working-with-junior-programmers-57oj</guid>
      <description>&lt;p&gt;I just had an opportunity to work with some junior programmers for the first time in a while. One of the things I noticed was that they often wrote code &lt;em&gt;that they did not want to run&lt;/em&gt;, but they thought they had to write to get some warning to be quiet.&lt;/p&gt;

&lt;p&gt;It's so obviously silly to write code that you don't want to run, and yet it still happens. A lot! So I wrote &lt;a href="https://thecontextwindow.ai/p/never-write-code-you-dont-want-to-run"&gt;a fun little piece&lt;/a&gt; about it. Here's an excerpt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;And all of the good programming languages... have at least one construct entirely devoted to “if the bad thing happens, then what?” In the best languages, you say “I will tie my shoelace”, and the language says “But what if you scrape your forehead?” And nothing else can happen until you have an answer.&lt;/p&gt;

&lt;p&gt;“I won’t scrape my forehead while I -” UNNNNNHANDLED CASE ScrapeForeheadException WHAT IF YOU SCRAPE YOUR FOREHEAD ON LllllLLLine TWELVE THIRTY THIRTY TWO then what? …&lt;/p&gt;

&lt;p&gt;One option is to run away to live with Python, who lets you drink Coke for breakfast and shit in the refrigerator. But it would be better to be a goodie two shoes and say “dear mommy I will get a bandaid from the cupboard and put on neosporin”. That might work, or maybe she’ll hit you with a nested DrankTheNeosporinException but then you can say “dear mommy I’ll call poison control” and eventually she’ll be satisfied and your shoes will be tied.&lt;/p&gt;

&lt;p&gt;As you age and better grasp the desperate scarcity of time, you will correctly say “I don’t have time for this”...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The whole thing is on my new Substack at &lt;a href="https://thecontextwindow.ai/p/never-write-code-you-dont-want-to-run"&gt;https://thecontextwindow.ai&lt;/a&gt;, but I'll be crossposting to &lt;a href="https://dev.to/thecontextwindow/never-write-code-you-dont-want-to-run-part-1-2i9f"&gt;a mirror account here on dev.to&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Never write code you don't want to run, part 1</title>
      <dc:creator>Ned Twigg</dc:creator>
      <pubDate>Thu, 09 May 2024 22:29:28 +0000</pubDate>
      <link>https://dev.to/thecontextwindow/never-write-code-you-dont-want-to-run-part-1-2i9f</link>
      <guid>https://dev.to/thecontextwindow/never-write-code-you-dont-want-to-run-part-1-2i9f</guid>
      <description>&lt;p&gt;When I was a kid, I wanted to go FAST. And my mom, she didn’t care about fast, she only cared about SAFE. And it sucked, and anytime she’s not around I go FAST, and I have a modest basket of broken bones that wouldn’t be so crooked if she could have had any say, but eventually she didn’t have any say and it was worth it. Fast is worth it.&lt;/p&gt;

&lt;p&gt;And all of the good programming languages are like my mom. They have at least one construct entirely devoted to “if the bad thing happens, then what?” In the best languages, you say “I will tie my shoelace”, and the language says “But what if you scrape your forehead?” And nothing else can happen until you have an answer.&lt;/p&gt;

&lt;p&gt;“I won’t scrape my forehead while I -” UNNNNNHANDLED CASE ScrapeForeheadException WHAT IF YOU SCRAPE YOUR FOREHEAD ON LllllLLLine TWELVE THIRTY THIRTY TWO then what? …&lt;/p&gt;

&lt;p&gt;One option is to run away to live with Python, who lets you drink Coke for breakfast and shit in the refrigerator.1 But it would be better to be a goodie two shoes and say “dear mommy I will get a bandaid from the cupboard and put on neosporin”. That might work, or maybe she’ll hit you with a nested DrankTheNeosporinException but then you can say “dear mommy I’ll call poison control” and eventually she’ll be satisfied and your shoes will be tied.2&lt;/p&gt;

&lt;p&gt;As you age and better grasp the desperate scarcity of time, you will correctly say “I don’t have time for this” and incorrectly you’ll say “just do nothing”. The thing she’s worried about? It won’t happen. So if it does happen, do nothing. (because it won’t happen)&lt;/p&gt;

&lt;p&gt;Fast is worth it. But you would be better off proudly eating your boogers at Python’s house than to “do nothing” if you scrape your forehead. Because while your mom may or may not respect you, your computer absolutely does. If you say “do nothing”, then nothing will be done. Shoelace by shoelace, your foreskull will be ground flat like the lucky red crayon that never got lost, and as you commanded, nothing will be done.&lt;/p&gt;

&lt;p&gt;If you scrape your forehead while tying your shoes, you should scream. You should panic, and you should thank the wise mommy who gave you a chance to do so.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Names in java, maven, and gradle</title>
      <dc:creator>Ned Twigg</dc:creator>
      <pubDate>Thu, 23 Jan 2020 22:11:25 +0000</pubDate>
      <link>https://dev.to/nedtwigg/names-in-java-maven-and-gradle-2fm2</link>
      <guid>https://dev.to/nedtwigg/names-in-java-maven-and-gradle-2fm2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A central aspect of Java's philosophy is that names matter.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Brian Goetz, Java Language Architect and author of Java Concurrency in Practice&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Packages
&lt;/h2&gt;

&lt;p&gt;If you work for "acme.com" and you're working on a project called "foo" then &lt;a href="https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html"&gt;the convention&lt;/a&gt; is for your root package to be &lt;code&gt;com.acme.foo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Being a &lt;a href="https://xkcd.com/974/"&gt;forward-looking bunch&lt;/a&gt;, we tend to add lots of "grouping" packages.  Our foo project is a utility library, and we might make other ones, so we put it into  &lt;code&gt;com.acme.util.foo&lt;/code&gt;, to make sure there is space for other utility projects.  If we're really forward-looking, we'll take into account that foo is a utility library for manipulating text, so we better put it into &lt;code&gt;com.acme.util.text.foo&lt;/code&gt;.  On the other hand, &lt;a href="http://thehumbleprogrammer.com/resources/mastering-yagni/mastering-yagni-you-aint-gonna-need-it-fb.jpg"&gt;YAGNI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the javascript world, there are no packages, you just get one name -  &lt;code&gt;foo&lt;/code&gt; - and that's it.  I'm glad that I do most of my work on the JVM rather than a runtime which was &lt;a href="https://stackoverflow.com/questions/21139322/how-long-did-the-first-implementation-of-javascript-take/21139387#21139387"&gt;designed and built in 10 days&lt;/a&gt;, but whenever I start nesting my root package deeper than &lt;code&gt;com.acme.foo&lt;/code&gt;, I try to remember that all those gobs of software being written in Node.js are getting by without any nesting at all, so maybe I can get by with 3 or 4 levels of nesting for my root package, rather than 5 or 6.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maven groupId:artifactId
&lt;/h2&gt;

&lt;p&gt;One nice thing about &lt;code&gt;.class&lt;/code&gt; files is that you don't have to pick names for them - they get their name automatically from a 1:1 mapping on the &lt;code&gt;.java&lt;/code&gt; file they came from.  Unfortunately, maven asks you to pick &lt;em&gt;two&lt;/em&gt; names, so it can't be that simple.  Luckily, maven also provides not only &lt;a href="https://maven.apache.org/maven-conventions.html"&gt;one&lt;/a&gt;, but &lt;a href="https://maven.apache.org/guides/mini/guide-naming-conventions.html"&gt;&lt;em&gt;two&lt;/em&gt;&lt;/a&gt; slightly different conventions for how to pick these names!  Accordingly, if you ask &lt;a href="https://stackoverflow.com/questions/3724415/maven-artifact-and-groupid-naming"&gt;StackOverflow&lt;/a&gt;, you'll see two popular answers.  And when a major library like RxJava ships a new version, you'll need a &lt;a href="https://github.com/ReactiveX/RxJava/issues/6606"&gt;12-screen-long debate&lt;/a&gt; to figure out what the names ought to be.&lt;/p&gt;

&lt;p&gt;Luckily, there is a mechanistic answer out there!  JitPack turns any git commit into a maven artifact at &lt;code&gt;https://jitpack.io&lt;/code&gt; , which I've found to be huge improvement over &lt;code&gt;-SNAPSHOT&lt;/code&gt; for integration testing.  The naming convention that it uses is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;com.github.{user}:{repo}&lt;/code&gt; (also &lt;code&gt;com.gitlab&lt;/code&gt;, &lt;code&gt;org.bitbucket&lt;/code&gt;,  and &lt;code&gt;com.gitee&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;com.github.{user}.{repo}:{subproject}&lt;/code&gt; for multi-module builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use JitPack's &lt;a href="https://jitpack.io/docs/#custom-domain-name"&gt;custom domain&lt;/a&gt; integration, then you can replace &lt;code&gt;com.github.{user}&lt;/code&gt; with &lt;code&gt;com.acme&lt;/code&gt; for a professional touch.  Even if you don't use JitPack, using this convention will mean that you &lt;em&gt;could&lt;/em&gt;, and it lays down a simple rule that works well enough for &lt;a href="https://github.com/jitpack/jitpack.io/stargazers"&gt;all these people&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gradle plugin id
&lt;/h2&gt;

&lt;p&gt;In Gradle-land, you can apply a plugin like this: &lt;code&gt;plugins { id 'any.plugin.id.you.want' }&lt;/code&gt;.  Gradle provides an excellent &lt;a href="https://guides.gradle.org/publishing-plugins-to-gradle-plugin-portal/"&gt;guideline&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As a convention, we recommend you use an ID based on the reverse-domain pattern used for Java packages, for example org.example.greeting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The trouble is, a huge number of the plugins which have been published so far are named... &lt;a href="https://plugins.gradle.org/search?term=gradle-plugin"&gt;&lt;code&gt;gradle-plugin&lt;/code&gt;&lt;/a&gt;.  It seems reasonable while you're &lt;em&gt;writing&lt;/em&gt; the plugin, and you don't realize how silly it is until you &lt;em&gt;use&lt;/em&gt; it from a distance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s1"&gt;'com.acme.gradle.foo'&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s1"&gt;'org.nonprofit.bar.bar-gradle-plugin'&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s1"&gt;'beetlejuice.beetlejuice.gradle'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;What kind of car is that?  That's the Chevy Corvette Car.  What kind of phone is that?  It's an iPhone XS Phone.  Wouldn't this be better?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s1"&gt;'com.acme.foo'&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s1"&gt;'org.nonprofit.bar'&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="s1"&gt;'beetlejuice'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's interesting, because the guidelines that Gradle gives are very good - no excessive nesting, no unnecessary &lt;code&gt;gradle.gradle&lt;/code&gt;, just the bare minimum.  And yet, a lot of the people who &lt;em&gt;use&lt;/em&gt; it feel like they should add a &lt;code&gt;gradle&lt;/code&gt; or two, just in case.  Probably the only way to save us from ourselves would be for the gradle tooling to search for &lt;code&gt;gradle&lt;/code&gt; in the id and throw a warning, to help us think about it a little before we publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons
&lt;/h2&gt;

&lt;p&gt;Designing namespaces is a rare opportunity.  Most of us never do it even once in our entire career.  And since nobody has experience in it, we're still making lots of beginner mistakes, even in the quarter-century-old world of java.  It's hard!  Typosquatting, &lt;a href="https://en.wikipedia.org/wiki/IDN_homograph_attack"&gt;IDN homograph attacks&lt;/a&gt;, there are so many pitfalls.  If I ever end up defining a namespace, I'm gonna try to remember these lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;namespaces are helpful for identifying the author/maintainer: &lt;code&gt;com.acme.foo&lt;/code&gt; 👍&lt;/li&gt;
&lt;li&gt;namespaces are overkill for fine-grained categories: &lt;code&gt;com.acme.util.text.foo&lt;/code&gt; 👎&lt;/li&gt;
&lt;li&gt;defining the name to be a tuple of two other names is 👎&lt;/li&gt;
&lt;li&gt;if the names are all plugins to &lt;code&gt;foobar&lt;/code&gt;, people are just gonna name them &lt;code&gt;my-foobar-plugin&lt;/code&gt;, and it might be good to warn them that it's probably not the best choice ¯\_(ツ)_/¯&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>gradle</category>
      <category>maven</category>
    </item>
  </channel>
</rss>
