<?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: T.J. Telan</title>
    <description>The latest articles on DEV Community by T.J. Telan (@tjtelan).</description>
    <link>https://dev.to/tjtelan</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%2F118508%2Fce13f546-34cf-4046-b572-6b95bf59a4ee.jpeg</url>
      <title>DEV Community: T.J. Telan</title>
      <link>https://dev.to/tjtelan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tjtelan"/>
    <language>en</language>
    <item>
      <title>How to Build a Custom Integration Test Harness in Rust</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Mon, 26 Apr 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/how-to-build-a-custom-integration-test-harness-in-rust-7n7</link>
      <guid>https://dev.to/tjtelan/how-to-build-a-custom-integration-test-harness-in-rust-7n7</guid>
      <description>&lt;p&gt;I ran into a problem effectively using &lt;code&gt;cargo test&lt;/code&gt; in &lt;a href="https://github.com/infinyon/fluvio"&gt;Fluvio&lt;/a&gt; for integration testing&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s talk about integration testing in Rust
&lt;/h2&gt;

&lt;p&gt;While creating integration testing for Fluvio, I ran into a problem. Organizing and executing integration tests with &lt;code&gt;cargo test&lt;/code&gt; was becoming inefficient. We needed to standardize the setup of a test environment. &lt;/p&gt;

&lt;p&gt;As a lone developer, you can apply one-off customizations when running tests locally. But if you try to extend that strategy to continuous integration, you’ll quickly find that making changes manually becomes burdensome. CI encourages testing many different configurations, which means a successful CI plan requires easy management of test harness variables (a.k.a. Not manually updating variables for every test you need to run).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cargo test&lt;/code&gt; is just not equipped to handle this specialized focus on environment setup, or the cleanup/teardown needed after a test is run. When using &lt;code&gt;cargo test&lt;/code&gt;, these crucial tasks could only occur outside of the harness or within the logic of a test. Neither of these are good choices. Outside of the harness is not ideal because these processes end up too disconnected and hard to maintain. Likewise, including setup/teardown within the logic of a test is inappropriate because it creates mental overhead for a test writer, and may obscure the results of tests.&lt;/p&gt;

&lt;p&gt;I needed to find a way around the limited functionality of &lt;code&gt;cargo test&lt;/code&gt; -- keep reading to find out how I did it by creating a standardized setup and teardown as part of our testing harness.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does &lt;code&gt;cargo test&lt;/code&gt; work by default?
&lt;/h3&gt;

&lt;p&gt;There is a distinction between unit tests and integration tests in &lt;a href="https://doc.rust-lang.org/book/ch11-03-test-organization.html"&gt;the Rust book&lt;/a&gt;. The distinction is less about testing strategy and more about defining Rust’s conventions for test organization.&lt;/p&gt;

&lt;p&gt;The main points are that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your tests are annotated with &lt;code&gt;#[test]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rust-lang/libtest"&gt;libtest&lt;/a&gt; harness enumerates through all of your tests (a point we’ll revisit later in more detail)&lt;/li&gt;
&lt;li&gt;libtest returns the pass/fail status of the execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What do I need from integration testing?
&lt;/h3&gt;

&lt;p&gt;Libtest doesn't specifically offer anything to support integration testing patterns.&lt;/p&gt;

&lt;p&gt;Setup of a standard test environment – especially in a complex system – is essential for managing expected behavior when making code changes.&lt;/p&gt;

&lt;p&gt;Unfortunately libtest does not assist with setup or teardown. I needed the ability to abstract away the setup and teardown of my test environment from test code. &lt;/p&gt;

&lt;p&gt;This task will be performed either way. Without harness support, setup/teardown will be performed via external shell scripts or padding the setup/teardown process within every single integration test... (no one's idea of fun).&lt;/p&gt;

&lt;p&gt;It isn’t convenient to manage setup and teardown in a different context than the integration test. This kind of testing overhead leads to hard-to-reproduce and time consuming mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where do we get started with a custom test harness?
&lt;/h3&gt;

&lt;p&gt;By default, libtest will compile each of your &lt;code&gt;#[test]&lt;/code&gt; labeled functions into their own binary crates (with its own &lt;code&gt;main()&lt;/code&gt;) and executes it as part of the test. But we’re going to build all our integration tests into a single crate. This is recommended in order to speed up compile time ([&lt;a href="https://endler.dev/2020/rust-compile-times/#combine-all-integration-tests-in-a-single-binary"&gt;1&lt;/a&gt;], [&lt;a href="https://matklad.github.io/2021/02/27/delete-cargo-integration-tests.html"&gt;2&lt;/a&gt;])&lt;/p&gt;

&lt;p&gt;First we’re going to create an integration test directory at the root of the crate where we’re going to build our integration test focused binary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;integration
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;integration/main.rs

&lt;span class="c"&gt;# Then create a main() function in main.rs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your Cargo.toml, you want to add&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;# Cargo.toml&lt;/span&gt;

&lt;span class="c"&gt;# We'll revisit the `inventory` crate later in the post&lt;/span&gt;
&lt;span class="nn"&gt;[dev-dependencies]&lt;/span&gt;
&lt;span class="py"&gt;inventory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1"&lt;/span&gt;

&lt;span class="nn"&gt;[[test]]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"integration"&lt;/span&gt;
&lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"integration/main.rs"&lt;/span&gt;
&lt;span class="py"&gt;harness&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;This tells cargo test to not use libtest when running the &lt;code&gt;integration&lt;/code&gt; test.&lt;/p&gt;

&lt;p&gt;When we run &lt;code&gt;cargo test integration&lt;/code&gt;, what cargo will compile &lt;code&gt;integration/main.rs&lt;/code&gt; and execute it in the same manner as &lt;code&gt;cargo run&lt;/code&gt;. This is all a harness is from &lt;code&gt;cargo&lt;/code&gt;’s perspective. &lt;/p&gt;

&lt;h3&gt;
  
  
  Add Setup and teardown steps
&lt;/h3&gt;

&lt;p&gt;Next we’ll lay the foundation for our testing pattern. We’ll create 2 functions, &lt;code&gt;setup()&lt;/code&gt; and &lt;code&gt;teardown()&lt;/code&gt;, and add them to our &lt;code&gt;main()&lt;/code&gt; (with reserved space in between for our future tests to be called).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c"&gt;// main.rs&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Setup"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;teardown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Teardown"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c"&gt;// Setup test environment&lt;/span&gt;
   &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

   &lt;span class="c"&gt;// TODO: Run the test&lt;/span&gt;

   &lt;span class="c"&gt;// Teardown test environment&lt;/span&gt;
   &lt;span class="nf"&gt;teardown&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;h3&gt;
  
  
  Collect all integration tests
&lt;/h3&gt;

&lt;p&gt;To do its job, our test runner needs to create a list of all the test functions. Initially, I thought there would be an easy way to do this by leveraging &lt;a href="https://github.com/rust-lang/libtest"&gt;libtest&lt;/a&gt;'s &lt;code&gt;#[test]&lt;/code&gt; attribute. &lt;/p&gt;

&lt;p&gt;I dug around in &lt;a href="https://github.com/rust-lang/libtest/blob/master/libtest/lib.rs"&gt;relevant areas of libtest&lt;/a&gt; and &lt;a href="https://github.com/rust-lang/cargo/blob/master/src/cargo/ops/cargo_test.rs"&gt;Cargo test&lt;/a&gt; and &lt;a href="https://github.com/rust-lang/rust/blob/master/compiler/rustc_builtin_macros/src/test.rs"&gt;Rustc macros&lt;/a&gt; code, but long (sad) story short, there is no straightforward way to reuse libtest for the purpose of test collection.&lt;/p&gt;

&lt;p&gt;If that surprises you, then you're like me. I had hoped to use the test collection functionality from &lt;code&gt;#[test]&lt;/code&gt;, but it wasn’t clear how I could accomplish this. My mental model for how &lt;code&gt;cargo test&lt;/code&gt; works needed a refresh.&lt;/p&gt;

&lt;p&gt;Now that we’ve removed the option of using libtest, so that gives you 2 practical options for collecting tests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manually modify &lt;code&gt;integration/main.rs&lt;/code&gt; and add your test in between the setup and teardown

&lt;ul&gt;
&lt;li&gt;A quick and straightforward solution if you have a small set of tests&lt;/li&gt;
&lt;li&gt;This option requires us to add new tests to this list, which can be error-prone and tedious as we grow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Build a test collector. We generate an external test catalog, and modify &lt;code&gt;integration/main.rs&lt;/code&gt; to execute tests from the catalog.

&lt;ul&gt;
&lt;li&gt;This is a long term solution, which we’ll be covering for the rest of the post.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Building the test collector
&lt;/h3&gt;

&lt;p&gt;For this test collector, we'll be utilizing a crate. The &lt;a href="https://crates.io/crates/inventory"&gt;inventory&lt;/a&gt; crate is a plugin registry system. We'll be using it for all the heavy lifting in our test framework, which means we'll be treating our tests as plugins.&lt;/p&gt;

&lt;p&gt;In our &lt;code&gt;main.rs&lt;/code&gt;, let’s declare a new module &lt;code&gt;tests&lt;/code&gt;, where we can organize all the integration tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt; main.rs

+ pub mod tests;

fn setup() {
   println!("Setup")
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;fn teardown() {
&lt;/span&gt;   println!("Teardown")
&lt;span class="err"&gt;}&lt;/span&gt;
fn main() {
   // Setup test environment
   setup();

   // TODO: Run the test

   // Teardown test environment
   teardown();
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our new module, we’ll start by creating a struct to represent a single test for the plugin registry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c"&gt;// tests/mod.rs&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Debug)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;IntegrationTest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'static&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;test_fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nn"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;collect!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntegrationTest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, our struct &lt;code&gt;IntegrationTest&lt;/code&gt; has 2 fields. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;name&lt;/code&gt; is a human-readable name, which can be used as a key for test selection.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;test_fn&lt;/code&gt; is a pointer to a function whose signature is non-async, takes no args, and does not return anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note:  You can use functions that take args, and return things.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;test_fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;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 we call the &lt;code&gt;inventory::collect!()&lt;/code&gt;macro to instantiate a plugin registry. When we write our tests, we’ll add to the plugin registry. More on this next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding new tests to plugin registry
&lt;/h3&gt;

&lt;p&gt;We’re going to add a new basic test to the plugin registry. Start by adding a new submodule called &lt;code&gt;basic&lt;/code&gt; in the tests module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c"&gt;// tests/mod.rs&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;basic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;code&gt;basic&lt;/code&gt; module, we write our basic test &lt;code&gt;basic_test()&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c"&gt;// tests/basic.rs&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IntegrationTest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;basic_test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Running basic test"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nn"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;submit!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntegrationTest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"basic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;test_fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;basic_test&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll use &lt;code&gt;inventory::submit!()&lt;/code&gt; to register our new test with the &lt;code&gt;IntegrationTest&lt;/code&gt; struct we defined earlier.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;name&lt;/code&gt; is a friendly, human-readable name. We can use this name as a key to search through the plugin registry.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;test_fn&lt;/code&gt; takes the name of our test function. It has the same function signature as we defined. &lt;/p&gt;

&lt;h3&gt;
  
  
  Running tests from registry
&lt;/h3&gt;

&lt;p&gt;We’ll finish this example up by running all of our registered tests&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt; main.rs

pub mod tests;
&lt;span class="gi"&gt;+ use tests::IntegrationTest;
&lt;/span&gt;
fn setup() {
   println!("Setup")
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;fn teardown() {
&lt;/span&gt;   println!("Teardown")
&lt;span class="err"&gt;}&lt;/span&gt;
fn main() {
   setup();

-   // TODO: Run the test
&lt;span class="gi"&gt;+   // Run the tests
+   for t in inventory::iter::&amp;lt;IntegrationTest&amp;gt; {
+       (t.test_fn)()
+   }
&lt;/span&gt;
   teardown();
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nb"&gt;test &lt;/span&gt;integration
   Compiling blog-post-example v0.1.0 &lt;span class="o"&gt;(&lt;/span&gt;/home/telant/Documents/blog-post-example&lt;span class="o"&gt;)&lt;/span&gt;
    Finished &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;unoptimized + debuginfo] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.21s
    Running target/debug/deps/blog_post_example-e042d787684bb333

running 0 tests

&lt;span class="nb"&gt;test &lt;/span&gt;result: ok. 0 passed&lt;span class="p"&gt;;&lt;/span&gt; 0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out&lt;span class="p"&gt;;&lt;/span&gt; finished &lt;span class="k"&gt;in &lt;/span&gt;0.00s

    Running target/debug/deps/integration-7ed2452642c6f3b6

Setup
Running basic &lt;span class="nb"&gt;test
&lt;/span&gt;Teardown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tips for extending the example
&lt;/h3&gt;

&lt;p&gt;The example runs all of the registered tests. But here are some useful impls if you want to extend even further. For example, adding a CLI, if you want to select individual tests. Or provide options to customize setup or teardown behavior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;IntegrationTest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;all_test_names&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'static&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nn"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;iter&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegrationTest&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="nf"&gt;.into_iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
           &lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="py"&gt;.name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="py"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;from_name&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AsRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_name&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;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'static&lt;/span&gt; &lt;span class="n"&gt;IntegrationTest&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nn"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;iter&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegrationTest&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="nf"&gt;.into_iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
           &lt;span class="nf"&gt;.find&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="py"&gt;.name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;test_name&lt;/span&gt;&lt;span class="nf"&gt;.as_ref&lt;/span&gt;&lt;span class="p"&gt;())&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;blockquote&gt;
&lt;p&gt;If you want to see more of these ideas extended even further, check out &lt;a href="https://github.com/infinyon/fluvio/tree/master/tests/runner/src"&gt;Fluvio’s integration test runner&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We use the CLI to customize setup, handle async testing, and we use an [attribute macro] to collect tests.&lt;/p&gt;

&lt;p&gt;[attribute macro]: &lt;a href="https://github.com/infinyon/fluvio/blob/master/tests/runner/src/fluvio-integration-derive/src/lib.rs"&gt;https://github.com/infinyon/fluvio/blob/master/tests/runner/src/fluvio-integration-derive/src/lib.rs&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Rust’s testing ecosystem in the 2018 edition is great for unit testing. But for integration testing it still has room for improvement. Custom harnesses will become more necessary as Rust gains new developers. &lt;/p&gt;

&lt;p&gt;If we want to avoid reinventing the wheel, we need stable support from &lt;a href="https://docs.rs/libtest/0.0.1/libtest/"&gt;libtest&lt;/a&gt; or more examples of how to perform test collection and patterns for setup, test, and teardown workflows.&lt;/p&gt;

&lt;p&gt;If you made it this far, thank you for following along with me! I wrote this because I could not find a guide to do this before trying to do this myself, and knowing these things beforehand would have made it much faster. Hopefully others find my experience helpful.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>devops</category>
      <category>testing</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>9 Insights I Uncovered While Building a Writing Habit</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Fri, 29 Jan 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/9-insights-i-uncovered-while-building-a-writing-habit-jhn</link>
      <guid>https://dev.to/tjtelan/9-insights-i-uncovered-while-building-a-writing-habit-jhn</guid>
      <description>&lt;h2&gt;
  
  
  Building a writing habit
&lt;/h2&gt;

&lt;p&gt;In the forever-trying year of 2020, I set my sights on earning the &lt;a href="https://dev.to/badge/16-week-streak"&gt;16 week posting streak badge on Dev.to&lt;/a&gt; – and &lt;a href="https://dev.to/tjtelan"&gt;I did it&lt;/a&gt;! (Then I took a long break from posting.) Before I get started on more tech writing for 2021, I wanted to stop and reflect on this effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  How did it go?
&lt;/h3&gt;

&lt;p&gt;Pretty well, to be honest. It has been one of the most challenging goals I’ve set for myself. After the 50% mark, I had exhausted the developed ideas in my backlog so it became harder to get in front of my schedule. I had to start the next post immediately after publishing.&lt;/p&gt;

&lt;p&gt;I found a few insights while building my habit for writing, and you might find them helpful, too.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The hardest part is getting started
&lt;/h2&gt;

&lt;p&gt;It’s easy to say that some of this is due to the mood of 2020, but it was really easy to fall into self-doubt and self-rejection based on the worry that no one would read what I was going to write. Or that people would read it, but they’d hate it.&lt;/p&gt;

&lt;p&gt;These are still feelings that I sometimes have today. But aside from SEO, marketing on social media, experimenting with the time I post, and other tasks that take effort – whether or not someone clicks and reads is out of my control.&lt;/p&gt;

&lt;p&gt;Due to the mental effort required to overcome these feelings, the hardest part of writing is getting started. As such, it (almost) doesn’t matter what the resulting quality is. Primarily what matters is getting something on one topic on the page, to edit later.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Editing is easier than writing
&lt;/h2&gt;

&lt;p&gt;I have a much easier time editing than writing from scratch. Knowing this about myself meant that it was a lot more important to complete any kind of first draft, no matter how bad.&lt;/p&gt;

&lt;p&gt;The editing phase takes at least twice as long as writing. This phase may involve complete rewrites of sections, but I still consider that to be less difficult than starting from a blank page. It’s also a lot easier to judge how much I have left to do when the edits are focused on formatting and pacing, and less on content or coherency.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Don’t be a perfectionist
&lt;/h2&gt;

&lt;p&gt;At least for the content that I’m creating, most people aren’t going to suddenly understand a complicated concept because I wrote a specific sentence in a particular way.&lt;/p&gt;

&lt;p&gt;For the goal I was working toward, it was important to post on a predictable schedule. While it’s good to set your own standards for yourself high, keep in mind that it’s impossible to level up 10x with a single post. Writing well takes practice, and you get more practice if you are able to let go, call a story done, and move on to writing something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Writing consistently doesn’t always yield consistent quality
&lt;/h2&gt;

&lt;p&gt;I’ll be the first to admit that I think some of my posts are more useful or interesting to read than others. That’s just how it goes sometimes, where ambitions are better than the content produced.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Ira_Glass"&gt;Ira Glass&lt;/a&gt; spoke about storytelling and &lt;a href="https://www.youtube.com/watch?v=X2wLP0izeJE"&gt;the taste gap (and how to close it&lt;/a&gt;). He encourages that the most important thing one can do when starting out is to produce quantity over quality. Over time you improve, if you can endure this creative, iterative phase. It is normal for quality to lag behind your ambitions.&lt;/p&gt;

&lt;p&gt;With that in mind, it’s okay to write things that you never publish. I’ve learned that writing can be a method for understanding a topic, or just organizing my thoughts. Not all of that needs to be public.&lt;/p&gt;

&lt;p&gt;What continued to give me encouragement was noticing that my first draft quality was (on average) getting better over time. That was a measurable improvement!&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Be really specific about who you are talking to
&lt;/h2&gt;

&lt;p&gt;When I write, I always start the first draft always with a question: Who am I writing to?&lt;/p&gt;

&lt;p&gt;It doesn’t always matter if the answer is a real person. This person I’m writing to might be based on my past experience, questions people have asked me, interactions I’ve observed, an organization, or just completely made up!&lt;/p&gt;

&lt;p&gt;What is most important is that I focus my message so my intended target audience understands. I don’t want to unintentionally expand the audience or over-explain a concept if it doesn’t benefit the base group of people I am writing to. This technique has made it a lot easier to write in bursts, and edit for clarity. It helps each piece of writing have a consistent voice.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Writing titles is hard (because SEO is hard)
&lt;/h2&gt;

&lt;p&gt;I have to admit: I change the title of each post no less than 3 times, sometimes minutes before publishing the post!&lt;/p&gt;

&lt;p&gt;Different publishing platforms have different audiences, so experiment with what works for your readers. If you plan on cross-posting across multiple platforms or you want to be discovered through search engines, you will need to learn a little bit about marketing and &lt;a href="https://en.wikipedia.org/wiki/Search_engine_optimization"&gt;SEO&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m frequently torn between using technical jargon in my titles, or less specific concepts that can be generally applied.&lt;/p&gt;

&lt;p&gt;Playing with this balance is a cheap and interesting game that, in my experience, avoids disappointment by taking a long-term perspective. It’s been validating to see what kind of content does well though organic search visits vs. people sharing links. I’m still caught off guard when an article from many months ago begins to trend. The lesson here is to be patient and see what strategies pay off.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Keep a backlog of ideas
&lt;/h2&gt;

&lt;p&gt;I have a spreadsheet that I use to keep track of ideas in various states. When I think of something that might be a good topic to explore in a post, I add it to the list. These can be title ideas, posts that are in progress, and links to drafts.&lt;/p&gt;

&lt;p&gt;I try not to dismiss an idea too early. Just writing it down gets it out of my mind, with low pressure to fully explore the idea. Sometimes this collection of thoughts ends up presenting patterns or themes that, when combined, contain enough material to create a full post around. This strategy is really practical, and comes in handy when I am feeling like I’m in a creative rut. If I have a deadline to meet, I can always pull from the pile of ideas I already had.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Building structure and motivation for writing is moving target
&lt;/h2&gt;

&lt;p&gt;I am generally informed about trending topics within tech, but I’m trying to discover my niche and I don’t want to spend an eternity looking for ideas. I’ve also discovered that I’m most creative when I have constraints and have a structure to lean on.&lt;/p&gt;

&lt;p&gt;I have a long-term goal to work for myself creating educational products / services / consulting. So a structure I lean into is that each post contributes to that long-term goal.&lt;/p&gt;

&lt;p&gt;It’s also important to address shorter-term motivation. My approach has been to identify what motivates me to create, and then slowly build systems to support producing content. Aside from the obvious need to set aside time to write, creating that motivation for a post takes three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The content has to be something that is &lt;strong&gt;not too difficult&lt;/strong&gt; for me to create. This means I mostly know the material I’m talking about, and I’m not learning new skills specifically for the post. (It’s not uncommon for me to write about a learning experience, though! I just don’t set out to learn how to do something specifically to write a post)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Something I enjoy creating&lt;/strong&gt; - The topic I’m writing about needs to be interesting, or the story I’m telling needs to be meaningful. Otherwise, I’ll get bored writing it (or you’ll get bored reading it).&lt;/li&gt;
&lt;li&gt;The result should &lt;strong&gt;provide value to someone else&lt;/strong&gt;. People value their time, so in writing an article, I’m trading my time writing for someone’s time savings. What I communicate can save people time, and that’s meaningful to me. I know I have benefitted from others doing the same.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I really enjoy creating software developer advocacy and tech education content, and the topics I (mostly) write on reinforce these areas.&lt;/p&gt;

&lt;p&gt;I aspire to have objectives that can be described as &lt;a href="https://en.wikipedia.org/wiki/SMART_criteria"&gt;SMART&lt;/a&gt;. Admittedly, my short- and long-term goals are still pretty abstract. I think that’s okay right now, as long as I am making progress in the right direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Don’t be afraid to be seen trying
&lt;/h2&gt;

&lt;p&gt;Credit to a video by &lt;a href="https://www.youtube.com/watch?v=hFQRx5iwLtw"&gt;Evelyn From The Internets&lt;/a&gt; for helping me articulate my feelings about this point.&lt;/p&gt;

&lt;p&gt;This relates to my previous point of starting being the hardest part. Some of my internal friction stems from the feeling of being afraid to be seen trying something I’m not good at.&lt;/p&gt;

&lt;p&gt;With some rare exceptions, I’ve decided to keep my old content online. It likely won’t be an issue where stuff I created in the past while I was still learning has embarrassed me. Largely, this content is ignored and no one but myself cares about it.&lt;/p&gt;

&lt;p&gt;To be concise, haters gonna hate. That’s what they do. So don’t pay any attention to the inconsiderate folks who “just want to help” but are not actually helpful. The tech community is full of strong personalities that aren’t always inviting or pleasant to engage with. (I’m not saying this is the majority. I see you...)&lt;/p&gt;

&lt;p&gt;I see enough 💩 being talked in social media threads that it constantly occupies space in my mind when I’m about to publish a new piece of content. However, the truth is that most people are not focused on you for even a moment. So a way I like to view that is that most people will not even see you fail – that’s the blessing of no one knowing who you are yet. Therefore, there’s no reason to not try.&lt;/p&gt;

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

&lt;p&gt;Building a writing habit has been very humbling. I learned that I actually know a lot less about certain topics than I thought. I had to research more than I expected. But as I gained experience, I leveled up my time management and my process.&lt;/p&gt;

&lt;p&gt;Now that I’m not trying to post weekly, what I would do differently is to spend more time developing my production processes. And that’s what the focus of this next year will be about.&lt;/p&gt;

&lt;p&gt;Aside from continuing to &lt;a href="https://www.twitch.tv/tjtelan"&gt;stream my product development on Twitch&lt;/a&gt;, this year I will be creating short videos, starting with some of my more popular blog posts as topics. I hope this will lead into more types of educational content, and more opportunities to work with other people in achieving their goals.&lt;/p&gt;

&lt;p&gt;I started a consulting business (&lt;a href="https://figbeelabs.com/"&gt;Figbee Labs&lt;/a&gt;) in the latter half of 2020. I will continue to travel out of my comfort zone into the deeper waters and hopefully meet new people or organizations that want to work together. It’s important to me to help people from all backgrounds succeed in sustainably building and running their own software products. I will document my experience over 2021 through posts and various social media.&lt;/p&gt;

&lt;p&gt;If you’ve undertaken a similar challenge, what did you learn about your process? What do you want to achieve with writing this year?&lt;/p&gt;

</description>
      <category>writing</category>
      <category>motivation</category>
      <category>productivity</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Questions to Find the Right Continuous Integration System for You</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Thu, 10 Dec 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/questions-to-find-the-right-continuous-integration-system-for-you-32n</link>
      <guid>https://dev.to/tjtelan/questions-to-find-the-right-continuous-integration-system-for-you-32n</guid>
      <description>&lt;p&gt;Continuous integration is fancy shell scripting. It even uses shell scripting terminology like pipelines, but is obscured with marketing and many seemingly complex and different methods of configuration.&lt;/p&gt;

&lt;p&gt;The purpose of this post is to discuss Continuous Integration (CI) Systems at a high level if you are considering switching to a new service. I want to introduce you to a few talking points that aren't discussed enough in order to help you make a decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the goals of Continuous Integration (CI)?
&lt;/h2&gt;

&lt;p&gt;The functions of continuous integration are very flexible and therefore, and the goals are super simple. Automatically run scripts upon the occurrence of an event.&lt;/p&gt;

&lt;p&gt;Common events can be a git commit or a timer event set to run every 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does CI differ from shell scripting?
&lt;/h2&gt;

&lt;p&gt;Continuous integration has a narrow context in which it is intended to run. It has extra structure in order to tell a tighter story. (The CI story leads into another story called Continuous Delivery/Deployment (CD), but we will only be focusing on CI)&lt;/p&gt;

&lt;p&gt;A best practice of CI is to automatically build and/or run tests on every commit in order to validate whether the codebase builds/tests are complete without errors.&lt;/p&gt;

&lt;p&gt;Basic structure defines conditions as well as commands or actions that should be executed when an event occurs. Conditions such as a new commit in a specific branch, or file paths. Or keywords in commit messages.&lt;/p&gt;

&lt;p&gt;On the more advanced side, platform specific features like plugins may be introduced for sending or receiving events from other systems, initiating external triggers based on other pipelines, caching, cleaning up and notifications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What type of CI systems that exist today?
&lt;/h2&gt;

&lt;p&gt;There is no shortage of software that is designed for Continuous Integration. What I believe sets these platforms apart from each other is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The experience and effort involved with setting up a new environment for your organization&lt;/li&gt;
&lt;li&gt;Path to configuring new pipelines, and maintaining them over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your organization regularly exercises the creation of new environments, like in consulting orgs, it is reasonable to gain the experience with an open source tool that won’t cost you any money with licensing.&lt;/p&gt;

&lt;p&gt;Otherwise, I might suggest picking a system the reduces the friction for pipeline creation and maintenance.&lt;/p&gt;




&lt;p&gt;Styles of setting up new pipelines falls into two categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stateful (WebUI) pipeline config
&lt;/h3&gt;

&lt;p&gt;Jenkins is the primary example of configuration via WebUI, as it is the functionality out of the box. Adding pipelines in this system requires a user to log into the WebUI, configure connections to builder systems and methodically define pipelines.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The biggest player in this space, Jenkins, is free to install with flexible system requirements.&lt;/li&gt;
&lt;li&gt;Relatively low skill required to get started. Setup of pipelines and any subsequent edits are performed through the browser with a few clicks.&lt;/li&gt;
&lt;li&gt;Many plugins exist, which probably suit the needs of your org.&lt;/li&gt;
&lt;li&gt;Most of the CI in this category are older and mature. Very search engine friendly solutions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Administration is more difficult and time consuming to perform as footprint increases. Over time the details of the pipeline configuration may drift and be difficult to reproduce for the purposes of documentation or migration.&lt;/li&gt;
&lt;li&gt;It is easy to neglect this kind of CI installation. Both a testament to stability, and a detriment to your org when unexpected outages occur. Rebuilding can be tedious and error prone.&lt;/li&gt;
&lt;li&gt;Takes a lot of effort to secure natively in a cloud-based future. Typically these CI systems inconveniently end up hiding behind a VPN.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stateless (File-based) pipeline config
&lt;/h3&gt;

&lt;p&gt;This is the modern style of CI system. Your TravisCI, Github Action, Azure DevOps&lt;/p&gt;

&lt;p&gt;Typically we find this system is hosted through your git provider, or as a separate hosted service that we allow access to the repos. YAML is the most popular config format.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Configuration of pipelines stay versioned alongside the codebases that use them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;No config schema standards, though. most use a yaml format.&lt;/li&gt;
&lt;li&gt;Complexity becomes harder to manage, and requires a commit and push to repos in order to test. Testing contributes clutter in git logs, and uses up build minutes, which is the cost unit that many hosted services bill on.&lt;/li&gt;
&lt;li&gt;Limited self-hosted options that are free.&lt;/li&gt;
&lt;li&gt;Limited self-hosted options that have small system requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My opinion
&lt;/h3&gt;

&lt;p&gt;I strongly prefer the stateless type of configuration because it provides a more code-like arena where documentation can be provided.&lt;/p&gt;

&lt;p&gt;Mixing the workflow of CI pipeline configuration with your organization’s version control practices can be disruptive if you need to push code in order to see the results of changes to your pipeline. It is a price to pay for the ability to easily correlate changes in codebase with changes in pipeline.&lt;/p&gt;

&lt;p&gt;The balance to strike rests on your code hosting provider needs (i.e. costs per user) and the types of technologies and platforms you need to support for building (web, native, mobile, embedded, etc). This flexibility mostly skews support towards building for web-based technologies.&lt;/p&gt;

&lt;p&gt;Also, Jenkins technically has file-based pipeline support via Jenkinsfile, but unless my org was already deeply invested in staying with Jenkins, I would steer clear. It is not the future. It is harder than necessary to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the CI Hosting Options?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Self-hosting
&lt;/h3&gt;

&lt;p&gt;Self-hosting means running and maintaining a process on a physical or virtual machine that you have access to.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Somewhat more private for less effort if hosting in a private location.&lt;/li&gt;
&lt;li&gt;Effective use of data center computers. Initial costs may be higher, but maintenance costs are typically lower.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Being responsible for maintenance&lt;/li&gt;
&lt;li&gt;Limited to the platforms that you have available.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  System as a Service (Hosted)
&lt;/h3&gt;

&lt;p&gt;External systems as a service (Hosted services) allow users to just log in and connect their version control.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Not responsible for performing maintenance.&lt;/li&gt;
&lt;li&gt;Typically authentication is provided, with options to support your org’s auth provider&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Can be expensive if you require a lot of build time or resources&lt;/li&gt;
&lt;li&gt;Shrinking caps on “free” resources for open source projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Issues to Consider when Switching between CI platforms
&lt;/h2&gt;

&lt;p&gt;These are some categorized rhetorical questions that you or your organization should ask if you are migrating CI platforms&lt;/p&gt;

&lt;h4&gt;
  
  
  Threat model
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Do you need to be deployed on-site? &lt;/li&gt;
&lt;li&gt;What are the upfront and ongoing costs associated?&lt;/li&gt;
&lt;li&gt;Do you have secrets (like private keys, API tokens) that are needed at build time?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Contributor model
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;How are contributors logging in?&lt;/li&gt;
&lt;li&gt;What are the costs associated per seat?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Maintenance
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Who is responsible for the health of the pipeline?&lt;/li&gt;
&lt;li&gt;How much time/money are you budgeting to spend on maintenance and improvements?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cost of Build minutes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;For open source projects, how many build minutes are being used?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Responsiveness needs
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;How many concurrent builds does your org require?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Technologies used
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Containerizing builds is popular for isolation. But not all projects can build within a container.&lt;/li&gt;
&lt;li&gt;Apple, Microsoft and embedded projects are not nearly as flexible and may require special considerations or resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Delivery/Deployment model
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;What do you need to happen after a build passes?&lt;/li&gt;
&lt;li&gt;Are you creating a build artifact that needs to be stored somewhere?&lt;/li&gt;
&lt;li&gt;What is the desired frequency between build vs delivery/deploy?&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Not all continuous integration is considered equal. But they all provide basically the same functions. In most cases, it is possible to self-host and do everything yourself. But sometimes it is worth paying money to a product / service that takes care of your needs. It is really all about making sure you know what the trade-offs are for your specific case.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>startup</category>
      <category>leadership</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Re: Reading More Technical Content Can Help You Improve Your Content Creation Skills</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Thu, 03 Dec 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/re-reading-more-technical-content-can-help-you-improve-your-content-creation-skills-42eb</link>
      <guid>https://dev.to/tjtelan/re-reading-more-technical-content-can-help-you-improve-your-content-creation-skills-42eb</guid>
      <description>&lt;p&gt;This post is in response to &lt;a href="https://www.stephaniemorillo.co/post/reading-more-technical-content-can-help-you-improve-your-content-creation-skills-here-s-how"&gt;Stephanie Morillo’s post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main piece of advice that is elaborated upon is to &lt;strong&gt;read a lot of technical content&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What I think is very helpful about this post are the questions that are asked. I thought it would be a good idea to answer these questions so that I can share my opinions around how I read through technical content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do I like a piece of technical content?
&lt;/h2&gt;

&lt;p&gt;I can answer this in different ways depending on the context that leads me to find technical content. The main two contexts being discovered through social media, or via a search engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Through social media
&lt;/h3&gt;

&lt;p&gt;I spend a lot of time on technical social media, like Reddit, Hacker News, Dev.to, and Twitter and I mostly only read the trending posts. So in these cases, an individual’s or company’s personality drives my interest over the actual content.&lt;/p&gt;

&lt;p&gt;A lot of the time this leads to some cult of personality for popular posts in the comment section. This can’t be helped. However, this kind of engagement occasionally leads to interesting and tangential discussion. I like when the author can participate in the discussion as well, but this is a rare occurrence.&lt;/p&gt;

&lt;p&gt;I prefer concepts over code in the case of social media discovery. Emphasis when I’m reading through something that is about an ecosystem I don’t have experience using. I like having my hand held lightly, and guided through the examples with metaphor or images.&lt;/p&gt;

&lt;p&gt;Bonus points if you both provide links for more context, as well as provide a simplified summary. Help frame how I should think, and even give negative examples for how I should not think if it helps.&lt;/p&gt;

&lt;p&gt;These posts are primarily to entertain me, and then to inform me. I want the attention to readability with layout and markup to be more considered. If there are images to help set tone, I’d rather they be well used memes, or diagrams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Through search
&lt;/h3&gt;

&lt;p&gt;If I’m searching for something technical, it’s more likely that I’m doing research, design or implementation. So personality may continue to play a role in my likelihood to revisit an article, but the code snippets and coherence of an explanation is more important.&lt;/p&gt;

&lt;p&gt;Bonus points if consideration was made for keyword searching or organized textbook-like. I don’t need my hand held as much in his case. Just point me in a direction. I don’t want the entire post to be read through carefully unless the post is about low-level detail.&lt;/p&gt;

&lt;p&gt;I’ll be grumpy, but I will endure a post that is harder to skim if the content is promising enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is their intended audience?
&lt;/h2&gt;

&lt;p&gt;Part of reading a lot of technical content means reading things that are not specifically targeted at myself.&lt;/p&gt;

&lt;p&gt;When the content involves discussion of code, I really prefer a lot of gentle, but explicit nudging around the skill level required to make sense of what is in the post.&lt;/p&gt;

&lt;p&gt;Wide audience is generally my least favorite because content has to be high-level enough to not lose anyone. If you’re aiming wide, then say so or be very obvious.&lt;/p&gt;

&lt;p&gt;Textbook-style is good enough for me. Build up concepts in a reasonable sequence. Or link to posts or definitions that talk about foundational concepts that you’re introducing. Unless you’ve already stated an expected skill level, I will feel like you don’t know the audience you’re writing to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this (company/individual) do really well?
&lt;/h2&gt;

&lt;p&gt;This kind of question is mostly for judging a collection of posts. Any single post may have left positive impressions on me of being informative, concise, funny, easy to read. But I don’t feel like I can judge what the competencies or patterns of a company or individual is until I see other work.&lt;/p&gt;

&lt;p&gt;I look for consistency in voice. Are we having a conversation. Am I reading a monologue? Do you know where your content beats and break things up with whitespace or images? Are you flexible enough with how you present ideas so that I understand you or know what homework I have in order to understand? Visual branding also comes into mind when discussing consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this content help me do?
&lt;/h2&gt;

&lt;p&gt;My expectations of what the content offers me is again, dependent on the context in which I was introduced.&lt;/p&gt;

&lt;p&gt;In general, if it is through social media, I’m looking first to have some kind of entertainment aspect. I’m looking for a breadth of information that allows me to insert my own ideas. I know that content creators aren’t always in control of where and when their content is posted, so this isn’t always going to be fair to judge entertainment value when the content is informational. But it is a plus if the author can be engaging and educational because it takes effort to do well.&lt;/p&gt;

&lt;p&gt;Conversely, if it is through organic search, I’m looking for some kind of informational value. Help me solve a problem, or understand a model of thinking better.&lt;/p&gt;

&lt;h2&gt;
  
  
  How would doing (or implementing) “X” improve my content?
&lt;/h2&gt;

&lt;p&gt;This is a great question. Often when I ask myself this question, I’m considering the visual branding of an individual. But lately I’ve also been thinking about how my favorite creators structure and pace the flow of information in their posts while balancing their voice. This is why it is a good idea to follow content creators that resonate with you, because everyone learns to strike this balance differently. And typically the more someone writes technical content, the more natural and easier to read they get.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can they improve upon to make this content even more effective?
&lt;/h2&gt;

&lt;p&gt;At least for me, it is easier to edit someone else’s work. Naturally, I’m constantly thinking about how little bits of friction can be smoothed out and so that I could understand it better. This could mean mixing the styles of creators together, and I try to identify creators who are particularly good (or sometimes bad) at one thing so I can pay attention to how their style evolves.&lt;/p&gt;

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

&lt;p&gt;I don’t know if this post will be useful to others, but it was a good exercise for me. If you’re a content creator, I encourage you to read through Stephanie’s original post. Ask yourself these questions and try to give concrete answers.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>writing</category>
      <category>productivity</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Quick Primer to Practical Reproducible Builds: Reference Environments</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Fri, 27 Nov 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/quick-primer-to-practical-reproducible-builds-reference-environments-dmn</link>
      <guid>https://dev.to/tjtelan/quick-primer-to-practical-reproducible-builds-reference-environments-dmn</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This post is inspired by a larger &lt;a href="https://twitter.com/bitshiftmask/status/1321623304004866050"&gt;Twitter thread by James Munns&lt;/a&gt; about industry practices to follow for embedded systems projects that are not covered in school. Particularly the concept of a reference environment. However this idea is important across all platforms of software development.&lt;/p&gt;

&lt;p&gt;Our aim is to be pragmatic to a wide audience of “Developers” and not to be confused with the goals of the &lt;a href="https://reproducible-builds.org/"&gt;reproducible builds project&lt;/a&gt;. (I’m not worrying about achieving &lt;a href="https://reproducible-builds.org/docs/deterministic-build-systems/"&gt;complete build environment determinism&lt;/a&gt;. There is a lot more involved that is out of scope for this discussion, but I encourage others to check it out.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s the benefit?
&lt;/h2&gt;

&lt;p&gt;The benefit of a reference environment is to allow a practical step-by-step plan for individuals to reproduce a suitable environment in order to build from a codebase, produce artifacts and interface with any external hardware.&lt;/p&gt;

&lt;p&gt;I want to help you form a maintainable process of documenting what is needed to build your code, and create artifacts for release.&lt;/p&gt;

&lt;p&gt;The expected outcome is to create a reference environment for build and release purposes.&lt;/p&gt;

&lt;p&gt;An additional side-effect of this effort is a shortening of the effort to onboard new devs and testers into new projects or codebases. Additionally version control of this process will reduce your organization’s institutional knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your reference environment can be used for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CI environments&lt;/li&gt;
&lt;li&gt;Onboarding new developers&lt;/li&gt;
&lt;li&gt;Projects that don’t get modified very often&lt;/li&gt;
&lt;li&gt;Embedded projects&lt;/li&gt;
&lt;li&gt;Mobile projects&lt;/li&gt;
&lt;li&gt;Projects with private code&lt;/li&gt;
&lt;li&gt;Projects with vendored / version pinned code&lt;/li&gt;
&lt;li&gt;Legacy code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start your reference environment in steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  First level: Automate what is easy and Document what is hard
&lt;/h3&gt;

&lt;p&gt;You need to have a step-by-step set of commands to run that walk you through downloading and installing your tools in order to enable others to build their own reference environment. Tools and libraries installed through a package manager, and anything manually installed off a website.&lt;/p&gt;

&lt;p&gt;The goal of documenting the setup of your local environment can then be further streamlined the more you automate the step-by-step into scripts that you can provide.&lt;/p&gt;

&lt;p&gt;The experience you want to cultivate is a relatively short step from a fresh clone, to building and modifying code.&lt;/p&gt;

&lt;p&gt;If you use a language that has its own package manager used to compile, such as Javascript’s NPM, Java’s Maven or Rust’s Cargo, then you are able to keep track of the names and version numbers of the libraries you use.&lt;/p&gt;

&lt;p&gt;I recommend that you learn how to use these tools to also remove files created during build. Cached files from previous builds are classic causes of “&lt;a href="https://www.leadingagile.com/2017/03/works-on-my-machine/"&gt;works on my machine&lt;/a&gt;” and may hide otherwise obvious issues. Make a habit of trying to reproduce issues starting from a cache-free build by using the same tools for build to also remove the files and directories it creates.&lt;/p&gt;

&lt;p&gt;Not all language package managers come with cleanup functionality, so you may need to install plugins. Otherwise you should use a tool like &lt;code&gt;make&lt;/code&gt;, and create separate &lt;code&gt;make build&lt;/code&gt; and &lt;code&gt;make clean&lt;/code&gt; targets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second level: Shell scripts
&lt;/h3&gt;

&lt;p&gt;Automation should be driven by makefiles or plain shell scripts like &lt;code&gt;bash&lt;/code&gt;/&lt;code&gt;zsh&lt;/code&gt;/&lt;code&gt;fish&lt;/code&gt;/&lt;code&gt;sh&lt;/code&gt; or in windows &lt;code&gt;batch&lt;/code&gt; or &lt;code&gt;powershell&lt;/code&gt;. The rationale is that these are plain commands that you can copy/paste from your terminal, and into the script. You can always call out to another language like &lt;code&gt;python&lt;/code&gt;/&lt;code&gt;ruby&lt;/code&gt;/&lt;code&gt;perl&lt;/code&gt; or other tools.&lt;/p&gt;

&lt;p&gt;But the initial point of functionality should be plain shell scripting through an executable shell script or a &lt;code&gt;Makefile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you are working from an existing step-by-step document, then you should have a sequence of commands that you can transfer straight into your script. This is a lot fewer commands for your future users (and future you) to deal with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third level: Configuration management
&lt;/h3&gt;

&lt;p&gt;There are tools that specifically deal with configuration management of your operating system / development environment. One of their main selling points is declaring the desired state through config files instead of scripting everything step-by-step. The tools read the config files and check the system for differences. If differences are found, then these tools take specific actions in order to attempt to bring the reality of the system state to be the same as the config.&lt;/p&gt;

&lt;p&gt;The config files lend themselves into achieving automation that is “&lt;a href="https://en.wikipedia.org/wiki/Idempotence"&gt;idempotent&lt;/a&gt;”. A simple explanation of idempotency with respect to configuration automation is experienced when running the automation twice in succession. The first time, an automation tool takes a moment to execute because work is being performed. The second time, the tool discovers that there is no work to be done so the execution time is significantly reduced.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ansible&lt;/li&gt;
&lt;li&gt;Saltstack&lt;/li&gt;
&lt;li&gt;Puppet&lt;/li&gt;
&lt;li&gt;Chef&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In your shell scripts, you need to install these config management tools first. But then the tools can replace significant volumes of shell scripts in many cases because their idempotent properties lead to more efficient execution. The more popular tools have an added benefit of wide support of different OSes, allowing your configs to also widely support different OSes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next level: Portable Reference Environments via Virtual Machines &amp;amp; Containers
&lt;/h3&gt;

&lt;p&gt;Building your reference environment within a virtual machine may enable you to be a little less strict about documenting and automating your setup. After you build the environment, you can save a snapshot, back it up or even distribute it to others. This can be convenient and portable in most cases.&lt;/p&gt;

&lt;p&gt;You can also use your scripts or config management to configure virtual machines, or containers. Using tools like &lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; or &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; allow you to store the instructions for building virtual machines (via &lt;a href="https://www.vagrantup.com/docs/vagrantfile"&gt;Vagrantfile&lt;/a&gt;) or containers (via &lt;a href="https://docs.docker.com/engine/reference/builder/"&gt;Dockerfile&lt;/a&gt;) alongside your code. This enables potential contribution without the need of installing tools locally because the codebase includes a portable development environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Platform specific caveats
&lt;/h4&gt;

&lt;p&gt;Virtualization or containerization is not an available option for every platform. In these cases, you may be limited to config management or documentation for your reference environments.&lt;/p&gt;

&lt;p&gt;If your project has the following, you may have limited support for a portable reference environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apple products&lt;/li&gt;
&lt;li&gt;Platform-specific tools like IDEs and/or compilers&lt;/li&gt;
&lt;li&gt;Hardware requirements such as GPU&lt;/li&gt;
&lt;li&gt;Very old “Legacy” OSes&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The specific tools, and libraries you use in development may seem obvious to you. But as a courtesy to an outsider, or even to yourself in the future, you need to provide requirements needed to build your code.&lt;/p&gt;

&lt;p&gt;Documentation requires discipline to keep up-to-date. Scripts, config management or even a portable environment such as a virtual machine or a container are even better because they are easier to verify for correctness.&lt;/p&gt;

&lt;p&gt;The less critically someone needs to think in order to get started, the easier it will be to focus on what matters. Reference environments are not one-size-fits all. They may be unique per project, or organization. Do future you or future team members a favor and write these details down. It can save a lot of time and avoid works-on-my-machine.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>startup</category>
    </item>
    <item>
      <title>Rust in 2021</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Tue, 17 Nov 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/rust-in-2021-5p6</link>
      <guid>https://dev.to/tjtelan/rust-in-2021-5p6</guid>
      <description>&lt;p&gt;I missed the official call for blog post submissions, I still want to share some ramblings of my hopes for Rust in 2021.&lt;/p&gt;

&lt;p&gt;I’ll split this up into two sections: What I hope to see from the community, and what I hope to see for myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want for the Rust community in 2021
&lt;/h2&gt;

&lt;h3&gt;
  
  
  I want to see Rust shed some of its reputation for being hard to learn
&lt;/h3&gt;

&lt;p&gt;When I was learning Rust, I thought it was harder than necessary. But I would admit that it was due to writing strict idiomatic Rust while I was still figuring out how to be productive.&lt;/p&gt;

&lt;p&gt;I think learners should give themselves patience to learn Rust by writing bad or mediocre code first, and focus productivity later.&lt;/p&gt;

&lt;p&gt;I am not exactly sure how to create the conditions for this outcome. Maybe more people can publish more Rust that looks messy but “just works”.&lt;/p&gt;

&lt;p&gt;I know that Rust in Action is being written and it is for an intermediate-level audience. But perhaps this looks more like encouragement to beginners to ignore the warnings from the compiler. Just write Rust code and form your own opinions.&lt;/p&gt;

&lt;h3&gt;
  
  
  More blog posts from developers and management using Rust at work
&lt;/h3&gt;

&lt;p&gt;For 2021, I don’t even care if it is from one of the many blockchain-related companies using Rust. I want to read more experiences that lay out the decision of why Rust was chosen and how the experience has been.&lt;/p&gt;

&lt;p&gt;I am especially interested when expertise is in another language and a comparison can be made to the other language. Emphasis when performing a rewrite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: &lt;a href="https://dropbox.tech/infrastructure/rewriting-the-heart-of-our-sync-engine"&gt;https://dropbox.tech/infrastructure/rewriting-the-heart-of-our-sync-engine&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s great to hear Rust used in complicated, low-level development, but it would be normalizing to read about more trivial types of applications, just as a way to highlight Rust as being good for general purpose use.&lt;/p&gt;

&lt;p&gt;Anecdotally, I feel like Go has been growing a reputation as being suitable as a scripting language kind for a while and Rust could also check many of the same boxes.&lt;/p&gt;

&lt;h3&gt;
  
  
  More Rust in DevOps tooling
&lt;/h3&gt;

&lt;p&gt;In my experience, the cultures surrounding Rust and DevOps are very similar. They both seem to attract cult-like appeal that demand adopters to adjust to thinking in a different way than they may have been taught.&lt;/p&gt;

&lt;p&gt;The intended reasons are for a “better future experience” that usually alludes to improved cooperation at a non-technical level.&lt;/p&gt;

&lt;p&gt;The implementations of Rust or DevOps shift considerations of future problems earlier in development. Possibly experiencing some of the friction earlier.&lt;/p&gt;

&lt;p&gt;Rust’s benefits are often placed in a context of pure development benefit, which may be ok for now given it is primarily Devs that are writing code. But as a user, there are a few tools in the space that I’m aware of that support DevOps culture (e.g. Habitat, Linkerd) and I want to see more of them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Link regarding rise of Rust + DevOps: &lt;a href="https://d2iq.com/blog/rust-devops"&gt;https://d2iq.com/blog/rust-devops&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Better Rust Interoperability between languages
&lt;/h3&gt;

&lt;p&gt;Rust is entering other ecosystems through libraries via &lt;a href="https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html#using-extern-functions-to-call-external-code"&gt;FFI&lt;/a&gt;. People don’t even have to know or care if they are using Rust.&lt;/p&gt;

&lt;p&gt;However, if I’m writing the code myself, it would be nice if FFI were done without needing to be so mindful of C as the common language.&lt;/p&gt;

&lt;p&gt;C++ and Java come to mind as currently Rust interop is a complicated dance. Rust to Javascript is improving through the Deno runtime, or through WebAssembly.&lt;/p&gt;

&lt;p&gt;My motivation is that I’d like to work in the ecosystems where these languages are most often used (Web, Mobile and Embedded), but I stubbornly want to use Rust as much as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  More shared experiences from people picking up Rust as a second language.
&lt;/h3&gt;

&lt;p&gt;The borrow checker has a reputation that scares people away.&lt;/p&gt;

&lt;p&gt;Especially if they are not from a traditional CS/Engineering background. And we should be trying to bring these folks into the ecosystem.&lt;/p&gt;

&lt;p&gt;Acceptance of Rust as another language worth knowing by “average devs” would be helped with more beginners writing or talking about it. It’s my observation that a lot of developers who are self-taught or from bootcamps are mostly in the Javascript/Python/Ruby space for mostly Web facing code. But Rust can be a perfect second language to learn about types and memory management.&lt;/p&gt;

&lt;p&gt;I believe content from this crowd would be my favorites to read since I think they’ll give valid opinions to someone who has been using Rust for years (like me) now overlook or accept without second thoughts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Increase of copy/paste templates to help bootstrap common types of projects
&lt;/h3&gt;

&lt;p&gt;I have just become aware of &lt;code&gt;cargo generate&lt;/code&gt; because of some of the niche project spaces I’m working on: WebAssembly and embedded.&lt;/p&gt;

&lt;p&gt;Today, I keep &lt;a href="https://github.com/tjtelan/rust-examples"&gt;my own repo&lt;/a&gt; where I offer rough working examples using common servers or patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  My technical wishlist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust analyzer support for generated code

&lt;ul&gt;
&lt;li&gt;I want support for &lt;a href="https://github.com/hyperium/tonic"&gt;Tonic&lt;/a&gt;’s generated code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Better tools or patterns for debugging Async/Await

&lt;ul&gt;
&lt;li&gt;The debugger just makes me realize how little I understand about Futures.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Native Rust for building games

&lt;ul&gt;
&lt;li&gt;The end goal being Rust on consoles or in AAA games. I know they are sometimes used through FFI. It’s not a light task to use Rust in this manner.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Native Rust for building mobile apps

&lt;ul&gt;
&lt;li&gt;We can technically write apps for both Android and iOS today, but they aren’t exactly popular because building is complicated&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where I plan to be with Rust in 2021
&lt;/h2&gt;

&lt;h3&gt;
  
  
  I plan to write more Rust that other people find useful.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I hope to have &lt;a href="https://github.com/orbitalci/orbital"&gt;OrbitalCI&lt;/a&gt; into more of a Beta quality, and usable by others for feedback&lt;/li&gt;
&lt;li&gt;Publish more crates that allow people to write Rust to interact with existing APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  I plan to have serious projects
&lt;/h3&gt;

&lt;p&gt;A few serious projects in upcoming Rust niches so that I can produce more educational content (and hopefully even a product that others may use!)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedded&lt;/li&gt;
&lt;li&gt;WebAssembly&lt;/li&gt;
&lt;li&gt;Mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  I plan to start making money with Rust.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I’ve started my own business in 2020, and I’m not yet making any money. However, I’ve decided to base a lot of my work using Rust. I am enjoying the experience so far. I intend to sharpen my skills throughout 2021 into paid work.&lt;/li&gt;
&lt;li&gt;I hope to make some income through &lt;a href="https://www.twitch.tv/tjtelan"&gt;Twitch from livestreaming my coding&lt;/a&gt; and &lt;a href="https://medium.com/@tjtelan"&gt;other platforms from my writing&lt;/a&gt;. (edit: Added my affiliate links 😉)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How do I intend to help the Rust project?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I’m using Rust to build software for my business (in the DevOps tooling space).&lt;/li&gt;
&lt;li&gt;I will be producing more blog posts, with an angle of inviting Python and Javascript programmers to Rust&lt;/li&gt;
&lt;li&gt;I plan on making my first code or docs contribution to the Rust project in 2021.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I see a lot of promise in Rust's future in 2021. Much has become stable in 2020 and all that is needed is some time and encouragement.&lt;/p&gt;

&lt;p&gt;I have enough confidence that I plan on using Rust as my main language as well as motivation to get more involved with the community.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>discuss</category>
      <category>development</category>
    </item>
    <item>
      <title>Is DevOps Automation a zero-sum game?</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Tue, 10 Nov 2020 22:09:03 +0000</pubDate>
      <link>https://dev.to/tjtelan/is-devops-automation-a-zero-sum-game-3dg7</link>
      <guid>https://dev.to/tjtelan/is-devops-automation-a-zero-sum-game-3dg7</guid>
      <description>&lt;p&gt;Some of my intention is to lean into the ambiguity of the definition of DevOps.&lt;/p&gt;

&lt;p&gt;In general, when automation is created and introduced into an organization for the purposes of "progress" for a wide audience, is this improvement gained at the expense of an individual or a team?&lt;/p&gt;




&lt;p&gt;Here's a made up example. Automatic alerts in a production environment of a web app for a small US company's online order form.&lt;/p&gt;

&lt;p&gt;The primary customer live in US timezones. The assumed culture is that outages are to be avoided. 24/7 uptime.&lt;/p&gt;

&lt;p&gt;Before alerting was introduced in this org, outages in production might not be known until traditional work hours when more complex workflows.&lt;/p&gt;

&lt;p&gt;After alerting was introduced, the possibility of non-work hour wake up calls from alerts increased significantly. On-call/event-based compensation might balance the fairness to the person responsible, but that's a monetary cost paid from the org to offset a forced work-life cost.&lt;/p&gt;

&lt;p&gt;In my opinion, the introduction of automation led to compromise by the individual, with practically no benefit to the business to make no change.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>DevOps Helps you be a Better Leader</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/devops-is-not-a-role-2j4c</link>
      <guid>https://dev.to/tjtelan/devops-is-not-a-role-2j4c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the first of a series about helping your organization embrace DevOps.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps is misunderstood
&lt;/h2&gt;

&lt;p&gt;DevOps is buzzwordy – so hot right now. Like all tech development trends, everyone wants it, but everyone also has their own ideas about the kind of problems it will solve. This is a precarious situation, because a lot of people aren’t wrong. But they are unaware that their version of the truth is so narrow that they end up missing the big picture.&lt;/p&gt;

&lt;p&gt;In this post, I’ll discuss DevOps at a high level by addressing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is (and what isn’t) DevOps&lt;/li&gt;
&lt;li&gt;How DevOps differs from the “normal” development process you may already have&lt;/li&gt;
&lt;li&gt;How practicing DevOps can reduce time and money required for development and operations&lt;/li&gt;
&lt;li&gt;How nurturing a DevOps culture will increase the quality of life for everyone working on your product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are many more topics to discuss, but we must stay focused! This should lay the foundation to allow for constructive conversation about how DevOps works in your organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who should read this post?
&lt;/h3&gt;

&lt;p&gt;This post is primarily intended for people who need to know the purpose of DevOps because they’re managing a team or hiring for a DevOps skill set. You also might find it helpful if you’re just wondering what DevOps is all about as a developer, operator, student, or in a related, non-technical role.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conventions and Definitions
&lt;/h3&gt;

&lt;p&gt;Let’s start with some definitions and conventions so we’re on the same page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt; or &lt;strong&gt;space&lt;/strong&gt; may be used interchangeably. It refers to the location where code is being executed. A laptop or workstation are examples of environments that we can physically touch. But Kubernetes, or “the cloud” are examples of more abstract environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development environment&lt;/strong&gt; will refer to any environment that is primarily used by a single person for the purposes of writing code, such as a laptop or a workstation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production environment&lt;/strong&gt; will refer to any environment that is shared, regardless of whether external customers are using it. An internally used environment used only for testing purposes is a production environment. Big differences between a development environment and a production environment may be complexity or scale at which components are deployed. As well as the amount of targeted automation to perform changes such as deployment or collection of analytics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development&lt;/strong&gt; &lt;em&gt;(Dev)&lt;/em&gt; is a phase and a team we associate with writing code. Specifically, it refers to code that has not yet been released officially to a wider audience. When a project is in development, there is an implication that it may not yet be stable. The people who do the code writing are called Developers, or Dev.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations&lt;/strong&gt; &lt;em&gt;(Ops)&lt;/em&gt; is a phase and a team we associate with building and maintaining the environment(s) used for running code from Development, as well as infrastructure used to support the running code. The people who run code may also be Developers, but they are also commonly known as Operators, Ops, SysAdmins, SREs, Production Engineers, and increasingly (and incorrectly) as DevOps Engineers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps&lt;/strong&gt; is the art of joining principles from traditional software Development and Operations so both can work better together. DevOps is not a phase of development, nor is it a role, despite the emergence of DevOps engineering roles or teams. It is an organization’s professional culture, and emotional intelligence for working together as a single team. The purpose of DevOps is managing expected behavior of the product in production with respect to constant “change of state” (we’ll talk about that soon).&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem DevOps solves
&lt;/h2&gt;

&lt;p&gt;An industry trope is the antagonistic rivalry about whose role, Dev or Ops, is more important. But it doesn’t need to be a battle. DevOps is a culture or method of interaction between Dev and Ops and a direct result is shortened feedback loops between writing code (development) and running code (operations).&lt;/p&gt;

&lt;p&gt;Admittedly, “DevOps” is a more complex concept when compared to Dev or Ops, which muddies an otherwise straightforward conversation because the actual tasks of practicing DevOps are not one-size-fits all.&lt;/p&gt;

&lt;p&gt;Software is rarely a single moving piece. The benefit is the flexibility to incrementally change the state of any single piece. The “change of state” refers to updates to code or the supporting infrastructure, and effectively communicating those changes to the people involved. As a system grows in complexity, it takes some effort to make changes without disrupting other pieces.&lt;/p&gt;

&lt;p&gt;DevOps, as a practice, is about managing the changes to those moving pieces in an organized and intentional manner. An example of where DevOps builds this bridge is deploying to production. Thin encourages releasing and running code in a way that Devs and Ops can anticipate each other’s changes, at a high rate. These procedures are preferably automated, for speed and consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change the job title on your reqs: DevOps is not a role!
&lt;/h2&gt;

&lt;p&gt;Unfortunately, DevOps is increasingly used as a catch-all for all engineering tasks that do not have an owner. The result is that it starts to lose any specific meaning.&lt;/p&gt;

&lt;p&gt;A recent (and regrettable) trend in job postings is to rebrand SysAdmin or Operations roles into “DevOps engineer” roles. This makes it more difficult for companies and job-seekers alike to make a good match.&lt;/p&gt;

&lt;p&gt;Case in point: coding is often listed as a requirement for a “DevOps Engineer” role, but if that role is actually an operations role, there will be few opportunities to write code. This means that new hires joining with the expectation that their role includes coding will feel misled, and turnover will be increased.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a solution look like?
&lt;/h2&gt;

&lt;p&gt;So what is DevOps if not a role? Let’s describe practicing DevOps through the actions of the members of the technical organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps-enabled Dev vs Pure Development
&lt;/h3&gt;

&lt;p&gt;Unlike pure development, DevOps is primarily about improving processes and analytics capabilities to remove friction from developers’ workflows, outside of writing code. It is not about product functionality or quality of the product code. For example, Devs define the terms of success or failure of the behavior of their code in production. But thanks to DevOps practices, they can analyze that data to inform their next actions.&lt;/p&gt;

&lt;p&gt;Devs in a DevOps practice have a shorter onboarding process as well. Common tasks such as software requirements for build code and deploying code are documented through automation that is kept up to date. With this, new devs can focus on the codebase on day one, not spending all day reading documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps-enabled Ops vs Pure Operations
&lt;/h3&gt;

&lt;p&gt;Unlike pure operations, DevOps is proactive about observing how running code is behaving from within the code rather than only observing results. The purpose is to maximize the value of human time by only requiring a person to look into a problem if existing automated strategies fail to resolve it.&lt;/p&gt;

&lt;p&gt;Additionally, the introduction of Continuous Integration/Continuous Delivery (or Deployment) pipeline (aka CI/CD) is an important collection of automation shared between Devs and Ops. The Devs know how to push code for build for the CI, and the Ops know how to pull build artifacts for deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps-enabled management
&lt;/h3&gt;

&lt;p&gt;There is a lot to be said about DevOps-enabled management, but I will keep it brief (but stay tuned, this will be the topic of a future post). For now, I will be focusing on communication, quality of life of your employees, and a short aside on saving money on cloud operational expenditure.&lt;/p&gt;

&lt;p&gt;As a product manager, DevOps directly serves the priorities and product roadmap, as they will be naturally driven from the analytics of your production environments. More objective discussion can be had with your developers and operators when you can provide more specific details and requirements to what is motivating your decision making as a manager. Data about feature usage or responsiveness can more easily be measured and placed onto a dashboard if the metrics to be tracked are known during development, rather than after a feature is complete. This production data can help facilitate discussions with your stakeholders.&lt;/p&gt;

&lt;p&gt;As a hiring manager, DevOps enables you to be more specific about what it is you are looking for in job applicants. If you’re looking for a candidate with broad skills, you can justify why with actual functions that need served. Otherwise, you can also be much more specific with need for specialized roles since the functions of your direct reports feed into the quality of your analytics.&lt;/p&gt;

&lt;p&gt;Lastly, if you operate in cloud infrastructure such as AWS or Azure, your DevOps practice should condition you to analyze your compute usage for ways to save money. It can show you when you may be able to shut down compute resources for the night to save costs on guaranteed idle time that you would otherwise be paying for. Automation can automatically turn them back on for the work day if needed by devs, but otherwise, you may find that these resources are often unintentionally abandoned by devs.&lt;/p&gt;

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

&lt;p&gt;If you are a manager, how do you start a DevOps practice? You start by consistently being data-driven through requests for data from your employees. Show them how the data influences your decision making. The consistency of your requests ought to naturally lead to automation of data collection.&lt;/p&gt;

&lt;p&gt;Remember that DevOps is more than operations. It is a professional workplace culture that starts with management through commitment to improve communication.&lt;/p&gt;

&lt;p&gt;To do both drive and support this, management must be very specific about what information they need from their product, then align their processes to reinforce these needs. Realize that this kind of organization of processes is optimal. The perceived constraints your employees experience provides very clear expectations for team success while allowing individual opportunity to be creative and fulfilled without setting expectations that it is any individual person’s responsibility.&lt;/p&gt;

&lt;p&gt;DevOps is a practice that produces solutions that scale to the needs of the organization and humanizes the people who create solutions. It allows people to specialize their craft while providing a structure to let them trust that the rest of their surroundings (infrastructure) will be ready to accept any of their new creations.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>leadership</category>
      <category>management</category>
    </item>
    <item>
      <title>Bottle rockets in my DevOps? It’s more likely than you think.</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Thu, 29 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/bottle-rockets-in-my-devops-it-s-more-likely-than-you-think-10d9</link>
      <guid>https://dev.to/tjtelan/bottle-rockets-in-my-devops-it-s-more-likely-than-you-think-10d9</guid>
      <description>&lt;p&gt;Why is DevOps such a hot trend when many find it hard to concretely define? It is just for big companies? Could you be practicing DevOps as a small software organization and not even know it? What are the outputs of DevOps activities? How do you explain DevOps to your less-technical colleagues?&lt;/p&gt;

&lt;p&gt;To help address those questions, I want to tell you a story not about software, but instead about bottle rockets. We’ll take a look at typical DevOps activities and how feedback loops can naturally form and provide opportunities for improvement using DevOps thinking.&lt;/p&gt;




&lt;p&gt;Imagine you are building a company that makes and shoots off fireworks. You’re just starting out, so you’re the one making the fireworks.&lt;/p&gt;

&lt;p&gt;The firework is aimed, a fuse is lit, the rocket launches, and features are displayed to your customers. You intentionally design pyrotechnics with an expected outcome. Your customers love the loop-de-loops, whistling, and colorful sparks!&lt;/p&gt;

&lt;p&gt;At first, you’re just building customized fireworks by yourself with cheap kits. Based on positive feedback from customers, you start to develop a specific type of firework.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is essentially how all software products start.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You soon outgrow the capabilities and customizability offered through the kits, and to save on money you develop your own process using raw materials. You build and package every single unit in your garage, and have fireworks shows in a field next to your house. People are buying tickets to your fireworks shows, regardless of how the product was built -- they just want a cool explosion (and yours are the coolest).&lt;/p&gt;

&lt;p&gt;What your audience doesn't see are the many experiments and failures that went into building their experience. However, since you work alone, any mishaps are in your private space and they are easy to put out with a fire extinguisher and a bucket of water.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is similar to software development.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your company wants to expand their market size and offerings. You hire new people to help you build more of what currently sells, as well as help create new designs based on feedback from customers. Building in your garage no longer suits the needs of the business.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is similar to the start of &lt;a href="https://www.geekwire.com/2014/amazon-20-years-garage-startup-global-powerhouse/"&gt;some&lt;/a&gt; &lt;a href="https://news.microsoft.com/announcement/microsoft-is-born/"&gt;legends&lt;/a&gt; in &lt;a href="https://en.wikipedia.org/wiki/HP_Garage"&gt;software&lt;/a&gt; &lt;a href="https://mashable.com/2013/09/27/google-garage-anniversary/"&gt;development&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You move into a bigger warehouse with an indoor launchpad. You teach the new people how you work. You build and package units by hand. The new people are not as good at this as you are and they don’t have your intuition, so the quality of output is not as consistent.&lt;/p&gt;

&lt;p&gt;You’re now launching your bottle rockets from inside the warehouse, through a window. The inconsistencies sometimes cause a small fire so everyone has to stop what they’re doing to help put it out.&lt;/p&gt;

&lt;p&gt;You spend the money or time and effort to create special tools so that they don’t needlessly make mistakes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is similar to &lt;strong&gt;dev tooling&lt;/strong&gt;. Dev tooling is domain-specific software or automation created for the purpose of helping developers keep their focus on the details of their problem. It also helps developers to offload the mental burden of tedious tasks such as data processing, reformatting, or validation, onto their tools.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your company now creates many different types of fireworks, and has showcase displays every week. Every product uses specialized parts so it can be a scramble to get everything done in time. One of your new bottle rocket designers discovers that with a few small modifications, many of your products could use the same, adjustable fuse. Now, many firework designs can be made at the same time, and each fuse can be adjusted in the field prior to ignition. You apply this strategy to other parts and this improves your manufacturing efficiency.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is similar to &lt;strong&gt;microservice architecture&lt;/strong&gt; , a style of service-oriented architecture design that enables an application to be composed of several small modules organized by business capabilities. These modules can be developed and updated ad-hoc without requiring a full redeployment of all components.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You get late notice there’s going to be a huge fireworks expo very soon, and your company’s unique fireworks will be the star of the show.&lt;/p&gt;

&lt;p&gt;You return to the product lines to assist with packing units. It’s a terrible experience.&lt;/p&gt;

&lt;p&gt;The work is manual, and for some of the tasks you realize that the same tools can be used by an assembly machine and performed with more precision and consistency. With some extra effort, more machines could be constructed to create units for quality control testing, and package units for shipping. The process of assembly, packing, and launch preparation is now more standardized, and your human workers can focus on designing better fireworks instead of remembering the exact order and specifications of assembly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is similar to &lt;strong&gt;CI/CD&lt;/strong&gt; (continuous integration / continuous delivery/deployment). CI/CD is a process that connects development (writing the code) to operations (running the code).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Typically initiated by a developer pushing code, which builds, tests. This process is called Continuous Integration (CI). The end of a CI process that results in an artifact ready to be deployed is called Continuous Delivery. Going one step further to an automatic deployment of the artifact into production is called Continuous Deployment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As your rockets get bigger, you notice that the aiming from the launchpad isn’t going as well as it used to. With the smaller rockets, you were able to eyeball the right trajectory, but this isn’t working as well with these more complex fireworks. Due to your previous standardizations of fuses, the same fuse modules are used for all the rockets. Therefore we can narrow our investigation of the trajectory issues specifically to construction of the complex fireworks. Quality control is now also improved because there are fewer variants introduced. Changes are easier to track and correct using information from internal quality control and from customers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is &lt;strong&gt;observation through metrics and monitoring&lt;/strong&gt;. The trajectory was noticed not only holistically because of regular launches internally, and by customers. But also objectively, because we’ve collected data on the distances experienced in a variety of conditions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You’re building bigger and better bottle rockets, and your customers are thrilled with the exciting displays you’re putting on! They’ve never seen brighter colors or more interesting designs!&lt;/p&gt;

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

&lt;p&gt;Using this somewhat silly story as a stand-in for the software development and deployment process, you can see that DevOps activities are often part of a developing and growing system. With every deployment, you’re trying to shoot a bottle rocket out of the window.&lt;/p&gt;

&lt;p&gt;Picking and choosing DevOps activities to optimize is normal for small but growing software organizations. Be pragmatic. Adopt solutions when you have problems they solve.&lt;/p&gt;

&lt;p&gt;So how do you know what you actually need? You’re likely already addressing the needs you have (but in a much less efficient way). Interested in investing in your team’s DevOps practice? Here are some starting points to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your team spends a lot of time moving between projects, consider bulking up your &lt;strong&gt;dev tooling&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you frequently find yourself solving the same problem repeatedly or copy/pasting and lightly modifying service code, investigate implementing &lt;strong&gt;microservice architecture&lt;/strong&gt; to do that job for you.&lt;/li&gt;
&lt;li&gt;If you rely on a single developer’s machine or struggle to consistently build or release minor changes, &lt;strong&gt;CI/CD&lt;/strong&gt; could be what you’re missing.&lt;/li&gt;
&lt;li&gt;If you make changes based on feelings and not with data, then improve your product observation through collecting &lt;strong&gt;metrics and monitoring&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cohesive strategy for packaging, deployment, and response is essential as growth occurs. As the rate of updates increase, the rate of outage-causing failures climbs proportionally.&lt;/p&gt;

&lt;p&gt;It is fatally optimistic to rely on the hope that your product is absent of critical bugs. Reactivity is not a dependable plan, especially in the high-stress situations caused when your bottle rocket explodes on the launchpad. Instead, assume that things will inevitably go wrong sometime, somewhere. Create tangible strategies that bridge writing code (development) and running code (operations) through common language and goals, and rely on procedures that considered the important details back when stress levels were not high.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>devrel</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My Hacktoberfest 2020 is Complete</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Mon, 19 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/my-hacktoberfest-2020-is-complete-42fe</link>
      <guid>https://dev.to/tjtelan/my-hacktoberfest-2020-is-complete-42fe</guid>
      <description>&lt;p&gt;This is a followup post to my &lt;a href="https://dev.to/tjtelan/a-first-timer-s-perspective-to-digital-ocean-s-hacktoberfest-2020-18on"&gt;previous Hacktoberfest related post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR - Officially I’ve completed Hacktoberfest 2020!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The beginning of the month was a bit rough, and while there were good intentions, the level of communication to participants was not up to par. But eventually the news of the changes rolled out in a much more official way! For what it’s worth, I approve.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TqVrUoLX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/8bb1694d2af0774e00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TqVrUoLX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/8bb1694d2af0774e00.png" alt="Header with update announcing event being opt-in"&gt;&lt;/a&gt;Better late than never&lt;/p&gt;

&lt;p&gt;The change to make eligible repos opt-in will hopefully provide less of an unexpected disruption to open source maintainers. I imagine the spike in activity will belong to repos who want the commits. Also I hope the intended effect will cut down on greedy devs gaming the rules with low quality contributions to get free stuff.&lt;/p&gt;

&lt;p&gt;The extended review time was still 2 weeks, but a couple days later after &lt;a href="https://dev.to/tjtelan/a-first-timer-s-perspective-to-digital-ocean-s-hacktoberfest-2020-18on"&gt;my post&lt;/a&gt;, I got an email acknowledging my 4 PRs. I’ve just been waiting for the clock to run out this entire time.&lt;/p&gt;

&lt;p&gt;However, the time is here. Officially I’ve completed Hacktoberfest 2020!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4TyKqn7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t4kr3re93rhv77f5omsa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4TyKqn7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t4kr3re93rhv77f5omsa.png" alt="Congrats message in my profile"&gt;&lt;/a&gt;Congrats message in my profile&lt;/p&gt;

&lt;h2&gt;
  
  
  My strategy
&lt;/h2&gt;

&lt;p&gt;If you have never contributed to open source before, I can share what I usually do. I took a simple approach.&lt;/p&gt;

&lt;p&gt;I crawled the Github search for &lt;a href="https://github.com/search?l=&amp;amp;p=1&amp;amp;q=label%3Ahacktoberfest+state%3Aopen+no%3Aassignee+is%3Aissue+language%3ARust&amp;amp;ref=advsearch&amp;amp;type=Issues"&gt;Hacktoberfest labeled repos that were written in Rust&lt;/a&gt; because I was only interested in writing in that language.&lt;/p&gt;

&lt;p&gt;There were quite a lot, so I picked a handful of the smallest Rust projects where the repo owner asked for some &lt;strong&gt;very specific&lt;/strong&gt; contributions that were clear enough that it didn’t require me to ask questions before getting started. All things considered, it only took me a total of 2-3 hours to write code.&lt;/p&gt;

&lt;p&gt;I did a bit of overcommunication with the repo maintainer to be friendly, but also to give the impression that changes can still be made with their feedback. I wanted to offer an opportunity for them to give me feedback so they would be happy with what they would get merged in.&lt;/p&gt;

&lt;p&gt;If you didn’t know, you can &lt;a href="https://docs.github.com/en/free-pro-team@latest/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue"&gt;reference issues from your commit message&lt;/a&gt;, which I did. Additionally I linked the PR to the issue, and I left a message in the issue itself describing my thought process. There were small changes requested by the maintainers, though every PR was eventually accepted and merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Prize
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vWK3P1aH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xx591jqstqe6g7husdsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vWK3P1aH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xx591jqstqe6g7husdsy.png" alt="Hacktoberfest Forest 2020 logo"&gt;&lt;/a&gt;Am I a digital lorax? Because I wrote code for the trees&lt;/p&gt;

&lt;p&gt;So I’ve decided to plant a tree instead of receiving a shirt. It was nice that there was an alternative.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9ObvmQAT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/c8f6cd13e0be1a2300.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9ObvmQAT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/c8f6cd13e0be1a2300.png" alt="Order form for claiming plant a tree prize"&gt;&lt;/a&gt;There was only one color and one size. Fun!&lt;/p&gt;

&lt;p&gt;I don’t know what’s next. After completing the form I was told to await instructions from Digital Ocean for how to continue the process of planting the tree.&lt;/p&gt;

&lt;p&gt;Either way, this is the end of the line. Hacktoberfest 2020 is done for me. I feel happy to have made a positive impact.&lt;/p&gt;

&lt;p&gt;Thanks to Digital Ocean, Intel, Dev.to and the Hacktoberfest team for making this year happen!&lt;/p&gt;




&lt;p&gt;In the future I will likely crawl the Github search for small Rust projects to contribute to live on &lt;a href="https://www.twitch.tv/tjtelan"&gt;my Twitch stream&lt;/a&gt;. If that interests you, or if you’d like me to contribute to your repo, then I’d appreciate it if you’d &lt;a href="https://www.twitch.tv/tjtelan"&gt;give me a follow&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>hacktoberfest</category>
      <category>github</category>
    </item>
    <item>
      <title>What can I do to feel like I belong in the Tech community?</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Tue, 13 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/what-can-i-do-to-feel-like-i-belong-in-the-tech-community-1k7k</link>
      <guid>https://dev.to/tjtelan/what-can-i-do-to-feel-like-i-belong-in-the-tech-community-1k7k</guid>
      <description>&lt;p&gt;When I was a teenager, in the 00’s, the internet gave me net-positive energy and optimism. It was still very novel, and there was a lot of opportunity to discover niche communities that overlapped with my interests. I felt like part of an in-crowd and it deeply influenced my life.&lt;/p&gt;

&lt;p&gt;I have continuously been connected online (Metaphorically. Bc I grew up with dial-up). Much of the novelty has long worn off.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s been an exhausting year
&lt;/h2&gt;

&lt;p&gt;I was laid off early in the year due to the pandemic. Due to the sudden loss of human interaction, I have been revisiting some of that yearning for connection as I transition to starting a business from scratch (more about that some other time). As a necessity, I am dependent on the internet for the majority of my human interaction. Maybe this is me being mentally old, but I feel the current energy of my echochamber to be more net-negative and I’m hoping I can introduce myself to people who build others up.&lt;/p&gt;

&lt;p&gt;Niche communities are difficult for me to discover with the same ease as when I was young. That’s not a reason enough for me to stop looking! So that’s fine. I’ll start looking where I’m at. For professional reasons, I &lt;em&gt;need&lt;/em&gt; to start in Tech. So I’ll need to be more specific, because Tech is HUGE.&lt;/p&gt;




&lt;h2&gt;
  
  
  Searching for my k-nearest neighbors
&lt;/h2&gt;

&lt;p&gt;I’ll spare you the rest of the thought exercise. I’ve been focusing my efforts within the Rust community. Why? It’s reignited my joy in writing code again, and I’m trying to start my business with it. &lt;a href="https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved"&gt;And because people love it!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With a few years under my belt, I’ve finally reached a point in my Rust development that I no longer consider myself a beginner and I can be productive. Great! Well, now what?&lt;/p&gt;

&lt;h3&gt;
  
  
  What have I been doing?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Regularly posting blog posts with a purpose of educating or sharing an experience as a non-expert&lt;/li&gt;
&lt;li&gt;Hanging out around Tech Twitter and occasionally commenting and retweeting&lt;/li&gt;
&lt;li&gt;Streaming writing Rust code for a few hours at least once a week&lt;/li&gt;
&lt;li&gt;Joining so many Slack/Discord/Matrix/Gitter/IRC communities. Mostly lurking, but participating occasionally&lt;/li&gt;
&lt;li&gt;Maintaining a &lt;a href="https://crates.io/crates/git-url-parse"&gt;Rust crate&lt;/a&gt; and occasionally asking related projects if they would like to depend on it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What have I been expecting?
&lt;/h3&gt;

&lt;p&gt;Part of me was hoping eventually after seeing the same same faces, same names… that I would feel like I had joined the community and I’d stop feeling so intimidated. Perhaps that I would have experienced some subtle mutual acknowledgement of acquaintance? (I have since been lowering my expectations, fwiw. I now believe it is my responsibility to initiate the interactions with potential personal meaning or expectation.)&lt;/p&gt;

&lt;h3&gt;
  
  
  What have I not been doing?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Actively inviting conversation&lt;/li&gt;
&lt;li&gt;Stepping out of my comfort zone to ask for feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Won’t you be my neighbor?
&lt;/h2&gt;

&lt;p&gt;When was the last time you joined a new community? What was the defining moment when you felt like you belonged?&lt;/p&gt;

&lt;p&gt;I don’t feel unwelcome in Tech, but I feel invisible. My attempts to extend my reach out to those who might actually care to connect has random-like results. Not for lack of trying. But admittedly, I am placing too much value in establishing consistency before figuring out what works for me.&lt;/p&gt;

&lt;p&gt;I don't know what options to try next. I’m not fishing for pity, but I am looking for advice. How do I find my audience? How can my audience find me?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>beginners</category>
      <category>culture</category>
      <category>motivation</category>
    </item>
    <item>
      <title>A first-timer's perspective to Digital Ocean's Hacktoberfest 2020</title>
      <dc:creator>T.J. Telan</dc:creator>
      <pubDate>Mon, 05 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/tjtelan/a-first-timer-s-perspective-to-digital-ocean-s-hacktoberfest-2020-18on</link>
      <guid>https://dev.to/tjtelan/a-first-timer-s-perspective-to-digital-ocean-s-hacktoberfest-2020-18on</guid>
      <description>&lt;h2&gt;
  
  
  So... what is Hacktoberfest?
&lt;/h2&gt;

&lt;p&gt;Digital Ocean’s &lt;a href="https://hacktoberfest.digitalocean.com/"&gt;Hacktoberfest&lt;/a&gt; is a month-long event over the month of October aimed at generating an increase of contributions to open source projects. Participants are asked to open PRs against public repositories in Github with “positive contributions”. Swag is offered to the first 70k participants to open 4 qualified PRs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l3vRmVv5P01I5NDAA/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l3vRmVv5P01I5NDAA/giphy.gif" alt="Ed from Cowboy Bebop"&gt;&lt;/a&gt;A typical hacker&lt;/p&gt;

&lt;h2&gt;
  
  
  And… how is it going?
&lt;/h2&gt;

&lt;p&gt;I have mixed opinions that honestly, skew negatively. But I feel like I’m more charitable about my feedback than what I've seen on the internet. I’m not intending to drag Hacktoberfest but I’d like to see improvement.&lt;/p&gt;

&lt;p&gt;2020 is my first year participating in Hacktoberfest. I’ve already been contributing more to the open source community over the last few years. Particularly for the Rust programming language. I set out to use this event as an excuse to help the Rust community out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Positives:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  The feeling of a community effort to contribute to Open Source
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BvAaeZQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.makeagif.com/media/10-05-2020/FTPRH-.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BvAaeZQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.makeagif.com/media/10-05-2020/FTPRH-.gif" alt="From Tom Goes to the Mayor into. Shaking hands. Community Spirit"&gt;&lt;/a&gt;A typical open source PR&lt;/p&gt;

&lt;p&gt;Contributions to open source can happen at any time. I think it’s a nice idea to have a time where people who use open source software are encouraged to contribute meaningfully. Especially for anyone who may feel a bit of intimidation to do so. I’m sure a T-shirt and some stickers can feel very validating to someone who was just using open source before, and now they have some evidence that they contributed too.&lt;/p&gt;

&lt;h4&gt;
  
  
  Discovering smaller projects
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/1FXYMTuKX91hS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/1FXYMTuKX91hS/giphy.gif" alt="Bob Ross. Beauty is everywhere"&gt;&lt;/a&gt;Bob Ross had amazing commit messages&lt;/p&gt;

&lt;p&gt;This was a great opportunity to explore Github for projects that don’t require a lot of experience or commitment in order to help a maintainer out. The repos I offered code to were all small Rust projects that were doing some practical things. It was fun, and I put some effort into what I wrote in addition to having good interactions with the maintainers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Negatives:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  This year’s Hot-fix to the rules and the lack of follow-up communication
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/jV4wbvtJxdjnMriYmY/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/jV4wbvtJxdjnMriYmY/giphy.gif" alt="Spongebob. Communication rainbow"&gt;&lt;/a&gt;Talk to your community&lt;/p&gt;

&lt;p&gt;I feel like the communication around the event is not being managed well. Very reactive, and not effective at spreading the word.&lt;/p&gt;

&lt;p&gt;A few days after the start of the event, there was a &lt;a href="https://github.com/digitalocean/hacktoberfest/pull/596"&gt;significant change in the rules&lt;/a&gt;. I only happened to learn about it through the grapevine, as opposed to from Digital Ocean or through the Hacktoberfest front page or profile pages. Rules feel like they are inconsistently applied, and it feels unwelcoming.&lt;/p&gt;




&lt;p&gt;Where this change affected me is their change of minimum review times, and probably the validity of my contributions. But I’m confused about what is supposed to apply to me since I had created all my PRs in the first 3 days.&lt;/p&gt;

&lt;p&gt;What makes this more confusing is the conflicting information within the Hacktoberfest FAQ.&lt;/p&gt;

&lt;p&gt;For example, this is likely some old information about the review time of PRs. States 7 days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jLzx6GA1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/86a33dd88d94cfbc00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jLzx6GA1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/86a33dd88d94cfbc00.png" alt="From FAQ. Review time of 7 days"&gt;&lt;/a&gt;From FAQ. Review time of 7 days&lt;/p&gt;

&lt;p&gt;Later in the same FAQ it says it’s been updated to 14 days. But only those &lt;strong&gt;before October 3, 2020 @ 12:00 UTC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wd75jw2c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/0c0950ccc9eb470100.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wd75jw2c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/0c0950ccc9eb470100.png" alt="Also from FAQ. Review time of 14 days"&gt;&lt;/a&gt;Also from FAQ. Review time of 14 days&lt;/p&gt;

&lt;p&gt;All 4 PRs were made before this rule change was stated to go into effect (Oct 3 @ 12:00 UTC). The latest being Oct 3 @ 6:26 UTC.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y68Ze7_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/efd9a3bde7ea45c100.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y68Ze7_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/efd9a3bde7ea45c100.png" alt="4 PRs. All earlier than Oct 3 @ 12:00 UTC"&gt;&lt;/a&gt;4 PRs. All earlier than Oct 3 @ 12:00 UTC&lt;/p&gt;

&lt;p&gt;Changes to the rules could have been communicated somewhere on the profile page in the legend, but were not. Or through email, like the message I received when I made my first PR.&lt;/p&gt;

&lt;p&gt;I just noticed all my maturation times jump from about a week to about 2 weeks. 3 of these were PRs that were already merged too.&lt;/p&gt;

&lt;p&gt;And I’m more annoyed and slightly unmotivated to continue in the event.&lt;/p&gt;

&lt;p&gt;(But tbh, rather than feel angry, I’m psyched that I got a few PRs merged so quickly!)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vqh1n6h9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/5aeb599f51db45be00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vqh1n6h9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tjtelan.com/processed_images/5aeb599f51db45be00.png" alt="Missed opportunity to communicate that this duration has been updated from 7 to 14 days."&gt;&lt;/a&gt;Missed opportunity to communicate that this duration has been updated from 7 to 14 days.&lt;/p&gt;

&lt;h4&gt;
  
  
  Feeling like corporate-sponsored projects are taking advantage of free labor
&lt;/h4&gt;

&lt;p&gt;I think that the core intention of Hacktoberfest is well meaning. But I'm seeing some non-trivial work in big projects labeled for Hacktoberfest.&lt;/p&gt;

&lt;p&gt;I’m not personally driven by the swag of a free T-shirt. I just want to help the Rust community and level up my skills while I'm at it. But I feel weird sitting near loud, &lt;a href="https://blog.domenic.me/hacktoberfest/"&gt;negative opinions&lt;/a&gt; that I partially agree with. (Although my feelings are a lot more charitable and less intense)&lt;/p&gt;

&lt;p&gt;Before &lt;a href="https://github.com/digitalocean/hacktoberfest/pull/596"&gt;the silent rule changes&lt;/a&gt;, the premise of projects that must opt-out really placed a huge burden on the maintainers of small projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/48Osj6XyU0ptQRfh5V/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/48Osj6XyU0ptQRfh5V/giphy.gif" alt="A typical maintainer during Hacktoberfest"&gt;&lt;/a&gt;A typical maintainer during Hacktoberfest&lt;/p&gt;

&lt;p&gt;But I’m mostly in my raw feelings, because I feel like the focused energy of the open source community is being taken advantage of by bigger corporate entities for a T-shirt. They are all on the bandwagon to use free energy from eager and inexperienced developers to contribute to their big name-brand projects even though they have their own funding for development.&lt;/p&gt;

&lt;h2&gt;
  
  
  But... will I participate next year?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/4TtrENnFsz4EWkU6gz/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/4TtrENnFsz4EWkU6gz/giphy.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hard to say at this moment, but what incentive do I have? I can contribute any time to small projects, and I most likely will. I have to thank Digital Ocean for helping me realize that.&lt;/p&gt;

&lt;p&gt;The spirit to drive help to small projects is one of my favorite parts of open source, and I think that Hacktoberfest probably started out with that ethos before their audience made it about T-shirts and stickers.&lt;/p&gt;

&lt;p&gt;I don’t like the gamified feeling, and maybe that makes this event not for me. The new rule changes will very much change the feel of participation. Probably for the better, since it is opt-in.&lt;/p&gt;




&lt;p&gt;As I continue to dig into the changes, it appears that there was a &lt;a href="https://twitter.com/hacktoberfest/status/1312221208667185153"&gt;tweet&lt;/a&gt; made prior to the changes, but from my perspective, if you didn’t use Twitter and follow &lt;a href="https://twitter.com/hacktoberfest"&gt;@hacktoberfest&lt;/a&gt;, you’d continue to be lost to the change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hacktoberfest.digitalocean.com/hacktoberfest-update"&gt;This message&lt;/a&gt; appears on their site, but I only got to it through the PR. I don't know how else I would have found it because it isn't on the front page or anywhere I'd easily find.&lt;/p&gt;

&lt;p&gt;On one account, I've been told that an email was sent out to highlight rule changes. Pretty late after the fact, but I guess better than never. I cannot confirm this myself, since at the time of this writing, I haven't received any email regarding rule changes.&lt;/p&gt;




&lt;p&gt;Depending on how the changes affect the mood and the outcome of this year's event, I could probably warm up to the idea of 2021. Either way, I'll still be opening PRs against something.&lt;/p&gt;

&lt;p&gt;I'll give credit where it is due to the Hacktoberfest team for responding to abusive participants. BUT I don’t appreciate rules being changed without care to communicate them effectively. I expect better communication from a worldwide event. Please learn from this!&lt;/p&gt;




&lt;p&gt;Anyway, if you've made it this far, don't wait for October to contribute to open source!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>hacktoberfest</category>
      <category>github</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
