<?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: Daniil Baturin</title>
    <description>The latest articles on DEV Community by Daniil Baturin (@dmbaturin).</description>
    <link>https://dev.to/dmbaturin</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%2F232259%2F8821a017-3091-454c-acb4-37360b268ff5.png</url>
      <title>DEV Community: Daniil Baturin</title>
      <link>https://dev.to/dmbaturin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmbaturin"/>
    <language>en</language>
    <item>
      <title>How many open source maintainers are there?</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Mon, 07 Dec 2020 18:39:09 +0000</pubDate>
      <link>https://dev.to/dmbaturin/how-many-open-source-maintainers-are-there-2go1</link>
      <guid>https://dev.to/dmbaturin/how-many-open-source-maintainers-are-there-2go1</guid>
      <description>&lt;p&gt;There's a highly interesting post by Ben Frederickson, titled &lt;a href="https://www.benfrederickson.com/github-wont-help-with-hiring/"&gt;Why GitHub won't help you with hiring&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It makes some very good arguments against &lt;em&gt;requiring&lt;/em&gt; a strong GitHub profile for job applicant screening. The main argument is that most great developers don't have one. I think the best argument against it is that unless you hire people to work on open source code, requiring them to have a track record of contributions to open source software is hypocritical.&lt;/p&gt;

&lt;p&gt;However, it's not my point. My point is that his analysis is hinting at the true size of the open source developer community, and it's not as large as it seems.&lt;/p&gt;

&lt;p&gt;From the GitHub archive data, he got these figures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only 17% of GitHub users pushed any code in the last year&lt;/li&gt;
&lt;li&gt;Only 7.4% of GitHub users pushed more than 10 times&lt;/li&gt;
&lt;li&gt;Only 1.4% of GitHub users pushed more than 100 times&lt;/li&gt;
&lt;li&gt;Only 0.15% of GitHub users pushed more than 500 times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As of 2020, GitHub is the largest code hosting platform with about 40M users.&lt;/p&gt;

&lt;p&gt;Now, let's convert Ben's relative numbers to absolute values: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only 560 000 people pushed more than 100 times.&lt;/li&gt;
&lt;li&gt;Only 2 960 000 people pushed more than 10 times.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if you somehow bring them all together, the community of people who ever made some code dumps or drive-by contributions is about as large as the populations of Amsterdam, Athens, or Chicago.&lt;/p&gt;

&lt;p&gt;The people who actively maintain projects could fill a city like Dresden or Las Vegas.&lt;/p&gt;

&lt;p&gt;That's compared to 40M registered accounts. It's hard to tell how many of those accounts are duplicates, or how many programmers are in the world.&lt;/p&gt;

&lt;p&gt;Now, let's make an incredibly conservative estimate: most accounts are duplicates and there are 10M programmers in the world. It means only one in three ever helped an open source projects, and one in five maintains a project of some kind.&lt;/p&gt;

&lt;p&gt;And that's when almost every programmer depends on at least some open source code for their daily work.&lt;/p&gt;

&lt;p&gt;I think this leaves no open questions about whether companies should allow employees work on open source in their paid time, or whether we should advocate for participation. The answers to all those questions is "yes".&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Is "written in $lang" a feature or an implementation detail?</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Sun, 06 Dec 2020 08:45:26 +0000</pubDate>
      <link>https://dev.to/dmbaturin/is-written-in-lang-a-feature-or-an-implementation-detail-k55</link>
      <guid>https://dev.to/dmbaturin/is-written-in-lang-a-feature-or-an-implementation-detail-k55</guid>
      <description>&lt;p&gt;Some keep arguing that "written in $someLanguage" is a minor implementation detail that should not matter to users. This can only possibly be true for applications (as opposed to libraries). However, is it actually true?&lt;/p&gt;

&lt;p&gt;On the surface is sounds plausible: you can write good software in any language, so if you aren't going to modify the program, it shouldn't matter.&lt;/p&gt;

&lt;p&gt;However, in practice there may be very valid reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance and startup time
&lt;/h2&gt;

&lt;p&gt;It's no longer true that "interpreted" languages are orders of magnitude slower than ones that are compiled to native code. JIT compilation and modern VM designs can make them almost as fast to run as native code.&lt;/p&gt;

&lt;p&gt;However, those improvements have done almost nothing to the &lt;em&gt;startup time&lt;/em&gt;. Interpreter/runtime startup cost still ranges from "non-trivial" to "atrocious".&lt;/p&gt;

&lt;p&gt;For web backend and for most desktop apps, startup time isn't very important. For CLI tools and programs designed as building blocks for scripting (like &lt;code&gt;jq&lt;/code&gt;) it may be crucial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety guarantees
&lt;/h2&gt;

&lt;p&gt;For some use cases, memory safety provided by a garbage collector or a borrow checker is important enough to sacrifice something else for it. Security-sensitive public-facing services can benefit from a rewrite in a memory-safe language just because that way you know that a next &lt;a href="https://heartbleed.com/"&gt;Heartbleed&lt;/a&gt; is not lurking in your codebase.&lt;/p&gt;

&lt;p&gt;For a larger set of use cases, "does not segfault" is a useful property too, since it's easier to avoid data corruption in that case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ease of installation and maintenance
&lt;/h2&gt;

&lt;p&gt;If a program is written in Go, you know it's most likely self-contained and statically linked. You also know that it doesn't support plugins or live patching.&lt;/p&gt;

&lt;p&gt;If it's in Python, you know that special effort is required to create a self-contained package. However, you also know that you can load code run time, or edit a program on disk. &lt;/p&gt;

&lt;p&gt;Platform support also varies. If your target platform is an IBM mainframe, and a program you want is written in a language that only has an interpreter for x86 and ARM so far, you know you are out of luck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;"Written in $language" can be a &lt;em&gt;valuable&lt;/em&gt; piece of information at the very least.&lt;/p&gt;

&lt;p&gt;It's not to say that there are no projects whose only "advantage" over predecessors is different language—not even always a suitable one. But dismissing the language argument uncritically can be equally silly.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>TOML first class dates is a mistake</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Sat, 05 Dec 2020 14:37:06 +0000</pubDate>
      <link>https://dev.to/dmbaturin/toml-first-class-dates-is-a-mistake-1n2b</link>
      <guid>https://dev.to/dmbaturin/toml-first-class-dates-is-a-mistake-1n2b</guid>
      <description>&lt;p&gt;Making something a first-class entity may seem like an unquestinably good idea, but it's not always the case. Sometimes it creates more problems than it solves.&lt;/p&gt;

&lt;p&gt;I fear TOML's first-class dates is one of those cases. Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behaviour is ambiguous
&lt;/h2&gt;

&lt;p&gt;The TOML spec does a good job at specifying acceptable date and time formats. However, it doesn't say what implementations are supposed to do with them.&lt;/p&gt;

&lt;p&gt;What it says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;To unambiguously represent a specific instant in time, you may use an RFC 3339 formatted date-time with offset.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RFC3339 dates indeed specify a specific instant in time &lt;em&gt;in the past&lt;/em&gt;. They aren't good for things like "an offer valid until 2038-01-19 in Nebraska" because the UTC offset of the Nebraska time zone isn't guaranteed to stay the same until 2038. Timezone changes aren't even &lt;em&gt;that&lt;/em&gt; rare and haven't all occured decades ago: for example, Brazil stopped using DST in 2019.&lt;/p&gt;

&lt;p&gt;But, that's not really my point. My point is that the spec doesn't say whether the result of deserializing a TOML date should be a timezone-aware object or converting it to a UNIX timestamp is acceptable. In practice... it varies.&lt;/p&gt;

&lt;p&gt;Why this matters? If an implementation doesn't preserve timezone information (which it isn't required to do), then &lt;code&gt;dump(load(toml))&lt;/code&gt; is a lossy operation. It can be quite a serious issue for tools that automatically manipulate TOML files.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's no natural datetime type choice for every language
&lt;/h2&gt;

&lt;p&gt;Some languages, like Python or Go have datetime types and functions in their standard library. Whether a "batteries included" is a good approach or not is debatable.&lt;/p&gt;

&lt;p&gt;What isn't debatable is that other languages like Rust or OCaml do not have it built-in—they leave choice of a datetime library to use developer.&lt;/p&gt;

&lt;p&gt;However, it means that a TOML parsing library will have to either force a datatime library choice on developers who want to use it, or provide an abstraction mechanism.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;All in all, I think TOML would really be better off without first-class dates, which aren't even used all that often in the wild.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>General relativity vs complex analysis</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Mon, 30 Nov 2020 08:47:08 +0000</pubDate>
      <link>https://dev.to/dmbaturin/general-relativity-vs-complex-analysis-1m5a</link>
      <guid>https://dev.to/dmbaturin/general-relativity-vs-complex-analysis-1m5a</guid>
      <description>&lt;p&gt;There are two distinct categories of scientific discoveries and inventions: facts and methods.&lt;/p&gt;

&lt;p&gt;The great thing about "fact" discoveries is that they are often easy to give a one-line, catchy summary.&lt;/p&gt;

&lt;p&gt;If someone asks what's the big discovery of the general relativity, you can say "it's that massive bodies bend the spacetime around them". It will be a correcty, even if simplistic explanation. The best thing is that it can even be confirmed visually, with pictures of stars during a total solar eclipse and spectacular effects of &lt;a href="https://en.wikipedia.org/wiki/Gravitational_lens"&gt;gravitational lensing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's another class of discoveries that can be described as "methods". Complex analysis is a great example.&lt;/p&gt;

&lt;p&gt;High school students are sometimes taught complex numbers. Or rather a set of meaningless rules for manipulating imaginary numbers. Let's pretend there's a number &lt;em&gt;i&lt;/em&gt; such that &lt;em&gt;i^2 = -1&lt;/em&gt;. Very funny game, isn't it?&lt;/p&gt;

&lt;p&gt;The real big idea of complex analysis sounds vague and ambiguous to the uninitiated: you can discover properties of real functions by studying their complex-valued versions.&lt;/p&gt;

&lt;p&gt;You can classify singularities using a &lt;a href="https://en.wikipedia.org/wiki/Laurent_series"&gt;complex-valued equivalent of Taylor series&lt;/a&gt;, calculate contour integrals using &lt;a href="https://en.wikipedia.org/wiki/Residue_(complex_analysis)"&gt;just one point&lt;/a&gt; and find the &lt;a href="https://en.wikipedia.org/wiki/Gamma_function"&gt;factorial of &lt;code&gt;-3/2&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It also takes a few months of study to understand the power of complex analysis.&lt;/p&gt;

&lt;p&gt;What does it have to do with programming? Technically, in computer science and software engineering, every discovery is a "method".&lt;/p&gt;

&lt;p&gt;However, some discoveries are much closer to facts. For example, the &lt;a href="https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm"&gt;Dijkstra's algorithm&lt;/a&gt; is a fact: there's a quick way to find shortest paths in a graph. You can even make an animated demonstration.&lt;/p&gt;

&lt;p&gt;Many programming techniques, however, are exactly methods—not unlike complex analysis or group theory. Higher order functions, dependent types, formal verification and so on: they are useful and important, but don't allow for catchy and correct descriptions.&lt;/p&gt;

&lt;p&gt;Even relatively simple concepts like the World Wide Web can fall into this category. I'm pretty sure in 1990, a description like "it allows everyone to publish documents online and link to any other document" prompted a lot of "so what?" reactions.&lt;br&gt;
You have to see the Web in its advanced state to realize that it enables completely different usage patterns than any closed hypertext environment.&lt;/p&gt;

&lt;p&gt;Thus, if you see a description that seems vague, it may not be a communication failure. Maybe its very nature makes a consice description impossible.&lt;/p&gt;

&lt;p&gt;How to tell if it's the case, or if a proposed method is any good (or if it even works) is another question.&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>How to make an informative project README</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Fri, 27 Nov 2020 08:10:41 +0000</pubDate>
      <link>https://dev.to/dmbaturin/how-to-make-an-informative-project-readme-gi3</link>
      <guid>https://dev.to/dmbaturin/how-to-make-an-informative-project-readme-gi3</guid>
      <description>&lt;p&gt;There are lots of projects with rudimentary READMEs. It's sad because many of those are good, promising projects, but they make it hard for prospective users to assess them and try them out.&lt;br&gt;
There are also people who advocate flashy READMEs with images, animated GIFs and lots of shields. Being flashy isn't always a bad idea by itself, but a README must be informative first.&lt;/p&gt;

&lt;p&gt;Here's my checklist for making READMEs informative.&lt;/p&gt;
&lt;h2&gt;
  
  
  Add usage examples
&lt;/h2&gt;

&lt;p&gt;A bunch of examples cannot replace proper reference documentation, but reference documentation cannot replace introductory examples either.&lt;/p&gt;

&lt;p&gt;As a potential user, I want to see what is it like to use your project. For a GUI tool, screenshot is an obvious way to show what it looks like. Libraries and CLI tools benefit from it even more though.&lt;/p&gt;
&lt;h3&gt;
  
  
  For libraries, show a self-contained program
&lt;/h3&gt;

&lt;p&gt;When I'm looking for libraries, I find a demonstration in a REPL or a small self-contained program very helpful.&lt;/p&gt;

&lt;p&gt;If your library is hard to demo that way, maybe the library itself needs work. For example, when I wanted to sort dependencies, one thing I found annoying about existing graph manipulation libraries is how much initialization they need, when I &lt;em&gt;just&lt;/em&gt; wanted to sort dependencies.&lt;/p&gt;

&lt;p&gt;So one of my goals for &lt;a href="https://github.com/dmbaturin/ocaml-tsort"&gt;ocaml-tsort&lt;/a&gt; was to make it easy to show in a one-line example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"tsort"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="nn"&gt;Tsort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"roof"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"walls"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"foundation"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"walls"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"foundation"&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nn"&gt;Tsort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Tsort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sorted&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"foundation"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="s2"&gt;"walls"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="s2"&gt;"roof"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some projects, like MVC frameworks, are genuinely difficult to showcase in a README. In that case a "starter project" repo can be a good alternative.&lt;/p&gt;

&lt;h3&gt;
  
  
  For CLI tools, show output or use animated demos
&lt;/h3&gt;

&lt;p&gt;CLI tools can benefit from some examples &lt;em&gt;with output&lt;/em&gt;. Man pages usually just give you command examples with descriptions, but if you can show how the tool changes its input data, that's much better.&lt;/p&gt;

&lt;p&gt;Tools that work with text are usually easy to showcase. Suppose you were to tell a novice about &lt;a href="https://en.wikipedia.org/wiki/Sed"&gt;sed&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sed is a tool for non-interactive text editing.

Example: replace every occurence of "hello" with "hi".

$ echo "hello world" | sed -e 's/hello/hi/g'
hi world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your tool works with files and directories, you can show before/after &lt;code&gt;tree&lt;/code&gt; outputs.&lt;/p&gt;

&lt;p&gt;Interactive tools can be difficult to showcase, but if you aren't limited to plain text, you can do it with an animated GIF or a video. I love how &lt;a href="https://github.com/nvbn/thefuck"&gt;thefuck&lt;/a&gt; did it, for example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add build/installation instructions
&lt;/h2&gt;

&lt;p&gt;Even if it's just the "usual procedure", say what that procedure is!&lt;/p&gt;

&lt;p&gt;One reason is that a user may be coming from another language and isn't familiar with &lt;em&gt;your&lt;/em&gt; language and ecosystem convention.&lt;br&gt;
C programmers who suddenly need to install a JS application may have never encountered &lt;code&gt;npm&lt;/code&gt; before, while JS programmers may not know that &lt;code&gt;./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;/code&gt; is a usual procedure for a C project.&lt;/p&gt;

&lt;p&gt;Another reason is to reassure users that there's no unusual procedure. I see &lt;code&gt;./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;/code&gt; and I know that I will not need to install a fashionable build tool of the week and purchase black candles to build your project.&lt;/p&gt;

&lt;p&gt;You should make sure that your stated procedure actually works from a clean repo state. For example, some users of GNU autotools don't include autogenerated &lt;code&gt;configure&lt;/code&gt; scripts and makefiles in the git repos and don't tell the user to run &lt;code&gt;autoreconf -i&lt;/code&gt; in their README.&lt;br&gt;
Then users who never created their own autotools projects see "Run &lt;code&gt;./configure&lt;/code&gt;" and wonder how to run it if there's no &lt;code&gt;./configure&lt;/code&gt; to begin with.&lt;br&gt;
You can avoid that confusion with just one additional line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ autoreconf -i
$ ./configure &amp;amp;&amp;amp; make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Specify your dependencies
&lt;/h2&gt;

&lt;p&gt;Some people just cannot use latest versions of everything, no matter how much they want it. There are many reasons people may not be able to "just" upgrade.&lt;/p&gt;

&lt;p&gt;For those people, it's really important to know if they can even use your project at all. So, if your project needs Python 3.7, then people stuck with 3.6 will know they cannot use it.&lt;/p&gt;

&lt;p&gt;If you don't know your minimum requirements, then you should find out. &lt;/p&gt;

&lt;h2&gt;
  
  
  Specify expected level of maintenance and community interaction
&lt;/h2&gt;

&lt;p&gt;Every open source license comes with a clause that says there's no warranty. We all understand that in practice, that situation is very different for, say, the Linux kernel and a script I cobbled together for a one-off task and uploaded in hope someone else some day finds it useful.&lt;/p&gt;

&lt;p&gt;Sadly there's no commonly accepted way to specify how much effort you &lt;em&gt;intend&lt;/em&gt; to put into handling bug reports and interacting with the community.&lt;/p&gt;

&lt;p&gt;There's a "&lt;a href="http://unmaintained.tech/"&gt;no maintenance intended&lt;/a&gt;" shield meant for completely abandoned projects. &lt;/p&gt;

&lt;p&gt;Some informal statements may help, like "I'm using this in production and I'm ready to fix bugs" or "I'm not planning to add support for use cases I don't have, but I'm ready to merge your patches".&lt;/p&gt;

&lt;p&gt;Make sure you actually follow your own policy of course. If your README says "Bug reports and contributions are welcome", but in reality you auto-close them for "inactivity", you need to reconsider it.&lt;/p&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>Tidy up your GitHub account </title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Thu, 19 Nov 2020 09:06:21 +0000</pubDate>
      <link>https://dev.to/dmbaturin/tidy-up-your-github-account-5ele</link>
      <guid>https://dev.to/dmbaturin/tidy-up-your-github-account-5ele</guid>
      <description>&lt;p&gt;End of the year is a designated special time. One of the things I try to do is cleaning up my GitHub account. Here's my checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Archive inactive repositories
&lt;/h2&gt;

&lt;p&gt;Some people advocate deleting "unneeded" repositories. That advice was in the widely popular &lt;a href="https://anti-pattern.com/github-is-your-resume-now"&gt;GitHub is your resume now&lt;/a&gt; post for example, and many repeated it since then.&lt;/p&gt;

&lt;p&gt;However, if you aren't actively working on something now and/or see it as "low value", it doesn't mean you will never work on it again, or that no one is using it.&lt;/p&gt;

&lt;p&gt;You may want to mark then as inactive by &lt;a href="https://github.blog/2017-11-08-archiving-repositories/"&gt;archiving&lt;/a&gt; them instead. When you archive a repository, it's made read-only, and visitors see a warning that it was archived by the owner. You can un-archive it at any time later.&lt;/p&gt;

&lt;h3&gt;
  
  
  ...or make them private.
&lt;/h3&gt;

&lt;p&gt;Now that GitHub allows creating private repositories for free, you may want to make use of it too. If you want to keep an old project for the reference or nostalgia, but don't want it to "pollute" your GitHub profile, you can hide it from the public view instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update your pinned repositories
&lt;/h2&gt;

&lt;p&gt;Whether peers and recruiters &lt;em&gt;should&lt;/em&gt; treat one's GitHub account as a resume and portfolio substitute or not is a serious question. The truth is that many people &lt;em&gt;do&lt;/em&gt; treat it as such, so how it looks to them is a real concern.&lt;/p&gt;

&lt;p&gt;When the (in)famous "GitHub is your resume now" post was written, GitHub would only show your &lt;em&gt;most popular&lt;/em&gt; repositories on the profile page.&lt;/p&gt;

&lt;p&gt;Luckily, GitHub developers added more ways to customize your profile page. Now you can &lt;a href="https://docs.github.com/en/free-pro-team@latest/github/setting-up-and-managing-your-github-profile/pinning-items-to-your-profile"&gt;pin&lt;/a&gt; up to six repos on the profile page. This makes having a lot of repos much less of a problem.&lt;/p&gt;

&lt;p&gt;If that isn't enough, you can also create a profile README by creating a repository that matches your username and adding a README.md file to it.&lt;/p&gt;

&lt;p&gt;No need to resort to book^W repository burning to make your profile serve as a better resume/portfolio page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delete genuinely unused forks
&lt;/h2&gt;

&lt;p&gt;There's often a tendency to keep forks of other people's repos for way too long after your pull requests are merged.&lt;/p&gt;

&lt;p&gt;If you aren't working on a repo fork, it may really be better to delete it. You can always fork it again.&lt;/p&gt;

&lt;p&gt;If you are concerned about repo's fate, like it happened with youtube-dl lately, it's better to maintain mirrors on independent code hosting services that are concerned with digital freedom and privacy, like &lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt; or &lt;a href="https://sr.ht"&gt;SourceHut&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walk through your pull requests
&lt;/h2&gt;

&lt;p&gt;We all want things to move fast, but it's still a fact of life: sometimes pull requests linger for months or even years.&lt;/p&gt;

&lt;p&gt;And sometimes it's &lt;em&gt;we&lt;/em&gt; who forgot to merge PRs, or make changes when repo owners request them.&lt;/p&gt;

&lt;p&gt;If you are tidying up your account, it's a good idea to walk through both incoming and outgoing PRs. Merge or reject incoming PRs. If your own PRs don't get any attention, ping the repo owner. If they want you to change something, make the change.&lt;/p&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>TOML: the annoying parts</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Wed, 18 Nov 2020 01:57:37 +0000</pubDate>
      <link>https://dev.to/dmbaturin/toml-the-annoying-parts-5h5c</link>
      <guid>https://dev.to/dmbaturin/toml-the-annoying-parts-5h5c</guid>
      <description>&lt;p&gt;If your project needs a configuration file, &lt;a href="https://toml.io/en/"&gt;TOML&lt;/a&gt; is usually the best format.&lt;br&gt;
It's definitely easier to read and write than JSON, and much less fragile and ambiguous than YAML. There are comments, real booleans, and multi-line string literals.&lt;br&gt;
It also offers better flexibility than classic INI-like formats, and there's a &lt;a href="https://toml.io/en/latest"&gt;spec&lt;/a&gt; where users can learn the syntax.&lt;/p&gt;

&lt;p&gt;I went for TOML when I wrote the &lt;a href="https://soupault.neocities.org"&gt;Soupault&lt;/a&gt; static site generator/HTML processor, and in these 1.5 years that I've been using it and working on it, I never thought "I wish I'd chosen something else". None of the users told me they wish it used something else either.&lt;br&gt;
However, there are still annoying points that I hope will be improved some day.&lt;/p&gt;
&lt;h2&gt;
  
  
  Paste-ability
&lt;/h2&gt;

&lt;p&gt;Don't we all like to paste configuration snippets from tutorials and other people's configs?&lt;/p&gt;

&lt;p&gt;When nested tables are involved, TOML doesn't make it especially easy to paste, or even discuss configuration options.&lt;/p&gt;

&lt;p&gt;Consider this config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[settings]&lt;/span&gt;
  &lt;span class="py"&gt;verbose&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="py"&gt;debug&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How are we going to talk about those options in the docs?&lt;br&gt;
Let's try this: "When &lt;code&gt;settings.verbose = true&lt;/code&gt;, build progress output will be printed to the console".&lt;br&gt;
Users cannot paste &lt;code&gt;settings.verbose = true&lt;/code&gt; into that config because TOML doesn't allow re-defining options.&lt;/p&gt;

&lt;p&gt;This is an invalid config because the &lt;code&gt;verbose&lt;/code&gt; option is re-defined:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;settings.verbose&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[settings]&lt;/span&gt;
  &lt;span class="py"&gt;verbose&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="py"&gt;debug&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It gets funnier. This is technically valid TOML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[settings]&lt;/span&gt;
  &lt;span class="py"&gt;verbose&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="py"&gt;debug&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="py"&gt;settings.verbose&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It just doesn't mean what one may think it means: the last option is interpeted as &lt;code&gt;settings.settings.verbose&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, best you can do when talking about options is to use lengthy descriptions like "Option &lt;code&gt;verbose&lt;/code&gt; in the &lt;code&gt;[settings]&lt;/code&gt; table".&lt;br&gt;
Well, or avoid using tables, but it defeats the purpose.&lt;/p&gt;

&lt;p&gt;If I were designing a format from scratch, I would likely avoid having both &lt;code&gt;[table]\n key&lt;/code&gt; and &lt;code&gt;table.key&lt;/code&gt; notations because they clearly don't compose.&lt;/p&gt;
&lt;h2&gt;
  
  
  Unordered tables
&lt;/h2&gt;

&lt;p&gt;Sometimes I wish the standard mandated that tables were ordered dicts. If you need order, you can only use lists of tables (and their syntax and behaviour are rather clumsy and not obvious), or provide a different way to specify the order.&lt;/p&gt;

&lt;p&gt;When I wanted to make it possible to use output of one "widget" as an input for another, I chose to add an explicit &lt;code&gt;after&lt;/code&gt; option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# Highlights the link to the current section in the navigation menu&lt;/span&gt;
&lt;span class="nn"&gt;[widgets.section-link-highlight]&lt;/span&gt;
  &lt;span class="py"&gt;after&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"insert-nav-menu"&lt;/span&gt;
  &lt;span class="py"&gt;widget&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"section-link-highlight"&lt;/span&gt;

  &lt;span class="py"&gt;active_link_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nav-active"&lt;/span&gt;
  &lt;span class="py"&gt;selector&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"div#nav"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maybe the fact that users can specify multiple dependencies with &lt;code&gt;after = ["widget-1", "widget-2"]&lt;/code&gt; is a good thing, but it may also make complex configs hard to follow.&lt;/p&gt;

&lt;p&gt;I suppose one reason TOML designers made tables unordered is that it's how hash tables/dicts work in most languages. In Python you have &lt;code&gt;OrderedDict&lt;/code&gt;, and in OCaml or Haskell you can use a &lt;em&gt;(string × α) list&lt;/em&gt;. There's no equally common and straightforward way to do that in JS or many other languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic manipulation
&lt;/h2&gt;

&lt;p&gt;Unordered tables and "more than one way to do it" mean parsing and formatting TOML objects isn't a lossless operation. None of existing libraries can parse a TOML file and print it back as it came.&lt;/p&gt;

&lt;p&gt;It's hard to blame them. Preserving comments, line numbers, and whether a table was normal or inline for example—these are all pretty hard tasks. They are also unnecessary if you only want to de/serialize TOML.&lt;/p&gt;

&lt;p&gt;If you are writing a validator or convertor, then things are different.&lt;/p&gt;

&lt;p&gt;When I had to make some &lt;a href="https://soupault.neocities.org/blog/soupault-2.0.0-beta1-release/"&gt;breaking changes&lt;/a&gt; to the config syntax, I made a convertor from the old format to new to simplify migration for users.&lt;/p&gt;

&lt;p&gt;However, what it outputs is quite far from the config that comes in. You'll lose all your comments at the very least.&lt;br&gt;
I tried to alleviate it by making the convertor output a detailed log of the changes it's making so that users can replicate them by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I don't regret going with TOML for the configuration format. There's still room for improvement in its tooling and usage conventions though, and I hope that I or someone else will be able to make those improvements. &lt;/p&gt;

</description>
      <category>tooling</category>
    </item>
    <item>
      <title>HTML5 details element: equally great and disappointing </title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Mon, 16 Nov 2020 01:15:05 +0000</pubDate>
      <link>https://dev.to/dmbaturin/html5-details-element-equally-great-and-disappointing-1ebi</link>
      <guid>https://dev.to/dmbaturin/html5-details-element-equally-great-and-disappointing-1ebi</guid>
      <description>&lt;p&gt;I love making websites that work without JS. That's why I also love all web standards that make it easier.&lt;/p&gt;

&lt;p&gt;HTML5 &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element promises to make collapsible blocks and tree views first class entities in web pages. All in all it feels like a great success—with a few frustrating shortcomings when it comes to styling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility and graceful degradation
&lt;/h2&gt;

&lt;p&gt;It works in every browser released in &lt;a href="https://caniuse.com/details"&gt;2017 and later&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since web browsers simply ignore unknown elements, it also degrades gracefully: the content of &lt;code&gt;&amp;lt;details&lt;/code&gt;&amp;gt; is just shown by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Styling
&lt;/h2&gt;

&lt;p&gt;One issue is that people who aren't well-familiar with this element often don't realize that the element is clickable and that the triangle is a part of the "button".&lt;/p&gt;

&lt;p&gt;It's not surprising, since that element breaks the desktop  convention. You can alleviate it with a bit of CSS though.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;summary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, I'm still surprised why it's not the default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Styling the button itself
&lt;/h3&gt;

&lt;p&gt;What's more surprising is that there's no easy, or even standard way to style the "expand" button itself.&lt;/p&gt;

&lt;p&gt;This feels especially weird. If HTML form elements can be styled in arbitrary ways, why should &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; be an exception?&lt;/p&gt;

&lt;p&gt;In any case, the standard doesn't define that, and different browsers do it differently.&lt;/p&gt;

&lt;p&gt;In Firefox, you can easily style the button with &lt;code&gt;list-style-type&lt;/code&gt; or &lt;code&gt;list-style-image&lt;/code&gt; properties. Sadly, this &lt;em&gt;only&lt;/em&gt; works in Firefox.&lt;/p&gt;

&lt;p&gt;In Chrome and Edge you can only disable that button with this pseudo-element rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="nd"&gt;::-webkit-details-marker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can insert a symbol or an image with a &lt;code&gt;::before&lt;/code&gt; selector.&lt;/p&gt;

&lt;p&gt;So, the only somewhat cross-browser way is to disable its display with &lt;code&gt;list-style-type: none&lt;/code&gt; (for Firefox) and with above rule for Chrome, then insert your own "button" one way or another.&lt;/p&gt;

&lt;p&gt;Still even that won't work in Opera and Safari.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;That's the frequently overlooked part! There are some impressive hacks that emulate collapsible elements with heavily-styled radio buttons and CSS, but it's a nightmare for screen reader users because the semantics of it all are opaque.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;, user agents know what it is and can present it in an appropriate way in each medium.&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Multi-line string literals</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Mon, 09 Nov 2020 21:52:47 +0000</pubDate>
      <link>https://dev.to/dmbaturin/multi-line-string-literals-4agg</link>
      <guid>https://dev.to/dmbaturin/multi-line-string-literals-4agg</guid>
      <description>&lt;h2&gt;
  
  
  Python
&lt;/h2&gt;

&lt;p&gt;I suppose most people know that Python allows writing multi-line string literals in triple quotes. This feature relatively hard to miss because it's used in docstrings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="s"&gt;""" Prints a greeting """&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using it for variables is also common.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'''
hello
world
'''&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All in all, it's an easily discoverable feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lua
&lt;/h2&gt;

&lt;p&gt;It's less widely known that Lua supports multi-line strings because it uses unusual delimiters: double square brackets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[[
hello
world
]]&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's see if it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ lua ./test.lua 
hello
world

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you remember the delimiter, it's not harder to use than Python's triple quotes.&lt;/p&gt;

&lt;p&gt;This syntax is also used by the &lt;a href="https://github.com/toml-lang/toml"&gt;TOML&lt;/a&gt; serialization format.&lt;/p&gt;

&lt;h2&gt;
  
  
  OCaml
&lt;/h2&gt;

&lt;p&gt;OCaml's approach is the easiest of all. However, it's also the least easily &lt;em&gt;discoverable&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To write a multi-line string, you... need not do anything special. You can use add line breaks to normal strings and the lexer will understand them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"
hello
world
"&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%s"&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ocamlopt -o test ./test.ml 

$ ./test 

hello
world

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>lua</category>
      <category>python</category>
      <category>ocaml</category>
    </item>
    <item>
      <title>Can we make searching for Hacktoberfest projects to contribute easier next year?</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Wed, 04 Nov 2020 19:01:39 +0000</pubDate>
      <link>https://dev.to/dmbaturin/can-we-make-searching-for-hacktoberfest-projects-to-contribute-easier-next-year-657</link>
      <guid>https://dev.to/dmbaturin/can-we-make-searching-for-hacktoberfest-projects-to-contribute-easier-next-year-657</guid>
      <description>&lt;p&gt;It was the first time I participated. I've heard something about the Hacktobefest before, but never paid attention—not least because contributing to various projects is a part of my daily work and life and I never looked for events encouraging people to contribute.&lt;/p&gt;

&lt;p&gt;I have to admit the PR spam drama was what got me curious enough to actually take a look. Initially I thought I'll use the challenge to make some PRs I was going to make but kept leaving for later.&lt;/p&gt;

&lt;p&gt;Then came the rules change. I thought if I registered for that thing anyway, I can as well use it as a challenge to find new interesting projects. Indeed, I discovered &lt;a href="https://tldr.sh/"&gt;TL;DR pages&lt;/a&gt; and added some OCaml tools to their collection.&lt;/p&gt;

&lt;p&gt;It may actually be good that Hacktoberfest 2020 essentially &lt;em&gt;forced&lt;/em&gt; people to discover new projects if they want to participate. &lt;br&gt;
However, I found searching for projects much more difficult than it should be. The &lt;a href="https://github.com/topics/hacktoberfest"&gt;/topics/hacktoberfest&lt;/a&gt; page doesn't provide an obvious way to search for more than one topic. I hope there &lt;em&gt;is&lt;/em&gt; a way to do that, but I couldn't find it it.&lt;br&gt;
Without an easy way to customize the search query, all you can do is to "load more" and hope for something that interests you.&lt;/p&gt;

&lt;p&gt;If next year's Hacktoberfest will also be opt-in, I hope searching for projects will be made easier.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>If you like a project, test its development versions</title>
      <dc:creator>Daniil Baturin</dc:creator>
      <pubDate>Wed, 04 Nov 2020 13:06:50 +0000</pubDate>
      <link>https://dev.to/dmbaturin/if-you-like-a-project-test-its-development-versions-133f</link>
      <guid>https://dev.to/dmbaturin/if-you-like-a-project-test-its-development-versions-133f</guid>
      <description>&lt;p&gt;Bugs in open source projects are often highly visible and create a lot of trouble for maintainers and users alike. &lt;/p&gt;

&lt;p&gt;Bugs in libraries can require both upstream and downstream maintainers make difficult decisions, too. Suppose an unintended breaking change is found in libfoo 1.5.0. Now maintainers not only need to fix that bug, they also need to decide whether to try "un-releasing" the broken version, how to notify the users of the problem and so on.&lt;/p&gt;

&lt;p&gt;Myself I always test betas and code from the master branch whenever I can, with projects I use often. This behaviour is not &lt;em&gt;entirely&lt;/em&gt; altruistic: I know that if a bug makes it into a released version before I see it, I will be in trouble as much as the maintainers.&lt;br&gt;
As an open source maintainer, I also know that my downstream users will be in trouble if my dependencies have bugs.&lt;/p&gt;

&lt;p&gt;It can be hard to find time for testing. However, I often see that people underestimate the importance of it. They think it wouldn't make a difference and they aren't good testers.&lt;/p&gt;

&lt;p&gt;In reality, no one is a bad tester. Any testing is important, and every maintainer will (at least, should) appreciate any testing effort.&lt;/p&gt;

&lt;p&gt;Here are some common misconeptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  It works for me, thus the maintainers already know it works
&lt;/h2&gt;

&lt;p&gt;They may know that it works for &lt;em&gt;them&lt;/em&gt;. They have no way to know that it works for you until you tell them.&lt;/p&gt;

&lt;p&gt;It's very nice and reassuring to hear from users that a new feature works for them as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Someone else is already testing it
&lt;/h2&gt;

&lt;p&gt;There's often a bizzare situation when everyone thinks someone else is already doing it, only to find out that no one did.&lt;/p&gt;

&lt;p&gt;Even if someone is really testing it already, doesn't mean you should not. Chances are what they are doing isn't &lt;em&gt;exactly&lt;/em&gt; the same, or their environment isn't exactly the same as yours.&lt;/p&gt;

&lt;p&gt;Many bugs require specific environment settings to trigger: certain hardware, combination of options, dependency versions or something else. Even the largest and well-funded projects don't have resources to test every combination, so community help is required to catch and reproduce them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The project has automated tests
&lt;/h2&gt;

&lt;p&gt;Unit tests are great, but they can only test functions in isolation. Even automated integration/acceptance tests only catch problems that developers know may happen. Nothing catches the unknowns.&lt;/p&gt;

&lt;p&gt;Even formal methods can only prove that the code matches developers' assumptions.&lt;/p&gt;

&lt;p&gt;While some bugs are indeed simply programming errors, many more are caused by missing or incorrect assumptions about the ways the code interacts with the environment, or the ways different parts of the code interact with one another.&lt;/p&gt;

&lt;h2&gt;
  
  
  My workflow is so ordinary, how can my testing help?
&lt;/h2&gt;

&lt;p&gt;You may think your setup and workflow is completely ordinary, and you need to be doing something special, outside of your normal workflow, to be a useful tester.&lt;/p&gt;

&lt;p&gt;It isn't true! First, your workflow is almost surely different from that of the developers at least in &lt;em&gt;some&lt;/em&gt; ways. Second, you have an excellent intuition for the right and wrong, and can spot even slightly odd behaviour easily.&lt;/p&gt;

&lt;p&gt;Any maintainer will appreciate a dedicated tester who goes to great lengths to try the code in unusual settings, test uncommon paths, and push the code to its extremes.&lt;/p&gt;

&lt;p&gt;However, even just doing what you are always doing, just with a development version instead of a stable one, and telling developers that it works for you is already valuable. &lt;/p&gt;

</description>
      <category>testing</category>
    </item>
  </channel>
</rss>
