<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>spf13</title><link>https://spf13.com/</link><description>Recent content on spf13</description><generator>Hugo</generator><language>en-us</language><copyright>Copyright (c) 2008 - 2022, Steve Francia; all rights reserved.</copyright><atom:link href="https://spf13.com/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Tue, 11 Nov 2025 07:00:00 -0400</lastBuildDate><item><title>The 9 Cost Factors</title><link>https://spf13.com/p/the-9-factors/</link><pubDate>Tue, 11 Nov 2025 07:00:00 -0400</pubDate><guid>https://spf13.com/p/the-9-factors/</guid><media:content url="https://spf13.com/p/the-9-factors/the9costfactors.png" medium="image"/><media:thumbnail url="https://spf13.com/p/the-9-factors/the9costfactors.png"/><description>&lt;div class="callout callout--tip callout--icon">
&lt;div class="callout__icon" aria-hidden="true">✨&lt;/div>
&lt;p class="callout__title">Series Overview&lt;/p>&lt;p>This is the second entry in the True Cost of a Language series.&lt;/p>
&lt;ul>
&lt;li>Start with Part 1: &lt;a href="https://spf13.com/p/the-hidden-conversation/">Why Engineers Can&amp;rsquo;t Be Rational About Programming Languages&lt;/a>&lt;/li>
&lt;li>You&amp;rsquo;re reading Part 2: The 9 Factors&lt;/li>
&lt;/ul>
&lt;/div>
&lt;p>Language choice is among the most expensive strategic decisions a technical leader will make, and many CTOs choose to delegate it.&lt;/p>
&lt;p>Every technical leader knows the pain: your team is debating languages, everyone has data, much of it conflicts, and somehow a decision that will determine 40-60% of your development costs is being made based on whoever argues most passionately.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/the-9-factors/the9costfactors.png" alt="The 9 Cost Factors"/><div class="callout callout--tip callout--icon"><div class="callout__icon" aria-hidden="true">✨</div><p class="callout__title">Series Overview</p><p>This is the second entry in the True Cost of a Language series.</p><ul><li>Start with Part 1:<a href="/p/the-hidden-conversation/">Why Engineers Can&rsquo;t Be Rational About Programming Languages</a></li><li>You&rsquo;re reading Part 2: The 9 Factors</li></ul></div><p>Language choice is among the most expensive strategic decisions a technical leader will make, and many CTOs choose to delegate it.</p><p>Every technical leader knows the pain: your team is debating languages, everyone has data, much of it conflicts, and somehow a decision that will determine 40-60% of your development costs is being made based on whoever argues most passionately.</p><p>There&rsquo;s a reason these conversations feel broken. We&rsquo;re having the<a href="/p/the-hidden-conversation/">wrong conversation entirely</a>. We debate technical features when we should be evaluating economic impact. We argue about what languages can do when we should be measuring what they will cost.</p><p>In my roles at MongoDB, Docker, and Google, I&rsquo;ve watched hundreds of companies treat programming language choice as a purely technical decision, often made by the engineering team, sometimes inherited from history. Given everything else a CTO has to worry about, it often seems like a decision best delegated to the team.</p><p>That made sense when language choice was mostly about whether a language could do the job. But today languages have matured to the point where many languages could accomplish most tasks, the question isn&rsquo;t &ldquo;could&rdquo; but &ldquo;is the right choice considering all the economic factors&rdquo;.</p><p>The choice of language determines how expensive the job will be, how long it will take, and how reliable the result will be. Language choice has become a deeply strategic decision, one that requires moving the conversation from preference to performance, from opinion to economics.</p><p>We need a framework that makes invisible costs visible and ensures we&rsquo;re evaluating what actually determines success: not which language your team prefers, but which language your business can afford.<a href="/p/the-hidden-conversation/">Part 1 of this series</a> unpacked the emotional and identity drivers that keep teams stuck in the old debate; this post unveils the economic counterweight.</p><section class="content-section content-section--type-band content-section--layout-split content-section--tone-alt content-section--bg-aurora"><div class="content-section__inner content-section__inner--split"><div class="content-section__body"><h2 class="content-section__title">Treat language selection as an economic decision</h2>
Beyond bechmarks and "time to MVP" your total cost is determined by maintenance burden, deployment complexity, hiring difficulty, and systemic risk. This framework surfaces those hidden economics so your roadmap, staffing, and tooling choices stay aligned with what you can actually afford.</div><div class="content-section__media"><div class="content-section__media-card"><span class="content-section__eyebrow">Three cost domains</span><ul><li><strong>Building</strong>: maintenance, authoring, onboarding.</li><li><strong>Running</strong>: performance, deployment, scalability.</li><li><strong>Externalities</strong>: interoperability, security, AI leverage, ecosystem risk.</li></ul></div></div></div></section><h2 id="the-nine-cost-factors">The Nine Cost Factors</h2><p>I started developing this framework during my time as product lead of Google&rsquo;s Languages, Optimizations, and Libraries team, then refined it over several years working with dozens of companies facing exactly this decision. It evaluates the total lifecycle cost of a programming language across nine critical dimensions, organized into three domains:</p><ul><li>What it costs to build</li><li>What it costs to run</li><li>The externalities that compound over time</li></ul><p>This framework won&rsquo;t prescribe a single right answer, your context determines that. But it will ensure you&rsquo;re evaluating the right variables across your project&rsquo;s full lifecycle, not just the features that make for passionate debates.</p><h3 id="core-development-factors-13">Core Development (Factors 1–3)</h3><div class="factor-grid factor-grid--cols-2 factor-grid--spotlight"><div class="factor-grid__item factor-grid__item--full factor-grid__item--accent"><div class="factor-grid__header"><span class="factor-grid__number">1</span><h3 class="factor-grid__title">Authoring</h3></div><div class="factor-grid__content"><p>The investment in developer time to build and ship the first version, plus all subsequent features. This encompasses writing new code, understanding existing code, and modifying existing code. The vast majority of authoring happens within an existing system, not on greenfield projects.</p><p><strong>Key considerations:</strong></p><ul><li><p><em>Initial Velocity vs. Sustained Velocity:</em> Languages with simpler syntax, rich standard libraries, and features like automatic memory management often allow developers to write code faster initially. Python is known for rapid prototyping, but that velocity often plummets as project complexity grows. In contrast, languages like C++ or Rust demand more upfront consideration of memory management and data structures, which slows initial authoring but pays dividends in performance and safety later. Go strikes a balance of fast initial authoring with sustained velocity.</p></li><li><p><em>Readability and Cognitive Load:</em> How easily can developers understand existing code? Languages with simple, consistent syntax and &ldquo;one obvious way&rdquo; to accomplish tasks reduce the mental overhead of comprehension. Go&rsquo;s deliberate simplicity and lack of magic makes codebases readable even years later. Languages with heavy metaprogramming, implicit behaviors, or multiple competing patterns increase the time spent understanding code before you can modify it.</p></li><li><p><em>Refactoring Safety:</em> How confidently can you modify existing code? Static typing provides a safety net for changes. Dynamic languages can make small changes quick but at the expense of increased risk. Quality IDE tooling with reliable refactoring support dramatically reduces the cost of evolving a codebase.</p></li><li><p><em>Ecosystem Maturity:</em> Are there excellent, maintained libraries for your needs? Or is the ecosystem a confusing thicket of duplicative or outdated options (a common complaint in the JavaScript and Java worlds)? Poor library support forces your team to build from scratch, dramatically increasing authoring cost. Even worse is choosing the wrong library due to a confusing ecosystem and being forced into costly migrations down the road.</p></li></ul></div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">2</span><h3 class="factor-grid__title">Project Scale</h3></div><div class="factor-grid__content"><p>How well a language enforces structure and prevents chaos as both the codebase and the team expand. A language that is delightful for a single developer can become a &ldquo;big ball of spaghetti&rdquo; for a team of one hundred working on millions of lines of code.</p><p><strong>Critical capabilities:</strong></p><ul><li><p><em>Module Systems and Interface Definitions:</em> Strong module boundaries and clear interface contracts prevent different parts of the codebase from becoming entangled. Languages with weak encapsulation allow dependencies to creep in unchecked, making large codebases nearly impossible to reason about.</p></li><li><p><em>Concurrent Development Support:</em> Can multiple developers work on different parts of the system without constantly stepping on each other&rsquo;s toes? This requires good package management, clear dependency boundaries, and minimal global state.</p></li><li><p><em>Documentation and Knowledge Transfer:</em> Built in documentation generators (like Go&rsquo;s<code>godoc</code> or Java&rsquo;s Javadoc) and conventions for self documenting code are essential as teams scale. Without these, knowledge lives only in developers&rsquo; heads, creating bottlenecks and risk.</p></li><li><p><em>Complexity Management:</em> Does the language provide features that help developers work together and maintain understanding, or does it enable incomprehensible complexity? Excessive abstraction, metaprogramming, and &ldquo;clever&rdquo; features can make code impossible to understand at scale.</p></li><li><p><em>Dependency management at scale:</em> How does the language handle diamond dependencies, version conflicts, and transitive dependencies when you have hundreds of libraries? This is related to ecosystem (in Authoring) but specifically about managing complexity as dependencies proliferate.</p></li></ul><p>Languages like Go, Java, and C# were explicitly designed with large scale enterprise systems in mind, prioritizing clarity and structure over individual developer expressiveness and flexibility, which create exponential complexity costs at scale.</p></div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">3</span><h3 class="factor-grid__title">Onboarding</h3></div><div class="factor-grid__content"><p>How fast can you fill an open headcount and get that person productively shipping code?</p><p><strong>Key factors:</strong></p><ul><li><p><em>Talent Pool Size:</em> Languages with massive, vibrant communities like JavaScript, Python, or Go have vast talent pools, making it easier and faster to hire. Popular languages let you fill positions quickly at competitive salaries; niche languages force you to pay premiums for scarce talent or invest heavily in training developers from other backgrounds.</p></li><li><p><em>Learning Curve:</em> How long before a new hire becomes productive? Some languages can be learned in weeks (Go, Python); others require months of investment (C++, Rust). A steep learning curve multiplies your onboarding cost with every new hire, extending the time before they can ship features independently. This includes the ramp up time on a project in the given language. The more complicated, customized, magic, monolithic a codebase is the longer it takes to be productive even if you already know the language.</p></li><li><p><em>Community Resources:</em> A vibrant community produces more tutorials, better documentation, Stack Overflow answers, and a wealth of third party libraries and frameworks. These resources accelerate onboarding by helping new developers solve problems quickly rather than struggling in isolation or reinventing solutions.</p></li></ul><p>Choosing a niche or obscure language might offer technical advantages, but you&rsquo;ll pay the price in slower hiring, longer ramp up times, and building more from scratch.</p><p><strong>Plan for it:</strong> Track time to first meaningfull PR for new hires across stacks.</p></div></div></div><hr><h3 id="shipping--operating-factors-46">Shipping &amp; Operating (Factors 4–6)</h3><div class="factor-grid factor-grid--cols-2 factor-grid--spotlight"><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">4</span><h3 class="factor-grid__title">Maintenance &amp; Debugging</h3></div><div class="factor-grid__content"><p>The largest hidden tax on any software project, often dwarfing initial development expense. This encompasses the relentless, long term effort required to fix bugs, refactor code, and adapt the system as it evolves.</p><p><strong>Critical factors include:</strong></p><ul><li><em>Profiling &amp; Debugging Tooling</em>: The quality of debuggers and profilers directly impacts the time it takes to solve problems. Mature ecosystems like Java and Go offer excellent tooling, while newer languages can leave developers struggling.</li><li><em>Backward Compatibility &amp; LTS</em>: Languages with strong commitment to backward compatibility (e.g., Go, Java, .NET) minimize risk. Volatile ecosystems with frequent breaking changes, like Python&rsquo;s 2 to 3 transition or TS/JS framework churn impose ongoing migration costs that act as a constant tax on development.</li><li><em>Testing Infrastructure &amp; Readability</em>: How easy is it to write and maintain tests? A language with robust testing support, clear error messages, and inherent readability is far cheaper to maintain when the original author is gone.</li><li><em>Type System</em>: Statically typed languages catch errors at compile time, while dynamically typed languages defer them to runtime, where they are far more expensive to find and fix.</li></ul><p><strong>Plan for it:</strong> Budget time for test coverage, runtime diagnostics, and upgrade windows.</p></div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">5</span><h3 class="factor-grid__title">Runtime</h3></div><div class="factor-grid__content"><p>The direct, operational cost of executing your code: your cloud provider bill for CPU, memory, and network I/O. This cost is driven by the language&rsquo;s performance, efficiency, and runtime characteristics.</p><p><strong>Key factors include:</strong></p><ul><li><p><em>Performance &amp; Efficiency</em>: Compiled languages like C++, Rust, and Go typically execute faster and consume fewer resources than interpreted ones. For a system processing millions of requests, a 10% efficiency improvement translates to significant savings.</p></li><li><p><em>Serverless Suitability</em>: Languages with minimal runtimes and fast cold starts (Go, Rust) excel in serverless environments, while JVM based languages may suffer multisecond startup penalties that impact both cost and user experience.</p></li><li><p><em>Hardware Needs</em>: For specialized workloads like machine learning, this cost includes expensive GPU/TPU resources. The Python code itself may be minimal, but the underlying compute cost can dwarf all others.</p></li></ul><p><strong>Plan for it:</strong> Load test early and benchmark cost per transaction, not just latency.</p></div></div><div class="factor-grid__item factor-grid__item--full factor-grid__item--accent"><div class="factor-grid__header"><span class="factor-grid__number">6</span><h3 class="factor-grid__title">Deployment</h3></div><div class="factor-grid__content"><p>The operational price you pay to move code from a developer&rsquo;s machine to production. This isn&rsquo;t the cost of running the code, but the cost of the build, test, and release process itself. Paid with every commit, a slow or fragile deployment process acts as a significant tax on your team&rsquo;s agility and ability to ship features quickly.</p><p><strong>Key cost drivers include:</strong></p><ul><li><p><em>Build/CI Speed</em>: Languages with slow incremental builds (Rust, C++) or test suites (Java) impose direct dollar costs in CI/CD minutes on platforms like GitHub Actions, potentially reaching thousands of dollars monthly for large projects.</p></li><li><p><em>Artifact Complexity</em>: A language like Go, which compiles quickly to a single binary, offers a simple and fast deployment story. In contrast, Python or TypeScript require packaging the interpreter and numerous dependencies into larger container images, increasing pipeline execution time, storage costs, and complexity.</p></li></ul><p><strong>Plan for it:</strong> Track pipeline minutes and artifact size as first class cost metrics.</p></div></div></div><hr><h3 id="external-forces-factors-79">External Forces (Factors 7–9)</h3><div class="factor-grid factor-grid--cols-2 factor-grid--spotlight"><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">7</span><h3 class="factor-grid__title">AI Assistance</h3></div><div class="factor-grid__content"><p>A modern and increasingly vital factor measuring the effectiveness of AI powered coding assistants like GitHub Copilot and Gemini for Code. These tools are trained on vast amounts of public code, so their quality varies dramatically by language.</p><p><strong>Key factors affecting AI assistance quality:</strong></p><ul><li><p><em>Open Source Footprint:</em> Languages with extensive public codebases provide complete training data, resulting in better, more accurate suggestions.</p></li><li><p><em>API Consistency:</em> Languages with stable, consistent APIs and &ldquo;one obvious way&rdquo; to accomplish tasks generate reliable suggestions. Languages with multiple competing patterns or ways to do the same thing confuse LLMs, resulting in buggy and insecure code.</p></li><li><p><em>Stability and Churn:</em> Frequent breaking changes, evolving idioms, and version fragmentation reduce AI effectiveness. When patterns change rapidly, the AI suggests outdated approaches that no longer work, creating dependency conflicts and compatibility issues.</p></li><li><p><em>Readability and Cognitive Load:</em> The factors that make code easier for humans to understand (covered in Authoring Cost) matter doubly for LLMs. Simple, explicit syntax with minimal &ldquo;magic&rdquo; helps AI assistants generate correct code. Heavy metaprogramming, implicit behaviors, and complex abstractions confuse AI models just as they confuse human developers.</p></li><li><p><em>Context Window Limitations:</em> AI models can only see a limited amount of surrounding code at once. This makes the Project Scale factors: clear module boundaries, self documenting code, and consistent patterns critically important. Languages that enable sprawling, interconnected codebases make it nearly impossible for AI to understand enough context to provide useful suggestions.</p></li></ul><p>Effective AI assistance acts as a productivity multiplier accelerating initial authoring, suggesting bug fixes, and even helping with documentation. Poor AI support puts your team at a competitive disadvantage, essentially forcing them to work without a powerful modern tool that their competitors are leveraging.</p></div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">8</span><h3 class="factor-grid__title">Interoperability</h3></div><div class="factor-grid__content"><p>The cost of making the language work with your existing systems. Few large scale projects are built in a vacuum, they almost always need to communicate with legacy services, databases, cloud platforms, third party APIs, and systems written in other languages.</p><p><strong>Critical capabilities:</strong></p><ul><li><p><em>Foreign Function Interface (FFI):</em> How easily can you call C/C++ libraries? Many critical systems, databases, and performance sensitive components are written in C or C++. A language with a clean, well documented FFI (like Go&rsquo;s cgo or Rust&rsquo;s FFI) enables you to leverage existing code. A poor or cumbersome FFI forces complete rewrites of battle tested libraries.</p></li><li><p><em>Data Exchange Formats:</em> Does the language have mature, well maintained libraries for common data formats like Protocol Buffers, Avro, JSON, MessagePack, or Thrift? Can it efficiently serialize and deserialize data for communication with other services? Poor support means writing custom serialization code or accepting significant performance penalties.</p></li><li><p><em>Ecosystem Integration:</em> Are there quality libraries for the databases you use (PostgreSQL, MySQL, MongoDB, Redis)? For the message queues you rely on (Kafka, RabbitMQ, AWS SQS)? For the cloud platforms you deploy to (AWS, GCP, Azure)? Immature or abandoned libraries force you to maintain forks or build from scratch, dramatically increasing cost.</p></li></ul><p>Poor interoperability creates an isolated silo, forcing costly rewrites of working systems or the creation of complex, fragile bridge services that add latency, failure modes, and operational overhead.</p></div></div><div class="factor-grid__item factor-grid__item--full factor-grid__item--accent"><div class="factor-grid__header"><span class="factor-grid__number">9</span><h3 class="factor-grid__title">Security</h3></div><div class="factor-grid__content"><p>The cost of preventing, detecting, and remediating security vulnerabilities<strong>and</strong> the potential damage to your organization from a breach. A language ecosystem&rsquo;s design can be either a safety net or a minefield.</p><p><strong>Critical security factors:</strong></p><ul><li><p><em>Memory Safety:</em> Languages that offer memory safety by default (Rust, Go, Java, C#) eliminate entire classes of critical vulnerabilities like buffer overflows and use after frees that plague C and C++. This is a huge advantage! Memory safety issues account for roughly 70% of severe security vulnerabilities in systems software.</p></li><li><p><em>Package Manager &amp; Supply Chain Risk:</em> This is massive and often overlooked. Modern applications depend on hundreds of open source packages. The security posture of the ecosystem directly impacts your vulnerability surface. npm has a history of malicious packages; PyPI faces typosquatting campaigns. More curated ecosystems like Go modules or Rust&rsquo;s crates.io provide better security guarantees. This includes the continuous cost of auditing dependencies, running security scans, and responding to advisories. This is work that never ends and comes with catastrophic consequences.</p></li><li><p><em>Integrated Tooling:</em> Built in or ecosystem supported tooling dramatically reduces the cost of securing software. Go ships with integrated fuzzing, go vet, govulncheck (tied directly to Go&rsquo;s vulnerability database and module proxy), and other security tools. In contrast, npm&rsquo;s ecosystem is vast but filled with deprecated, insecure, and abandoned packages. npm audit exists, but false positives and noise overwhelm developers, and tooling consistency is poor across the ecosystem.</p></li><li><p><em>Dependency on C Libraries:</em> Languages that depend on C libraries (such as OpenSSL) inherit their vulnerabilities. The Heartbleed bug in OpenSSL comprimised an estimated 17% of all secure web servers worldwide, including major services from Yahoo to the Canadian Revenue Agency. Any application using the vulnerable OpenSSL versions: including web servers like nginx and Apache, and applications written in Python, Ruby, PHP, Node.js, Java, Rust, and others, were vulnerable regardless of the programming language&rsquo;s own memory safety guarantees.</p><p>Go was uniquely unaffected because it ships its own native TLS implementation rather than depending on OpenSSL. After Heartbleed, the Rust community developed rustls as a memory-safe alternative, though many Rust applications still use OpenSSL through wrapper libraries. This demonstrates how dependency on C libraries creates hidden systemic risk across entire language ecosystems.</p></li></ul><p>A language with memory safety, a secure standard library, strong ecosystem tooling, and a community that prioritizes security can dramatically reduce both your ongoing security costs and the potential damage from breaches.</p></div></div></div><p>Did I miss something or get it wrong? Join the conversation on<a href="https://x.com/spf13">X</a>,<a href="https://bsky.app/profile/spf13.com">Bluesky</a>, or<a href="https://www.linkedin.com/in/stevefrancia/">LinkedIn</a>.</p><hr><p><em>This framework is a living document. As languages evolve and new considerations emerge, the factors may be updated to reflect current realities.</em></p><div class="note"><p class="callout__title">Catch Up or Look Ahead</p><p>Missed Part 1?<a href="/p/the-hidden-conversation/">Why Engineers Can&rsquo;t Be Rational About Programming Languages</a> explores the invisible decision drivers that make this framework necessary.</p><p>Part 3, where we apply the nine factors to real languages, is coming soon.</p></div>
]]></content:encoded></item><item><title>Why Engineers Can't Be Rational About Programming Languages</title><link>https://spf13.com/p/the-hidden-conversation/</link><pubDate>Mon, 03 Nov 2025 10:00:00 -0400</pubDate><guid>https://spf13.com/p/the-hidden-conversation/</guid><media:content url="https://spf13.com/p/the-hidden-conversation/hype-over-logic.png" medium="image"/><media:thumbnail url="https://spf13.com/p/the-hidden-conversation/hype-over-logic.png"/><description>&lt;div class="callout callout--tip callout--icon">
&lt;div class="callout__icon" aria-hidden="true">✨&lt;/div>
&lt;p class="callout__title">Series Overview&lt;/p>&lt;p>This is the first entry in a series on the true cost of a programming language. When you are finished here, read Part 2: &lt;a href="https://spf13.com/p/the-9-factors/">The 9 Factors of a Language’s True Cost&lt;/a>.&lt;/p>
&lt;/div>
&lt;h2 id="the-leadership-blindspot-how-identity-drives-multi-million-dollar-technical-debt">The Leadership Blindspot: How Identity Drives Multi-Million Dollar Technical Debt&lt;/h2>
&lt;p>A programming language is the single most expensive choice a company makes, yet we treat it like a technical debate. After watching this mistake bankrupt dozens of companies and hurt hundreds more, I&amp;rsquo;ve learned the uncomfortable truth: these decisions are rarely about technology. They&amp;rsquo;re about identity, emotion, and ego, and they&amp;rsquo;re destroying your velocity and budget in ways you can&amp;rsquo;t see until it&amp;rsquo;s too late.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/the-hidden-conversation/hype-over-logic.png" alt="Why Engineers Can't Be Rational About Programming Languages"/><div class="callout callout--tip callout--icon"><div class="callout__icon" aria-hidden="true">✨</div><p class="callout__title">Series Overview</p><p>This is the first entry in a series on the true cost of a programming language. When you are finished here, read Part 2:<a href="/p/the-9-factors/">The 9 Factors of a Language’s True Cost</a>.</p></div><h2 id="the-leadership-blindspot-how-identity-drives-multi-million-dollar-technical-debt">The Leadership Blindspot: How Identity Drives Multi-Million Dollar Technical Debt</h2><p>A programming language is the single most expensive choice a company makes, yet we treat it like a technical debate. After watching this mistake bankrupt dozens of companies and hurt hundreds more, I&rsquo;ve learned the uncomfortable truth: these decisions are rarely about technology. They&rsquo;re about identity, emotion, and ego, and they&rsquo;re destroying your velocity and budget in ways you can&rsquo;t see until it&rsquo;s too late.</p><p>Early in my career, I worked at Takkle, a promising social network. A sudden departure vaulted me from lead engineer to VP of Engineering, leading a team of 12. While we were delivering on all our goals, I was in my early 20s and lacked experience, a risk our board wanted to fix. They pressured our CEO to recruit a CTO with more experience. I looked forward to learning from him; he was a well known figure in the Perl community and arrived with a stack of O&rsquo;Reilly &ldquo;camel&rdquo; books.</p><p>One of his first acts was to pronounce our language, PHP, the wrong choice. He decreed a switch to Perl. This decree happened after what felt to me like a sham analysis comparing PHP and Perl.</p><p>Our velocity collapsed. Our team had to not only learn a new language but rebuild from scratch, delaying our product by nine months. Our monthly burn rate jumped from $200K to $500K as we more than doubled our size to make up for the lost velocity while building the new Perl based system, which halved our runway.</p><p>Our CTO did deliver, at least on some of his promises. We built a beautiful system, one I was truly proud of. But it was too late. By the time we finally launched, the market opportunity had vanished. Facebook had now expanded beyond colleges, and we were at the end of our monitary runway. The increased spend had shortened our runway by half, and we didn&rsquo;t have enough momentum with the new site to reach the milestones required to raise more money.</p><p>I&rsquo;ve often wondered: What if we had just stuck with PHP? We had a fine system and real momentum. We would have launched much earlier at a fraction of the cost. PHP was good enough for Facebook; why not us?</p><p>But the question that haunted me was:<em>Why did such an experienced leader make such an terrible mistake</em>?</p><div class="multi-column" style="--multi-column-count:2;--multi-column-gap:2rem;"><p><strong>Promises Made</strong></p><ul><li>Switching to Perl would unlock the architecture we needed</li><li>Rebuilding from scratch would accelerate hiring and quality</li></ul><p><strong>Reality Delivered</strong></p><ul><li>Velocity collapsed as the team relearned and rebuilt everything</li><li>Burn rate jumped from $200K to $500K per month</li></ul></div><h2 id="the-pattern-repeats">The Pattern Repeats</h2><p>As my career progressed I saw this same pattern over and over. As Languages Product Lead at Google, my group included C++, Java, Go, and Python. At MongoDB, I managed teams writing in 13 different languages. In both places I saw brilliant engineers arguing past each other, armed with conflicting data, all of it true, but none of it complete. At Google Cloud, I saw these same challenges across our customers.</p><p>Fast forward two decades from Takkle, and I had déjà vu. I watched as a VP of Engineering presented to leadership why his team needed to build their next system in Rust. The presentation eerily paralleled that Takkle experience. In that old presentation, nearly every reason the CTO gave for Perl was truer of PHP at the time. Now, every single reason given for choosing Rust in this presentation, Go was objectively better at. As an example: they cited &ldquo;easy build and deploy&rdquo; as a Rust advantage. It&rsquo;s true that this is a strength of Rust, but Go&rsquo;s nearly instant cross compilation and single static binary is even stronger than Rust in this specic critera with Rust&rsquo;s very long build times.</p><p>It&rsquo;s not that I think they should have chosen Go, Go would have been the wrong choice for their situation, and I believe Rust was the right choice. But what struck me was how broken their reasoning was. If they were making a logical argument, surely they would have considered Go and in doing so with their presented criteria they would have realized Go was a better option and, at the very least, refined their critera.</p><p>I pulled the VP aside after the meeting. &ldquo;Walk me through how you evaluated other language candidates,&rdquo; I said. His face went blank. &ldquo;We&hellip; didn&rsquo;t really look at any others,&rdquo; he admitted. &ldquo;Everyone&rsquo;s talking about Rust.&rdquo; There it was: a 50 million dollar decision made on hype, about to be green lit.</p><p>For me this was the moment of epiphany, finally an answer to the question for the beginning of my career. The presentation didn&rsquo;t share an analysis, they hadn&rsquo;t done one; it was a justification for a choice already made. This was a decision based purely on hype, emotion, and identity.</p><h2 id="every-technical-debate-is-really-two-conversations">Every Technical Debate Is Really Two Conversations</h2><p>In every language discussion, two conversations are happening simultaneously.</p><p><strong>The Visible Conversation</strong>: &ldquo;Rust has memory safety without garbage collection.&rdquo; &ldquo;Go has faster compile times and easier deployment.&rdquo; &ldquo;Python has the richest ML ecosystem.&rdquo;</p><p><strong>The Invisible Conversation</strong>: &ldquo;I am a Rust programmer.&rdquo; &ldquo;I want to become a Rust programmer.&rdquo; &ldquo;I cannot imagine being someone who doesn&rsquo;t choose Rust.&rdquo;</p><p>If you just read that and thought &ldquo;well, my last language choice was different, I was being rational,&rdquo; your invisible conversation is running right now, defending itself while you read this sentence.</p><p>My CTO at Takkle was having the invisible conversation. Every point in his visible Perl analysis was technically true, but it felt like a sham because it was only there to cover the much deeper invisible conversation. He wasn&rsquo;t evaluating languages. He was protecting an identity he&rsquo;d spent a decade building. What our company paid $300K per month extra for wasn&rsquo;t better architecture or faster hiring. We paid for the opportunity for him to be a Perl CTO instead of a PHP CTO. That was the real transaction. The rebuild was just the payment plan.</p><p>That VP&rsquo;s Rust presentation listed &ldquo;easy build and deploy&rdquo; as an advantage, technically true, but Go is objectively better on that specific criterion. If they were truly having the visible conversation, they would have caught that. They would have at least considered Go in their analysis.</p><p>They hadn&rsquo;t. Because they weren&rsquo;t having that conversation at all. And they were about to spend $50 million on the invisible one.</p><section class="content-section content-section--type-band content-section--bg-spectrum"><h2 id="the-neuroscience-of-why-you-cant-see-your-own-bias">The Neuroscience of Why You Can&rsquo;t See Your Own Bias</h2><p>In one of the most<a href="https://dornsife.usc.edu/news/stories/which-brain-networks-respond-when-someone-sticks-to-a-belief/">fascinating studies</a> done in the past 20 years, researchers set out to understand why people cling to beliefs even when confronted with overwhelming contradictory evidence. What<a href="https://www.nature.com/articles/srep39589">they discovered</a> fundamentally changed our understanding of human decision making.</p><p>The researchers recruited participants and first identified which beliefs were central to each person&rsquo;s identity—their core political views, their fundamental values, the beliefs that defined who they were. Then, while participants lay in an fMRI scanner, the researchers presented them with carefully constructed challenges to these identity based beliefs, alongside challenges to beliefs the participants held but weren&rsquo;t central to their sense of self.</p><p>The brain scans revealed something remarkable: these two types of challenges activated completely different neural pathways.</p><p>When a<em>peripheral belief</em> was challenged, something the person believed but wasn&rsquo;t core to their identity, the brain&rsquo;s reasoning centers activated normally. Participants could consider the evidence, weigh the arguments, and sometimes even change their minds.</p><p>But when an<em>identity based belief</em> was challenged, the brain responded as if under physical attack. The amygdala, your threat detection system, the same system that fires when you encounter a predator or a physical danger, activates immediately. The insular cortex, which processes emotional pain and disgust, lit up with activity. Most tellingly, the brain&rsquo;s Default Mode Network, the system that maintains your sense of self and personal narrative, went into defensive mode, working to protect the existing identity rather than evaluate the new information.</p><p>In other words, your brain wasn&rsquo;t weighing evidence. It was defending itself from an existential threat.</p><div class="note">The researchers&rsquo; conclusion was stark:<strong>&ldquo;To consider an alternative view, you have to imagine an alternative version of yourself.&rdquo;</strong></div><p>Your brain can&rsquo;t objectively evaluate challenges to identity based beliefs because doing so requires temporarily dismantling the neural architecture that defines who you are. It&rsquo;s not a matter of being more rational or trying harder. The mechanism that would allow you to see the bias clearly is the same mechanism the bias has compromised.</p><p>Think about what this means in practice. Every time an engineer evaluates a language that isn&rsquo;t &ldquo;theirs,&rdquo; their brain is literally working against them. They&rsquo;re not just analyzing technical trade offs, they&rsquo;re contemplating a version of themselves that doesn&rsquo;t exist yet, that feels threatening to the version that does. The Python developer reads case studies about Go&rsquo;s performance and their amygdala quietly marks each one as a threat to be neutralized. The Rust advocate looks at identical problems and their Default Mode Network constructs narratives about why &ldquo;only&rdquo; Rust can solve them.</p><p>We&rsquo;re not lying. We genuinely believe our reasoning is sound. That&rsquo;s what makes identity based thinking so expensive, and so invisible.</p></section><h2 id="weve-built-our-industry-around-the-wrong-conversation">We&rsquo;ve Built Our Industry Around the Wrong Conversation</h2><p>We call ourselves Pythonistas, Gophers, Rustaceans, we wear these labels like badges, sometimes we even wear literal badges (t-shirts, stickers, etc). There’s a reason so many of our surnames come from people’s crafts: Potter, Smith, Brewer. What we do becomes who we are. What looks like decorative labels are really decision making frameworks that operate beneath conscious thought.</p><p>We&rsquo;ve built our entire industry around the<em>visible conversation</em>. We train engineers to debate technical merits. We create decision frameworks based on feature matrices. We think if we just gather enough benchmarks and case studies, we&rsquo;ll make the right choice.</p><p>But the<em>invisible conversation</em> is much stronger. It&rsquo;s why my CTO chose Perl. It&rsquo;s why that VP chose Rust. And it&rsquo;s operating in your next language decision right now, invisible and unexamined.</p><p>The moment you hire a Rust developer to evaluate languages, you&rsquo;ve already chosen Rust. You&rsquo;ve just added a $2 million feasibility study to make the predetermined decision feel rational.</p><h2 id="the-real-cost">The Real Cost</h2><p>The question isn&rsquo;t whether this bias exists, the science is conclusive. The real question is: can you afford to let it make your decisions?</p><p>Because the invisible conversation has a price tag. Industry research suggests that technology stack decisions account for 40-60% of total development costs over a product&rsquo;s lifecycle.<a href="https://stripe.com/reports/developer-coefficient-2018">Research by Stripe</a> found that developers spend 42% of their time on technical debt. When you let identity drive that decision you&rsquo;re mortgaging your velocity, your budget, and your runway to pay for someone&rsquo;s sense of self.</p><p>The visible conversation is about technology. The invisible conversation is about identity. And the invisible conversation always wins.</p><h2 id="a-new-framework-language-as-economic-decision">A New Framework: Language as Economic Decision</h2><p>So how do we win, when the invisible conversation is constantly working against us?  Change the conversation entirely.</p><p>Instead of asking &ldquo;which language is best?&rdquo; we need to ask &ldquo;what is this language going to cost us?&rdquo; Not just in salaries, but in velocity, in technical debt, in hiring difficulty, in operational complexity, in every dimension that actually determines whether you survive.</p><p>Reframe it from a technical debate to an economic one. And unlike identity, economics can be measured, compared, and decided without anyone&rsquo;s ego being threatened.</p><p>Choosing a programming language is the single most expensive economic decision your company will make. It will define your culture, constrain your budget, determine your hiring pipeline, set your operational costs, and ultimately dictate whether you can move fast enough to win your market.</p><p>We need a framework that makes the invisible costs visible. One that lets us have the economic conversation instead of the identity conversation. One that works whether you&rsquo;re choosing your first language or evaluating a migration.</p><p>Our industry has never really had that framework&hellip;<a href="/p/the-9-factors/">Until now.</a></p><div class="note"><p class="callout__title">Up Next</p><p>The next post introduces<a href="/p/the-9-factors/">The 9 Factors of a Language’s True Cost</a>. A comprehensive framework for evaluating language decisions based on economics, not identity.</p><p>You’ll learn how to quantify the hidden costs, predict long term impact, and make defensible decisions that your team can align behind, regardless of their language preferences.</p></div>
]]></content:encoded></item><item><title>How Benjamin Franklin Invented Machine Learning in 1720</title><link>https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/</link><pubDate>Fri, 12 Sep 2025 00:00:00 UTC</pubDate><guid>https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/</guid><media:content url="https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/FranklinNeuralCreation.png" medium="image"/><media:thumbnail url="https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/FranklinNeuralCreation.png"/><description>&lt;p>&lt;em>How a teenage printer&amp;rsquo;s writing exercise reverse engineered the timeless principles of learning.&lt;/em>&lt;/p>
&lt;p>The core algorithm that powers today&amp;rsquo;s most advanced artificial intelligence wasn&amp;rsquo;t born in Silicon Valley or has anything to do with computers. It was engineered in the dusty, ink stained backroom of a Boston print shop, nearly 300 years ago, by a teenager who was tired of being told he wasn&amp;rsquo;t a good writer.&lt;/p>
&lt;p>Long before he was a world famous statesman and inventor, Benjamin Franklin was an ambitious, self taught apprentice with a chip on his shoulder. Working for his older brother, he devoured books and secretly submitted anonymous essays to his brother&amp;rsquo;s newspaper, desperate to succeed in this world of words. But he had a problem. While his ideas were sharp, his prose was clumsy.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/how-benjamin-franklin-invented-machine-learning-in-1720/FranklinNeuralCreation.png" alt="How Benjamin Franklin Invented Machine Learning in 1720"/><p><em>How a teenage printer&rsquo;s writing exercise reverse engineered the timeless principles of learning.</em></p><p>The core algorithm that powers today&rsquo;s most advanced artificial intelligence wasn&rsquo;t born in Silicon Valley or has anything to do with computers. It was engineered in the dusty, ink stained backroom of a Boston print shop, nearly 300 years ago, by a teenager who was tired of being told he wasn&rsquo;t a good writer.</p><p>Long before he was a world famous statesman and inventor, Benjamin Franklin was an ambitious, self taught apprentice with a chip on his shoulder. Working for his older brother, he devoured books and secretly submitted anonymous essays to his brother&rsquo;s newspaper, desperate to succeed in this world of words. But he had a problem. While his ideas were sharp, his prose was clumsy.</p><p>His own father, Josiah, delivered a blunt critique: Ben&rsquo;s writing lacked &ldquo;elegance of expression, method and perspicuity.&rdquo;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> For an aspiring intellectual, this was a devastating diagnosis. It confirmed his fear that he simply didn&rsquo;t have the innate &lsquo;gift&rsquo; for writing.</p><p>Instead of giving up, Franklin did something extraordinary.<span class="highlight-inline">He rejected the idea of ‘innate talent’ and treated his flawed writing not as a personal failure, but as an<strong>engineering problem</strong>.</span>
He asked himself:<em>Is there a system, an algorithm, that can build the skill of writing from the ground up?</em> In effect, he decided to debug his own brain.<span style="display:none;"><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></span></p><p>What Franklin developed wasn&rsquo;t just a writing exercise, it was something far more profound. His process reveals something fundamental about how intelligence, artificial or human, actually improves. When we examine his method through a modern lens, we discover he had unknowingly architected the same learning principles that power today&rsquo;s AI.</p><p><strong>Franklin&rsquo;s method can be seen as a kind of human powered, conceptual gradient descent</strong>, where conscious insight replaces calculus to minimize the &rsquo;error&rsquo; between his writing and his goal. By deconstructing his 300 year old protocol, we can uncover a powerful blueprint for how anyone can master a complex skill.</p><p>Franklin&rsquo;s breakthrough wasn&rsquo;t just in learning to write better, it was in<em>systematizing the process of improvement itself</em>. He created a feedback loop that could be applied to any skill, making excellence reproducible rather than accidental.</p><section class="content-section content-section--type-band content-section--bg-zenith"><h2 id="the-learning-algorithm">The Learning Algorithm</h2><figure><img src="/p/how-benjamin-franklin-invented-machine-learning-in-1720/FranklinLearning.png" alt="Benjamin Franklin's systematic approach to learning"><figcaption><p>Franklin&rsquo;s methodical approach to mastering writing</p></figcaption></figure><p>Franklin chose articles from<em>The Spectator</em>, a respected British periodical, as his &ldquo;training data&rdquo; and ran them through a repeatable loop that tightened his prose with every pass.</p><div class="factor-grid factor-grid--cols-2"><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">1</span><h3 class="factor-grid__title">Feature Extraction</h3></div><p class="factor-grid__blurb">Compress the source to its signal</p><div class="factor-grid__content">First, he converted exemplary essays into compact notes. He took several articles and made &ldquo;short hints of the sentiment in each sentence&rdquo;<sup><a href="#fn:2">2</a></sup>, forcing himself to distill structure, tone, and argument the way an AI model pulls features from raw data.</div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">2</span><h3 class="factor-grid__title">Reconstruction</h3></div><p class="factor-grid__blurb">Generate from compressed understanding</p><div class="factor-grid__content">After a deliberate pause of a few days—an instinctual guard against rote memorization—he rebuilt the article sentence by sentence from those hints. This was his forward pass, a prediction generated from the representation he had just engineered.</div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">3</span><h3 class="factor-grid__title">Error Calculation</h3></div><p class="factor-grid__blurb">Compare against the ground truth</p><div class="factor-grid__content">He then executed the most critical step: &ldquo;I compared my Spectator with the original, discovered some of my faults, and corrected them&rdquo;<sup><a href="#fn:2">2</a></sup>. The side by side review supplied a loss signal that surfaced concrete gaps in diction, cadence, and logic.</div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">4</span><h3 class="factor-grid__title">Parameter Update</h3></div><p class="factor-grid__blurb">Adjust the mental model</p><div class="factor-grid__content">Franklin leaned into every discrepancy. By rewriting awkward phrases, borrowing structure, and noting superior turns of phrase, he updated the parameters of his own style so the next prediction would land closer to the target.</div></div></div><div class="callout callout--idea callout--icon"><div class="callout__icon" aria-hidden="true">⚡</div><p class="callout__title">Deliberate Practice, 1720 Style</p><p>Psychologist Anders Ericsson later coined the term<strong>&ldquo;deliberate practice&rdquo;</strong><sup><a href="#fn:3">3</a></sup> for exactly this pattern: a structured activity with explicit goals, rapid feedback, and relentless correction. Franklin was running that playbook two centuries early.</p></div></section><h2 id="the-modern-parallel-deconstructing-the-training-loop">The Modern Parallel: Deconstructing the Training Loop</h2><p>Franklin&rsquo;s protocol is a striking parallel for a modern machine learning training loop:</p><table><thead><tr><th>Benjamin Franklin&rsquo;s Method</th><th>Modern Machine Learning Equivalent</th></tr></thead><tbody><tr><td>Selects high quality articles from<em>The Spectator</em></td><td><strong>Data Collection</strong>: A curated, high quality dataset is assembled for training</td></tr><tr><td>Reconstructs articles from &ldquo;short hints&rdquo;</td><td><strong>Forward Pass</strong>: The model makes a prediction based on an input</td></tr><tr><td>Compares his version to the original to find &ldquo;faults&rdquo;</td><td><strong>Loss Function</strong>: The model&rsquo;s prediction is compared to the correct output to calculate an error</td></tr><tr><td>Meticulously corrects his prose based on the errors found</td><td><strong>Backpropagation &amp; Gradient Descent</strong>: The error is propagated backward to adjust the model&rsquo;s internal weights, minimizing future errors</td></tr></tbody></table><div class="callout note callout--icon"><div class="callout__icon" aria-hidden="true">🧠</div><p class="callout__title">Regularization Before Calculus</p><p>Franklin&rsquo;s built in delay functioned as<strong>regularization</strong>, preventing overfitting by forcing him to generalize rather than memorize the Spectator&rsquo;s prose. He even practiced early<strong>data augmentation</strong>, shuffling notes or flipping prose into poetry and back to strengthen the underlying representation.</p></div><section class="content-section content-section--type-band content-section--bg-dusk"><h2 id="the-learners-playbook-applying-the-franklin-protocol">The Learner&rsquo;s Playbook: Applying the Franklin Protocol</h2><figure class="figure--side"><img src="/p/how-benjamin-franklin-invented-machine-learning-in-1720/AppliedLearning.png" alt="Applied Learning Framework" width="500"><figcaption><p>Modern applications across domains</p></figcaption></figure><p>Anyone can use the Franklin Protocol to master a skill today, from coding to cooking to playing a musical instrument. The key is to<strong>stop passively consuming information and start building your own active learning loop</strong>.</p><p>The beauty of Franklin&rsquo;s method lies in its universality. Whether you&rsquo;re debugging code, perfecting a recipe, or learning a musical piece, the same principles apply: compress the knowledge, reconstruct from memory, compare against excellence, and iterate based on the gaps you discover.</p><div class="callout note callout--icon"><div class="callout__icon" aria-hidden="true">🍌</div><p>Even when our primary ventures fail, we have to remember that there’s always money in the banana stand. The fundamental practices that seem mundane often contain the greatest value.</p></div><h3 id="1-find-your-spectator">1. Find Your &ldquo;Spectator&rdquo;</h3><p>Every skill has a &ldquo;ground truth&rdquo;, a gold standard you can learn from. Franklin had<em>The Spectator</em>. For you, it might be an exemplar that proves what&rsquo;s possible.</p><ul><li><strong>Developer</strong>: The source code of a well written, open source project or a language&rsquo;s standard library</li><li><strong>Musician</strong>: A virtuosic recording of a difficult piece</li><li><strong>Chef</strong>: A classic, time tested recipe from a master like Julia Child</li></ul><p>The goal is to find an authoritative model you can meaningfully compare your own work against.</p><h3 id="2-implement-your-learning-loop">2. Implement Your Learning Loop</h3><p>I used a very similar protocol when I was learning the Go programming language, treating the effort like a<strong>Code Kata</strong>. After learning the basics, I designed focused challenges such as reimplementing functions from the<code>strings</code> package.</p><div class="factor-grid factor-grid--cols-3"><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">FP</span><h3 class="factor-grid__title">Forward Pass</h3></div><p class="factor-grid__blurb">Attempt the skill from your current understanding</p><div class="factor-grid__content">I&rsquo;d write my own version of<code>strings.Split</code> or<code>strings.Join</code> from scratch, based on my current knowledge</div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">LF</span><h3 class="factor-grid__title">Loss Function</h3></div><p class="factor-grid__blurb">Compare against a trusted ground truth</p><div class="factor-grid__content">Then, I would open Go’s standard library, written by the Go creators, and compare my code, line-by-line, against the official, production-grade implementation</div></div><div class="factor-grid__item"><div class="factor-grid__header"><span class="factor-grid__number">ES</span><h3 class="factor-grid__title">Error Signal</h3></div><p class="factor-grid__blurb">Capture precise deltas to correct</p><div class="factor-grid__content">The difference was my feedback. My clumsy error handling, inefficient loops, and non-idiomatic variable names became glaringly obvious when placed next to the work of masters.</div></div></div><h3 id="3-internalize-the-patterns-the-masters-step">3. Internalize the Patterns (The Master&rsquo;s Step)</h3><p>This final step is what separates simple practice from true mastery. After refactoring based on insights, ask the master&rsquo;s question:<em>&ldquo;What pattern did I miss that an expert sees instantly?&rdquo;</em> This meta analysis, thinking about your thinking, accelerates the internalization of expert mental models.</p><p>For me learning Go, the most crucial step was not just seeing the difference, but going back and<strong>refactoring my own code</strong> based on those insights. Each cycle transformed the exercise from a simple task into a kata, a mindful practice where the goal wasn’t just to get a working solution, but to internalize the patterns of an expert. I even gave<a href="https://spf13.com/presentation/7-biggest-mistakes-in-go/">a presentation about my mistakes and how I learned from them</a>.</p><div class="callout callout--idea callout--icon"><div class="callout__icon" aria-hidden="true">🧩</div><p class="callout__title">Leverage LLMs for your learning</p><p>Today modern AI models can facilitate this step much more efficiently, as these models are excellent at identifying and evaluating the differences between two blocks of text and explaining why one is superior.</p></div></section><h2 id="true-learning">True Learning</h2><div class="callout callout--idea callout--icon"><div class="callout__icon" aria-hidden="true">🎯</div><p class="callout__title">Mastery Means Building a Generative Model</p><p>Franklin&rsquo;s method worked because he intuitively understood that<strong>mastery is not about memorization, but about building an internal generative model of a domain</strong>. He didn&rsquo;t memorize<em>The Spectator</em>, he learned to generate prose with the same qualities by internalizing its patterns.</p></div><p>This principle extends far beyond Franklin&rsquo;s era. It is the very essence of modern AI. Large language models don&rsquo;t &ldquo;know&rdquo; anything; they are sophisticated pattern recognition engines. They have learned the statistical patterns of language so well that they can generate coherent, novel text because they have captured the distribution of language itself<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup><sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>.</p><p>People who master any field follow the principle. They don&rsquo;t win by consuming the most tutorials, but have built the most effective systems for recognizing patterns, crafting systems that surface errors quickly, and converting them into new capabilities.</p><p>Perhaps Franklin&rsquo;s greatest insight wasn&rsquo;t the method itself, but his<strong>rejection of the fixed mindset</strong>. In an era when talent was considered innate, he proved that expertise could be engineered systematically. This is<em>learning how to learn</em>, the ultimate meta skill.</p><p>Three hundred years ago, a teenage printer reverse engineered the algorithm of learning with nothing more than paper and ink. While Franklin’s method and machine learning operate in different domains, they share the same core architecture of systematic improvement through error correction.</p><p>Today, we have access to endless “Spectators” in every field imaginable. Franklin gave us the blueprint.<strong>It&rsquo;s time we started building ourselves with it.</strong></p><section class="content-section content-section--type-card content-section--tone-alt content-section--bg-halo"><h2 id="the-franklin-challenge">The Franklin Challenge</h2><p>If you&rsquo;re inspired by this method, don&rsquo;t just admire it,<strong>try it</strong>.</p><div class="cta-group"><span class="cta-group__eyebrow">Run the loop</span><h3 class="cta-group__title">Try Franklin's protocol this week</h3><div class="cta-group__body">Pick a micro skill, find your Spectator, and walk one deliberate loop. Capture what changes and share it with a teammate to cement the lesson.</div></div><ol><li><strong>Pick a Micro Skill</strong>: Choose one small, specific skill you want to improve this week (e.g., writing a SQL query, refactoring a function, kneading bread, drawing a face)</li><li><strong>Find Your Spectator</strong>: Track down a single, high quality example of that skill executed perfectly</li><li><strong>Run One Loop</strong>: Spend 30 minutes replicating it from memory. Then compare your work to the original and record three precise differences</li></ol><p>That’s it. By running a single, conscious loop, you’ll have already started practicing like Franklin and learning like a neural network.</p></section><div class="footnotes" role="doc-endnotes"><hr><ol><li id="fn:1"><p>Benjamin Franklin,<em>The Autobiography of Benjamin Franklin</em> (1791). Franklin&rsquo;s own account of his father&rsquo;s critique of his writing style.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#8617;&#xfe0e;</a></p></li><li id="fn:2"><p>Benjamin Franklin,<em>The Autobiography of Benjamin Franklin</em> (1791). Franklin describes his method: &ldquo;I compared my Spectator with the original, discovered some of my faults, and corrected them.&rdquo;&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#8617;&#xfe0e;</a></p></li><li id="fn:3"><p>Anders Ericsson,<em>Peak: Secrets from the New Science of Expertise</em> (2016). The seminal work on deliberate practice and how experts are made.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#8617;&#xfe0e;</a></p></li><li id="fn:4"><p>PNAS,<a href="https://www.pnas.org/doi/10.1073/pnas.2115229119">&ldquo;Learning in deep neural networks and brains with similarity&rdquo;</a> - Scientific paper on pattern recognition in neural networks and biological brains.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#8617;&#xfe0e;</a></p></li><li id="fn:5"><p>OpenAI,<a href="https://openai.com/index/learning-complex-goals-with-iterated-amplification/">&ldquo;Learning complex goals with iterated amplification&rdquo;</a> - Research on how AI systems learn and improve through iterative processes.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#8617;&#xfe0e;</a></p></li></ol></div>
]]></content:encoded></item><item><title>Cobra &amp; Viper Fortify Security as Part of GitHub Secure Open Source Fund</title><link>https://spf13.com/p/cobra-viper-fortify-security-as-part-of-github-secure-open-source-fund/</link><pubDate>Tue, 19 Aug 2025 00:00:00 UTC</pubDate><guid>https://spf13.com/p/cobra-viper-fortify-security-as-part-of-github-secure-open-source-fund/</guid><media:content url="https://spf13.com/p/cobra-viper-fortify-security-as-part-of-github-secure-open-source-fund/GithubSecureFundCobraViper.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/cobra-viper-fortify-security-as-part-of-github-secure-open-source-fund/GithubSecureFundCobraViper.jpg"/><description>&lt;p>I&amp;rsquo;ve spent most of my career working in New York City. Every morning, I&amp;rsquo;d walk past those towering skyscrapers, genuinely amazed at what humans can build together. The engineering, the coordination, the trust required. It&amp;rsquo;s breathtaking.&lt;/p>
&lt;p>What fascinates me most is the foundation. While everyone admires the gleaming towers, I think about the engineers who spent months planning what goes sixty feet underground. That invisible work makes everything else possible. No Instagram posts about foundation concrete. No TED talk talks about rebar placement.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/cobra-viper-fortify-security-as-part-of-github-secure-open-source-fund/GithubSecureFundCobraViper.jpg" alt="Cobra & Viper Fortify Security as Part of GitHub Secure Open Source Fund"/><p>I&rsquo;ve spent most of my career working in New York City. Every morning, I&rsquo;d walk past those towering skyscrapers, genuinely amazed at what humans can build together. The engineering, the coordination, the trust required. It&rsquo;s breathtaking.</p><p>What fascinates me most is the foundation. While everyone admires the gleaming towers, I think about the engineers who spent months planning what goes sixty feet underground. That invisible work makes everything else possible. No Instagram posts about foundation concrete. No TED talk talks about rebar placement.</p><p>In software, we build on similar foundations, and I&rsquo;ve been incredibly fortunate to help create some of them.</p><h2 id="an-honor-and-a-renewed-responsibility">An Honor and a Renewed Responsibility</h2><p>When I learned that<a href="https://cobra.dev/">Cobra</a> and<a href="https://github.com/spf13/viper">Viper</a> were selected for the inaugural<a href="https://github.blog/news-insights/company-news/github-secure-open-source-fund-2024/">GitHub Secure Open Source Fund</a>, I felt a mix of profound gratitude and renewed responsibility.</p><p>These projects started over a dozen years ago. Cobra was born because no library existed in Go at the time that could enable the<a href="https://gohugo.io/">Hugo</a> experience I had invisioned. Viper? I just wanted config management that didn&rsquo;t make me question my career choices. I never imagined they&rsquo;d become the foundation for projects like<a href="https://kubernetes.io/">Kubernetes</a>,<a href="https://www.docker.com/">Docker</a>,<a href="htts://caddyserver.com">Caddy</a>, and the<a href="https://cli.github.com/">GitHub CLI</a>.</p><p>The responsibility isn&rsquo;t just an intellectual exercise, it&rsquo;s real and troubling. When millions of production systems depend on your code, &ldquo;YOLO-driven development&rdquo; stops being funny real quick.</p><h2 id="learning-from-shared-challenges">Learning from Shared Challenges</h2><p>The<a href="https://en.wikipedia.org/wiki/Log4Shell">Log4Shell</a> vulnerability was a wake up call for all of us. The<a href="https://logging.apache.org/log4j/">Log4j</a> team, who graciously shared their experiences as part of this GitHub cohort, showed us how quickly a single vulnerability can become a global crisis.</p><p>Their openness taught me so much. We&rsquo;re all vulnerable. We&rsquo;re all doing our best with limited resources. And we all need to support each other better.</p><p>That&rsquo;s what made this GitHub program so powerful: it was about learning together how to do better.</p><h2 id="a-cohort-of-collaboration">A Cohort of Collaboration</h2><p>The GitHub program exceeded every expectation. We worked with tools like<a href="https://codeql.github.com/">CodeQL</a> and<a href="https://github.com/dependabot">Dependabot</a>, but more importantly, we worked with each other.</p><p>Being in the program with teams from<a href="https://ollama.com/">Ollama</a>,<a href="https://caddyserver.com/">Caddy</a>,<a href="https://fluxcd.io/">Flux</a>,<a href="https://github.com/abiosoft/colima">Colima</a>,<a href="https://ente.io/">Ente</a>, and<a href="https://zitadel.com/">ZITADEL</a> reminded me why I love open source.</p><p>We shared our struggles, our solutions, and our hopes. The Ollama team showed us how they handle AI model security. The Colima team shared their experiences with container security in a world where containers are the new VMs.</p><p>We weren&rsquo;t competing, we were collaborating. Every improvement to one project strengthens the entire ecosystem. Your security is my security. We rise together.</p><h2 id="security-boot-camp-not-security-theater">Security Boot Camp, Not Security Theater</h2><p>In a workshop titled &ldquo;CodeQL from Zero to Hero,&rdquo; we were instructed by GitHub&rsquo;s leading security researcher. She didn&rsquo;t just teach us theory but how to practially leverage CodeQL. After a few introductory exercises, she had the participants switch from a test database to a real one from an open source project she had previously analyzed.</p><p>She guided everyone in writing a data flow query from scratch. The goal was to find any place where user input (source) flowed into a dangerous command execution function (sink). After assembling the final query, the group ran it. The results lit up the screen, revealing 16 distinct command injection vulnerabilities.</p><p>The &ldquo;aha&rdquo; moment was seeing how they all stemmed from a popular machine learning framework called Gradio, which the query had identified as a source of user input. The instructor explained how she had previously modeled that framework in CodeQL, allowing her to find all these &ldquo;variants&rdquo; of the same vulnerability. It was a live demonstration of moving from learning a new skill to finding critical, real world security flaws in a matter of minutes.
This wasn&rsquo;t just a workshop; it was a masterclass in how to think like a security researcher. It was about building skills, not just checking boxes.</p><h2 id="building-on-a-strong-foundation">Building on a Strong Foundation</h2><p>During my time leading the<a href="https://go.dev/blog/">Go team at Google</a>, I had the privilege of working with<a href="https://en.wikipedia.org/wiki/Rob_Pike">Rob Pike</a>,<a href="https://github.com/griesemer">Robert Griesemer</a>, and<a href="https://en.wikipedia.org/wiki/Ken_Thompson">Ken Thompson</a>. They didn&rsquo;t just create a language, they encoded decades of hard won wisdom about what goes wrong in systems programming.</p><p>The decisions we made: immutable strings, no pointer arithmetic, explicit error handling, integrated fuzzing and vulnerability scanning weren&rsquo;t just technical choices. They were investments in the future security of every Go program. When I started Cobra and Viper, I wanted to build on that foundation. I wanted to create libraries that were not just powerful, but also secure by default. When I joined the Go team, I thought of this heavy responsibility as a privilege. I wanted to make sure that the tools we built would help developers avoid the pitfalls that had plagued so many other languages.</p><h2 id="the-uncomfortable-economics-of-open-source-security">The Uncomfortable Economics of Open Source Security</h2><p>I want to be transparent: maintaining critical open source infrastructure is challenging. I&rsquo;ve been fortunate to have support from companies like<a href="https://google.com">Google</a>,<a href="https://docker.com">Docker</a>,<a href="https://mongodb.com">MongoDB</a>, and<a href="https://twosigma.com">Two Sigma</a> throughout this journey.</p><p>But even with that support, security improvements often take a backseat. Why? Building new features is exciting. Users shout in celebration about new features (or riot over missing features). They only whisper about security&hellip; until something catastrophic happens.</p><p>The GitHub fund is a start to changing this dynamic. It&rsquo;s recognition that this often invisible security work is essential infrastructure that deserves dedicated time and resources.</p><h2 id="a-community-achievement">A Community Achievement</h2><p>This recognition belongs to everyone who has contributed to Cobra and Viper. Every person who submitted a PR, reported an issue, or reviewed code late into the night; You made this possible.</p><p>I especially want to acknowledge the people who do the quiet, essential work: writing documentation, patiently answering questions, and creating examples that make concepts click. You are the heart of these projects.</p><p>This achievement is yours as much as ours.</p><h2 id="your-action-items-yes-you">Your Action Items (Yes, You)</h2><p><strong>If you use Cobra or Viper</strong>: Thank you for your trust. Update to the latest versions to get these improvements. We&rsquo;re committed to maintaining this higher standard.</p><p><strong>If you maintain open source</strong>: I encourage you to explore the security resources available through<a href="https://openssf.org/resources/">OpenSSF</a>. The tools are accessible, and the community is supportive. We&rsquo;re all learning together.</p><p><strong>If your company depends on open source</strong>: Please consider how you might support the projects that form your foundation. Giving your employees time to contribute back is often the most valuable support you can offer.</p><h2 id="the-view-from-here">The View From Here</h2><p>Looking at where these projects are today fills me with gratitude. We built the foundation. The Go community reinforced it. And now, thanks to GitHub and this incredible cohort, we&rsquo;ve done the seismic retrofitting to make sure it can handle whatever comes next.</p><p>To everyone who&rsquo;s been part of this journey thank you.</p><p>Now if you&rsquo;ll excuse me, I need to update some dependencies. Security never sleeps, but at least now it has better tooling.</p><hr><p><em>P.S. - For a deep dive into the technical details, the<a href="https://cobra.dev/blog/2025-08-11-github-opensource-fund/">Cobra team&rsquo;s post</a> has comprehensive notes. If you have questions, we genuinely want to hear them—that&rsquo;s how we all improve.</em></p><p><em>P.P.S. - If you&rsquo;re wondering about the impact: when you run<code>kubectl</code>, you&rsquo;re using Cobra. When your services load configuration, they&rsquo;re likely using Viper. We&rsquo;re all connected in this dependency graph we call modern software. Thank you for being part of it.</em></p>
]]></content:encoded></item><item><title>spf13 Google --></title><link>https://spf13.com/p/spf13-google/</link><pubDate>Mon, 18 Jul 2022 16:49:39 UTC</pubDate><guid>https://spf13.com/p/spf13-google/</guid><media:content url="https://spf13.com/p/spf13-google/mantas-hesthaven-_g1WdcKcV3w-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/spf13-google/mantas-hesthaven-_g1WdcKcV3w-unsplash.jpg"/><description>&lt;p>I’m leaving my role as the Product Lead for the Go Language at Google. I’m super proud of everything the Go team has accomplished in the last six years, and I&amp;rsquo;ve never been more excited for Go&amp;rsquo;s future. &lt;strong>Read on if you&amp;rsquo;re interested in what led me to my decision, what I&amp;rsquo;ll be doing next, and what I&amp;rsquo;ll miss about my time at Google.&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="go-has-been-my-passion-for-the-past-10-years">Go has been my passion for the past 10 years&lt;/h2>
&lt;p>Ten years ago, I used Go for the first time. I immediately fell in love with the language and its simple elegance. For the first time in a long time, I loved programming again. So much so that I was eager to write Go whenever I could. This led to the creation of &lt;a href="https://gohugo.io">Hugo&lt;/a>, &lt;a href="https://cobra.dev">Cobra&lt;/a>, &lt;a href="https://github.com/spf13/viper">Viper&lt;/a> and a handful of &lt;a href="https://github.com/spf13">additional Go libraries&lt;/a>.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/spf13-google/mantas-hesthaven-_g1WdcKcV3w-unsplash.jpg" alt="spf13 Google -->"/><p>I’m leaving my role as the Product Lead for the Go Language at Google. I’m super proud of everything the Go team has accomplished in the last six years, and I&rsquo;ve never been more excited for Go&rsquo;s future.<strong>Read on if you&rsquo;re interested in what led me to my decision, what I&rsquo;ll be doing next, and what I&rsquo;ll miss about my time at Google.</strong></p><hr><h2 id="go-has-been-my-passion-for-the-past-10-years">Go has been my passion for the past 10 years</h2><p>Ten years ago, I used Go for the first time. I immediately fell in love with the language and its simple elegance. For the first time in a long time, I loved programming again. So much so that I was eager to write Go whenever I could. This led to the creation of<a href="https://gohugo.io">Hugo</a>,<a href="https://cobra.dev">Cobra</a>,<a href="https://github.com/spf13/viper">Viper</a> and a handful of<a href="https://github.com/spf13">additional Go libraries</a>.</p><p>This passion also led me to get involved in the broader Go community. I spoke at the first Gophercon, the first Gotham Go, and the first Gopherfest. I fondly remember sitting in a room with<a href="https://twitter.com/goinggodotnet">Bill Kennedy</a> the night before the first Gophercon, putting together all the swag bags alongside<a href="https://twitter.com/erikstmartin">Erik</a> and<a href="https://twitter.com/bketelsen">Brian</a>. For the second Gophercon Brian and Erik asked me to run the lightning talk program with<a href="https://twitter.com/markbates">Mark Bates</a>. We quickly became close friends and organized and emceed the next several Gotham Go conferences and Gophercons (lightning track) together.</p><p>This work in the community led to relationships with a few members of the Go team, which led to the opportunity to join the team myself. I blogged about<a href="https://spf13.com/p/im-joining-the-go-team-at-google/">joining the Go team</a>.</p><hr><h2 id="taking-go-to-the-enterprise-mainstream">Taking Go to the Enterprise Mainstream</h2><p>I<a href="https://spf13.com/p/im-joining-the-go-team-at-google/">joined the Go team 6 years ago</a> with a goal to take Go from a niche hobbyist language to a mainstream, enterprise ready language. Looking back now, I believe we have accomplished, and even exceeded this goal.</p><p>When I joined the Go team their primary focus (and roadmap) was centered around addressing the needs of Google’s internal users. I drove a pivot in our focus to address the needs of our entire global user base of both current and future users. Our focus on Go’s global user base led to identifying and addressing friction around the entire Go developer experience.</p><p>My first project reflected this change of focus. I started the now bi-annual<a href="https://go.dev/blog/survey2016">Go user survey</a>, one of the world’s largest developer surveys. This survey has done more than anything else to drive the Go roadmap over the past 6 years. The direct feedback from our users led to the team addressing Go’s two biggest enterprise adoption blockers with the addition of<a href="https://go.dev/blog/modules2019">modules</a> and<a href="https://go.dev/blog/intro-generics">generics</a> to the Go language.</p><p>Based on feedback from enterprise users we made significant updates to<a href="https://go.dev/blog/go-brand">Go’s Brand</a>. This led to publishing<a href="https://go.dev/">Go.dev</a>,<a href="https://go.dev/blog/go.dev">a single destination</a> for all Go web properties with<a href="https://go.dev/solutions/#case-studies">over 30 case studies</a>,<a href="https://go.dev/solutions/#use-cases">helpful use cases</a>,<a href="https://go.dev/learn/">a learning center</a>,<a href="https://go.dev/play/">a Go playground</a> and<a href="https://pkg.go.dev">Go’s package discovery portal</a>.</p><p>We delivered<a href="https://go.dev/blog/vscode-go">VSCode Go</a> and<a href="https://go.dev/blog/gopls-vscode-go">Gopls</a>, significantly improving the Go developer experience. We’ve improved our documentation and<a href="https://go.dev/doc/tutorial/">expanded our tutorials</a> around use cases that Go’s users identified. We improved how folks<a href="https://go.dev/doc/install">install Go</a> and created<a href="https://go.dev/blog/get-familiar-with-workspaces">Go workspaces</a> to facilitate multiple module projects.</p><p>Our global focus led to embracing our worldwide community and contributors. We ensured that Go was accessible in as many countries as possible including<a href="https://go.dev/blog/hello-china">China</a>. We held several<a href="https://go.dev/blog/contributors-summit">contributor summits</a> and<a href="https://go.dev/blog/contributor-workshop">a contributor workshop</a>. The Go project evolved from<a href="https://go.dev/blog/9years#go-contributors">one that was primarily written by Googlers, to primarily written by community contributors</a>. The Go project made<a href="https://go.dev/blog/conduct-2018">impactful</a><a href="https://go.dev/blog/conduct-2021">refinements</a> to our<a href="https://go.dev/conduct">Code of Conduct</a>, ensuring that the Go community remains welcoming and friendly. We created a<a href="https://go.dev/blog/go-developer-network">Go Developer Network</a> of nearly 200 meetups in over 50 countries.</p><p>Over the past 6 years Go’s user base has grown ~10x and Go users have increased their frequency from occasional to daily usage. Today, Go is now widely considered a mainstream enterprise language. Go is the modern cloud language both as the primary infrastructure language, with over 75% of<a href="https://www.cncf.io/projects/">CNCF projects</a> written in Go, and as one of the main cloud application languages.</p><p>I’m so fortunate to have played a role in assisting the Go team and community, who worked incredibly hard to accomplish all of this (and more) to take Go to where it is today.</p><hr><h2 id="the-exceptional-go-team">The Exceptional Go Team</h2><p>I can’t overstate how much being a part of Go has meant to me personally and professionally. I’ve made many of my closest friends through the Go community. These are some of the most genuine, caring people I’ve ever met.</p><p>During my time at Google, I’ve been fortunate to work alongside and learn from the most talented people in our industry. Even at a company made up of exceptional people, I believe the Go team is the exception within the exceptional, truly the best of the best. I think there is nothing more empowering as a product leader than knowing that regardless of the vision you have, your engineering partners will be able to build it better than you imagined.</p><p>I’ve learned more about what it means to lead and what it means to be a good teammate over the past six years than I ever thought possible. I will deeply miss my partners,<a href="https://twitter.com/sajma">Sameer Ajmani</a> and<a href="https://twitter.com/_rsc?lang=en">Russ Cox</a>, and the rest of the Go team. Together we have made something amazing and I’m deeply proud of what we’ve accomplished.</p><hr><h2 id="personal-highlights-from-my-time-on-the-go-team">Personal highlights from my time on the Go team</h2><p>Indulge me while I share some personal experiences. Things that really nobody else saw and might not have been meaningful to anyone else, but will remain with me as some of my fondest memories.</p><ul><li>The Go team’s first movie night where we watched<a href="https://www.imdb.com/title/tt0113243/">Hackers</a> in the NYC Google office’s small theater room.</li><li>Going to see<a href="https://cjramone.com/">CJ Ramone</a> &amp;<a href="https://www.theaquabats.com/">The Aquabats</a> with the NYC Go team</li><li>My first Go team summit where<a href="https://twitter.com/jessfraz?lang=en">Jessie Frazelle</a> and I made<a href="https://www.spinroot.com/pico/pjw.html">PJW face</a> stickers for the team.</li><li>Karaoke with the Open Source Strategy Team in SF</li><li>Eating lunch with<a href="https://en.wikipedia.org/wiki/Brian_Kernighan">Brian Kernighan</a> and<a href="https://en.wikipedia.org/wiki/Peter_J._Weinberger">Peter Weinberger</a> and hearing stories about their days at Bell Labs</li><li>Skateboarding with Suzy Muller,<a href="https://twitter.com/dr2chase">David Chase</a> and<a href="https://twitter.com/_rsc">Russ Cox</a> at Gophercon San Diego</li><li>Teaching a room full of excited gophers Go with<a href="https://twitter.com/ashleymcnamara">Ashley Willis</a> during the Go CLI workshop</li><li>Our first contribute-a-thon reaching over<a href="https://go.dev/blog/contributor-workshop">1000 points</a></li><li>Pair programming a new Go installer with<a href="https://twitter.com/bradfitz">BradFitz</a></li><li>Writing the Story of Go’s Future with Sameer &amp; Russ for a presentation to SVP<a href="https://twitter.com/urshoelzle">Urs Hölzle</a></li><li>Exploring Iceland with a bunch of Gophers during Gophercon EU</li></ul><figure><img src="iceland.jpg" alt="Iceland Gophers"/><figcaption><p>
Photo by Winter Francia</p></figcaption></figure><hr><h2 id="why-im-leaving">Why I’m leaving</h2><p>With all of these great experiences and accomplishments, I’m sure you are wondering, why would anyone leave this behind? With each of the past few Go releases it increasingly felt that my journey with the Go team was coming to a close. When I first joined there was so much to learn about both Go and working within Google. My learning had slowed down dramatically. I was torn. I loved the team and the work we were doing, but was feeling personally stagnant.</p><p>With the monumental<a href="https://go.dev/blog/go1.18">Go 1.18 release</a> it very much felt to me that my mission on the Go team was accomplished. I began to explore what could be next. I came up with a very short list of things that I wanted to make sure my next endeavor had:</p><ol><li>Continue working with exceptional people</li><li>Continue working with nice people</li><li>Opportunities to learn new skills</li><li>Pioneering a new path for our industry</li><li>Opportunities to work with open source in the data science and machine learning domains</li><li>Work in a leadership role in a smaller company, one where I could effect change</li></ol><p>After months of searching I believe I have found a company and role that checks all of these boxes.</p><hr><h2 id="-two-sigma">→ Two Sigma</h2><p>Looking back on my career I’ve been very fortunate to be at the bleeding edge of many different industry innovations. I led the team that designed<a href="https://www.mongodb.com/">MongoDB</a>&rsquo;s pioneering user experience. I led<a href="https://www.docker.com/">Docker</a>’s core engineering team. I created the world’s leading static site generator,<a href="https://gohugo.io/">Hugo</a>. I created the popular CLI framework,<a href="https://cobra.dev/">Cobra</a>, which has contributed to a resurgence of CLI applications. I’ve now led the<a href="https://go.dev/">Go Programming Language</a>. Next I’m going to put my attention to data science and machine learning.</p><p>My search took me to<a href="https://www.twosigma.com/">Two Sigma</a>, who for the past two decades has been at the bleeding edge of innovation in data science, distributed computing and machine learning with deep investments into<a href="https://www.twosigma.com/open-source/">open source</a>.</p><p>As I spoke with<a href="https://www.linkedin.com/in/matt-greenwood-aa8741">Matt Greenwood</a>,<a href="https://www.linkedin.com/in/david-palaitis-34775131">David Palaitis</a>,<a href="https://www.linkedin.com/in/jbigler">Jason Bigler</a> and several others at Two Sigma I saw their potential to propel machine learning and data science forward. I recognized the opportunity to be on the forefront of another paradigmatic shift and felt the same excitement and passion that I felt when I first discovered MongoDB, Docker and Go. I’m thrilled to be joining the incredibly talented team at<a href="https://www.twosigma.com">Two Sigma</a>.</p>
]]></content:encoded></item><item><title>The New spf13.com</title><link>https://spf13.com/p/the-new-spf13.com/</link><pubDate>Wed, 16 Feb 2022 00:00:00 UTC</pubDate><guid>https://spf13.com/p/the-new-spf13.com/</guid><media:content url="https://spf13.com/p/the-new-spf13.com/front.png" medium="image"/><media:thumbnail url="https://spf13.com/p/the-new-spf13.com/front.png"/><description>&lt;p>I&amp;rsquo;m proud to present the new and improved &lt;a href="https://spf13.com">spf13.com&lt;/a> a dramatic redesign of the very first &lt;a href="https://gohugo.io">Hugo&lt;/a> powered website.&lt;/p>
&lt;p>After 25 years of building websites I&amp;rsquo;m happy to say that this is the best website I&amp;rsquo;ve ever made and I look forward to sharing more content than I ever have before. Something about the new design is really inviting and honestly just makes me happy, and I think it&amp;rsquo;s going to be a big motivator to write more content.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/the-new-spf13.com/front.png" alt="The New spf13.com"/><p>I&rsquo;m proud to present the new and improved<a href="https://spf13.com">spf13.com</a> a dramatic redesign of the very first<a href="https://gohugo.io">Hugo</a> powered website.</p><p>After 25 years of building websites I&rsquo;m happy to say that this is the best website I&rsquo;ve ever made and I look forward to sharing more content than I ever have before. Something about the new design is really inviting and honestly just makes me happy, and I think it&rsquo;s going to be a big motivator to write more content.</p><h2 id="some-history">Some History</h2><p>In late 2012 I decided to rebuild my website from scratch. I wanted to learn<a href="https://go.dev">Go</a> and CSS3 and really learn them, not learn how to use the latest front end framework. My rule was<em>No frameworks, no libraries, no templates, no plugins</em>. I started with an empty file, wrote my own custom HTML and CSS and wrote a markdown / template processor in Go.</p><p>I wanted something simple, minimalistic, and clean. I also wanted something that was easy to maintain, easy to write and was very secure.</p><p>There was something very liberating about starting from scratch. I had a lot of freedom to experiment with different ideas and see what worked best for me. I was also able to do things I didn&rsquo;t know I could do before.</p><p>I wrote my website alongside of a CSS framework I called Zombie — that nobody ever used again, a static site generator which I called<a href="https://gohugo.io">Hugo</a> — that loads of folks are now using including<a href="https://vote.gov">vote.gov</a>,<a href="https://2k.com">2k.com</a>,<a href="https://kubernetes.io">kubernetes.io</a>,<a href="https://getboostrap.com">getboostrap.com</a>,<a href="https://budweiser.com">budweiser.com</a>,<a href="https://brave.com">brave.com</a>,<a href="https://freebsd.org">freebsd.org</a>, &amp;<a href="https://kde.org">kde.org</a>, and several<a href="https://github.com/spf13">Go libraries</a> which are now among the most popular in the Go ecosystem.</p><p>I documented the launch in<a href="https://spf13.com/p/go-go-hugo-blog/">a blog post</a>. That blog post was the first post ever published in Hugo. After nearly 10 years I&rsquo;m really excited to reinvent it.</p><h2 id="about-this-site">About this site</h2><p>This time around I took a totally different approach.</p><p>Today there are<strong>100s of Hugo themes available</strong>, both free and commercial. Here are a few places to find them:</p><ul><li><a href="https://themes.gohugo.io">Official Hugo Themes Gallery</a></li><li><a href="https://jamstackthemes.dev/ssg/hugo/">JamStack Themes</a></li><li><a href="https://hugothemesfree.com">Hugo Themes Free</a></li><li><a href="https://awesomeopensource.com/projects/hugo-theme">Awesome Hugo Themes</a></li><li><a href="https://1.envato.market/BXem5L">Theme Forest $$</a></li><li><a href="https://gethugothemes.com">Get Hugo Themes $$</a></li><li><a href="https://wowchemy.com/hugo-themes/">Wowchemy Themes $$</a></li><li><a href="https://www.zerostatic.io">Zero Static $$</a></li></ul><p>I decided to go with the<a href="https:1.envato.market/Yg4EdR">menca</a> theme. It&rsquo;s a very clean theme with a striking visual design. I loved the look and wanted to support our theme designers in our community.</p><p>This site is intentionally very close to the base<a href="https://1.envato.market/Yg4EdR">menca</a> theme. I&rsquo;ve added a few small features to it and customized the style a bit, but thanks to thanks to a well designed theme and Hugo&rsquo;s excellent theme overriding support this was trivial to do.</p><p>On the other hand, updating<a href="https://spf13.com">spf13.com</a> to the latest version of<a href="https://gohugo.io">Hugo</a> took me several months. I had a lot of posts and wanted to convert them to page bundles and add images for each post. Neither of these features existed when I launched spf13.com the first time around. I went through each post one by one, added an image, cleaned up the meta data and fixed the ocassional typo.<a href="https://unsplash.com">Unsplash</a> was a great resource for the images.</p><p>In addition to adding images, I went through and added videos for many of the older<a href="https://spf13.com/presentation">presentations</a> (the more recent ones mostly already had them). I also added quite a bit of content from presentations, podcasts and articles I&rsquo;ve written over the past couple of years which regretfully didn&rsquo;t make it onto the site until now.</p><p>Lastly, I added a featured section to<a href="https://spf13.com">the homepage</a>. If you are new here, please checkout the featured content. I consider those my best work and I hope you enjoy them.</p><p>This new site supports in-site search, a wonderful feature that uses the approach found by<a href="https://decovar.dev/blog/2020/01/05/hugo-search/">Declaration of VAR</a>. This approach uses Hugo to generate an index (which it does instantly on build) and then uses javascript to search the index. I imagine there&rsquo;s a limit to the number of posts that this approach works with, but it works well for me with a few hundred posts.</p><p>I&rsquo;m exicited to share this new site with you. I hope you enjoy it.</p><p>— Steve (aka spf13)</p><p><span style="font-size: 80%"><em>Disclaimer: Some links on this page are affiliate links. If you choose to make a purchase after clicking a link, I may receive a commission at no additional cost to you. Thank you for your support!</em></span></p>
]]></content:encoded></item><item><title>InfoQ interview - Go Language at 13 Years</title><link>https://spf13.com/p/infoq-interview-go-language-at-13-years/</link><pubDate>Thu, 30 Dec 2021 00:00:00 UTC</pubDate><guid>https://spf13.com/p/infoq-interview-go-language-at-13-years/</guid><media:content url="https://spf13.com/p/infoq-interview-go-language-at-13-years/infoq-go-at-13-screenshot.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/infoq-interview-go-language-at-13-years/infoq-go-at-13-screenshot.jpg"/><description>&lt;p>I had the pleasure of speaking with Olimpiu Pop from &lt;a href="https://www.infoq.com/">InfoQ&lt;/a> about the Go language and community.&lt;/p>
&lt;p>The article can be found at &lt;a href="https://www.infoq.com/articles/go-language-13-years">https://www.infoq.com/articles/go-language-13-years&lt;/a>.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/infoq-interview-go-language-at-13-years/infoq-go-at-13-screenshot.jpg" alt="InfoQ interview - Go Language at 13 Years"/><p>I had the pleasure of speaking with Olimpiu Pop from<a href="https://www.infoq.com/">InfoQ</a> about the Go language and community.</p><p>The article can be found at<a href="https://www.infoq.com/articles/go-language-13-years">https://www.infoq.com/articles/go-language-13-years</a>.</p>
]]></content:encoded></item><item><title>Gophers Say GopherCon Edition</title><link>https://spf13.com/p/gophers-say-gophercon-edition/</link><pubDate>Fri, 10 Dec 2021 00:00:00 UTC</pubDate><guid>https://spf13.com/p/gophers-say-gophercon-edition/</guid><media:content url="https://spf13.com/p/gophers-say-gophercon-edition/front.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/gophers-say-gophercon-edition/front.jpg"/><description>&lt;p>Go Time panelists Natalie &amp;amp; Jon join forces with Go Team members Steve Francia, Katie Hockman, Julie Qui, and Rob Findley to battle it out and see who can better guess what the GopherCon gophers had to say!&lt;/p>
&lt;p>Listen to the podcast at &lt;a href="https://changelog.com/gotime/211">https://changelog.com/gotime/211&lt;/a>&lt;/p>
&lt;h2 id="transcript">Transcript&lt;/h2>
&lt;p>&lt;strong>Mat Ryer:&lt;/strong> Hello, and welcome to this Go Time GopherCon extravaganza&amp;hellip; Yeah, extravaganza, yeah. I&amp;rsquo;m Mat Ryer, and I&amp;rsquo;m thrilled to announce that today again we&amp;rsquo;re playing Gophers Say, the excellent, popular, family game show based on Family Feud, or Family Fortunes if you&amp;rsquo;re in the U.K, which I am.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/gophers-say-gophercon-edition/front.jpg" alt="Gophers Say GopherCon Edition"/><p>Go Time panelists Natalie &amp; Jon join forces with Go Team members Steve Francia, Katie Hockman, Julie Qui, and Rob Findley to battle it out and see who can better guess what the GopherCon gophers had to say!</p><p>Listen to the podcast at<a href="https://changelog.com/gotime/211">https://changelog.com/gotime/211</a></p><h2 id="transcript">Transcript</h2><p><strong>Mat Ryer:</strong> Hello, and welcome to this Go Time GopherCon extravaganza&hellip; Yeah, extravaganza, yeah. I&rsquo;m Mat Ryer, and I&rsquo;m thrilled to announce that today again we&rsquo;re playing Gophers Say, the excellent, popular, family game show based on Family Feud, or Family Fortunes if you&rsquo;re in the U.K, which I am.</p><p>Let&rsquo;s meet the teams. We have Team Zero, is &ndash; well, let&rsquo;s meet our contestants here. We&rsquo;ve got Julie Qiu around&hellip; Hello, Julie.</p><p><strong>Julie Qiu:</strong> Hi!</p><p><strong>Mat Ryer:</strong> Welcome to Go Time/GopherCon. We&rsquo;ve also got Steve Francia. I can&rsquo;t believe it. Hi, Steve.</p><p><strong>Steve Francia:</strong> Hi, everyone.</p><p><strong>Mat Ryer:</strong> I can&rsquo;t believe you&rsquo;re here, Steve, really. Can you?</p><p><strong>Steve Francia:</strong> I mean, I&rsquo;m here&hellip;</p><p><strong>Mat Ryer:</strong> Well, you won a competition, so congrats. Jon Calhoun is also here. Jon.</p><p><strong>Jon Calhoun:</strong> Hey, Mat. How are you?</p><p><strong>Mat Ryer:</strong> Hi, Jon. I&rsquo;m good, mate. I&rsquo;m excited. Are you gonna win?</p><p><strong>Jon Calhoun:</strong> [03:59] I don&rsquo;t know.</p><p><strong>Mat Ryer:</strong> That&rsquo;s a good answer. An honest answer.</p><p><strong>Jon Calhoun:</strong> If my team carries me, I&rsquo;ll win. But if my team doesn&rsquo;t carry me, I probably won&rsquo;t.</p><p><strong>Mat Ryer:</strong> Okay, good. So he&rsquo;s not gonna be pulling his own weight there. Well, Natalie Pistunovich is in town. Hello, Natalie.</p><p><strong>Natalie Pistunovich:</strong> Hi, Mat.</p><p><strong>Mat Ryer:</strong> Welcome back. Are you looking forward to the game show?</p><p><strong>Natalie Pistunovich:</strong> I&rsquo;m very excited to be the one person who is aware of the rules, yes.</p><p><strong>Mat Ryer:</strong> Yeah, absolutely.</p><p><strong>Natalie Pistunovich:</strong> Because I already played it.</p><p><strong>Mat Ryer:</strong> Yes. Please remind me if I forget, as well. Katie Hockman also around. Hello, Katie. Welcome. How are you doing?</p><p><strong>Katie Hockman:</strong> I&rsquo;m good. I&rsquo;m very excited to win, despite Jon not believing that we can.</p><p><strong>Mat Ryer:</strong> Ah, okay. Well, you&rsquo;ll have to carry him. That&rsquo;s it. Rob Findley is also here, aren&rsquo;t you, Rob?</p><p><strong>Rob Findley:</strong> I am. Hi, Mat.</p><p><strong>Mat Ryer:</strong> Hey. Welcome to the Gopher Time/Go Time Mashup. Yeah, don&rsquo;t worry, I said it wrong on purpose. I need to tell you about this game that we&rsquo;re gonna play, because it&rsquo;s lovely. Essentially, we&rsquo;ve asked a load of gophers some questions, and you&rsquo;ll have to try and guess the answers. So you&rsquo;re trying to match the popular answers from the survey. It&rsquo;s not about right or wrong, it&rsquo;s just about what gophers say. That&rsquo;s why it&rsquo;s called Gophers Say.</p><p>The top answers will go on the board. Any response that had five or more answers will appear on the board, and in order to get control of the board, each team has to do a face-off, basically, where you&rsquo;ll just have a guess and see the highest score, and that&rsquo;s how you&rsquo;ll take control of the board. Once you&rsquo;ve got control, you have to then guess all the other answers, and then you&rsquo;ll win. That&rsquo;s how you win, you get points. But be warned, if you get three of them wrong, you&rsquo;ll lose three lives, and you&rsquo;ll give the other team a chance to steal, and they&rsquo;ll be able to take your points, essentially. So don&rsquo;t let that happen.</p><p>You cannot confer through the game, but while you&rsquo;re stealing, you can confer, and I&rsquo;ll remind you of that later. Do we feel like we&rsquo;re ready to play? I&rsquo;m gonna announce the teams that we have here.</p><p>So team zero - it&rsquo;s Natalie, Steve and Julie. You are our first team, team zero.</p><p><strong>Natalie Pistunovich:</strong> Woo-hoo!</p><p><strong>Julie Qiu:</strong> Woo-hoo!</p><p><strong>Mat Ryer:</strong> There you go. And you know, don&rsquo;t take anything by the fact that zero is in the name of your team; it&rsquo;s literally just zero-bound, like with the Go slice. That&rsquo;s why I&rsquo;ve done that. Jon, Katie and Rob, team one. You&rsquo;re our second team.</p><p><strong>Rob Findley:</strong> Go team one!</p><p><strong>Jon Calhoun:</strong> Katie apparently isn&rsquo;t happy. [laughter]</p><p><strong>Katie Hockman:</strong> It&rsquo;s one for the first place, yeah.</p><p><strong>Rob Findley:</strong> Very happy.</p><p><strong>Mat Ryer:</strong> Yeah. Okay, good. They&rsquo;re definitely happy, we&rsquo;ve been assured of that verbally. Okay, we&rsquo;re gonna now look at the board, we&rsquo;re gonna show the screen&hellip; Can we see this? I&rsquo;m gonna jump into our first round here&hellip; Natalie and Jon, you&rsquo;re gonna go face to face; we&rsquo;re gonna have an interface-off, if you like puns&hellip; Natalie, what would your guess be to this question: &ldquo;Describe the Go community with just one word.&rdquo; What did most people say when they were asked to describe the Go community with just one word?</p><p><strong>Natalie Pistunovich:</strong> Welcoming.</p><p><strong>Mat Ryer:</strong> Welcoming. Gophers say&hellip; [win sound] Yes, it&rsquo;s on the board, in number two. Nine points there. So Jon, you&rsquo;re gonna have a guess. If you beat Natalie, you have to get that number one spot. You&rsquo;ll take control of the board.</p><p><strong>Jon Calhoun:</strong> Natalie stole my answer, and I don&rsquo;t know if my back-up is&hellip; I guess &ndash; is &ldquo;friendly&rdquo; the same as &ldquo;welcoming&rdquo;? I don&rsquo;t know how that would be categorized.</p><p><strong>Mat Ryer:</strong> Let&rsquo;s see if friendly is on there. Gophers say&hellip; [win sound] Yes, friendly&hellip; And where is it? At number three.</p><p><strong>Natalie Pistunovich:</strong> Wooooh!</p><p><strong>Mat Ryer:</strong> Natalie&rsquo;s team, team zero, takes control. And we&rsquo;re over to Steve Francia. Steve&hellip; How&rsquo;s it going, Steve? Are you gonna have a guess? What do you think the Go community said about this?</p><p><strong>Steve Francia:</strong> [08:05] I was gonna say welcoming and friendly&hellip;</p><p><strong>Mat Ryer:</strong> Okay&hellip;</p><p><strong>Steve Francia:</strong> But those have been taken. So I&rsquo;m gonna say &ldquo;good-looking&rdquo;. No, it&rsquo;s two words&hellip; Attractive.</p><p><strong>Mat Ryer:</strong> [laughs] Okay. Gophers say&hellip; [fail sound] Oh, no, I&rsquo;m sorry. Attractive was not on the board. You lose a life. But don&rsquo;t worry, you&rsquo;ve got two other lives.</p><p><strong>Steve Francia:</strong> It should have been. It should have been.</p><p><strong>Mat Ryer:</strong> Agree, yeah. Julie, would you wanna have a guess?</p><p><strong>Julie Qiu:</strong> I&rsquo;m gonna say &ldquo;fabulous&rdquo;.</p><p><strong>Mat Ryer:</strong> Fabulous, okay. Gophers say&hellip; [fail sound] Oh, sorry. Nobody said it was fabulous. Well, five or more people didn&rsquo;t say that. We&rsquo;ll loop back around&hellip; Natalie, what do you think?</p><p><strong>Natalie Pistunovich:</strong> Inclusive.</p><p><strong>Mat Ryer:</strong> Inclusive. Gophers say&hellip; [fail sound] No. Nobody said inclusive. And that&rsquo;s your third and final life gone, I&rsquo;m afraid&hellip; So now the other team, team one, have a chance to steal. You can confer. I just need one answer from you, Jon, the team captain, after you&rsquo;ve conferred with your team.</p><p><strong>Jon Calhoun:</strong> Alright. From my team, does anybody think the word &ldquo;gopher&rdquo; might be on the board?</p><p><strong>Katie Hockman:</strong> I don&rsquo;t know&hellip;</p><p><strong>Rob Findley:</strong> The Go community is gopher?</p><p><strong>Jon Calhoun:</strong> That, or like programmer, or like nerdy&hellip;</p><p><strong>Katie Hockman:</strong> I was gonna say diverse&hellip;</p><p><strong>Rob Findley:</strong> Yeah, I think diverse&hellip;</p><p><strong>Jon Calhoun:</strong> That&rsquo;s a good one.</p><p><strong>Mat Ryer:</strong> Okay, is that gonna be the answer you&rsquo;d like to submit?</p><p><strong>Jon Calhoun:</strong> Are we going with diverse?</p><p><strong>Mat Ryer:</strong> Do you wanna lock it in?</p><p><strong>Rob Findley:</strong> Yeah.</p><p><strong>Jon Calhoun:</strong> Okay, we&rsquo;re locking diverse in.</p><p><strong>Mat Ryer:</strong> Okay, we&rsquo;re gonna lock diverse in. Gophers say&hellip; [fail sound]</p><p><strong>Katie Hockman:</strong> What?!</p><p><strong>Mat Ryer:</strong> No, I&rsquo;m afraid not. You did not steal. Let&rsquo;s reveal the board. Number six was &ldquo;opinionated&rdquo;. Five people said that.</p><p><strong>Rob Findley:</strong> It makes sense.</p><p><strong>Mat Ryer:</strong> And at number five, we have &ldquo;fun&rdquo;, with six people. And in position number four, we had &ldquo;helpful&rdquo;, seven people said that. In position three we have &ldquo;friendly&rdquo; with eight people, &ldquo;welcoming&rdquo; is in position two with nine people, and at number one it is &ldquo;awesome&rdquo;, and that was said by 17 people.</p><p><strong>Katie Hockman:</strong> Wow&hellip;</p><p><strong>Mat Ryer:</strong> There we go.</p><p><strong>Jon Calhoun:</strong> We&rsquo;re getting off to a rough start.</p><p><strong>Katie Hockman:</strong> Yeah.</p><p><strong>Natalie Pistunovich:</strong> Isn&rsquo;t it the same as fabulous?</p><p><strong>Steve Francia:</strong> Yeah, I was gonna say, &ldquo;awesome&rdquo; is fabulous, right?</p><p><strong>Natalie Pistunovich:</strong> [laughs]</p><p><strong>Mat Ryer:</strong> Yeah. Well, there we go. Let&rsquo;s move on to our next round. Okay, round two&hellip; Name a place outside your house where you like to code/work. This time it&rsquo;s Steve versus Katie going face to face, to find out who controls the board. Steve, I&rsquo;ll ask you after Katie. Katie, what&rsquo;s your answer?</p><p><strong>Katie Hockman:</strong> Wait, so it&rsquo;s me first?</p><p><strong>Mat Ryer:</strong> Yeah.</p><p><strong>Katie Hockman:</strong> Okay. I had two guesses&hellip; I will say &ldquo;coffee shop.&rdquo;</p><p><strong>Mat Ryer:</strong> &ldquo;Coffee shop.&rdquo; Good one, I think&hellip; Gophers say&hellip; [win sound] Yes, of course. And it&rsquo;s the top answer&hellip;</p><p><strong>Katie Hockman:</strong> Yaaay!</p><p><strong>Mat Ryer:</strong> That means that Steve doesn&rsquo;t even get to have a guess. You&rsquo;ve basically snapped his dream out of the clutches of his tiny &ndash;</p><p><strong>Steve Francia:</strong> And I was gonna say coffee shop, so&hellip;</p><p><strong>Mat Ryer:</strong> There we go.</p><p><strong>Steve Francia:</strong> Good one.</p><p><strong>Mat Ryer:</strong> Yeah, good one. Okay&hellip; Right, so - now it&rsquo;s Rob&rsquo;s turn to have a guess. You&rsquo;ve got three lives, Rob&hellip; What do you think?</p><p><strong>Rob Findley:</strong> Okay. We used to work in offices&hellip; So how about the office?</p><p><strong>Mat Ryer:</strong> Okay, let&rsquo;s find out. The office. Gophers say&hellip; [win sound] Yes, indeed. In at number three, &ldquo;the office&rdquo;, with 21 people. By the way, 38 people said &ldquo;coffee shop&rdquo;. Very cool. Alright, John, three lives still. Going strong. Where do you like to code/work?</p><p><strong>Jon Calhoun:</strong> [12:02] I&rsquo;m gonna go with &ldquo;park&rdquo;.</p><p><strong>Mat Ryer:</strong> In the park, how beautiful. Gophers say&hellip; [win sound] Yes, indeed. Number two. Park/garden/yard. 26 people. Okay, Katie - you&rsquo;ve still got your three lives&hellip;</p><p><strong>Katie Hockman:</strong> I don&rsquo;t do this, because I watch movies instead, but I know a lot of people who do&hellip; I&rsquo;m gonna say &ldquo;airplane&rdquo;.</p><p><strong>Mat Ryer:</strong> Oh, airplane. Gophers say&hellip; [fail sound]</p><p><strong>Katie Hockman:</strong> Ugh&hellip;</p><p><strong>Mat Ryer:</strong> No, nobody does that outside &ndash; they don&rsquo;t tend to do that, apparently. They watch movies too, I guess. You lose a life, but that&rsquo;s okay. You&rsquo;ve got two more lives. Rob, what do you think?</p><p><strong>Rob Findley:</strong> Okay, how about the beach? Some people work at the beach.</p><p><strong>Mat Ryer:</strong> Oh, do they? Well, let&rsquo;s see. Gophers say&hellip; [fail sound] No. Have you met a programmer at the beach?</p><p><strong>Rob Findley:</strong> Well, yeah&hellip;</p><p><strong>Mat Ryer:</strong> Yeah, there&rsquo;s some cool ones, aren&rsquo;t there? Not in this survey, mate&hellip;</p><p><strong>Rob Findley:</strong> Not me.</p><p><strong>Mat Ryer:</strong> Not me either. Okay, Jon, back around to you, talking to cool people&hellip; What do you think?</p><p><strong>Jon Calhoun:</strong> Oh, boy&hellip; I&rsquo;m gonna guess campground.</p><p><strong>Mat Ryer:</strong> Campground. Okay. Gophers say&hellip; [fail sound] No. I can&rsquo;t believe no one&rsquo;s going camping, setting up a tent, sorting out the electric, sort out the water, look up the local amenities&hellip;</p><p><strong>Jon Calhoun:</strong> I figured if everybody&rsquo;s going remote, they&rsquo;re gonna go camping and working.</p><p><strong>Mat Ryer:</strong> And just get some code written. They&rsquo;re not doing that. I can&rsquo;t believe it. Katie, what do you think?</p><p><strong>Katie Hockman:</strong> I always have a life left&hellip;</p><p><strong>Mat Ryer:</strong> One life left&hellip;</p><p><strong>Katie Hockman:</strong> Oh, gosh. I thought we were dead, so I wasn&rsquo;t even thinking&hellip; [laughs] Pressure&rsquo;s on&hellip; Um, I was gonna say &ndash;</p><p><strong>Steve Francia:</strong> They are good, they&rsquo;ve had three x&rsquo;es.</p><p><strong>Mat Ryer:</strong> Oh, really?</p><p><strong>Rob Findley:</strong> Yeah.</p><p><strong>Jon Calhoun:</strong> Mat, are you good?</p><p><strong>Mat Ryer:</strong> Oh, okay.</p><p><strong>Katie Hockman:</strong> We did die three times, so I&rsquo;m pretty sure&hellip;</p><p><strong>Mat Ryer:</strong> Yeah, that&rsquo;s a mistake by me then. Okay. Okay, that means &ndash;</p><p><strong>Natalie Pistunovich:</strong> Mat started counting at zero.</p><p><strong>Mat Ryer:</strong> Yeah, thank you for getting me out of it&hellip; Okay, unfortunately that was your last life, so that means the other team get to steal. You can confer, and Natalie, I&rsquo;ll take your answer. What do you think?</p><p><strong>Steve Francia:</strong> So we get to talk to each other right now?</p><p><strong>Mat Ryer:</strong> yes.</p><p><strong>Natalie Pistunovich:</strong> Yes, we get to decide together.</p><p><strong>Steve Francia:</strong> What about library?</p><p><strong>Julie Qiu:</strong> I thought train.</p><p><strong>Steve Francia:</strong> I was thinking train, too. Train and library.</p><p><strong>Natalie Pistunovich:</strong> That&rsquo;s because you live in the U.S. [laughs] Maybe most of the people who took the survey live in the U.S. How about a co-working space? Is that like the office?</p><p><strong>Julie Qiu:</strong> Hm&hellip;</p><p><strong>Mat Ryer:</strong> Okay, I&rsquo;m gonna have to take an answer.</p><p><strong>Steve Francia:</strong> I think four, five and six are co-working space, library and train.</p><p><strong>Mat Ryer:</strong> Okay.</p><p><strong>Natalie Pistunovich:</strong> By this order? [laughs]</p><p><strong>Steve Francia:</strong> Well, I don&rsquo;t know&hellip; Any of those sound good to me, Natalie. You choose.</p><p><strong>Julie Qiu:</strong> Yeah.</p><p><strong>Mat Ryer:</strong> Natalie&hellip;?</p><p><strong>Natalie Pistunovich:</strong> I was about Julie &ldquo;What do you think?&rdquo;, but okay. Yeah, let&rsquo;s try train.</p><p><strong>Mat Ryer:</strong> Okay, &ldquo;train&rdquo; to steal. Gophers say&hellip; [fail sound] No, I&rsquo;m afraid not&hellip; Well, that means the points go to team one. Let&rsquo;s unload this board then. Number six was &ldquo;nowhere&rdquo;. [laughter] People that don&rsquo;t leave to do any work. That got five answers. In number five it&rsquo;s the pub or the bar; six people said that. I can&rsquo;t believe that. And at number four - let&rsquo;s see if this is one of yours, Steve&hellip; Number four was the library, indeed. 14 people.</p><p><strong>Natalie Pistunovich:</strong> Wow&hellip;!</p><p><strong>Mat Ryer:</strong> That&rsquo;s okay, don&rsquo;t worry though&hellip; It&rsquo;s going well, we&rsquo;ve got team zero have 17 points, team one are forging ahead with 85 points. Let&rsquo;s go on to round three&hellip;</p><p><strong>Break:</strong> [15:50]</p><p><strong>Mat Ryer:</strong> Okay, round three. The question we asked our gophers is &ldquo;The most useful Go keyword is what?&rdquo; What is the most useful Go keyword? What did people say? We&rsquo;re gonna find out which team takes control of the board when Julie and Rob go head to head&hellip; Julie, this time.</p><p><strong>Julie Qiu:</strong> Oh, boy&hellip; Um, switch.</p><p><strong>Mat Ryer:</strong> Switch. Gophers say&hellip; [fail sound] No.</p><p><strong>Julie Qiu:</strong> Sorry.</p><p><strong>Mat Ryer:</strong> That&rsquo;s okay, you just lose one life, no problem. Rob, you have to have a guess. Actually, Julie, you don&rsquo;t lose a life. We&rsquo;re just still finding out who&rsquo;s gonna take control&hellip; So Rob, you have to get one of these to take the board.</p><p><strong>Rob Findley:</strong> Well, you can&rsquo;t switch without a func, so I&rsquo;m gonna say func.</p><p><strong>Mat Ryer:</strong> Func indeed. Gophers say&hellip; [win sound] Yes, indeed, at number two. Eighteen people said func was the most useful Go keyword. And that means team one steals the control of the board, takes it. Jon Calhoun, what do you think the most useful Go keyword is? What do you think our Gophers said?</p><p><strong>Jon Calhoun:</strong> This is one of those ones where I just expect people to not name keywords as answers&hellip;</p><p><strong>Mat Ryer:</strong> [laughs] Why would that be, Jon? That&rsquo;s very unusual.</p><p><strong>Jon Calhoun:</strong> Like, if you asked me to list all the Go keywords, I couldn&rsquo;t list them all. I&rsquo;d definitely get something wrong.</p><p><strong>Mat Ryer:</strong> But you could do some of them, right?</p><p><strong>Jon Calhoun:</strong> I&rsquo;m gonna go with select&hellip;</p><p><strong>Mat Ryer:</strong> Select. Gophers say&hellip; [win sound] Yes, indeed. Down at number six. Seven people said select. Nice work. Okay, Katie, what do you think? Return would be very useful. Let&rsquo;s see if the Gophers said it. Gophers say&hellip; [fail sound] No&hellip;! And it honestly shocks me that that&rsquo;s not on there.</p><p><strong>Katie Hockman:</strong> Everybody needs that&hellip; [laughs]</p><p><strong>Mat Ryer:</strong> What are their programs?</p><p><strong>Rob Findley:</strong> You need to return&hellip;</p><p><strong>Mat Ryer:</strong> Well, we can&rsquo;t figure that out now, Rob. You&rsquo;ve got two lives still, so&hellip; What do you think?</p><p><strong>Rob Findley:</strong> Okay. I think people will have just heard the word Go, so they&rsquo;ll say &ldquo;go&rdquo;.</p><p><strong>Mat Ryer:</strong> Okay, that&rsquo;s how much respect you have for the audience of Gophers that have answered this&hellip;</p><p><strong>Rob Findley:</strong> It&rsquo;s useful.</p><p><strong>Mat Ryer:</strong> Yeah. It is useful. Let&rsquo;s find out if they&rsquo;ve said it. Gophers say&hellip; [win sound] Yes. And look at this - top answer. 29 people said that &ldquo;go&rdquo; was the most useful Go keyword. Very cool, indeed. Two lives, and it&rsquo;s Jonny Calhoun. Go on, Jon. Do a guess.</p><p><strong>Jon Calhoun:</strong> Var?</p><p><strong>Mat Ryer:</strong> [20:01] Var&hellip; Good one.</p><p><strong>Jon Calhoun:</strong> I mean, how else are you gonna create those globals?</p><p><strong>Mat Ryer:</strong> Good point.</p><p><strong>Jon Calhoun:</strong> &hellip;that everybody loves.</p><p><strong>Mat Ryer:</strong> [laughs] Trollin&rsquo;. Gophers say&hellip; [fail sound] No. You lose another life. You have one more life. Katie, that life sits delicately in your hand. Are you gonna set it free, or crush it to death more? What&rsquo;s your guess?</p><p><strong>Natalie Pistunovich:</strong> I&rsquo;m between two, so I&rsquo;m gonna go with &ndash; I think people said &ldquo;if&rdquo;.</p><p><strong>Mat Ryer:</strong> If. Gophers say&hellip; [fail sound] No. These programmers are very certain. There&rsquo;s no uncertainty.</p><p><strong>Natalie Pistunovich:</strong> Apparently&hellip;</p><p><strong>Mat Ryer:</strong> Yeah, yeah. They know what they&rsquo;re doing. This is not like &ldquo;Yeah, if this&hellip;&rdquo; Make your mind up.</p><p><strong>Jon Calhoun:</strong> These are interesting programs.</p><p><strong>Mat Ryer:</strong> That was your last life, I&rsquo;m afraid&hellip; This gives the other team, team zero, a chance to steal. Please confer amongst yourselves, and then Natalie, team captain, I&rsquo;ll take an answer after you&rsquo;ve conferred with your team.</p><p><strong>Natalie Pistunovich:</strong> Alright, this time we&rsquo;re doing this right&hellip;</p><p><strong>Mat Ryer:</strong> Yes, please.</p><p><strong>Natalie Pistunovich:</strong> What do you think?</p><p><strong>Steve Francia:</strong> I think it&rsquo;s &ldquo;defer&rdquo;.</p><p><strong>Natalie Pistunovich:</strong> I was thinking of that, too.</p><p><strong>Julie Qiu:</strong> I was thinking &ldquo;panic&rdquo; or &ldquo;type&rdquo;, but I&rsquo;ll defer to you two&hellip;</p><p><strong>Natalie Pistunovich:</strong> [laughs] This was meant to be. Let&rsquo;s go with &ldquo;defer&rdquo;.</p><p><strong>Mat Ryer:</strong> Oh, excellent. I don&rsquo;t know when to do this now&hellip; I feel like we need to wait for the end of the game show before I announce this one&hellip; I&rsquo;m just kidding.</p><p><strong>Natalie Pistunovich:</strong> [laughs]</p><p><strong>Mat Ryer:</strong> Defer. Gophers say&hellip; [win sound] Yes!</p><p><strong>Julie Qiu:</strong> Yaay!</p><p><strong>Mat Ryer:</strong> You&rsquo;ve successfully stolen! Third space there, with 11 people, &ldquo;defer&rdquo;. And you steal the points. 65 delicious points coming your way.</p><p><strong>Rob Findley:</strong> Oh, it&rsquo;s so close.</p><p><strong>Mat Ryer:</strong> So team zero is now on 82, team one is on 85. Let&rsquo;s reveal the rest of this board then. What was the most useful Go keyword? Number seven, people said &ldquo;struct&rdquo;, five people said that. At number six was &ldquo;select&rdquo;, with seven people. Number five is &ldquo;interface&rdquo;, nine people said that. At number four, &ldquo;for&rdquo;. Clue is in the number&hellip; Ten people said so. And defer was at number three, with 11 people, func in spot two, 18 people, and go at number one there, with 29 people.</p><p>Wow, things are heating up here&hellip; 82 and 85 it&rsquo;s not much in it is there? Now we&rsquo;ve built some tension&hellip; It&rsquo;s time to go to round four! Pam-param-pam-pam-pow! Right&hellip; What are we doing again&hellip;? What are we doing again? Okay, the next question&hellip; The best thing about the tech industry is - what? What is the best thing about the tech industry. And it&rsquo;s Natalie and Jon to go head to head&hellip; Jon, what&rsquo;s your guess? What&rsquo;s the best thing about the tech industry?</p><p><strong>Jon Calhoun:</strong> The paycheck?</p><p><strong>Mat Ryer:</strong> The paycheck. Gophers say&hellip; [win sound] Yes, at number two. The pay/benefits. 20 people there. Interesting. Okay, Natalie, can you beat that? Can you find that number one spot?</p><p><strong>Natalie Pistunovich:</strong> Twitter?</p><p><strong>Mat Ryer:</strong> Twitter. [laughter]</p><p><strong>Natalie Pistunovich:</strong> It&rsquo;s my honest answer&hellip;</p><p><strong>Mat Ryer:</strong> Gophers say&hellip; [fail sound] No, I&rsquo;m afraid. No one gets that. That means team one take control of the board. Katie, we&rsquo;re over to you&hellip; Three lovely lives. Don&rsquo;t ruin them. What&rsquo;s your guess?</p><p><strong>Katie Hockman:</strong> I think people would have said &ldquo;the people&rdquo;.</p><p><strong>Mat Ryer:</strong> The people. That&rsquo;d be nice, if they people said &ldquo;the people&rdquo;. Let&rsquo;s see - did the people say &ldquo;the people&rdquo;? Gophers say&hellip; [win sound] Yes indeed, at number four. The people or the community that they&rsquo;re in. 15 people said that. That&rsquo;s very nice, isn&rsquo;t it? Rob, can you find a nicer one than that? Or just any?</p><p><strong>Rob Findley:</strong> [23:53] I don&rsquo;t know about that, but&hellip; How about the fact that we get to program? How about the work?</p><p><strong>Mat Ryer:</strong> Oh, the work itself, programming. Gophers say&hellip; [win sound] Yes, indeed. People did say that. Problem-solving, we grouped into that. 19 people, at number three, yes.</p><p><strong>Rob Findley:</strong> Generous.</p><p><strong>Mat Ryer:</strong> Very cool. Three lives still. Jonny Calhoun&hellip;</p><p><strong>Jon Calhoun:</strong> I&rsquo;m gonna go with the impact.</p><p><strong>Mat Ryer:</strong> The impact.</p><p><strong>Jon Calhoun:</strong> You can impact more people.</p><p><strong>Mat Ryer:</strong> Okay, the impact - did they say that? Let&rsquo;s find out. Gophers say&hellip; [win sound] They did indeed say &ldquo;impact&rdquo;. They said &ldquo;opportunity&rdquo; or &ldquo;the impact to make a change&rdquo;, things like that. Ain&rsquo;t that nice? Eight people there, and it was at number six. And still, three lives&hellip; This is looking good. Katie, can you keep up the running streak of success?</p><p><strong>Katie Hockman:</strong> I don&rsquo;t know if I can&hellip; I feel like the thing I wanna say is probably within the category of benefits. I was gonna say &ldquo;flexibility&rdquo;&hellip;</p><p><strong>Mat Ryer:</strong> Hm, okay&hellip; Yeah, flexibility. Let&rsquo;s see if it&rsquo;s up there. Gophers say&hellip; [win sound] Well done. Yeah, work from home, or flexibility. Ten people said that. I&rsquo;ll tell you what - I genuinely thought this was probably gonna be the hardest question, and you&rsquo;ve really just nailed this. Very impressive. Rob, I think we&rsquo;re back around to you, aren&rsquo;t we?</p><p><strong>Rob Findley:</strong> I&rsquo;m mystified. I have no idea. I was gonna say flexibility. I don&rsquo;t know, how about the opportunity to grow?</p><p><strong>Mat Ryer:</strong> Okay, let&rsquo;s see&hellip;</p><p><strong>Rob Findley:</strong> I don&rsquo;t know, I&rsquo;m doubtful.</p><p><strong>Mat Ryer:</strong> Let&rsquo;s see if more than 20 people said &ldquo;opportunity to grow.&rdquo; Gophers say&hellip; [fail sound] No. And you lose a life. But it&rsquo;s okay, you&rsquo;ve got two other lives, so Jon and Katie are both gonna get a guess here&hellip; Starting with you, Jonny Calhoun, down at the local saloon&hellip; What do you think?</p><p><strong>Jon Calhoun:</strong> I am equally mystified&hellip; I don&rsquo;t know, I&rsquo;m gonna go with Go.</p><p><strong>Mat Ryer:</strong> The language, Go.</p><p><strong>Jon Calhoun:</strong> Go.</p><p><strong>Mat Ryer:</strong> The best thing.</p><p><strong>Jon Calhoun:</strong> The best thing about the tech industry is Go.</p><p><strong>Mat Ryer:</strong> Okay, let&rsquo;s see. Maybe Gophers did say that. Let&rsquo;s see, Gophers say&hellip;? [fail sound] No, I&rsquo;m afraid not. You lose your life. Katie, the last life, to prevent the steal&hellip;</p><p><strong>Katie Hockman:</strong> Oh, no, that was gonna be my guess&hellip; [laughs] I don&rsquo;t know&hellip;</p><p><strong>Mat Ryer:</strong> You&rsquo;re very close with that answer, apparently&hellip;</p><p><strong>Katie Hockman:</strong> Okay&hellip; Coding?</p><p><strong>Mat Ryer:</strong> Okay, let&rsquo;s do it. Let&rsquo;s find out. Gophers say&hellip; [fail sound] No, I&rsquo;m afraid not. So that means the other team get a chance to steal. Can you get this right, team? Please confer.</p><p><strong>Natalie Pistunovich:</strong> My idea is conferences.</p><p><strong>Julie Qiu:</strong> Me too!</p><p><strong>Natalie Pistunovich:</strong> Okay! Steve?</p><p><strong>Steve Francia:</strong> I was gonna say travel. So I think conferences is great.</p><p><strong>Julie Qiu:</strong> Yeah.</p><p><strong>Natalie Pistunovich:</strong> Cool. Okay. So that&rsquo;s our answer.</p><p><strong>Mat Ryer:</strong> Okay, conferences&hellip; Let&rsquo;s see if it&rsquo;s conferences. Is it conferences? Gophers say&hellip; [fail sound] Oh, no&hellip;! I&rsquo;m afraid not. That means team one steals all those delicious points&hellip; And we&rsquo;ll look at the scores after. The top answer for this one was in fact the tech, the innovation. Tech, or innovation is the best thing about the tech industry.</p><p>Okay, so let&rsquo;s check in with the scores. Team zero, in our slice of team here - team zero has 82 points. But team one out in the lead again, it&rsquo;s 157 points. You know, celebrate&hellip;</p><p><strong>Rob Findley:</strong> Yay!</p><p><strong>Mat Ryer:</strong> There we go. Okay, let&rsquo;s move on, shall we, to the next round. Round five. Daram-pam-pam-pow! Someone else is having a party at their own house by the sound of that&hellip; Okay, right. Here we go again. This is round five&hellip; This time the question is &ldquo;The worst thing about the tech industry.&rdquo; This is what we&rsquo;re after now - what&rsquo;s the worst thing about the tech industry? And last time it was Jon and Natalie went head to head, so it&rsquo;s Steve and Katie. And Steve goes first. Steve, what&rsquo;s the worst thing?</p><p><strong>Steve Francia:</strong> [28:20] Um, bugs.</p><p><strong>Mat Ryer:</strong> Bugs. What a great answer.</p><p><strong>Steve Francia:</strong> Bugs.</p><p><strong>Mat Ryer:</strong> Bugs. Yeah. We&rsquo;ll submit it in your accent then, shall well.</p><p><strong>Steve Francia:</strong> Bugs.</p><p><strong>Mat Ryer:</strong> Gophers say&hellip; [win sound] Yes, bugs. Bad practices. Okay, yeah. There we go, we&rsquo;ll give you that one. Bad practices and bugs, things like that. In position four there, 13 people said that. Okay, Katie, can you beat that? There are three other answers ahead of this one.</p><p><strong>Katie Hockman:</strong> I feel like no matter what I say, I&rsquo;m gonna get in trouble for it&hellip; [laughs] I&rsquo;m gonna say this in the most diplomatic way possible&hellip; Potentially like the room for growth as far as diversity goes.</p><p><strong>Mat Ryer:</strong> Okay, so&hellip; Right, diversity being the worst thing currently. Gophers say&hellip; [fail sound] No, Katie. Apparently, that&rsquo;s all sorted.</p><p><strong>Katie Hockman:</strong> It&rsquo;s all done. Fixed it.</p><p><strong>Mat Ryer:</strong> Yeah, we&rsquo;re finished. Put that into the Done column. Okay, so that means team zero - you need it. You&rsquo;ve taken control of the board. And Julie, it&rsquo;s your turn. Three lives&hellip; Have a guess. What do you think the worst thing about the tech industry is?</p><p><strong>Julie Qiu:</strong> Um, I&rsquo;m gonna say the bad people. The people, but specifically the people who are bad.</p><p><strong>Mat Ryer:</strong> The baddies. Bad people. Like villains, and the like. Charlatans.</p><p><strong>Julie Qiu:</strong> Yeah.</p><p><strong>Mat Ryer:</strong> Scallywags.</p><p><strong>Julie Qiu:</strong> Exactly.</p><p><strong>Mat Ryer:</strong> Okay. The bad people. Gophers say&hellip; [win sound] Yes, indeed. So people are saying people or the culture. 14 there, and that was a top answer. Merry, merry festive holidays to everybody. That was a little surprise&hellip; And that surprise there means Steve Francia is gonna donate $100 to a charity. That&rsquo;s what that lovely piece was. Thank you so much, Steve. That&rsquo;s lovely.</p><p>And Natalie - we&rsquo;re back around to you now. It&rsquo;s your turn to have a guess. What do you think the worst thing about the tech industry is? Three lives&hellip;</p><p><strong>Natalie Pistunovich:</strong> Something along the lines of agile, sprints, JIRA&hellip; Something there.</p><p><strong>Mat Ryer:</strong> Okay. So like management practices, stuff like that.</p><p><strong>Natalie Pistunovich:</strong> Yes.</p><p><strong>Mat Ryer:</strong> Okay, let&rsquo;s see if that&rsquo;s on the board. Gophers say&hellip; [fail sound] No, everyone loves all that. Not a problem at all.</p><p><strong>Natalie Pistunovich:</strong> Good! It&rsquo;s not a problem. Alright. That and diversity is all good.</p><p><strong>Mat Ryer:</strong> Steve, what do you think? Do you wanna have another guess? You&rsquo;ve got two lives left still.</p><p><strong>Steve Francia:</strong> I think it&rsquo;s the hours.</p><p><strong>Mat Ryer:</strong> Oh, the hours could be the worst thing about the tech industry. It is nearly 9 PM and I&rsquo;m hosting a game show&hellip; So let&rsquo;s see what Gophers say. [win sound] Yes, indeed, Steve. Number three there. The pressure and the long hours. 16 people said that. Yeah&hellip; Take a break, everyone. Not you though, Julie, because you&rsquo;re up to answer a question now. You&rsquo;ve got two lives still&hellip; What do you think the worst thing about the tech industry is? We&rsquo;re looking for that second answer.</p><p><strong>Julie Qiu:</strong> Hm&hellip; It is very hard. Can I say like the bad impact?</p><p><strong>Mat Ryer:</strong> So the evil? Would you class it as evil?</p><p><strong>Julie Qiu:</strong> Yes, the evil. Yeah.</p><p><strong>Mat Ryer:</strong> Yeah, the negative impact of tech. Okay, let&rsquo;s see if that&rsquo;s up there. Gophers say&hellip; [fail sound] No, Julie. Not there. Down to one life. Natalie, you&rsquo;ve got your thought on it, so what are you gonna do? What do you guess? What&rsquo;s the worst thing about the tech industry?</p><p><strong>Natalie Pistunovich:</strong> Bad code was already said, right? That was kind of the bad practices one&hellip;</p><p><strong>Mat Ryer:</strong> [31:57] Yeah, bad practices in existing code was at number four there. We&rsquo;ve got number three, the pressure of long hours, and at number one is the people.</p><p><strong>Natalie Pistunovich:</strong> Legacy?</p><p><strong>Mat Ryer:</strong> Well, that would probably fall under the existing code&hellip;</p><p><strong>Natalie Pistunovich:</strong> Okay. Oh, man&hellip; I&rsquo;m out of ideas. Um&hellip;</p><p><strong>Mat Ryer:</strong> Tough one, isn&rsquo;t it?</p><p><strong>Natalie Pistunovich:</strong> Not the people, not the long hours, not the bad practice&hellip; Nothing about management then? Did we say that? Is that management practices, that also doesn&rsquo;t work?</p><p><strong>Mat Ryer:</strong> Yeah. That one wasn&rsquo;t up there either, was it? What are we going to say? Or should we time you out?</p><p><strong>Natalie Pistunovich:</strong> Does that mean we get to keep the life? [laughter]</p><p><strong>Mat Ryer:</strong> No, it means the other team will get a chance to steal&hellip;</p><p><strong>Natalie Pistunovich:</strong> Right. Bad documentation?</p><p><strong>Mat Ryer:</strong> Okay, let&rsquo;s go for that then. Bad documentation. Gophers say&hellip; [fail sound] No. But what a great guess&hellip;! Okay, so now the other team have a chance to steal. Jon, I&rsquo;ll accept your answer after you confer with your lovely team.</p><p><strong>Jon Calhoun:</strong> So I&rsquo;m assuming that if they voted the podcasts, that they would have filtered that one out, right? [laughter] Jerod wouldn&rsquo;t have let that fly.</p><p><strong>Mat Ryer:</strong> Didn&rsquo;t take conferences out</p><p><strong>Katie Hockman:</strong> My idea is like Twitter, Reddit, Hacker News, that kind of &ndash; like the social media aspect. What do you guys think?</p><p><strong>Jon Calhoun:</strong> I was actually thinking Twitter, but Natalie used it for the best things about tech. But I think it&rsquo;s kind of like people as well - they can be good and bad.</p><p><strong>Rob Findley:</strong> They can be both. I think that&rsquo;s good. I was also gonna say &ndash;</p><p><strong>Jon Calhoun:</strong> Do we go with like social media, or do we want a specific &ndash;</p><p><strong>Katie Hockman:</strong> I would hope that they would take either, if that was actually the answer.</p><p><strong>Rob Findley:</strong> Sounds good.</p><p><strong>Jon Calhoun:</strong> Okay. So let&rsquo;s go with social media.</p><p><strong>Mat Ryer:</strong> Okay. Social media. Let&rsquo;s find out. Gophers say&hellip; [fail sound] No, they didn&rsquo;t say that, so you don&rsquo;t steal the points. That means that team zero keeps those lovely points&hellip; But let&rsquo;s find out, what was number two on this one? It was &ldquo;There&rsquo;s too much to learn.&rdquo; There&rsquo;s too much to learn in this old tech industry of ours, and it&rsquo;s making us angry. That&rsquo;s what we&rsquo;ve learned today.</p><p>Okay, I don&rsquo;t know, I probably wouldn&rsquo;t have guessed that one. I thought there were some great answers there, everyone&hellip; How&rsquo;s it going so far? Are we having a fun quiz?</p><p><strong>Natalie Pistunovich:</strong> Yaay!</p><p><strong>Rob Findley:</strong> Wooh!</p><p><strong>Steve Francia:</strong> This is fun.</p><p><strong>Jon Calhoun:</strong> I&rsquo;m realizing that I do not resonate with all the people who took the survey. [laughter] We&rsquo;ve missed the top two answers several times now, I feel like.</p><p><strong>Mat Ryer:</strong> Yeah. It&rsquo;s surprising; you learn things. It is a surprise. Let&rsquo;s check in with the scores, shall we? Please? Team zero has got 160 points. Just slightly ahead of team one, who have 157. This is so tight, you won&rsquo;t believe it&hellip; But the next round is Double Points Round! Round six. Let&rsquo;s go!</p><p><strong>Break:</strong> [34:42]</p><p><strong>Mat Ryer:</strong> Okey-doke, this is the final round for double points. Anyone could win the amazing prize. Any one of the three of you can win this&hellip; And then you have to share it, which I&rsquo;m sure will be no problem.</p><p>The question for round six is - we asked people to describe the Go language with just one word. Describe the Go language with just a single, solitary word. What did people say? Julie and Rob, you&rsquo;re going head to head, starting with Rob. What do you think people said, Rob?</p><p><strong>Rob Findley:</strong> [36:06] I think people said &ldquo;simple&rdquo;.</p><p><strong>Mat Ryer:</strong> Do you know? Let&rsquo;s see if people did say &ldquo;simple&rdquo;.</p><p><strong>Rob Findley:</strong> I hope.</p><p><strong>Mat Ryer:</strong> Gophers say&hellip; [win sound] Yes, and it&rsquo;s the top answer. So it means you take control of the board straight away there&hellip; And we&rsquo;re over to Jon. You&rsquo;ve got three lives, there are three ones to guess. The top answer is already taken. Simple. What else did people use to describe the Go language, Jon? One word.</p><p><strong>Jon Calhoun:</strong> I&rsquo;m gonna go with verbose.</p><p><strong>Mat Ryer:</strong> Verbose. Okay. And just for anyone that doesn&rsquo;t know, verbose is when you use lots of extra words that really aren&rsquo;t necessary and you don&rsquo;t need, to try and explain something to somebody, or it could be in documentation&hellip; And essentially, you&rsquo;re using way too many words that&rsquo;s unnecessary, essentially&hellip; And the idea is &ndash;</p><p><strong>Jon Calhoun:</strong> This is what happens when Jerod tells you we have 11 minutes&hellip;</p><p><strong>Mat Ryer:</strong> Oh, no, 11 minutes to fill? Oh, okay. I won&rsquo;t carry that joke on then for 11 minutes&hellip; That would have been gold.</p><p><strong>Natalie Pistunovich:</strong> About being verbose&hellip;</p><p><strong>Mat Ryer:</strong> Yup. Okay, a good bit of comedy, everyone. We&rsquo;re all equally guilty. Katie, what do you think?</p><p><strong>Katie Hockman:</strong> Is verbose on the board?</p><p><strong>Jon Calhoun:</strong> I was gonna say&hellip;</p><p><strong>Mat Ryer:</strong> Oh yeah, I genuinely forgot what we were doing&hellip; [fail sound] [laughter]</p><p><strong>Katie Hockman:</strong> I&rsquo;m gonna assume no&hellip; Okay&hellip;</p><p><strong>Mat Ryer:</strong> No, unfortunately&hellip; It should be now, after that&hellip; So unfortunately - yeah, Jon, you lose a life. Thanks, Katie&hellip; Hopefully, we can edit that, so I don&rsquo;t look like an idiot. [fail sound]</p><p><strong>Katie Hockman:</strong> No worries&hellip;</p><p><strong>Mat Ryer:</strong> No, we can&rsquo;t apparently&hellip; [laughter] Okay, Katie&hellip;</p><p><strong>Katie Hockman:</strong> Alright, I&rsquo;m gonna say &ldquo;fast&rdquo;.</p><p><strong>Mat Ryer:</strong> Fast. The Go language with just one word - fast. Gophers say&hellip; [win sound] Yes, indeed. It was in at spot number three there. Nine people said it, so you get 18 points. By the way, for the &ldquo;simple&rdquo; answer, because 25 people said it, you&rsquo;ve got 50 points there. So there&rsquo;s a lot of points on this board. And with two lives left, Rob&rsquo;s to guess. Robs?</p><p><strong>Rob Findley:</strong> How about &ldquo;concrete&rdquo;?</p><p><strong>Mat Ryer:</strong> Concrete. Oh, okay, concrete. Let&rsquo;s see if people said that; that&rsquo;d be interesting. Gophers say&hellip; [fail sound] No, obviously not, Rob. But good answer. But you lose a life, I&rsquo;m afraid. Jon, over to you now.</p><p><strong>Jon Calhoun:</strong> See, this is the problem&hellip;</p><p><strong>Mat Ryer:</strong> Last life, Jon&hellip;</p><p><strong>Jon Calhoun:</strong> It could be a self-fulfilling prophecy if I lose this for us&hellip;</p><p><strong>Mat Ryer:</strong> Come on, get in the minds of these surveyed Gophers. You know them by now&hellip; You got to know them over a series of five rounds of simple questions; you feel like you know them pretty well&hellip; What do you think?</p><p><strong>Jon Calhoun:</strong> Um, readable?</p><p><strong>Mat Ryer:</strong> Readable. I love that answer. Let&rsquo;s see. Gophers say&hellip; [fail sound] No, they did not. That is a surprise. And unfortunately, that was your last life, which means team zero has a chance to steal, and basically win the game if they can get either the second or the fourth answer from this board. You&rsquo;re allowed to confer, of course&hellip; Natalie, I&rsquo;ll accept your answer after you&rsquo;ve conferred with your team. What do you think?</p><p><strong>Natalie Pistunovich:</strong> What do you say?</p><p><strong>Julie Qiu:</strong> Oh, boy&hellip;</p><p><strong>Steve Francia:</strong> I think I would say &ndash; I&rsquo;ll give you a few. Efficient&hellip;</p><p><strong>Julie Qiu:</strong> That was mine!</p><p><strong>Steve Francia:</strong> Secure&hellip;</p><p><strong>Julie Qiu:</strong> That was what I have in mind.</p><p><strong>Steve Francia:</strong> I mean, it is what it says on the Go website, which I&rsquo;ve put there. You could also say &ldquo;fun&rdquo;. &ldquo;Fun&rdquo; is another one. So fun, efficient, secure.</p><p><strong>Natalie Pistunovich:</strong> Secure is a good one.</p><p><strong>Julie Qiu:</strong> I like efficient.</p><p><strong>Natalie Pistunovich:</strong> Efficient? It&rsquo;s interesting that some of the other questions have seven answers, and this one has only four, so it looks like everybody has the same thing in mind&hellip; Or they&rsquo;ve just dropped out of the questionnaire. Okay, so I guess &ndash;</p><p><strong>Jon Calhoun:</strong> I think anything below five answers gets dropped.</p><p><strong>Natalie Pistunovich:</strong> Oh, so it&rsquo;s actually the other way around. So many answers.</p><p><strong>Mat Ryer:</strong> Mm-hm.</p><p><strong>Steve Francia:</strong> Many people answered the same things in this one.</p><p><strong>Julie Qiu:</strong> Yeah.</p><p><strong>Mat Ryer:</strong> 25 people said &ldquo;simple&rdquo;, 9 people said &ldquo;fast&rdquo;. There&rsquo;s still two answers to get on the board, positions two and four.</p><p><strong>Natalie Pistunovich:</strong> Then how many people said &ldquo;efficient&rdquo;?</p><p><strong>Mat Ryer:</strong> Shall we find out? Is that your answer?</p><p><strong>Natalie Pistunovich:</strong> [40:23] Yes.</p><p><strong>Mat Ryer:</strong> Would you like to lock it in?</p><p><strong>Natalie Pistunovich:</strong> I would like to lock it in to number two, please. [laughter]</p><p><strong>Mat Ryer:</strong> Well, you don&rsquo;t get to choose&hellip; Let&rsquo;s find out. Efficient. Gophers say&hellip; [fail sound] You&rsquo;ve been hanging out in Germany too long, Natalie&hellip;</p><p><strong>Jon Calhoun:</strong> They haven&rsquo;t been reading Steve&rsquo;s page.</p><p><strong>Natalie Pistunovich:</strong> I&rsquo;ve been reading the documentation. It says there.</p><p><strong>Steve Francia:</strong> It is on the website&hellip;</p><p><strong>Mat Ryer:</strong> Yeah. Okay, we&rsquo;re gonna award those points, and let&rsquo;s find out, at number four on this board - people said, with just one word, the Go language was&hellip; Fun! Which was mentioned&hellip;</p><p><strong>Rob Findley:</strong> I knew it!</p><p><strong>Mat Ryer:</strong> Fast is at number three, nine people&hellip; At number two, pragmatic. 12 people said that. It would have earned you 24 points.</p><p><strong>Katie Hockman:</strong> At least it doesn&rsquo;t say secure&hellip;</p><p><strong>Mat Ryer:</strong> Yeah&hellip; [laughter]</p><p><strong>Jon Calhoun:</strong> Well, there are just a lot of answers with four or less then&hellip;</p><p><strong>Mat Ryer:</strong> Yeah, we&rsquo;ll do the data crunching and find out. It sometimes happens there&rsquo;s lots of answers, and it&rsquo;s not many people agreeing; only if you had five or more will it make it onto the board, of course&hellip; But there we go. Let&rsquo;s have a quick look at the scores, because these are final scores now.</p><p>It&rsquo;s time for final scores now. Team zero got 160 points, which is very respectable&hellip; And I&rsquo;m saying that to lessen the blow when we find out that team one thrashes you with 225 points. Please celebrate appropriately! [applause]</p><p>So there we go&hellip; Any surprises? What do we think? Which was the round? Jon, when you were saying that they missed out some answers, what were you thinking of?</p><p><strong>Jon Calhoun:</strong> Oh, I just felt like half the answers people gave on that last one were ones I would have expected to at least show up a couple times&hellip; But it is hard when everybody chooses different words.</p><p><strong>Mat Ryer:</strong> Yeah, that&rsquo;s it&hellip;</p><p><strong>Jon Calhoun:</strong> But I did call it, that Katie and Rob were gonna have to carry me&hellip; Because I got nothing on that last round.</p><p><strong>Mat Ryer:</strong> Yeah. It was good though, ain&rsquo;t it?</p><p><strong>Natalie Pistunovich:</strong> That&rsquo;s alright. That&rsquo;s why you&rsquo;re a team.</p><p><strong>Jon Calhoun:</strong> That teamwork. Sorry, Steve. You look upset.</p><p><strong>Mat Ryer:</strong> How are you feeling, Steve, after&hellip;?</p><p><strong>Steve Francia:</strong> I&rsquo;m pretty broken-hearted. I thought we were gonna win. Even at that last round, I thought we had it. I was like, &ldquo;We&rsquo;re gonna steal it.&rdquo;</p><p><strong>Natalie Pistunovich:</strong> We were not efficient enough.</p><p><strong>Steve Francia:</strong> Well, we weren&rsquo;t fun enough, that&rsquo;s really what it was.</p><p><strong>Natalie Pistunovich:</strong> That&rsquo;s true. That is actually true.</p><p><strong>Steve Francia:</strong> Or pragmatic.</p><p><strong>Jon Calhoun:</strong> I mean, that just means you need to rebrand the go.dev website, and just put &ldquo;FUN&rdquo; real big.</p><p><strong>Steve Francia:</strong> I think we&rsquo;re gonna have to&hellip; What were the &ndash; it was fast, simple, pragmatic and fun. I think that&rsquo;s what&rsquo;s gonna go on the website now.</p><p><strong>Katie Hockman:</strong> I think it has to. Legally obligated.</p><p><strong>Mat Ryer:</strong> That&rsquo;s what people think of it&hellip; But how do you feel? Do you feel like you got to know the Go community a bit more as well, in a way?</p><p><strong>Steve Francia:</strong> Yeah.</p><p><strong>Mat Ryer:</strong> Like, do you understand them? Sometimes some of the answers are unusual, aren&rsquo;t they?</p><p><strong>Jon Calhoun:</strong> I feel like the last time you played this &ndash; the last time you played this, didn&rsquo;t you have questions that asked about editors, and people were using that? Or I think one question was like &ldquo;What was the first language you learned?&rdquo;, so you kind of got to understand people better based on how old they were when they learned to program? This one I don&rsquo;t feel like there&rsquo;s any questions that gave that away too much.</p><p><strong>Mat Ryer:</strong> Yeah. You sort of just have to pick up the general vibes of people, I think, with this game.</p><p><strong>Steve Francia:</strong> So - interesting fact&hellip; In the first Go user survey we had a bonus question, &ldquo;What was your favorite Go keyword?&rdquo; And I thought doing all these surveys would help me; that&rsquo;s the only one it helped me with, but&hellip; &ldquo;go&rdquo; and &ldquo;defer&rdquo; were both high on the list. I remember.</p><p><strong>Jon Calhoun:</strong> I was something waiting for &ldquo;else&rdquo; to be on the list, even though &ldquo;if&rdquo; and &ldquo;switch&rdquo; weren&rsquo;t. I was just like, &ldquo;If that&rsquo;s the case, it&rsquo;s just somebody trolling us.&rdquo;</p><p><strong>Mat Ryer:</strong> [44:07] Some of the answers in some of the questions &ndash; because we&rsquo;ve asked loads of questions, so we have loads to choose from&hellip; And some of them are &ndash; like, you wonder if people are trolling, or joking. And sometimes the joke answers - enough people say it that it makes it onto the board as well, because&hellip; You know, it&rsquo;s quite funny, but&hellip; It&rsquo;s interesting to get into the minds of people, I think, a little bit&hellip;</p><p>Speaking of that, we&rsquo;ve got a couple of minutes&hellip; Steve, what have you been working on lately?</p><p><strong>Steve Francia:</strong> I&rsquo;ve been working on a lot of stuff lately, because that&rsquo;s what I do, I work on a lot of different stuff&hellip; But I know &ndash; I&rsquo;ll just kind of talk about some things that we&rsquo;re working on. A lot of work getting ready for a generics release, which is coming up in the release in February&hellip; But the betas should be &ndash; you know, all the pre-releases we&rsquo;re working hard on.</p><p>I&rsquo;m also meeting with a lot of our users. A good part of how I spend my day is meeting with companies and individuals and projects who have adopted Go, and just hearing their challenges and their successes&hellip;</p><p><strong>Mat Ryer:</strong> Oh, nice.</p><p><strong>Steve Francia:</strong> It&rsquo;s one of my favorite parts of my job, actually.</p><p><strong>Mat Ryer:</strong> Yeah. Generics of course coming in 1.18 in February&hellip; Katie - also fuzzing is coming. First-class concern.</p><p><strong>Katie Hockman:</strong> It is. I&rsquo;m so, so excited that it&rsquo;s happening. I&rsquo;m working very hard on documentation right now. We&rsquo;re kind of in the bug fix, and polish, and document phase&hellip; So I think it&rsquo;s gonna be important for it to land with docs, or it&rsquo;s not gonna land successfully if people can&rsquo;t use it. So that&rsquo;s the goal that I have right now for this project.</p><p><strong>Mat Ryer:</strong> That makes sense. I love the way that it interops with the existing testing stuff; our knowledge of writing unit tests can come in handy for writing fuzz tests. I think that&rsquo;s a kind of really nice advantage to the fact that it&rsquo;s getting first-class support, rather than being a sort of external tool.</p><p><strong>Katie Hockman:</strong> Yeah, absolutely. Yeah, that was one of the main goals, and I&rsquo;m glad you like that.</p><p><strong>Mat Ryer:</strong> Yeah, I do. I really do. Well, thank you so much, it&rsquo;s been a pleasure. If our audience wants to learn more about Rob and Julie, check out our Go Time back-catalog, and also listen to future shows, because they&rsquo;ll definitely be on it, hopefully.</p><p>Thank you so much to everyone for joining this live feed, this game. A great time was had by all(most); a great time was had by most&hellip; And we&rsquo;ll see you next time. Bye everyone!</p><p><strong>Steve Francia:</strong> Bye.</p><p><strong>Natalie Pistunovich:</strong> Bye!</p><p><strong>Break:</strong> [46:44]</p><p><strong>Jerod Santo:</strong> I feel like I only really screwed up probably the tech/innovation one, which was the number one answer nobody got&hellip; I almost gave it when Jon said &ldquo;Go&rdquo;, because that would be focused on like the tech, but it was more broad&hellip; I was struggling.</p><p><strong>Katie Hockman:</strong> What about diversity is not culture? How is diversity and culture not the same? [laughs]</p><p><strong>Jerod Santo:</strong> Well, yeah&hellip; I know, but you just said &ndash; yeah, that was definitely specifically mentioned by a few people.</p><p><strong>Katie Hockman:</strong> I see.</p><p><strong>Jerod Santo:</strong> And I grouped it into like &ndash; it was tough because there were so many&hellip; Like, &ldquo;tech bros&rdquo;&hellip; There were a lot of weird responses, so I kind of like put it in like the people and the culture. But when you said diversity specifically, I was kind of like &ldquo;It would be too much of a mismatch with just the people.&rdquo; It was tough.</p><p><strong>Katie Hockman:</strong> Nah, that&rsquo;s fair. I&rsquo;ll allow it.</p><p><strong>Jerod Santo:</strong> That one was.</p><p><strong>Julie Qiu:</strong> I feel like I should have gotten the points when I said &ldquo;fabulous&rdquo;&hellip;</p><p><strong>Jerod Santo:</strong> Oh, those were &ndash; that one I didn&rsquo;t do any grouping, because that was like the easiest one, right? Because you can actually just like &ldquo;Group by&rdquo; and the actual words were&hellip; So I didn&rsquo;t do any grouping of the words. But on the &ndash;</p><p><strong>Mat Ryer:</strong> Maybe we should like each question and then have a regex for the answer next time. So you have to do it in your head live, but&hellip;</p><p><strong>Jerod Santo:</strong> Just do the regex live and apply it?</p><p><strong>Jon Calhoun:</strong> I would not get any answers then, because I would never compose my regex right the first time&hellip;</p><p><strong>Jerod Santo:</strong> Well, you can just have Mat write the regex, and then we can all criticize it on the air like we did last time with your team selection algorithm.</p><p><strong>Mat Ryer:</strong> Which worked, yeah.</p><p><strong>Jerod Santo:</strong> Which worked&hellip; [laughs]</p><p><strong>Mat Ryer:</strong> Which worked.</p><p><strong>Jon Calhoun:</strong> Yeah, that time you didn&rsquo;t even give us the opportunity.</p><p><strong>Natalie Pistunovich:</strong> You are all saying regex, wow.</p><p><strong>Mat Ryer:</strong> Well, what do you say?</p><p><strong>Natalie Pistunovich:</strong> Reg ex.</p><p><strong>Katie Hockman:</strong> I say reg ex&hellip;</p><p><strong>Mat Ryer:</strong> Do you?</p><p><strong>Steve Francia:</strong> Wait, what is it?</p><p><strong>Natalie Pistunovich:</strong> Reg ex, regex.</p><p><strong>Katie Hockman:</strong> I say reg ex, but I realized people say regex. I say reg ex.</p><p><strong>Steve Francia:</strong> Reg ex. Like Reg A.</p><p><strong>Natalie Pistunovich:</strong> Like regular expression.</p><p><strong>Rob Findley:</strong> Do you say gif or gif?</p><p><strong>Katie Hockman:</strong> I say gif just to mess with people.</p><p><strong>Jerod Santo:</strong> Do you say gif?</p><p><strong>Katie Hockman:</strong> I say gif, I switch.</p><p><strong>Jon Calhoun:</strong> I mean, I get reg ex in the sense that it&rsquo;s regular expression, but&hellip;</p><p><strong>Jerod Santo:</strong> Yeah, I understand it&rsquo;s illogical.</p><p><strong>Jon Calhoun:</strong> &hellip;for some reason I don&rsquo;t do it.</p><p><strong>Jerod Santo:</strong> &hellip;but regex just rolls off the tongue, whereas reg ex - you feel like you&rsquo;re choking.</p><p><strong>Mat Ryer:</strong> Yeah, it&rsquo;s hard to say. I just say regiular expressions&hellip; [laughter]</p><p><strong>Jerod Santo:</strong> This is funny, because&hellip;</p><p><strong>Natalie Pistunovich:</strong> It sounds like something you&rsquo;d say in British.</p><p><strong>Julie Qiu:</strong> Do you say Lynux, too?</p><p><strong>Jerod Santo:</strong> No, of course not.</p><p><strong>Julie Qiu:</strong> Linux?</p><p><strong>Steve Francia:</strong> No, his name is Linus, so it&rsquo;s Lynux.</p><p><strong>Natalie Pistunovich:</strong> Oh&hellip;</p><p><strong>Rob Findley:</strong> Well, I thought it was based off minux</p><p><strong>Jerod Santo:</strong> No, because Linus is actually on the record of saying &ldquo;My name is Linus Torvalds and I call Linux Linux.&rdquo; [Linus recording 00:50:22.20] He recorded that audio and put it out there.</p><p><strong>Steve Francia:</strong> Oh, interesting.</p><p><strong>Mat Ryer:</strong> Oh, yeah.</p><p><strong>Jerod Santo:</strong> So we have permission.</p><p><strong>Steve Francia:</strong> Yeah, that was a long time ago.</p><p><strong>Jerod Santo:</strong> It really was.</p><p><strong>Steve Francia:</strong> Who created regex? Will they give us permission?</p><p><strong>Jerod Santo:</strong> Oh, I&rsquo;ll give you permission to call it regex.</p><p><strong>Natalie Pistunovich:</strong> This reg ex/regex just gave my next Twitter poll, thank you. All.</p><p><strong>Steve Francia:</strong> I think the teams were super-nice and fair, and I think if we had one more round, we would have taken it.</p><p><strong>Jerod Santo:</strong> It was super-tight. This was probably the closest one we&rsquo;ve had.</p><p><strong>Rob Findley:</strong> Yeah, it was amazing.</p><p><strong>Steve Francia:</strong> Yeah, it was close.</p><p><strong>Mat Ryer:</strong> Yeah, it was close.</p><p><strong>Jon Calhoun:</strong> Based on the way the score was going back and forth, I wouldn&rsquo;t have been shocked at all if you guys would have taken the next round, Steve.</p><p><strong>Jerod Santo:</strong> Well, you were one word away. &ldquo;Fun&rdquo; was the word, and you had it in your shortlist&hellip;</p><p><strong>Natalie Pistunovich:</strong> Yeah&hellip;</p><p><strong>Jerod Santo:</strong> So&hellip; Great game, guys.</p><p><strong>Steve Francia:</strong> That was the first thing that came to mind, and then &ndash; stupid, I was like &ldquo;I&rsquo;ll just look at the website, and see what the website says.&rdquo; I should have stuck with my guess.</p><p><strong>Mat Ryer:</strong> Does the website say &ldquo;fun&rdquo;?</p><p><strong>Steve Francia:</strong> No.</p><p><strong>Rob Findley:</strong> Oh, you were cheating?</p><p><strong>Steve Francia:</strong> Yeah, I was cheating.</p><p><strong>Natalie Pistunovich:</strong> Illegal!</p><p><strong>Jon Calhoun:</strong> You can&rsquo;t google it&hellip;!</p><p><strong>Steve Francia:</strong> Well, I didn&rsquo;t google it, I go.dev-ed it.</p><p><strong>Jerod Santo:</strong> [laughs]</p><p><strong>Mat Ryer:</strong> Is it still cheating if it doesn&rsquo;t work?</p><p><strong>Katie Hockman:</strong> Yes.</p><p><strong>Rob Findley:</strong> Yes.</p><p><strong>Steve Francia:</strong> Well, yes.</p><p><strong>Jon Calhoun:</strong> It&rsquo;s still cheating.</p><p><strong>Jerod Santo:</strong> It&rsquo;s still cheating.</p><p><strong>Rob Findley:</strong> But Steve did write that, so he shouldn&rsquo;t have had to google it.</p><p><strong>Steve Francia:</strong> I did write it. Yeah, I just wanted to double-check myself, because I actually thought it said &ldquo;fun&rdquo; &ndash; at least one version of it said &ldquo;fun&rdquo;; another version said &ldquo;simple&rdquo;, but those aren&rsquo;t on the website today.</p><p><strong>Rob Findley:</strong> I was kicking myself&hellip; I thought for sure that was concurrent.</p><p><strong>Jon Calhoun:</strong> So whoever did the study group&hellip;</p><p><strong>Natalie Pistunovich:</strong> It&rsquo;s on people&rsquo;s minds&hellip;</p><p><strong>Rob Findley:</strong> I almost said &ldquo;concurrent&rdquo;, and I didn&rsquo;t.</p><p><strong>Julie Qiu:</strong> Oh&hellip;!</p><p><strong>Rob Findley:</strong> It was not there. I was surprised.</p><p><strong>Katie Hockman:</strong> I knew it was gonna be &ldquo;fun&rdquo;. As soon as I said &ldquo;fast&rdquo;, I was like, &ldquo;I hope that can get fun&rdquo; Because they said &ldquo;fun&rdquo; in a previous one, for a similar question. I was like, &ldquo;They&rsquo;re gonna say it again.&rdquo; I thought &ldquo;fun&rdquo; was gonna be on the board 100%.</p><p><strong>Steve Francia:</strong> Oh, we should have said &ldquo;fun&rdquo;!</p><p><strong>Katie Hockman:</strong> [52:12] I was so sure&hellip; And then when they said it, I was like, &ldquo;We&rsquo;re done. We&rsquo;re done.&rdquo; I knew they had it. And then they didn&rsquo;t, and I was like&hellip;</p><p><strong>Rob Findley:</strong> Yeah, when Steve said said &ldquo;fun&rdquo;&hellip;</p><p><strong>Steve Francia:</strong> So close&hellip;</p><p><strong>Rob Findley:</strong> Yeah&hellip; I was like, &ldquo;Oh, man. Fun. Fun is definitely there.&rdquo;</p><p><strong>Mat Ryer:</strong> Well, everyone&rsquo;s got a time machine token that you can play at any point, and we have to rewind&hellip;</p><p><strong>Katie Hockman:</strong> Oh, dang. Okay, thanks.</p><p><strong>Mat Ryer:</strong> I forgot about that, yeah.</p><p><strong>Katie Hockman:</strong> You didn&rsquo;t mention that rule.</p><p><strong>Steve Francia:</strong> Oh, that&rsquo;d be fun.</p><p><strong>Mat Ryer:</strong> And we&rsquo;d be like [reverse sound] go backwards through everything, and we can get to that question again, and you can answer it differently, and we play it forward.</p><p><strong>Jerod Santo:</strong> Wow. Can we go back and erase that &ldquo;verbosity&rdquo; joke you did?</p><p><strong>Mat Ryer:</strong> I was trying to hold it up after that&hellip; [laughter] And I went too fast.</p><p><strong>Jerod Santo:</strong> I knew what you were doing immediately, and I&rsquo;m like, &ldquo;Oh, he&rsquo;s not doing this, is he?&rdquo;</p><p><strong>Mat Ryer:</strong> Of course he&rsquo;s doing it.</p><p><strong>Jon Calhoun:</strong> You just started doing it, and I read Jerod&rsquo;s 11 minutes.</p><p><strong>Mat Ryer:</strong> In the edit.</p><p><strong>Jerod Santo:</strong> I guess I can go back and change it.</p><p><strong>Steve Francia:</strong> Can we make fun of whoever? Panic is not a Go keyword, is it? But someone said it.</p><p><strong>Katie Hockman:</strong> Is it not&hellip;?!</p><p><strong>Natalie Pistunovich:</strong> [laughs] The same complaints last time also&hellip; The previous game, same questions, same answers.</p><p><strong>Jerod Santo:</strong> Yeah, it was new last time as well.</p><p><strong>Katie Hockman:</strong> Oh&hellip;</p><p><strong>Jon Calhoun:</strong> It&rsquo;s like, when they do the survey, they don&rsquo;t actually give them a list of keywords&hellip; So on any question like that, they can just type whatever they want in.</p><p><strong>Steve Francia:</strong> No, all the words they said were keywords, but someone in our panel&hellip;</p><p><strong>Jerod Santo:</strong> Oh, someone guessed &ldquo;panic&rdquo;?</p><p><strong>Mat Ryer:</strong> Well, it was on &ndash;</p><p><strong>Steve Francia:</strong> They guessed a non-keyword.</p><p><strong>Mat Ryer:</strong> It was on the last time, panic&hellip;</p><p><strong>Rob Findley:</strong> I think that&rsquo;s a good guess.</p><p><strong>Mat Ryer:</strong> Yeah, yeah. On keywords.</p><p><strong>Jerod Santo:</strong> Yeah, it actually was on the last time.</p><p><strong>Steve Francia:</strong> It was.</p><p><strong>Mat Ryer:</strong> People bundle that in.</p><p><strong>Jerod Santo:</strong> So they were playing 4D chess. Was that you, Natalie? She was on the last time&hellip;</p><p><strong>Mat Ryer:</strong> People bundle that in.</p><p><strong>Katie Hockman:</strong> Oh, panic is a function, not a keyword?</p><p><strong>Mat Ryer:</strong> Yeah, built-in function.</p><p><strong>Steve Francia:</strong> I don&rsquo;t think it&rsquo;s a keyword&hellip;</p><p><strong>Jerod Santo:</strong> I can&rsquo;t believe &ldquo;return&rdquo; wasn&rsquo;t on there.</p><p><strong>Jon Calhoun:</strong> I&rsquo;m guessing that things like &ldquo;new&rdquo;, &ldquo;panic&rdquo;, and there&rsquo;s a couple others that people probably think are keywords, even though they&rsquo;re not&hellip;</p><p><strong>Mat Ryer:</strong> Because they&rsquo;re built-in functions&hellip;</p><p><strong>Jon Calhoun:</strong> I mean, some of them I wouldn&rsquo;t know unless I looked at the spec and was like &ldquo;Okay, what actually is this?&rdquo;</p><p><strong>Mat Ryer:</strong> There&rsquo;s loads of built-in functions as well&hellip; See, I did a talk at Gotham Go, Steve, and I remember showing the list of &ndash; I showed the list, and you were like, &ldquo;They&rsquo;re not them.&rdquo; And I was like doing my talk, trying to concentrate and be professional. And you&rsquo;re like &ldquo;That&rsquo;s not them&hellip;&rdquo; And I was like, &ldquo;Oh&hellip;&rdquo; You can see on the video when you ruined it.</p><p><strong>Steve Francia:</strong> Mat, we know you&rsquo;re not telling the truth though, because I&rsquo;ve known you a long time and I&rsquo;ve yet to see you be professional once&hellip; [laughter]</p>
]]></content:encoded></item><item><title>Rust vs Go: Better Together</title><link>https://spf13.com/p/rust-vs-go-better-together/</link><pubDate>Fri, 12 Mar 2021 00:00:00 UTC</pubDate><guid>https://spf13.com/p/rust-vs-go-better-together/</guid><media:content url="https://spf13.com/p/rust-vs-go-better-together/rust-vs-go.png" medium="image"/><media:thumbnail url="https://spf13.com/p/rust-vs-go-better-together/rust-vs-go.png"/><description>While others may see &lt;a href="https://www.rust-lang.org/">Rust&lt;/a> and &lt;a href="https://go.dev/">Go&lt;/a> as competitive programming languages, neither the Rust nor the Go teams do. Quite the contrary, our teams have deep respect for what the others are doing, and see the languages as complimentary with a shared vision of modernizing the state of software development industry-wide.</description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/rust-vs-go-better-together/rust-vs-go.png" alt="Rust vs Go: Better Together"/><p>Editors Note:<em>Rust vs Go: Better Together is co-authored by<a href="https://twitter.com/jntrnr">JT</a> and was originally published on<a href="https://thenewstack.io/rust-vs-go-why-theyre-better-together/">The New Stack</a>.</em></p><p>While others may see<a href="https://www.rust-lang.org/">Rust</a> and<a href="https://go.dev/">Go</a> as competitive programming languages, neither the Rust nor the Go teams do. Quite the contrary, our teams have deep respect for what the others are doing, and see the languages as complimentary with a shared vision of modernizing the state of software development industry-wide.</p><p>In this article, we will discuss the pros and cons of Rust and Go and how they supplement and support each other, and our recommendations for when each language is most appropriate.</p><p>Companies are finding value in adopting both languages and in their complimentary value. To shift from our opinions to hands-on user experience, we spoke with three such companies,<a href="https://www.dropbox.com/">Dropbox</a>,<a href="https://www.fastly.com/">Fastly</a>, and<a href="https://www.cloudflare.com/">Cloudflare</a>, about their experience in using Go and Rust together. There will be quotes from them throughout this article to give further perspective.</p><h2 id="language-comparison">Language Comparison</h2><table><thead><tr><th>Language</th><th>Go</th><th>Rust</th></tr></thead><tbody><tr><td>Creation Date</td><td>2009</td><td>2010</td></tr><tr><td>Created at</td><td>Google</td><td>Mozilla</td></tr><tr><td>Notable software written in language</td><td>Kubernetes, Docker, Github CLI, Hugo, Caddy, Drone, Ethereum, Syncthing, Terraform</td><td>Firefox, ripgrep, alacritty, deno, Habitat</td></tr><tr><td>Key workloads</td><td>APIs, Web Apps, CLI apps, DevOps, Networking, Data Processing, cloud apps</td><td>IoT, processing engines, security-sensitive apps, system components, cloud apps</td></tr><tr><td>Developer adoption</td><td>8.8% (#12)</td><td>5.1% (#19)</td></tr><tr><td>Most loved</td><td>62.3% (#5)</td><td>86.1% (#1)</td></tr><tr><td>Most wanted</td><td>17.9% (#3)</td><td>14.6% (#5)</td></tr></tbody></table><h2 id="similarities">Similarities</h2><p>Go and Rust have a lot in common. Both are modern software languages born out of a need to provide a safe and scalable solution to the problems impacting software development. Both were created as reactions to shortcomings the creators were experiencing with existing languages in the industry, particularly shortcomings of developer productivity, scalability, safety and concurrency.</p><p>Most of today’s popular languages were designed over 30 years ago. When those languages were designed there were five key differences from today:</p><ol><li>Moore’s law was thought to be eternally true.</li><li>Most software projects were written by small teams, often working in person together.</li><li>Most software had a relatively small number of dependencies, mostly proprietary.</li><li>Safety was a secondary concern… or not a concern at all.</li><li>Software was typically written for a single platform.</li></ol><p>In contrast, both Rust and Go were written for today’s world and generally took similar approaches to design a language for today’s development needs.</p><h3 id="1-performance-and-concurrency">1. Performance and Concurrency</h3><p>Go and Rust are both compiled languages focused on producing efficient code. They also provide easy access to the multiple processors of today’s machines, making them ideal languages for writing efficient parallel code.</p><p><em>“Using Go allowed MercadoLibre to cut the number of servers they use for this service to one-eighth the original number (from 32 servers down to four), plus each server can operate with less power (originally four CPU cores, now down to two CPU cores). With Go, the company obviated 88 percent of their servers and cut CPU on the remaining ones in half—producing a tremendous cost-savings.”</em>— “<a href="https://go.dev/solutions/mercadolibre/">MercadoLibre Grows with Go</a>”</p><p><em>“In our tightly managed environments where we run Go code, we have seen a CPU reduction of approximately ten percent [vs C++] with cleaner and maintainable code.”</em> —<a href="https://go.dev/solutions/paypal/">Bala Natarajan, Paypal</a></p><p><em>“Here at AWS, we love Rust, too, because it helps AWS write highly performant, safe infrastructure-level networking and other systems software. Amazon’s first notable product built with Rust, Firecracker, launched publicly in 2018 and provides the open source virtualization technology that powers AWS Lambda and other serverless offerings. But we also use Rust to deliver services such as Amazon Simple Storage Service (Amazon S3), Amazon Elastic Compute Cloud (Amazon EC2), Amazon CloudFront, Amazon Route 53, and more. Recently we launched Bottlerocket, a Linux-based container operating system written in Rust.” —<a href="https://aws.amazon.com/blogs/opensource/why-aws-loves-rust-and-how-wed-like-to-help/">Matt Asay, Amazon Web Services</a></em></p><p><em>We “saw an extraordinary 1200-1500% increase in our speed! We went from 300-450ms in release mode with Scala with fewer parsing rules implemented, to 25-30ms in Rust with more parsing rules implemented!” —<a href="https://developer.ibm.com/technologies/web-development/articles/why-webassembly-and-rust-together-improve-nodejs-performance/">Josh Hannaford, IBM</a></em></p><h3 id="2-team-scalable--reviewable">2. Team Scalable — Reviewable</h3><p>Software development today is built by teams that grow and expand, often collaborating in a distributed way using source control. Go and Rust are both designed for how teams work, improving code reviews by removing unnecessary concerns like formatting, security, and complex organization. Both languages require relatively little context to understand what the code is doing, allowing reviewers to more quickly work with code written by other people and review code by both team members and code contributed by open source developers outside of your team.</p><p><em>“Building Go and Rust code, having come from a Java and Ruby background in my early career, felt like an impossible weight off my shoulders. When I was at Google, it was a relief to come across a service that was written in Go, because I knew it would be easy to build and run. This has also been true of Rust, though I’ve only worked on that at a much smaller scale. I’m hoping that the days of infinitely configurable build systems are dead, and languages all ship with their own purpose-built build tools that just work out of the box.”—<a href="https://bitfieldconsulting.com/golang/rust-vs-go">Sam Rose, CV Partner</a></em></p><p><em>“I tend to breathe a sigh of relief when writing a service in Go since it has a very simple, easy to reason about, static type system compared to dynamic languages, concurrency is a first-class citizen, and Go’s standard library is both unbelievably polished and powerful, yet also to the point. Take a standard Go install, throw in a grpc library and a database connector, and you need very little else to build anything on the server-side, and every engineer will be able to read the code and understand the libraries. When writing a module in Rust, Dropbox engineers felt Rust’s growing pains on the server-side before Async-await stabilized in 2019, but since then, crates are converging to use it and we get the benefit of async patterns coupled with fearless concurrency.” — Daniel Reiter Horn, Dropbox</em></p><h3 id="3-open-source-aware">3. Open Source-aware</h3><p>The number of dependencies used by the average software project today is staggering. The decades-long goal of software reuse has been achieved in modern development, where today’s software is built using 100s of projects. To do so, developers use software repositories, which increasingly has become a staple of software development across a broadening range of applications. Each of the packages a developer includes, in turn, has its own dependencies. Languages for today’s programming environments need to handle this complexity effortlessly.</p><p>Both Go and Rust have package-management systems that allow developers to make a simple list of the packages they’d like to build on, and the language tools automatically fetch and maintain those packages for them, so that developers can focus more on their own code and less on the management of others.</p><h3 id="4-safety">4. Safety</h3><p>The security concerns of today’s applications are well-addressed by both Go and Rust, which ensure that code built in the languages run without exposing the user to a variety of classic security vulnerabilities like buffer overflows, use-after-free, etc. By removing these concerns, developers can focus on the problems at hand and build applications that are more secure by default.</p><p><em>“The [Rust] compiler really holds your hand when working through the errors that you do get. This lets you focus on your business objectives rather than bug hunting or deciphering cryptic messages.” —<a href="https://developer.ibm.com/technologies/web-development/articles/why-webassembly-and-rust-together-improve-nodejs-performance/">Josh Hannaford, IBM</a></em></p><p><em>“In short, the flexibility, safety, and security of Rust outweighs any inconvenience of having to follow strict lifetime, borrowing, and other compiler rules or even the lack of a garbage collector. These features are a much-needed addition to cloud software projects and will help avoid many bugs commonly found in them.” —<a href="https://msrc-blog.microsoft.com/2020/04/29/the-safety-boat-kubernetes-and-rust/">Taylor Thomas, Sr., Microsoft</a>.</em></p><p><em>“Go is strongly and statically typed with no implicit conversions, but the syntactic overhead is still surprisingly small. This is achieved by simple type inference in assign­ments together with untyped numeric constants. This gives Go stronger type safety than Java (which has implicit conversions), but the code reads more like Python (which has untyped variables).” —<a href="https://yourbasic.org/golang/advantages-over-java-python/">Stefan Nilsson, computer science professor</a>.</em></p><p><em>“When building our Brotli compression library for storing block data at Dropbox, we limited ourselves to the safe subset of Rust and, further, to the core library (no-stdlib) as well, with the allocator specified as a generic. Using the subset of Rust this way made it very easy to call the Rust-Brotli library from Rust on the client-side and using the C FFI from both Python and Go on the Server. This compilation mode also provided<a href="https://dropbox.tech/infrastructure/lossless-compression-with-brotli">substantial security guarantees</a>. After some tuning, the Rust Brotli implementation, despite being 100% safe, array-bounds-checked code, was still faster than the corresponding native Brotli code in C.” — Daniel Reiter Horn, Dropbox</em></p><h3 id="5-truly-portable">5. Truly Portable</h3><p>It is trivial in both Go and Rust to write one piece of software that runs on many different operating systems and architectures. “Write once, compile anywhere.” In addition, both Go and Rust natively support cross-compilation eliminating the need for “build farms” commonly associated with older compiled languages.</p><p><em>“Golang possesses great qualities for production optimization such as having a small memory footprint, which supports its capability for being building blocks in large-scale projects, as well as easy cross-compilation to other architectures out of the box. Since Go code is compiled into a single static binary, it allows easy containerization and, by extension, makes it almost trivial to deploy Go into any highly available environment such as Kubernetes.” —<a href="https://jaxenter.com/golang-curve-163187.html">Dewet Diener, Curve</a>.</em></p><p><em>“When you look at a cloud-based infrastructure, often you’re using something like a Docker container to deploy your workloads. With a static binary that you build in Go, you could have a Docker file that’s 10, 11, 12 megabytes instead of bringing in the entire Node.js ecosystem, or Python, or Java, where you’ve got these hundreds of megabyte-sized Docker files. So, shipping that tiny binary is amazing.” —<a href="https://cloudblogs.microsoft.com/opensource/2018/02/21/go-lang-brian-ketelsen-explains-fast-growth/">Brian Ketelsen, Microsoft</a>.</em></p><p><em>“With Rust, we’ll have a high-performance and portable platform that we can easily run on Mac, iOS, Linux, Android, and Windows.” —<a href="https://blog.astropad.com/why-rust/">Matt Ronge, Astropad</a>.</em></p><h2 id="differences">Differences</h2><p>In design, there are always trade-offs that must be made. While Go and Rust emerged around the same time with similar goals, as they faced decisions at times they chose different trade-offs that separated the languages in key ways.</p><h3 id="1-performance">1. Performance</h3><p>Go has excellent performance right out of the box. By design, there are no knobs or levers that you can use to squeeze more performance out of Go. Rust is designed to enable you to squeeze every last drop of performance out of the code; in this regard, you really can’t find a faster language than Rust today. However, Rust’s increased performance comes at the cost of additional complexity.</p><p><em>“Remarkably, we had only put very basic thought into optimization as the Rust version was written. Even with just basic optimization, Rust was able to outperform the hyper-hand-tuned Go version. This is a huge testament to how easy it is to write efficient programs with Rust compared to the deep dive we had to do with Go.” —<a href="https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f">Jesse Howarth, Discord</a>.</em></p><p><em>“Dropbox engineers often see 5x performance and latency improvements by porting line-for-line Python code into Go, and memory usage often drops dramatically as compared with Python as there is no GIL and the process count may be reduced. However, when we are memory constrained, as on desktop client software or in certain server processes, we move over to Rust as the manual memory management in Rust is substantially more efficient than the Go GC.” — Daniel Reiter Horn, Dropbox</em></p><h3 id="2-adaptabilityinterability">2. Adaptability/Interability</h3><p>Go’s strength of quick iteration allows developers to try ideas quickly and hone in on working code that solves the task at hand. Often, this is sufficient and frees the developer to move onto other tasks. Rust, on the other hand, has longer compiles compared with Go, leading to slower iteration times. This leads Go to work better in scenarios where faster turnaround time allows developers to adapt to changing requirements, while Rust thrives in scenarios where more time can be given to making a more refined and performant implementation.</p><p><em>“The genius of the Go type system is that callers can define the Interfaces, allowing libraries to return expansive structs but require narrow interfaces. The genius of the Rust type system is the combination of match syntax with Result&lt;>, where you can be statically certain every eventuality is handled and never have to invent null values to satisfy unused return parameters.” — Daniel Reiter Horn, Dropbox</em></p><p><em>“(I)f your use case is closer to customers, it’s more vulnerable to shifting requirements, then Go is a lot nicer because the cost of continuous refactor is a lot cheaper. It’s how fast you can express the new requirements and try them out.” — Peter Bourgon, Fastly</em></p><h3 id="3-learnability">3. Learnability</h3><p>Simply put, there really isn’t a more approachable language than Go. There are many stories of teams who were able to adopt Go and put Go services/applications into production in a few weeks. Additionally, Go is relatively unique among languages in that its language design and practices are quite consistent over it’s 10+ year lifetime. So time invested in learning Go maintains its value for a long time. By comparison, Rust is considered a difficult language to learn due to its complexity. It generally takes several months of learning Rust to feel comfortable with it, but with this extra complexity comes precise control and increased performance.</p><p><em>“At the time, no single team member knew Go, but within a month, everyone was writing in Go” –<a href="https://medium.com/capital-one-tech/a-serverless-and-go-journey-credit-offers-api-74ef1f9fde7f">Jaime Garcia, Capital One</a></em></p><p><em>“What makes Go different from other programming languages is cognitive load. You can do more with less code, which makes it easier to reason about and understand the code that you do end up writing. The majority of Go code ends up looking quite similar, so, even if you’re working with a completely new codebase, you can get up and running pretty quickly.” — Glen Balliet Engineering Director of loyalty platforms at American Express<a href="https://go.dev/solutions/americanexpress/">American Express Uses Go for Payments &amp; Rewards</a></em></p><p><em>“However, unlike other programming languages, Go was created for maximum user efficiency. Therefore developers and engineers with Java or PHP backgrounds can be upskilled and trained in using Go within a few weeks — and in our experience, many of them end up preferring it.” —<a href="https://jaxenter.com/golang-curve-163187.html">Dewet Diener, Curve</a></em></p><h3 id="4-precise-control">4. Precise Control</h3><p>Perhaps one of Rust’s greatest strengths is the amount of control the developer has over how memory is managed, how to use the available resources of the machine, how code is optimized, and how problem solutions are crafted. This is not without a large complexity cost when compared to Go, which is designed less for this type of precise crafting and more for faster exploration times and quicker turnaround times.</p><p><em>“As our experience with Rust grew, it showed advantages on two other axes: as a language with strong memory safety it was a good choice for processing at the edge and as a language that had tremendous enthusiasm it became one that became popular for de novo components.”  — John Graham-Cumming, Cloudflare</em></p><h2 id="summarykey-takeaways">Summary/Key Takeaways</h2><p>Go’s simplicity, performance, and developer productivity make Go an ideal language for creating user-facing applications and services. The fast iteration allows teams to quickly pivot to meet the changing needs of users, giving teams a way to focus their energies on flexibility.</p><p>Rust’s finer control allows for more precision, making Rust an ideal language for low-level operations that are less likely to change and that would benefit from the marginally improved performance over Go, especially if deployed at very large scales.</p><p>Rust’s strengths are at the most advantageous closest to the metal. Go’s strengths are at their most advantageous closer to the user. This isn’t to say that either can’t work in the other’s space, but it would have increased friction to doing so. As your requirements shift from flexibility to efficiency it makes a stronger case to rewrite libraries in Rust.</p><p>While the designs of Go and Rust differ significantly, their designs play to a compatible set of strengths, and — when used together — allow both great flexibility and performance.</p><h2 id="recommendations">Recommendations</h2><p>For most companies and users, Go is the right default option. Its performance is strong, Go is easy to adopt, and Go’s highly modular nature makes it particularly good for situations where requirements are changing or evolving.</p><p>As your product matures, and requirements stabilize, there may be opportunities to have large wins from marginal increases in performance. In these cases, using Rust to maximize performance may well be worth the initial investment.</p>
]]></content:encoded></item><item><title>Break things on purpose podcast</title><link>https://spf13.com/p/break-things-on-purpose-podcast/</link><pubDate>Wed, 10 Feb 2021 00:00:00 UTC</pubDate><guid>https://spf13.com/p/break-things-on-purpose-podcast/</guid><media:content url="https://spf13.com/p/break-things-on-purpose-podcast/break-things-on-purpose-screenshot.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/break-things-on-purpose-podcast/break-things-on-purpose-screenshot.jpg"/><description>&lt;p>I had the privilage of sitting down with my friend Jason Yee as a guest on his podcast.&lt;/p>
&lt;p>Listen to the podcast at &lt;a href="https://www.gremlin.com/blog/podcast-break-things-on-purpose-steve-francia-product-and-strategy-lead-at-google/">https://www.gremlin.com/blog/podcast-break-things-on-purpose-steve-francia-product-and-strategy-lead-at-google/&lt;/a>&lt;/p>
&lt;h2 id="transcript">Transcript&lt;/h2>
&lt;p>Jason Yee: Hey, everyone. Welcome to Build Things On Purpose. Our slight deviation from the Break Things On Purpose podcast, where we talk with people that have made really cool things and we learn some tips from them about how we can make cool things as well, things that are reliable and that scale well. So joining us today we have Steve Francia.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/break-things-on-purpose-podcast/break-things-on-purpose-screenshot.jpg" alt="Break things on purpose podcast"/><p>I had the privilage of sitting down with my friend Jason Yee as a guest on his podcast.</p><p>Listen to the podcast at<a href="https://www.gremlin.com/blog/podcast-break-things-on-purpose-steve-francia-product-and-strategy-lead-at-google/">https://www.gremlin.com/blog/podcast-break-things-on-purpose-steve-francia-product-and-strategy-lead-at-google/</a></p><h2 id="transcript">Transcript</h2><p>Jason Yee: Hey, everyone. Welcome to Build Things On Purpose. Our slight deviation from the Break Things On Purpose podcast, where we talk with people that have made really cool things and we learn some tips from them about how we can make cool things as well, things that are reliable and that scale well. So joining us today we have Steve Francia.</p><p>Steve Francia: Hi.</p><p>Jason Yee: So Steve, tell us a little bit more about yourself. What do you do? Where do you work?</p><p>Steve Francia: So I work for Google as the product lead for the Go programming language. Previously, I worked at Docker and MongoDB in executive roles and have been involved in open source for 25 plus years. And I also was on the board of directors for the Drupal Association.</p><h3 id="origins-of-hugo">Origins of Hugo</h3><p>Jason Yee: Nice. So just some background for our listeners. That&rsquo;s actually how I met Steve, through Drupal. He was my boss at MongoDB. But aside from Drupal, one day, Steve came up to me and said, &ldquo;Hey, check out this thing that I built.&rdquo; And it turned out to be a thing that I think a lot of you might be using, a thing called Hugo. So Steve, tell us a little bit more about Hugo and why you built that.</p><p>Steve Francia: So back when I was at MongoDB, working with Jason, I was running developer experience, which was product engineering, DevRel, documentation, websites, and more; so anything that really our users interacted with. And part of that was creating and guiding our different language and integrations. I&rsquo;m now working on Go, but back then I was a polyglot and we worked with about a dozen different languages. And interestingly, the need to integrate was what brought me to Drupal. We added some good support there. And as we look to extend our language base, we adopted Scala and Go as our last two when I was there. And I spent a few months learning Scala and then pivoted to Go and needed a project to work on there. And at the same time I was retooling my website, I realized I was spending more time doing WordPress security updates than I was blogging, and that maintenance cost was killing me.</p><p>So I thought I&rsquo;m going to switch to a static site generator and tried Jekyll and a few of the others that existed at the time and really struggled with how much time it was taking to render my blog of a few hundred articles. And I thought there must be a faster way to do this. I was just beginning to play with Go. I&rsquo;d spent maybe a couple of weeks with it and I thought, I bet Go is faster than Ruby. I bet I could write a static site generator a little faster. And I said to myself I don&rsquo;t want to write a markdown parser, so if they have one Go, I&rsquo;ll write the rest. And luckily here, I did a quick search and found a really good markdown parser and just started tinkering around with it and within a couple of weeks, I had something that was maybe, I don&rsquo;t know, 50 times faster than Jekyll.</p><p>And I thought, wow, Go is awesome. It&rsquo;s easy to write. You can get great performance out of it. And the birth of Hugo came out of that. And it&rsquo;s an interesting project. Speed was obviously a goal, but I also wanted to make it really easy to use and really flexible. I took a lot of things I&rsquo;d learned from Drupal, put them into it, things I&rsquo;d learned from WordPress, put it into it, things I&rsquo;d learned from running documentation at Mongo DB, particularly with multi-lingual support, and put that into it. And then the open source community embraced it. And we got lots of contributions from all over the world and they were able to extend and polish and improve and really take Hugo further. And today it&rsquo;s much faster than it was then in the early days, which is amazing because we kept adding more features and usually you add features at the cost of speed or other costs. And in this case, so we were able to continue to keep it fast and even improve the speed. And partly, that was also aided from Go, which over its 15 releases, it just gets faster and faster and a lot of benefits to Go applications is a result of that.</p><h3 id="tips-for-learning-go">Tips for learning Go</h3><p>Jason Yee: Yeah. So I&rsquo;m curious, as things have progressed, I&rsquo;m sure a lot of that speed has come about too from just learning the way to do things. You started Hugo as a project to learn Go and obviously, when you do that, you do things in the way that you know of at the time, but then you learn better and you&rsquo;re like, oh, I should have done it in a certain way. I&rsquo;m curious if you&rsquo;ve got some tips on what are some of those things that new Go learners should think about?</p><p>Steve Francia: Yeah, it&rsquo;s a bit humbling to have your first project when you&rsquo;re learning language become the most popular, a very popular project, because all of your words and learning bumps are out there. That said, I&rsquo;m not shy. I was learning the whole time. I made plenty of mistakes as I went. I would say there&rsquo;s a few things that I really benefited from and now from the purview of being on the core Go team and having a lot of experience from working with the creators of Go now for almost five years, my first advice is Go is simpler than you&rsquo;re used to. Don&rsquo;t fight that simplicity. Embrace it.</p><p>And then the second one, which it stems from that, which is everyone comes to go, most people, not everyone, now we have some first programmers using Go, but most people come from another language and they want to come in with their Java way of doing things, or the Python way of doing things, or the C++, or whatever it is way of doing things because that&rsquo;s what&rsquo;s in their mind, and Go as a pretty different language. It&rsquo;s not object oriented, it doesn&rsquo;t have exceptions, it has concurrency baked in. So there&rsquo;s some pretty fundamental shifts in Go. And the advice I give is try and learn the idiomatic way of doing things. And the best way to do that is look at the Go standard library. And the standard library is comprehensive and it&rsquo;s of excellent quality. It&rsquo;s very usable and it really shows you the Go way of doing things. And I think that&rsquo;s a great starting point.</p><p>In other places, look at other popular packages from well-known maintainers and authors. Between that, you should be able to figure out really the Go standard way of doing things. And of course, I didn&rsquo;t have the benefit of this, but now, we actually launched a website just about a year ago called learn.go.dev, and there&rsquo;s a ton of great learning resources from online courses to tutorials, interactive to books. So it&rsquo;s a great starting point for people new to Go.</p><p>Patrick Higgins: I&rsquo;m curious, Steve, did your perception or thoughts about the language shift much when you started working very closely with the people who wrote it?</p><p>Steve Francia: It&rsquo;s a good question. Did they shift much? Honestly, it was an interesting evolution. To go from a community member to a core team member is just a really interesting shift, and I can&rsquo;t say that they changed all that much. I already was very impressed with Go and the things they did. Working with them more closely deepened that. So I wouldn&rsquo;t say it shifted it, but I do find myself just incredibly lucky to be working with the Go team. I&rsquo;m a bit older. I remember the &lsquo;92 dream team for the Olympic basketball team and it was all the best players. And there was this one time in history where this blip came where you just had this magical moment. And I kind of think of that as the Go team. I knew if I didn&rsquo;t join it, I would have regretted it the rest of my life, to be able to rub shoulders with the luminaries that created so much of what we consider is modern computing. So if anything, I was already in awe of them, and then sitting next to them and seeing it in person, actually doesn&rsquo;t happen often, but that impressed me even more. I felt even more humbled to be working with them.</p><h3 id="open-source-and-contributors">Open source and contributors</h3><p>Jason Yee: I&rsquo;m curious similarly. Has going from being a community member and participating in open source to now being a core member and really running the language and the program and the evolution of it, has that changed your perspective on open source and how people get involved?</p><p>Steve Francia: I think we&rsquo;re all learning what open source is more and more over time. And I don&rsquo;t know that that transition happened, but certainly being in the role I&rsquo;m in has opened my eyes a lot. I&rsquo;d say the biggest thing I learned is, I started my career actually in mostly web based open source things. And there&rsquo;s a unique property about web based things is that they can change regularly. Sometimes in our general broad developer community, we joke about, oh did you know JavaScript framework four months ago? Don&rsquo;t worry, there&rsquo;s a brand new one, because it&rsquo;s kind of constantly evolving. And when you&rsquo;re close to the surface, you can do that without much pain. But with the language, that&rsquo;s as low as you can really get. It&rsquo;s amazing how much more thought you have to take into what you&rsquo;re doing.</p><p>And so I remember as part of Drupal and other communities, it was about getting a big contributor base and more engagement and energy and excitement around it. And with Go, it helped me understand the maintenance taxes that come from that and that our maintainers have refined their skills over decades. And not that we don&rsquo;t want contributions, we very much do, but we also know that there&rsquo;s a cost of reviewing, there&rsquo;s a cost of interacting, and that distracts them from being able to do these things. So with Go, the approach is we don&rsquo;t want to change much. We actually want to change as little as possible and in a way that keeps stability and a good experience for our users.</p><p>And for me, that was kind of a new way of thinking. And it was a new way to think about open source and how do you create a good contributor community when the default answer is no? And it&rsquo;s no a high, high percentage of the time. And I kind of struggled with that a bit and I know a lot of our contributors do because it&rsquo;s such a shift. And one thing that helped me with it was to recognize, as a Go team member, the bar was even higher. We actually get told no even more than the community. And so many of our good ideas that we think are good end up on the cutting room floor, so to speak. So I think that was an interesting challenge of how do you figure out how to do that? And we tried a variety of things and some stuck and now Go is actually more contributions from outside than inside the core team. But that was a slow process that evolved over a decade to get there.</p><p>Jason Yee: I think that&rsquo;s fantastic insight. I mean, thinking of this podcast and talking to builders and talking about building reliable systems and applications, that idea of having that default to no and just ensuring that your core is of high quality and is reliable. And that oftentimes does mean you say no to a lot of things, but also balancing that with that contributor experience and ensuring that people have the right guidance and the right experience and are still part of that community despite being told no.</p><p>Cool. Well, thanks for being on the show with us. It&rsquo;s been a pleasure to chat with you. Usually before we go, we give people a chance to do any sort of plugs if you&rsquo;ve got any pluggables, things that you want people to check out.</p><p>Steve Francia: I could give some just general things. It&rsquo;s not like I&rsquo;m in a movie or anything exciting coming up. For those of you interested in Go, check out go.dev. We&rsquo;ve got some great learning resources. We&rsquo;ve also got some great case studies from major companies like American Express and PayPal and Google who&rsquo;ve adopted Go and how it&rsquo;s been transformative to them. And then you can always check me out at spf13.com. We&rsquo;re on GitHub/spf13. And on Twitter, I&rsquo;m everywhere at spf13, so just check me out. I&rsquo;m excited to talk to you.</p><p>Jason Yee: Cool. Well, thanks again.</p>
]]></content:encoded></item><item><title>Grokking Go.dev - Go Time Podcast</title><link>https://spf13.com/p/grokking-go.dev-go-time-podcast/</link><pubDate>Tue, 30 Jun 2020 00:00:00 UTC</pubDate><guid>https://spf13.com/p/grokking-go.dev-go-time-podcast/</guid><media:content url="https://spf13.com/p/grokking-go.dev-go-time-podcast/front.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/grokking-go.dev-go-time-podcast/front.jpg"/><description>&lt;p>I had the privilage of joining my coworker Julie Qiu as we talked with our friends Carmen, Mat and Jon about the new website we are launching for Go, &lt;a href="https://go.dev">go.dev&lt;/a>.&lt;/p>
&lt;p>Listen to the podcast at &lt;a href="https://changelog.com/gotime/115">https://changelog.com/gotime/115&lt;/a>&lt;/p>
&lt;h2 id="transcript">Transcript&lt;/h2>
&lt;p>&lt;strong>Mat Ryer:&lt;/strong> Hello, and welcome to GoTime! I&amp;rsquo;m Mat Ryer. Today we&amp;rsquo;re talking about Go.dev. It&amp;rsquo;s a user-friendly hub of curated resources for Go, and we&amp;rsquo;re lucky enough to have three of the brains behind it joining us today: Carmen Andoh, Steve Francia (also known as @spf13) and Julie Qiu. Hello, everybody!&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/grokking-go.dev-go-time-podcast/front.jpg" alt="Grokking Go.dev - Go Time Podcast"/><p>I had the privilage of joining my coworker Julie Qiu as we talked with our friends Carmen, Mat and Jon about the new website we are launching for Go,<a href="https://go.dev">go.dev</a>.</p><p>Listen to the podcast at<a href="https://changelog.com/gotime/115">https://changelog.com/gotime/115</a></p><h2 id="transcript">Transcript</h2><p><strong>Mat Ryer:</strong> Hello, and welcome to GoTime! I&rsquo;m Mat Ryer. Today we&rsquo;re talking about Go.dev. It&rsquo;s a user-friendly hub of curated resources for Go, and we&rsquo;re lucky enough to have three of the brains behind it joining us today: Carmen Andoh, Steve Francia (also known as @spf13) and Julie Qiu. Hello, everybody!</p><p><strong>Steve Francia:</strong> Hi!</p><p><strong>Julie Qiu:</strong> Hi!</p><p><strong>Mat Ryer:</strong> We&rsquo;re also joined by Jon Calhoun, a regular. Hi, Jon. How are you?</p><p><strong>Jon Calhoun:</strong> Hi, Mat. I&rsquo;m doing well.</p><p><strong>Mat Ryer:</strong> What&rsquo;s been going on?</p><p><strong>Jon Calhoun:</strong> Not too much.</p><p><strong>Mat Ryer:</strong> Okay, well let&rsquo;s get started. I wanna hear all about Go.dev, so who wants to give me an intro? What is it, and what&rsquo;s it for?</p><p><strong>Steve Francia:</strong> I can share that. It is a new official Go website for our Go community. It&rsquo;s intended to be a single destination, where the entire community can gather. Today it contains learning resources, it contains a package discovery or a module discovery component, and it also contains different resources to be able to help evangelize Go within your companies, or to new companies.</p><p><strong>Mat Ryer:</strong> And this is not gonna replace Golang.org, is it?</p><p><strong>Steve Francia:</strong> No.</p><p><strong>Mat Ryer:</strong> So they&rsquo;re gonna coexist, those two.</p><p><strong>Steve Francia:</strong> They&rsquo;re gonna coexist, yeah. That&rsquo;s right.</p><p><strong>Mat Ryer:</strong> And the difference then being, I guess, the Golang.org is the kind of open source home, it&rsquo;s the technical home of the project itself.</p><p><strong>Steve Francia:</strong> We struggled a lot&hellip; Creating two websites is not always the best thing. Two websites could create more confusion, and we initially started trying to expand Golang.org to contain all these things, and we really struggled with that because the intent of Golang.org - which if you don&rsquo;t know, actually gets distributed with the Go release; most of the content of Golang.org - is to be an official place for the Go project (the language, the compilers, the tools). And what we wanna do is expand it to be something that encompassed all of this stuff for the Go ecosystem.</p><p>Eventually, after a few months of trying to figure out how to shoehorn these competing goals into this existing site, we realized that maybe they&rsquo;re best as two separate sites. So the Golang.org is gonna remain the way it is, and the second site is really curated content that&rsquo;s created by the Go community and for the Go community.</p><p><strong>Mat Ryer:</strong> Right. So how did it get started then? Was this something that you internally saw that there was something missing, or was this something that the community asked for?</p><p><strong>Steve Francia:</strong> It&rsquo;s an interesting answer to that question, and I like the way you framed it.</p><p><strong>Mat Ryer:</strong> I&rsquo;ll be the judge of whether the answer is interesting or not, Steve, if you don&rsquo;t mind&hellip; [laughter]</p><p><strong>Steve Francia:</strong> So we actually started this project over four years ago.</p><p><strong>Mat Ryer:</strong> Really?</p><p><strong>Steve Francia:</strong> As a community member, I was talking to the Go leadership at Google about potentially joining, and it was in a new role that they&rsquo;d never really had someone do before&hellip; So as part of that, I wrote a document that was from my community member perspective of the things that were missing, that we needed to address. And if I was gonna join Google, I wanted to join to build those things.</p><p>And on that document, it had - and I&rsquo;ll read it to you - it was &ldquo;Provide educational resources for Go adoption and best practices, working with partners to create and provide the best training materials. Write the story of the value of Go and communicate that story broadly. Solve the problem of discoverability of libraries and packages.&rdquo;</p><p>The idea behind this wasn&rsquo;t necessarily one project at the time, but those were all things that started at that point, over four years ago. Fast-forward &ndash; and I&rsquo;ll also say, that document also had other things; the Go user surveys came out of that document, which we&rsquo;ve just finished doing our fourth one of those. Improved IDE experience, dependency management - those were all things in that document. If you look at the things the Go team has done for the past few years, a lot of them were in there.</p><p>So now we fast-forward to me joining Google&hellip; I worked with Russ and Samir to obtain the right staffing, by presenting these concepts to the Google leadership. And they did, they gave us the opportunity to expand the team, which led to hiring Carmen and Julie, who then did most of the heavy-lifting of bringing the project forward.</p><p><strong>Mat Ryer:</strong> Great. Well, thank you very much for doing all that excellent work. The thing you mentioned about package discovery is quite an interesting one, because for a while in the beginning of Go there weren&rsquo;t that many packages; over time, of course, it&rsquo;s grown, and so now people actually have a lot of different choices if they&rsquo;re gonna bring in some dependencies and things. And it is a little bit like the Wild West&hellip; So do you see this as being a way to tame that a little bit and find some of the more trustable open source packages out there?</p><p><strong>Steve Francia:</strong> This is not a Go problem. We think this is a modern software development problem. As you kind of get critical mass, the problem gets bigger, as you&rsquo;re saying&hellip; But it&rsquo;s a problem that every language is struggling with right now. Some to an extreme, and some &ndash; I think Go is actually on the smaller end of that. But we do see this as an opportunity to solve this problem for Go.</p><p><strong>Mat Ryer:</strong> And will it take into account things like if packages have stopped being maintained, or if they do things that are generally accepted to not be great patterns, and things like that? Is it gonna be opinionated in that way?</p><p><strong>Julie Qiu:</strong> Yeah, I definitely think it&rsquo;s something that we&rsquo;ve talked about and considered adding for the future. Right now, if you think about the Go ecosystem, the thing that&rsquo;s really out there is GoDoc.org, which provides package documentation&hellip; But it&rsquo;s missing a lot of this information about &ldquo;Is this package still being maintained? Is this something I actually wanna integrate into my site?&rdquo; So that&rsquo;s definitely part of what we wanna do, especially at<a href="https://pkg.go.dev/">pkg.go.dev</a>, now that it&rsquo;s launched, we&rsquo;ve laid the foundation&hellip; That&rsquo;s all stuff we&rsquo;re thinking about.</p><p><strong>Mat Ryer:</strong> Julie, you spoke at &ndash; I&rsquo;ve seen it a couple of times, actually&hellip; You do a talk about how to select good dependencies, and what to look for in things. Anyone interested in that should definitely have a search around. It&rsquo;s a great talk, and you talk about things like &ldquo;Are there tests in this package?&rdquo; What are some of the other things that are important when it comes to choosing dependencies, and why is that important?</p><p><strong>Julie Qiu:</strong> If I had to bucket it, I would say that the three main things to think about are popularity, quality and stability. By popularity, what we&rsquo;re really wondering is &ldquo;Are other people using this package?&rdquo; The reason that that&rsquo;s really important is because it essentially gives you a little bit of a heuristic of &ldquo;Are there other people out there that care about this?&rdquo;</p><p>Say the author suddenly decides that they don&rsquo;t really want anything to do with this package; what are the chances that someone else is gonna step up? What are the chances that they&rsquo;re gonna look for bugs? What are the chances that if I make a big part of my codebase depend on this, I can count on this being there in the future?</p><p>I think quality is things like &ldquo;Is it a well-documented package? Does the code have tests? Does it look essentially like idiomatic Go code to me?&rdquo; And you want that, because it gives you a sense of how familiar the package author is maybe with creating Go packages. And essentially what you&rsquo;re evaluating when you look at third-party packages - is this code that I actually wanna put into my codebase? So if, you know, on a Friday afternoon I&rsquo;m trying to deploy - which we all admit we do - you wanna know that you&rsquo;re not gonna suddenly look at code that looks like something you&rsquo;ve never seen before.</p><p>And then the third thing is essentially stability. Obviously, technology changes, the Go ecosystem changes, and so as things are changing, can I count on this author to think about where I am with my project? Something you don&rsquo;t wanna see is someone had an exported function in one version, and then all of a sudden in the next version it&rsquo;s not a major release, but that function got taken away&hellip; Because that is gonna create a lot of work for you as you are upgrading your codebase. That&rsquo;s how I would go about thinking about it.</p><p><strong>Jon Calhoun:</strong> One of our actual listeners had asked the question &ldquo;Will any of this data that you guys are using to figure out what packages are there - I&rsquo;m assuming you&rsquo;ll be gathering some data - be made publicly available?&rdquo; The specific question they were asking was &ldquo;When you&rsquo;re looking at packages, one of the ways you can tell if it&rsquo;s a good package to use is if bigger projects are using it. So if Docker is using a package, there&rsquo;s a good chance that they&rsquo;re gonna step up and make sure it doesn&rsquo;t die, whereas if it&rsquo;s a bunch of really small applications, then popularity there might not matter as much as one really big entity.&rdquo; If you&rsquo;re planning on exposing that sort of data and making it possible for people to explore what big projects are using these packages&hellip;</p><p><strong>Julie Qiu:</strong> It sounds like that information is &ndash; they&rsquo;re looking for what a package is importing, and then what a package is being imported by. All of that information actually is already available today on pkg.go.dev.</p><p>What you would do is for any package that you&rsquo;re interested, you can click on the Imports tab to see what other packages it&rsquo;s using; or on the flip side, you can look at the Imported By tab and see who else is using this.</p><p><strong>Mat Ryer:</strong> That&rsquo;s cool. And that&rsquo;s different to GoDoc, isn&rsquo;t it? That new pkg.go.dev.</p><p><strong>Julie Qiu:</strong> Mm-hm.</p><p><strong>Steve Francia:</strong> GoDoc is just documentation, and the intent for pkg.go.dev is to be much more encompassing of these more rich information around each package.</p><p><strong>Mat Ryer:</strong> Right, yeah.</p><p><strong>Julie Qiu:</strong> Yeah, there is some information about imports and importers on GoDoc.org, but our goal is to take this information and bucket it in a way that&rsquo;s something that people care about a lot more.</p><p>One thing that you might notice on the Imported By tab is that we tend to group the importers and count them depending on not just like &ndash; say Kubernetes has one package, and they&rsquo;re importing this one thing 1,000 times. We wanna be thoughtful about how much that weighs into the popularity of the package.</p><p><strong>Mat Ryer:</strong> Oh, I see. Can you explain that a bit more?</p><p><strong>Julie Qiu:</strong> Yeah. So if you think about it like &ldquo;Why do I care about popularity?&rdquo;, essentially what it&rsquo;s answering is telling me how many people have decided to use this package and integrate it into their codebase. One thing is that you might notice there&rsquo;s one repository - let&rsquo;s call it julieqiu.org/foo - and I have a million packages in there, and they&rsquo;re all importing this one package. So does this third-party package now have a million importers, or should it really have one importer? It&rsquo;s something that we don&rsquo;t actually quite have an answer to yet, but that&rsquo;s the kind of level that we wanna be thinking about it.</p><p>You can think about this in sort of like &ldquo;Maybe I&rsquo;ll count it as a million importers, but the way that users might wanna see it is that all of it is grouped under one thing&rdquo;, so that you can answer questions like &ldquo;Does one big organization use it, or does one really important module use it&rdquo;, without seeing just a giant list of things that essentially are all telling you the same thing.</p><p><strong>Mat Ryer:</strong> Right, that makes sense. Something else you mention in your talk, Julie, is about looking at dependencies for packages - how many dependencies another dependency has. So if you&rsquo;re gonna important a package - say you&rsquo;ve got two options. It might be sensible to choose the one that has fewer dependencies&hellip; But why really is that? Why do we care about that? Because it&rsquo;s not our problem, is it?</p><p><strong>Julie Qiu:</strong> Well, the funny thing is that a lot of times it feels like it isn&rsquo;t our problem, until it is. In my talk I gave this example about this package called pad-left; completely hypothetical package&hellip; [laughter] And it might be transitively depended on by millions of different packages. And you personally never end up using pad-left, but if it got deleted all of a sudden from the Go ecosystem and all that code disappeared and you can never find it again, it could actually end up breaking a lot of your stuff and then you now suddenly have to be like &ldquo;Oh no, how is this happening? I have to find the tree of things. I was depending on this&hellip;&rdquo; So it can cause you a lot of problems, even though on a day-to-day basis it might not seem like this is something that actually matters.</p><p>Obviously, getting deleted is a really bad situation, but there are also other things, like security vulnerabilities, or maybe licensing issues, and other things along those lines that you think a lot about when you&rsquo;re thinking about your own package, but you should really think about it with all of your dependencies, and your transitive dependencies as well.</p><p><strong>Steve Francia:</strong> I think there&rsquo;s an interesting thing here, too&hellip; We often reduce things to things that we currently have. The question you asked, Mat, was &ldquo;Is it better to have more dependencies or less?&rdquo; and there&rsquo;s not an answer to that question. It&rsquo;s really an &ldquo;It depends.&rdquo; If you have more dependencies, but they&rsquo;re stable and they&rsquo;re well-tested, and they&rsquo;re high-quality dependencies, I will take that every day over a fewer number of lower-quality, less stable dependencies.</p><p>So I think really the question is not &ldquo;How big is the dependency tree?&rdquo; but &ldquo;What is the quality of your dependency tree?&rdquo; And are we really evaluating &ndash; anytime you import a dependency, it really becomes a part of your project, and I don&rsquo;t think we really think about that as much as we should&hellip; That as soon as you do this, you&rsquo;re inviting that code into your home, and now you&rsquo;re responsible for it. So if you&rsquo;re gonna invite them in, you wanna make sure that that&rsquo;s something that you feel comfortable with.</p><p>So I don&rsquo;t think quantity is necessarily the right measurement of that. I think quality is really the right measurement, and then multiplied by quantity.</p><p><strong>Jon Calhoun:</strong> That&rsquo;s a good point, because the standard library really is just a set of third-party libraries, it&rsquo;s just one we know that is maintained at a very high standard&hellip; Whereas anything on GitHub or whatever - we don&rsquo;t know really know what their standards of quality are&hellip; So it&rsquo;s just kind of a gamble at that point. But if you know it&rsquo;s an organization that has those same levels of standards, then you can kind of import those with a lot more &ndash; you can import more of them without as much fear of something breaking.</p><p><strong>Mat Ryer:</strong> Yeah. This also helps package developers, if we think about what criteria people are gonna use, what they&rsquo;re gonna look for in packages&hellip; If someone out there wants to roll their own package for something, then there&rsquo;s kind of now a nice little &ndash; I mean, Julie, your talk is great for people that also want to do packages. There are some standards, there are some things that the community now is starting to expect&hellip; But I wonder, could this make it more difficult for new packages to emerge, if we start to really shine a light on the packages that are tried and tested? Can you see a world where we actually end up making it difficult for new packages to emerge, or is this sort of selection process gonna just be good for everybody?</p><p><strong>Steve Francia:</strong> I&rsquo;ll take that one. I&rsquo;ll start by saying, if a package solves the problem really well, then there isn&rsquo;t much of a need for another package. The standard library is a great model. When I first started learning Go, I looked at that as the pillar of excellence, and I tried to strive for that in the packages I wrote&hellip; And there&rsquo;s a reason there&rsquo;s not a lot of competitive string packages, because the Strings package does a really good job. But when there are ones, it&rsquo;s because they fill gaps that that package doesn&rsquo;t address.</p><p>So if a package is stable and well-tested, and does the job well, then we don&rsquo;t have a need for an alternative. We need an alternative when there might be a fundamental shift in design philosophy, or there&rsquo;s things that it doesn&rsquo;t accomplish, and that&rsquo;s a very natural thing that happens. We have a similar debate about companies; the larger a company is and the more established, does it stifle new companies being able to emerge?</p><p>There&rsquo;s a big political and philosophical debate around that, but the reality is that over time we&rsquo;ve seen that startups do emerge, and they&rsquo;re there to fill gaps, and the larger a company is, and I will translate to packages or libraries - the more established it is, the less it has a chance to migrate and move, and it can&rsquo;t adapt to maybe new requirements that come through&hellip; So when the requirements change, which over time requirements always do, it really opens the door for new packages to emerge and do that. I think it&rsquo;s a very healthy thing for an ecosystem to have.</p><p><strong>Jon Calhoun:</strong> I think the JSON package is a good example of this, where the one in the standard library is great, but there have been ones that emerged that sort of solved a slightly different problem. If you don&rsquo;t wanna build a struct to get something that&rsquo;s like six levels nested, there&rsquo;s a couple packages out there that make it really easy to dive six levels in and get one specific piece of information and that&rsquo;s it, from the JSON. And there&rsquo;s other ones that maybe they try to be faster&hellip; There&rsquo;s different goals, depending on what you&rsquo;re looking for, and even though you think &ldquo;Oh, the standard library has it. Nobody&rsquo;s ever gonna compete with that&rdquo;, the truth is people do compete with them because there&rsquo;s specific goals that they&rsquo;re going for.</p><p>And even if you look at front-end frameworks for JavaScript, you&rsquo;d think at some point one of them would have just won out and everybody would have stopped&hellip; But they all solve different goals, and if something comes along and it&rsquo;s unique enough and solves a different enough problem, I think we see that that tends to happen, it still tends to get some traction and move up.</p><p><strong>Break:</strong> [19:59]</p><p><strong>Mat Ryer:</strong> The Context package, when that happened - that was kind of one of those shifts you talked about, Steve, where suddenly now people expected to be able to cancel things that they couldn&rsquo;t cancel before&hellip; For example like copying. Is there a context-aware copy operation in the standard library? If you do io.Copy(), it just copies the whole thing until the end of the file, right? Is there a cancelable one, or do you have to write that on your own?</p><p><strong>Steve Francia:</strong> I am not aware of it in the standard library.</p><p><strong>Mat Ryer:</strong> So use cases like that are &ndash; there&rsquo;s still plenty of opportunity for anyone really to contribute, that&rsquo;s the thing&hellip; So I&rsquo;d hate for people to be put off because standards are going up; that doesn&rsquo;t mean you can&rsquo;t contribute something&hellip; And especially like &ndash; Steve, your point about &ldquo;find the thing that isn&rsquo;t already solved, and that&rsquo;s where you can innovate.&rdquo; I think that&rsquo;s great, and I agree that raising the standards is only gonna be good for &ndash; for most people it&rsquo;s gonna be great, because that is what we care about; we do care about good dependencies that we can rely on, and that are gonna stick around.</p><p><strong>Jon Calhoun:</strong> One of the goals you guys had mentioned was helping companies understand what other people are doing with Go, and I guess learning from that, deciding whether or not to adopt it. I guess this is something that a lot of us probably don&rsquo;t see; at least me, because while I want people do adopt Go, I don&rsquo;t generally go out and talk to big companies and say &ldquo;Here&rsquo;s why you should use it.&rdquo; So is that something that the Go team is actively pushing? Is that a big goal, to make it easier for people to understand that? Can you elaborate on what people are looking for, how you can help them? And if somebody is looking to maybe talk their company into using Go, what you&rsquo;d recommend?</p><p><strong>Steve Francia:</strong> We&rsquo;ve spent a lot of time meeting with different companies, trying to understand what their needs are and what they&rsquo;re struggling with. I&rsquo;ll also say, one of our big goals as the Go team is adoption. We want Go to be used as widely as possible. And as part of the adoption journey, which we&rsquo;re all familiar with that graph that starts slowly, and then there&rsquo;s a chasm, which is early adopters, and then there&rsquo;s the big chasm at the end of that, which is kind of mainstream&hellip; There&rsquo;s different stages to it. And as a language growth, the enterprise is really that next big-cap for Go to be able to tap into adoption more.</p><p>We really got lots of adoption on startups and hobbyist very early, and so we recognize that the enterprise is important to get Go adoption to really fulfill its potential. As part of that we&rsquo;re doing lots of research, and we&rsquo;ve been talking to lots of companies, from all different walks - from retailers, to banks, to multimedia companies&hellip; From every different style of company and in lots of different continents.</p><p>And through those conversations we&rsquo;ve heard two things that almost every company asked us, two questions almost every company asked. These are companies that are either thinking about using Go, or they&rsquo;ve done a prototype with Go, or they&rsquo;ve adopted it for some projects&hellip; So the two questions that everybody asked was &ldquo;Who else is using Go?&rdquo; and &ldquo;What are they using it for?&rdquo; As we talked to them, we heard lots of different stories which really got us excited. They talked about prototypes that they wrote in Go, and because they tried to talk to their management about it, they had challenges, and they thought Go would be a good solution for those, their leadership, the technical decision-makers wanted to know &ldquo;Well, who else is doing this, and what are they doing with Go?&rdquo; and they didn&rsquo;t have good answers to those questions.</p><p>So a lot of those stories stop there. But some of those stories continued, and we had people that felt confident enough that it was a good decision that they kind of went rogue, and they built a prototype in Go, and it ended up being phenomenally successful.</p><p>So those pioneers in those companies really provide the things that they wanted before, which were these stories&hellip; So we&rsquo;re really happy that we&rsquo;re able to tell some of these stories. We&rsquo;ve been working with these companies for many months to be able to capture these stories that they shared with us, and make them publicly available, and share them broadly. And hopefully, the next round of people answers to those questions, so that when they wanna go to their leadership and answer these questions &ldquo;Who else is using it? What are they using it for? Are they in our demographic of company or vertical of company?&rdquo; they&rsquo;ll have answers to those questions.</p><p>It wasn&rsquo;t just in these internal meetings, we also did different surveys, and this was one of the top things that people asked for in our surveys. Now, if you&rsquo;re coming from a small company or you might be an individual consultant, this probably sounds foreign to you. But if you&rsquo;re working at a big company&hellip; You know, on our website we&rsquo;ve launched several case studies from big companies: American Express, PayPal, MercadoLibre&hellip; You can go on the website and see them all there. These are larger companies that have more hoops to jump through, more permissions to obtain, and this was an overwhelming thing that they&rsquo;ve been asking for.</p><p><strong>Mat Ryer:</strong> Yeah. It&rsquo;s interesting, if you go to Go.dev, there are a lot of logos, but they&rsquo;re not just &ndash; sometimes you see these on websites and you feel like they&rsquo;re sort of brags, or something&hellip; But these are actually &ndash; you can click these and go and read about the actual ways in which people have used it, and what they&rsquo;re doing there, too.</p><p><strong>Carmen Andoh:</strong> You sure can.</p><p><strong>Mat Ryer:</strong> You can, you can.</p><p><strong>Steve Francia:</strong> You definitely can.</p><p><strong>Carmen Andoh:</strong> Yup.</p><p><strong>Steve Francia:</strong> I think they&rsquo;re very relatable stories, and I think they&rsquo;re very inspiring. As you click through and read these articles and these different stories&hellip; I remember back &ndash; I first adopted Go when I was working at MongoDB, very early on. And there was not a lot of these stories that existed yet, but in using it I fell in love with it. It lit a spark, and showed me potential of what a programming language could be&hellip; Which led me to work at Docker, which was a big Go user, and then eventually on the Go team at Google.</p><p>These stories shared a similar thing. If you&rsquo;ve been using Go a while, read them; it&rsquo;ll remind you why. It&rsquo;ll take you back to that moment when you had the first a-ha and fell in love with the language.</p><p><strong>Carmen Andoh:</strong> But the other thing that I wanted to point out about these case studies that I think are really useful is when I learn how to code, I am not taught how to influence my manager, or influence my higher-ups on choosing Go. That&rsquo;s just not something that they teach you in school&hellip; And this is just the perfect thing that I can point to people, saying &ldquo;I wanna choose this technology, and here&rsquo;s why.&rdquo;</p><p>I think so many people, when I had been in contact with them over the years, like &ldquo;How can I convince my manager?&rdquo; or &ldquo;How can I convince my CTO?&rdquo; or whoever in the organization, to use Go. Certainly, there&rsquo;s the rogue tactic that Steve mentioned, but this now doesn&rsquo;t &ndash; you don&rsquo;t have to worry about going rogue, or taking yourself out of the critical path in order to get it adopted. You can simply go &ldquo;Here, read the testimonials&rdquo; and then make a commitment to trying maybe one service at a time, or refactoring one corner of your codebase here and there.</p><p>And what&rsquo;s great about these is that some of them are more detailed than others, and they can give you a blueprint for how you might wanna do it, to certain extents&hellip; Whether you wanna go whole hog with Go, or whether you wanna maybe just instrument some of your observability toolset with Go, or you wanna do some of your automation.</p><p>So I really, really liked that, and I tell people now that certainly learning how to influence is a vital skill that they don&rsquo;t teach in school, but this is super-helpful.</p><p><strong>Mat Ryer:</strong> Yeah, I spoke to somebody at the last London Go meetup who &ndash; they were reluctant, because learning a new language sounds like quite a bit thing, especially for people that maybe only know one language; that was this case. But learning Go, especially if you are already familiar with the kind of C base language. Learning Go I think is easier than some other languages, actually, because of its minimalist nature&hellip; So I always kind of encourage that.</p><p>And I also like this idea of using it to solve a real problem you have, even if you&rsquo;re not 100% certain of what it&rsquo;s gonna turn out like. When you learn the context that you have, when you&rsquo;re trying to learn something, if you&rsquo;ve got context around a real problem you&rsquo;re trying to solve, it really focuses the mind. You don&rsquo;t go down the rabbit holes learning the details of how channels work, or how to do struct packing for optimum memory use. You focus really on the bits that are important in your case&hellip; And that was what this person was telling me - their experience. They were surprised how easy it was to pick up and to apply when solving some little problem they had. And I think it was a tiny little problem, but they loved that experience, and then they did a presentation to the rest of the people - anyone that would listen, really - in the company, to show it off. That&rsquo;s quite a nice way to also evangelize for it, too.</p><p><strong>Carmen Andoh:</strong> And to add further to that context, I also like the idea &ndash; when we talk about adoption, there are different mindsets, depending on where you&rsquo;re at within your company and where that company is at. Sometimes what I often heard was &ldquo;I don&rsquo;t wanna just learn about theory&rdquo; or &ldquo;I wanna see what it looks like in practice, from soup to nuts.&rdquo; And I think that&rsquo;s the other thing that these case studies also &ndash; they have some level of detail that can tell you, hold your hand from end-to-end.</p><p>Some people like to just go around and play and find what works for them, but others just need to see what it looks like in practice, and see how that matured over time. I think the case studies is one of my favorite pieces. Well, I like the whole site, but I really sing the case studies praises, for lots of reasons.</p><p><strong>Steve Francia:</strong> Moving forward with these case studies - we launched with a handful of case studies and articles that were published on external websites as well, and we&rsquo;re excited to tell these stories more; to tell additional stories, to tell deeper stories, and we&rsquo;re hoping that some of the listeners today are from companies that wanna show these stories. We&rsquo;ll give two pieces of advice for that.</p><p>One is you don&rsquo;t need us to tell the story. A lot of these companies, like Capital One, published several stories on their own blog about their journey to using Go. And we link to them here. So feel free to tell your own story; we&rsquo;d love to link to it and give more exposure to it. Also, we&rsquo;re happy to meet with you and to learn more about your experience and your story, and the best way to get in touch with us is if you go to Go.dev, on the very bottom, in the footer, there&rsquo;s a Share Feedback link. Please fill out that link and tell us if you&rsquo;re interested in working with us on a case study, or writing an article.</p><p>The most important thing - that&rsquo;s an anonymous button, so if you want us to actually get a hold of you, you have to put some identifying information in there, so that we have a way to reach back out to you, or else [unintelligible 00:35:24.27] Which we&rsquo;ve had a few companies do. &ldquo;Oh, we&rsquo;re really interested in the case study, and doing something&rdquo; and then Submit.</p><p><strong>Mat Ryer:</strong> Okay&hellip; [laughs] So put your name and email in, or something.</p><p><strong>Steve Francia:</strong> Do it someway.</p><p><strong>Julie Qiu:</strong> And also, if you wanna just send us a non-confidential email, you can feel free to email<a href="mailto:go-discovery-feedback@google.com">go-discovery-feedback@google.com</a>. In case you can&rsquo;t remember all of this, we have an About page on Go.dev. Go.dev/about has all of this information.</p><p><strong>Mat Ryer:</strong> Thank you. We&rsquo;ll also put some information in the show notes, too.</p><p>Will you have videos on there, and talks, and things from conferences, do you think?</p><p><strong>Steve Francia:</strong> As we said in our blog post when we launched this - it was really us getting what we felt was like a minimum viable product out to the community, as early as possible. You&rsquo;ll notice on the website we say it&rsquo;s for the Go ecosystem, by the Go ecosystem, but it doesn&rsquo;t have a ton of community resources on there yet. There is intent to add those items and to make it more of a place where the whole community can come together and learn more about conferences, and meetups, and talks, and really be a resource for them.</p><p><strong>Mat Ryer:</strong> There&rsquo;s an Event section on the homepage, isn&rsquo;t there?</p><p><strong>Steve Francia:</strong> Yeah. And it only gives you those three events&hellip; And I think they&rsquo;re only meetups. It&rsquo;s not conferences yet. So it&rsquo;s a start, and we&rsquo;re really happy that it&rsquo;s there, but we have so many meetups around the world that &ndash; if you look on it today, it says January 11th, it has three meetups, but there are actually more than three meetups on January 11th. So it does give a taste to it, but we really wanna expand that further and really make it so that whether you&rsquo;re in Melbourne, or Bangalore, or Eugen, Oregon - which happen to be the three on the website today - or anywhere else in the world, it&rsquo;s gonna give you when your upcoming thing is, when call for papers or participation is due etc.</p><p><strong>Mat Ryer:</strong> Yeah, that&rsquo;s great. That&rsquo;s gonna be really great to have that, because it&rsquo;s difficult even for those of us that have been in the community for a while to know what&rsquo;s going on. I think it&rsquo;s not just gonna be a good resource for new people; I think for everybody.</p><p><strong>Steve Francia:</strong> It&rsquo;s also partly solving the problem that kind of crept up on us&hellip; If we look back two years, there was &ndash; I don&rsquo;t remember the exact number, but around a dozen (maybe a little more) Go conferences. And this year, in 2020, there&rsquo;s scheduled to be over 30 conferences throughout the year. That&rsquo;s three a month. That&rsquo;s pretty overwhelming. That means there&rsquo;ll be more weeks with conferences than not this year. So with all of the excitement that&rsquo;s happening around the community, it&rsquo;s really helpful to have a place that organizes and gathers that.</p><p>We&rsquo;re not gonna have that delivered in the next month or two, but it is on our roadmap and it&rsquo;s things that we&rsquo;re intending to do.</p><p><strong>Jon Calhoun:</strong> One of the questions that I&rsquo;ve seen people ask a lot, either on Twitter, or even on our GoTimeFM Slack - this is sort of intended to eventually be a resource for the community, so they&rsquo;re all asking &ldquo;Are there plans to make it open source, or to give the community a bigger role in the project?&rdquo; I get early on it&rsquo;s usually easier to not do that with a lot of things, but I didn&rsquo;t know if you could share plans for the future with that sort of thing.</p><p><strong>Steve Francia:</strong> It&rsquo;s something we&rsquo;re looking into. We definitely wanna make sure that whatever we do, it&rsquo;s the best thing for the community and our users, and serves their needs the best way. We&rsquo;re trying to make sure that we&rsquo;re doing that in the best way possible. So there&rsquo;s ongoing discussion; it&rsquo;s actually part of our Go developer survey, we ask specific questions around this&hellip; So we&rsquo;re ongoing doing research to try to better understand our users&rsquo; needs, and making sure that we&rsquo;re satisfying them as best as possible.</p><p><strong>Julie Qiu:</strong> Yeah, and something that we also are planning on doing pretty soon is opening up the Go issue tracker to accepting feedback. We already described that we have two different channels to get feedback - the email, and also sharing feedback in the footer, but obviously, these are all private topics, and we&rsquo;ve heard everyone sort of saying they wanted a more public forum to be able to have discussions&hellip; So we&rsquo;re actually working on a process for that, and are gonna be sharing that pretty soon. That&rsquo;s another way that we really wanna be clear that we want people to share their feedback of us, like this is something that we wanna build for the Go ecosystem.</p><p><strong>Mat Ryer:</strong> That&rsquo;s great. In your pkg.go.dev, how do you decide what&rsquo;s a popular package, and how do you decide which packages you&rsquo;re gonna feature on there?</p><p><strong>Steve Francia:</strong> So you&rsquo;re saying on specifically that page&hellip;</p><p><strong>Mat Ryer:</strong> Yes. Because that&rsquo;s gonna be essentially &ndash; I mean, packages listed there are gonna be the ones people are using probably, right? &hellip;eventually, if not already.</p><p><strong>Steve Francia:</strong> We hope so. To some degree, they&rsquo;re already packages people are using quite often. That&rsquo;s why they&rsquo;re there.</p><p><strong>Mat Ryer:</strong> That&rsquo;s why they&rsquo;re called &ldquo;Popular Packages&rdquo;, is it?</p><p><strong>Steve Francia:</strong> Yeah, that&rsquo;s how we got the name. That&rsquo;s how we came up with it.</p><p><strong>Mat Ryer:</strong> It makes sense.</p><p><strong>Steve Francia:</strong> Believe it or not, there were several meetings to &ndash; no, I&rsquo;m just kidding. We just did that.</p><p><strong>Mat Ryer:</strong> [laughs]</p><p><strong>Steve Francia:</strong> So Featured Packages is a little bit of a curated one. They&rsquo;re largely popular packages as well, but they&rsquo;re ones that we thought fit a niche, or address needs that people were looking for&hellip; And then Popular Packages is just the popular packages from the database, based on import count.</p><p><strong>Jon Calhoun:</strong> When you&rsquo;re looking at those curated lists, I know there&rsquo;s always these &ndash; they&rsquo;re like Awesome Go, or Awesome&hellip; You&rsquo;ll see different lists like that on GitHub, that list a bunch of packages grouped by what they&rsquo;re for. Some will be graphical user interfaces, others will be like database packages&hellip; And generally speaking, they do a little bit of curation, but I feel like sometimes they just throw anything and everything in there.</p><p>I guess one of the questions I&rsquo;d ask is how do you guys draw that line between &ndash; you know, you don&rsquo;t wanna reject people or be a gatekeeper, but at the same time you need to&hellip; Like, just having everything listed in one place isn&rsquo;t necessarily useful&hellip; You know, just listing every single package that can connect to a database or something might just be overwhelming to users. So how do you navigate that middle ground?</p><p><strong>Steve Francia:</strong> If we look back to the beginning of search engines, the early days of the internet, early &rsquo;90s, mid-&rsquo;90s, you might recall that Yahoo! was one of the leading at the time, and they did it by doing the website directory, that was human-curated. And it worked well for a time. In fact, the reason everyone else struggled is you couldn&rsquo;t really compete with the quality of that.</p><p>Then Altavista came out. And Altavista had accuracy and quality, and it was fast. Well, it was fast&hellip; It was fast until people started using it; there was a time when it was blazing fast, and everyone was excited&hellip;</p><p><strong>Mat Ryer:</strong> Yeah, but Steve, all software is fast until people start using it. It&rsquo;s the people using it that ruins it. That&rsquo;s why we have to care about making things work&hellip;</p><p><strong>Steve Francia:</strong> Well, then Google came around and figured out how to solve that problem too, of making it fast, and quality, and accurate. But I think there&rsquo;s a lot to learn from that experience.</p><p>Awesome Go was and is still a great resource, but at the beginning, when packages were smaller, and there was less of a list, I think it was easier to maintain it and to keep track of it. As that list grows, it&rsquo;s harder and harder for humans to keep on top of it. So what Julie talked about earlier was these signals, these visual indicators on packages &ndash; I think the solution here is not to maintain manual lists, but really to have dynamic things.</p><p>If you&rsquo;re searching for &ndash; you know, sometimes you&rsquo;re searching for things that Awesome Go curated predefined categories, but sometimes you&rsquo;re searching for things that aren&rsquo;t in those predefined categories. And no matter what you&rsquo;re searching for, you really want to know quality&hellip; And I think it comes back to those indicators, to really help us. That&rsquo;s the discovery portion of the site, that is still ongoing, that we&rsquo;re working on.</p><p><strong>Mat Ryer:</strong> I once wrote a blog post and made a little repo alongside it to show the code&hellip; And I made some changes to it at some point a couple years later, and I started getting people opening issues, saying &ldquo;You broke our build.&rdquo; This was just a repo to show off some ideas, it wasn&rsquo;t ever meant to be imported by anybody, so I was shocked that that happened. Is there a way that package writers and package authors and maintainers can indicate to the tools Go.dev and to pkg.go.dev - is there a way that we can indicate that these things are deprecated, or perhaps shouldn&rsquo;t be imported, or even to say &ldquo;If you wanna solve this problem, there&rsquo;s a better package over here, so go and use that one&rdquo;?</p><p><strong>Julie Qiu:</strong> I think to indicate that something isn&rsquo;t working anymore, you can email us. We&rsquo;ve gotten requests for people to take down their packages from pkg.go.dev. So that&rsquo;s something that we do support doing.</p><p>I think in the future &ndash; some things that we&rsquo;ve been discussing are like, say when someone archives their repository, for example, or deletes their repository, even if we might have the code for that to provide some kind of flag, so that people know about it.</p><p>We don&rsquo;t currently have anything right now on the side for authors to say &ldquo;You should use this package instead.&rdquo; I think that that feature would require some sort of thought about what that user experience would actually look like, or if that&rsquo;s something that we even want people to be able to do&hellip; So those are kind of the avenues right now.</p><p><strong>Mat Ryer:</strong> Yeah. I mean, I would imagine something like a .go.dev file in the repo root, or something, where it could potentially have some metadata in there where we could communicate that. There are a few examples of that working quite well, where the tooling can notice those things. It&rsquo;s probably just that - a few things like &ldquo;Check out this package, these alternatives&hellip;&rdquo; Because even though it might be nice for my ego that people are using some package I&rsquo;ve written, if for whatever reason there are better packages, which believe it or not, does happen, I just want people to use those packages. I don&rsquo;t want them to just use mine for the sake of it. So I would be happy to go and put a bit of effort in if that meant that the whole experience quality goes up for everybody.</p><p><strong>Julie Qiu:</strong> Yeah, I think we&rsquo;ve also discussed very early on during the brainstorming phase about other types of metadata that would help with that problem, too. For example, keywords would be great. If you could tag this package as like &ldquo;It&rsquo;s a logging package&rdquo;, and so maybe that&rsquo;s what your package is, and that way you don&rsquo;t have to say &ldquo;This is exactly the package you&rsquo;re looking for&rdquo;, but you can just have keywords for people to look in the ecosystem&hellip; But these are all things we&rsquo;ve been thinking about and are still brainstorming about, and don&rsquo;t quite know what it will look like yet.</p><p><strong>Mat Ryer:</strong> Cool. No, but it&rsquo;s exciting though.</p><p><strong>Julie Qiu:</strong> Yeah. There&rsquo;s a lot of cool places that we can go.</p><p><strong>Jon Calhoun:</strong> It sounds like the experience you&rsquo;ve described, Mat &ndash; it&rsquo;s one I&rsquo;m familiar with too, where you&rsquo;re kind of doing educational material, and you want them to have something that compiles and runs, but at the same time by making it something that compiles and runs, it also means somebody can import it and use it, and it&rsquo;s like &ldquo;Well, this was clearly meant to teach, not to necessarily be the thing that does that.&rdquo; So you might show somebody how to make an HTTP router, but that doesn&rsquo;t mean that they should go use that one. There&rsquo;s some way more stable ones out there that you should check out. So that becomes a little bit trickier, but&hellip; Maybe just having a way of tagging things is like &ldquo;This is a learning resource, rather than something else that could actually help with that.&rdquo;</p><p><strong>Steve Francia:</strong> For this specific one &ndash; I think you bring up a good example of different needs that we might have, that expand beyond just the static metadata, of like readme and license files that we currently use. For this specific one, if you don&rsquo;t want someone to import it, change the license to something that is dot-something-that&rsquo;s-very-importable. It might be a solution to this specific problem.</p><p><strong>Mat Ryer:</strong> But the tools won&rsquo;t guard against that, will they? &hellip;assuming that everyone checks their license before they import a package&hellip;</p><p><strong>Jon Calhoun:</strong> The other issue I have with that is let&rsquo;s say I&rsquo;m teaching somebody how to do something&hellip; A lot of the times I want them to have the freedom to take chunks of that code and use it. And if I say &ldquo;This is some really restricted license&rdquo;, then all of a sudden they&rsquo;re like &ldquo;Well, I can&rsquo;t use what I learned here without fearing that I&rsquo;m gonna get sued later for using this code.&rdquo; And you kind of have to worry about that, where I know most instructors or people who do educational stuff basically just open source everything with an MIT license, because they don&rsquo;t want people to feel like everything they learned is something that they&rsquo;re worried about using that code.</p><p><strong>Mat Ryer:</strong> Yeah. On the other hand, Jon, you&rsquo;ve just thought up an excellent scam.</p><p><strong>Carmen Andoh:</strong> Don&rsquo;t give ideas.</p><p><strong>Mat Ryer:</strong> [laughs]</p><p><strong>Steve Francia:</strong> So the license question - I give that answer mostly tongue-in-cheek, because I think everything you said, Jon, is right. But we&rsquo;ve heard from a lot of &ndash; while maybe not every individual is doing this, companies are very concerned with this. License compliance is a huge deal, because it can really get you into a lot of hot water. Every company and individual should be concerned with it, but the larger the company is, the bigger the defensive legal staff needs to be, and the more concerned they are with this. All of the Go tooling certainly doesn&rsquo;t do this today, but we did build in more license awareness into Go.dev.</p><p><strong>Mat Ryer:</strong> Yeah, it reports the licensing on all the packages, doesn&rsquo;t it? And does it exclude things where you don&rsquo;t recognize the license?</p><p><strong>Julie Qiu:</strong> Yeah, so it excludes certain content, but not exactly the repository itself. So the way that we make that distinction is based off of whether or not it&rsquo;s factual information about this repository, as opposed to content that we are taking and editing in some way. For example, what that package imports is not something that we would exclude, or something that imports it&hellip; Because that&rsquo;s just factual information about it. Or the last time it was released. But things like its readme, and its documentation are things that we consider content that we are not able to redistribute.</p><p>If you look on pkg.go.dev and you&rsquo;re thinking about whether or not you should use a package, and you go to the documentation page and we don&rsquo;t think that its license is something that is redistributable, it will become really obvious really quickly.</p><p><strong>Mat Ryer:</strong> So therefore on the other hand if you do want things including, then pick a license that is gonna allow this.</p><p><strong>Julie Qiu:</strong> Yeah. That&rsquo;s something that we had gotten a lot of feedback about right after launch, because our license policy had been a bit strict&hellip; And also, I think we haven&rsquo;t provided a lot of information about exactly what information you need for your license&hellip; But we actually updated our license policy very recently. So if that&rsquo;s something that you want us to know more information about, we&rsquo;ve shared that we do license detection by using the license check library, and also a list of licenses and a copy of that content in case you wanted to pick one of the ones that would just fit on the site.</p><p><strong>Mat Ryer:</strong> Great, yeah. There is actually a Go tool - because I&rsquo;ve used it - which will check the licenses of all your repos as well. So I&rsquo;ll dig that out and put it in the show notes too, because that can be quite useful. And it&rsquo;s actually worth bearing in mind from the beginning, because it&rsquo;s all very well &ndash; usually, what happens is you build the thing, you get it working, and then towards the end of the process someone from the legal team will say &ldquo;Oh, just make sure the licenses make this all okay.&rdquo; And then if it doesn&rsquo;t, you kind of get yourself into a little bit of trouble&hellip; Or at least there&rsquo;s work to do to go and either find an alternative, or you sometimes have to rewrite the little bits and pieces yourself. So yeah, it is worth checking the license, as Steve was alluding to earlier. Check the license before you import.</p><p><strong>Jon Calhoun:</strong> I&rsquo;m surprised somebody hasn&rsquo;t come up with something like goreturns, that you can customize for each company, that basically just does that when you&rsquo;re saving&hellip; Because every company has a different set of policies around what they&rsquo;ll allow, and it would be kind of nice to just have your code flag it as like &ldquo;Hey, you can&rsquo;t import this. It&rsquo;s not gonna work.&rdquo;</p><p><strong>Mat Ryer:</strong> Like a compiler-time error.</p><p><strong>Jon Calhoun:</strong> Yeah. Because if you just had something, it would just build it into that; it&rsquo;d be kind of nice to have.</p><p><strong>Mat Ryer:</strong> Hm. Nice idea.</p><p><strong>Carmen Andoh:</strong> That sounds like a slick idea, for sure&hellip; Especially now, with software engineering in this day and age, and all this reuse, and the risks that carry with that.</p><p><strong>Jon Calhoun:</strong> Generally, I think people look on GitHub and they think &ldquo;Oh, it&rsquo;s open source&rdquo;, but that doesn&rsquo;t necessarily &ndash; people don&rsquo;t always put licenses there, and something being open source doesn&rsquo;t necessarily mean you can use it for what you wanna use it, especially if it&rsquo;s commercial.</p><p><strong>Carmen Andoh:</strong> Right. And the average software developer is not a lawyer&hellip; So they&rsquo;re just pulling it in, saying &ldquo;Hey, let&rsquo;s see if it works.&rdquo; Yeah&hellip; [laughs]</p><p><strong>Jon Calhoun:</strong> I&rsquo;m sometimes not even sure if the lawyers know for sure.</p><p><strong>Carmen Andoh:</strong> That&rsquo;s accurately stating the state of affairs in this day and age.</p><p><strong>Mat Ryer:</strong> What language is Go.dev written in? I caution you to be very careful here&hellip;</p><p><strong>Steve Francia:</strong> Elixir.</p><p><strong>Carmen Andoh:</strong> [laughs] Steve&hellip;!</p><p><strong>Steve Francia:</strong> What? Oh, are we not saying that?</p><p><strong>Carmen Andoh:</strong> Redact&hellip; Redact&hellip;! No&hellip; Troll.</p><p><strong>Julie Qiu:</strong> It&rsquo;s Ruby on Rails.</p><p><strong>Carmen Andoh:</strong> [laughs] I thought it was Haskell&hellip; It was Haskell, right?! [laughter]</p><p><strong>Mat Ryer:</strong> So what&rsquo;s the real answer?</p><p><strong>Julie Qiu:</strong> It&rsquo;s Go.</p><p><strong>Mat Ryer:</strong> It&rsquo;s Go! We&rsquo;ll play some celebratory music there.</p><p><strong>Carmen Andoh:</strong> Of course it&rsquo;s Go!</p><p><strong>Jon Calhoun:</strong> Can you talk about more of the technology? Is it an API, or are you using templates on the back-end? Can you talk a little bit about what you&rsquo;re using to build it all?</p><p><strong>Julie Qiu:</strong> Yeah, so the entire back-end is written in Go, and then the front-end is just all Go templates. The majority of it is HTML and CSS. I think for a really long time we had absolutely no JavaScript. And even now, it&rsquo;s pretty limited.</p><p>Then the site itself is hosted on the Google Cloud Platform. The high-level architecture is we have a system that we call our data ingestion system, which essentially extracts data from the module mirror, and then transforms it, and then puts it into a Postgres database, which is hosted on Google Cloud SQL. Then the front-end - we also just have a service that is pulling data out of this Postgres database, serving requests&hellip; We have Redis, which we use for caching, and&hellip; Yeah, that&rsquo;s a pretty high-level overview of it.</p><p><strong>Mat Ryer:</strong> Is it Google App Engine, or&hellip;?</p><p><strong>Julie Qiu:</strong> It is, yeah.</p><p><strong>Mat Ryer:</strong> Yeah. I use App Engine all the time, I love it.</p><p><strong>Julie Qiu:</strong> It&rsquo;s very easy for deploying and scaling and all of that&hellip; So it&rsquo;s been kind of nice, especially given that we had a small engineering team working on it.</p><p><strong>Mat Ryer:</strong> Yeah. And it will scale significantly as well, won&rsquo;t it? That&rsquo;s something that&rsquo;s nice, especially when you&rsquo;re not really into the operational side of things. You can sort of not worry about it, so yeah, I&rsquo;m all over that&hellip; It sounds great to hear.</p><p><strong>Break:</strong> [54:53]</p><p><strong>Mat Ryer:</strong> So, actually we have a new regular part of our show, and it&rsquo;s gonna get its own jingle as well&hellip; It&rsquo;s Unpopular Opinion.</p><p><strong>Jingle:</strong> [56:20]</p><p><strong>Mat Ryer:</strong> So we&rsquo;re gonna ask &ldquo;Do you have an unpopular opinion that you&rsquo;d like to share?&rdquo; Anyone?</p><p><strong>Julie Qiu:</strong> I can start&hellip;</p><p><strong>Mat Ryer:</strong> Please.</p><p><strong>Julie Qiu:</strong> This just comes to mind, because people on the Go team make fun of me for this a lot, but&hellip; My unpopular opinion is that the New York City buses are the best way to commute across Manhattan.</p><p><strong>Mat Ryer:</strong> Oh, that does sound controversial.</p><p><strong>Carmen Andoh:</strong> Better than cabs, better than subway. Take the busses.</p><p><strong>Julie Qiu:</strong> It&rsquo;s so great!</p><p><strong>Mat Ryer:</strong> Really?</p><p><strong>Julie Qiu:</strong> Yeah. It&rsquo;s basically an Uber Black car. It&rsquo;s like a giant car, it&rsquo;s come here, it&rsquo;s picked you up, it&rsquo;s got Wi-Fi, it&rsquo;s got views&hellip;</p><p><strong>Carmen Andoh:</strong> [laughs] We&rsquo;re waiting for New York City mass transit to disrupt&hellip;</p><p><strong>Julie Qiu:</strong> There are new seats on the M14 now&hellip;</p><p><strong>Mat Ryer:</strong> You&rsquo;re joking!</p><p><strong>Carmen Andoh:</strong> Nice.</p><p><strong>Julie Qiu:</strong> It&rsquo;s so great!</p><p><strong>Mat Ryer:</strong> That&rsquo;s a great one. Steve, do you have one?</p><p><strong>Steve Francia:</strong> My unpopular opinion is that I think Windows is the best operating system&hellip; And it was proven unpopular in preparing for this podcast. [laughter]</p><p><strong>Jon Calhoun:</strong> So for anybody who isn&rsquo;t familiar, when we do these episodes, every guest records their own audio, just so we have a little bit better quality&hellip; And I think Steve is our first guest with Windows &ndash; or at least our first guest with Windows who made me help him set up the recording, so I didn&rsquo;t know how to do it, and had to figure that out.</p><p><strong>Mat Ryer:</strong> Steve&rsquo;s the first modern-day programmer I&rsquo;ve ever met that uses Windows, actually&hellip; So Steve, yes, that is an unpopular opinion.</p><p><strong>Steve Francia:</strong> I use the other operating systems, too. I&rsquo;m not exclusive to Windows. But I really like Windows 10, I think they&rsquo;ve done a really good job with it. I like Windows Subsystem for Linux, and I&rsquo;ve got Bash in my Windows and I really feel very comfortable with it&hellip; I do develop on it, it&rsquo;s my primary development environment, but I also &ndash; it&rsquo;s nice that I can do photography work, and video editing&hellip;</p><p><strong>Mat Ryer:</strong> Minecraft&hellip;</p><p><strong>Steve Francia:</strong> I don&rsquo;t do Minecraft on it, but I might play the occasional game, and Windows is quite good at that, as well.</p><p><strong>Mat Ryer:</strong> What&rsquo;s that little game with the grid, where you find the bombs?</p><p><strong>Steve Francia:</strong> Oh, Minesweeper.</p><p><strong>Mat Ryer:</strong> Minesweeper. Let me do that again, and we can edit that in. Minesweeper&hellip; [laughter]</p><p><strong>Steve Francia:</strong> Oh, I like the way it was. I thought that was better.</p><p><strong>Mat Ryer:</strong> No, but Minecraft&rsquo;s on everything; I think Minesweeper is only on Windows. And I miss it. That&rsquo;s the thing I miss from Windows.</p><p><strong>Steve Francia:</strong> Honestly, I don&rsquo;t even know if it still is on Windows. Let&rsquo;s find out.</p><p><strong>Carmen Andoh:</strong> 1997 is calling Mat, and it wants you back there.</p><p><strong>Mat Ryer:</strong> I liked XP&hellip;</p><p><strong>Steve Francia:</strong> No, it does not ship with Windows anymore, apparently&hellip; I just searched for Minesweeper and it did not&hellip;</p><p><strong>Carmen Andoh:</strong> It wants to party like it&rsquo;s in 1999.</p><p><strong>Jon Calhoun:</strong> Apparently, people weren&rsquo;t productive enough at work, so they had to get rid of it.</p><p><strong>Mat Ryer:</strong> Yeah. I once dual booted my Mac so I could play the game of Minesweeper.</p><p><strong>Carmen Andoh:</strong> Wow&hellip;</p><p><strong>Jon Calhoun:</strong> You couldn&rsquo;t find one online somewhere?</p><p><strong>Mat Ryer:</strong> No, I didn&rsquo;t have the internet. [laughter] Yeah, XP was alright&hellip; But actually, I know that they&rsquo;ve put a lot of effort into Windows recently, for developers and stuff. And of course, you can be successful with Go on Windows, can&rsquo;t you?</p><p><strong>Steve Francia:</strong> Yeah, Go honestly was the language that let me shift to Windows full-time&hellip;</p><p><strong>Mat Ryer:</strong> Said nobody ever? Steve, you&rsquo;re the only person in the world where that&rsquo;s happened&hellip;</p><p><strong>Jon Calhoun:</strong> He&rsquo;s not the only one.</p><p><strong>Steve Francia:</strong> I&rsquo;m not the only one.</p><p><strong>Mat Ryer:</strong> Guaranteed.</p><p><strong>Jon Calhoun:</strong> I think Brian Ketelsen uses Windows every once in a while&hellip;</p><p><strong>Carmen Andoh:</strong> Yeah.</p><p><strong>Mat Ryer:</strong> No, but Go led you. Go was your gateway drug to Windows, you know what I mean? [laughter]</p><p><strong>Steve Francia:</strong> From my personal experience, other dynamic languages and other languages were a little more cumbersome. And I&rsquo;m not a Windows, Visual C++ programmer, or .NET programmer. So using the more dynamic open source languages, I always found it was jumping through hoops, and you&rsquo;d find edge cases that nobody else was hitting&hellip; And then Go just worked. And I could cross-compile from my Windows machine for all the Linux, and Mac&hellip;</p><p><strong>Carmen Andoh:</strong> You&rsquo;re like a walking advertisement for Windows. We&rsquo;d better call them to sponsor&hellip;</p><p><strong>Mat Ryer:</strong> I can&rsquo;t believe you just said it just worked. That&rsquo;s the Apple slogan. [laughter]</p><p><strong>Steve Francia:</strong> That&rsquo;s the Apple slogan?</p><p><strong>Mat Ryer:</strong> It&rsquo;s the Apple slogan, yeah.</p><p><strong>Steve Francia:</strong> Well, they should live up to it more.</p><p><strong>Mat Ryer:</strong> Yeah. [laughs]</p><p><strong>Jon Calhoun:</strong> So did you ever use Java before then?</p><p><strong>Steve Francia:</strong> I have spent my entire career avoiding Java.</p><p><strong>Mat Ryer:</strong> Congratulations.</p><p><strong>Jon Calhoun:</strong> Okay. I was gonna say, Java was one of the few languages where I didn&rsquo;t have much issue using different operating systems.</p><p><strong>Steve Francia:</strong> You had the same issue across all operating systems, you mean&hellip;</p><p><strong>Jon Calhoun:</strong> Exactly. [laughter] But that was part of the reason why I learned Java when I was in college, and it was kind of the language I stuck with then&hellip; But then later I learned Ruby, and that one would have been terrible. Because I tried it on Windows and I was just like &ldquo;Nope. This is not working.&rdquo;</p><p><strong>Mat Ryer:</strong> Yeah, met too, actually. Ruby was the reason I got a Mac. I bought a Mac so I could do Ruby on Rails. Visual Studio though, I have to say, was - and I think still is - very good for if you&rsquo;re doing C# or any of the .NET flavors of things. Visual Studio was just amazing, really&hellip; And of course, VS Code, which is Microsoft - I think that is the most popular editor for Go on the Mac for people, still.</p><p><strong>Jon Calhoun:</strong> Okay, so we have a little bit of time left&hellip; Do you guys wanna talk about the last aspect of Go.dev - the learning side?</p><p><strong>Steve Francia:</strong> I was hoping we&rsquo;d get to it, because that&rsquo;s Carmen&rsquo;s show.</p><p><strong>Carmen Andoh:</strong> Is it my show?</p><p><strong>Steve Francia:</strong> Oh, yeah.</p><p><strong>Carmen Andoh:</strong> Alright&hellip;</p><p><strong>Steve Francia:</strong> And it&rsquo;s also kind of your show.</p><p><strong>Carmen Andoh:</strong> It&rsquo;s also kind of my show. I am both a guest and a host today. Pretty weird. Learn.go.dev - yes, it is what I would call the part of go.dev that I am really excited about, and is ripe for the most community collaboration, contribution and ownership. Some of the original feedback when it first came out was &ldquo;Why didn&rsquo;t my site/my YouTube channel make it in?&rdquo; and to that, I say &ldquo;Let&rsquo;s talk.&rdquo; Because I really wanna be able to do this.</p><p>The one thing that we&rsquo;re finding when we&rsquo;re doing &ndash; I did a lot of research and put a lot of work into wondering &ldquo;Okay, how can we make this useful?&rdquo; is finding who are the people that we&rsquo;re forgetting about&hellip; What we&rsquo;ve found there was 1) zero coding experience. We&rsquo;re not even starting with Go as a second or third language&hellip; So we partnered with Codeacademy to provide that&hellip; Meaning &ldquo;I know nothing about coding at all, and I wanna try Go as my first language.&rdquo; And Codeacademy - that&rsquo;s their bread and butter, so we partnered with them, and it was a really good partnership. There&rsquo;s probably &ndash; the data that I can share is that we have roughly 70,000 people since they launched that course, and we made it available free, through a sponsorship.</p><p><strong>Steve Francia:</strong> That&rsquo;s a huge number, 70,000 people.</p><p><strong>Carmen Andoh:</strong> It really is. I&rsquo;ll share more later, but yeah&hellip; I get weekly reports on that. And there&rsquo;s four modules for free; the whole course is eight modules. You can go to codeacademy.com.</p><p>The other gap that was missing was people working in companies that they just &ndash; for whatever reason, they didn&rsquo;t want&hellip; The tour of Go wasn&rsquo;t working for them, or other self-learning sites - Jon, Gophercises - and also other things&hellip; They wanted to be handed the problem that they wanted to solve. Like, &ldquo;How do I do X in Go?&rdquo; Or &ldquo;From Java to Go for why?&rdquo; So we just looked at some of the things that many people were using Go - the specialties, verticals, if you will - and we chose the four most common based on the data that we have via surveys and other research, and we decided to find and provide curated learning journeys for those learners in particular, and we got really good feedback for that. Thank you for taking me step by step.</p><p>Because what we found was there was two different psychological mindsets for adopters. If you&rsquo;ve heard of Crossing the Chasm book - there&rsquo;s early majority/early adopters, late majority/late adopters, and there&rsquo;s a different psychology with each one of those. And the psychology that we&rsquo;re finding with Crossing the Chasm is &ldquo;I wanna just explore, I wanna learn, I wanna be given the space to kind of take the time to learn it&hellip;&rdquo; Versus the late majority adopter, what we call enterprise, and that is &ldquo;Just show me how to do it in Go.&rdquo;</p><p>So that&rsquo;s what the idea behind the curated learning journey is, based on these very specific &ldquo;I have things that I wanna do.&rdquo; So plans in 2020 are to continue to partner with more of the community to help find more gaps for those people for whom all the existing things aren&rsquo;t working. We wanna keep it free, and we wanna be able to make sure that all the different &ndash; what we&rsquo;re finding is that you ask ten people &ldquo;How do you learn?&rdquo; and you&rsquo;re gonna get ten different answers. There&rsquo;s so many different learning modalities, and we wanna be able to have a variety of learning modalities that appeal to a lot of people.</p><p>But the last thing is - and this touched on the events that we talked about earlier - the best outcomes happen when you learn together in-person, in a group. That&rsquo;s really hard to do, but we&rsquo;re hoping to leverage maybe meetups or online meetups. In-person doesn&rsquo;t mean that I&rsquo;m right next to you, it&rsquo;s also leveraging tools like VS Code for pairing, and then learning together or going through together and hand-over-hand testing things out&hellip; So we&rsquo;re trying to look into that a little bit more.</p><p>So I&rsquo;ve asked a lot of opinions&hellip; Jon has a learning site, and I actually wrote to Jon; I didn&rsquo;t know that I was doing it in that capacity, because we hadn&rsquo;t make Go.dev public at the time&hellip; But I just wanna ask people&rsquo;s feedback; I&rsquo;ve tried to ask a lot of different people&rsquo;s feedback for various things, and I&rsquo;m gonna continue to do so, so that we can continue to make learn.go.dev really what we envision it to be, which is a collaborative work of art that is quality, and serves a variety of learners to bring in the next two million.</p><p><strong>Jon Calhoun:</strong> Can I just add&hellip;? I know one of the things, at least from my perspective, that got me excited about seeing that site is that one of the things that&rsquo;s at least hard for me is to reach people who have limited accessibility. Let&rsquo;s say they speak another language, English isn&rsquo;t their first language, or they need transcripts if they&rsquo;re doing videos, or something like that&hellip; I know at least for independent creators, that&rsquo;s a challenging thing, but I know that as the language grows, sometimes people will learn Go better if they can learn it in Spanish or whatever language is native to them&hellip; And I like seeing something with Google behind it - or it seems like Google&rsquo;s behind it at least - in the sense that I feel like it opens more doors for that reaching a much larger audience, that it would be much harder for somebody like myself or anybody else to really reach.</p><p><strong>Carmen Andoh:</strong> That internationalization is in our future, and it&rsquo;s also been the thing that I&rsquo;ve seen at some of the bigger conferences. We have people like Friends of Go, a company based in Spain, that wrote back and said &ldquo;Hey, we have this training for Spanish speakers&rdquo;, and we also have some trainers in a variety of countries, including India, parts of Asia, and then in Europe, that have also said &ldquo;Can we collaborate?&rdquo;</p><p>So if you wanna go fast, go alone; if you wanna go far, go together&hellip; So the name of the game for learn.go.dev is really seeking the feedback that we need to seek, and making sure that we get both representation, as well as quality.</p><p><strong>Mat Ryer:</strong> Yeah, that&rsquo;s great. And do you see that being a community aspect of this, too? Will it stay curated completely, or do you ever imagine people being able to vote up things?</p><p><strong>Carmen Andoh:</strong> We go round and round on that. Some people say &ldquo;Oh gosh, if we could vote up, vote down, that is gonna be its own quality indicator of itself.&rdquo; The problem is everything can be gamed&hellip; So right now the only thing that can&rsquo;t be gamed is people whom we can trust to be ethical about curating things, and also making sure that we constantly go back and feed into what the global community needs in terms of learning gaps, whether that&rsquo;s content gaps, modality gaps, whatnot.</p><p>So for the forseeable future, it&rsquo;s going to be curated. If at such time we could find a way to do voting that we don&rsquo;t feel can be gamed, or turns into &ndash; you know, the thing I wanted to stop and prevent was someone saying &ldquo;Go vote on my thing, because you&rsquo;re my friend&rdquo;, versus &ldquo;Go vote on my thing because you personally learned from it, or you&rsquo;ve found it to be very beneficial for you.&rdquo;</p><p>But we&rsquo;ve gone round and round on it. I remember having a working group or a roundtable at GopherCon in July in San Diego, and then we had about 15 people show up to two sessions, and this was an idea that came up&hellip; Someone really wanted to push forward on that. I continued to research it, and look into it, and ultimately said &ldquo;Not right now&rdquo;, until we can answer some of the gamifying questions.</p><p><strong>Mat Ryer:</strong> Yeah. I mean, of course, even if there isn&rsquo;t the mechanisms automatically or programmatically to vote, people do still have a voice, of course, in any of the communities they&rsquo;re in. There is a great Go community on Twitter, and there are other communities. Of course, there&rsquo;s a Gopher Slack&hellip; So yeah, I think &ndash; I&rsquo;ve seen a few examples really in the community where although there isn&rsquo;t an official way for people to share ideas and things yet, having the conversation out in public really does influence things, doesn&rsquo;t it? So people&rsquo;s views are of course heard, so therefore you should say it, if people do want to contribute&hellip;</p><p><strong>Carmen Andoh:</strong> I think I will. The one thing that I want to start talking about more publicly is in order for a site to be useful, you&rsquo;re navigating two things that pull up against each other. One is keeping a 30,000-foot view, to make sure that you aren&rsquo;t having any blind spots, but you also need to dive deep down into the actual needs of a particular subgroup. So coming up and down and up and down is an incredibly challenging thing, and it&rsquo;s one I hope to help with.</p><p><strong>Steve Francia:</strong> Mat, you also mentioned their Twitter, and Gopher Slack&hellip; It&rsquo;s important to recognize that the intent of this site is not to displace those great resources that already exist. So we say it&rsquo;s &ldquo;by the ecosystem, for the ecosystem&rdquo;, but it doesn&rsquo;t mean it&rsquo;s gonna replace all the existing ecosystem solutions. The intent here was to fill some gaps that we saw were there. It&rsquo;s largely a curation site; it&rsquo;s actually to reference those existing things that are there.</p><p>As I heard you describing these voting mechanisms, it sounded to me a lot like Reddit. And the Reddit channel I think is great. I subscribe to the Golang Reddit channel, I read it every day. I always see good news, and new articles, and new talks on it, and I think that&rsquo;s a great mechanism to get the voice out&hellip; And of course, the other things you referenced already. But if you want a voting thing, we have it. It&rsquo;s the Reddit r/golang. Feel free to use it, it&rsquo;s a really good resource.</p><p><strong>Mat Ryer:</strong> Yeah, great. There&rsquo;s also the Go weekly newsletter, and there&rsquo;s a Changelog newsletter as well, which is the home of this podcast. So anyone that wants to sign up to that&hellip; You really can keep your finger on the pulse of what&rsquo;s going on that way; it&rsquo;s great.</p><p><strong>Jon Calhoun:</strong> I will say, the only thing I differentiate between Reddit and the voting thing is just that Reddit is kind of &ndash; it&rsquo;s not real-time, but it&rsquo;s time-boxed, in some sense&hellip; Whereas I could see some value in voting for learning resources, but I completely agree that the way voting and everything works, it&rsquo;d be very hard to do that correctly&hellip; So I completely get why you&rsquo;re not doing it. But I do see that as slightly different from Reddit. Because I agree, it&rsquo;s very similar, but I&rsquo;ve seen tons of cases where &ndash; you know, I have free resources that I give out, and I&rsquo;ve seen people post them; even though they&rsquo;ve been posted on Reddit before, they&rsquo;ll post them again and people are like &ldquo;I&rsquo;ve never seen this before&rdquo;, and it&rsquo;s like &ldquo;Okay, clearly nobody is going back and searching these things&rdquo;, or something&rsquo;s happening&hellip; So there is some difference there.</p><p><strong>Steve Francia:</strong> It&rsquo;s also important to recognize, most of the content on the site is static. As Carmen said, we&rsquo;ve talked about doing internationalization; we&rsquo;re using a tool that lets us do internationalization with it&hellip; And there&rsquo;s opportunities to &ndash; like, we do not have plans to do this yet, but we&rsquo;ve made sure that the options are there later, if we wanted to add additional curators, maybe localized curators from different areas to help us with this as well.</p><p>So there&rsquo;s an element there where we can open it to some degree and get support from the community, but also keep it tightly curated and a high-quality bar up there.</p><p><strong>Mat Ryer:</strong> Well, I think that&rsquo;s all the time we have for today. Thank you very much to our guests, Julie Qiu, Steve Francia, and our regular panelists, Jon Calhoun and Carmen Andoh. We&rsquo;ll see you next time on Go Time!</p><p><strong>Break:</strong> [01:14:14.21]</p><p><strong>Mat Ryer:</strong> Hello, and welcome to Go Time! I&rsquo;m Mat Ryer. Today we&rsquo;re talking about Go.dev. It&rsquo;s a user-friendly hub of curated resources for Go, and we&rsquo;re joined by two of the brains behind it - Steve Francia (also known as @spf13) and Julie Qiu are joining us. Hello!</p><p><strong>Steve Francia:</strong> Hi!</p><p><strong>Julie Qiu:</strong> Hi!</p><p><strong>Mat Ryer:</strong> And we&rsquo;re also joined by Carmen Andoh and Jon Calhoun. Hello, you two!</p><p><strong>Carmen Andoh:</strong> Hi!</p><p><strong>Mat Ryer:</strong> How&rsquo;s it going?</p><p><strong>Jon Calhoun:</strong> Mat, I think you kind of lied. I think Carmen is partially behind Go.dev as well.</p><p><strong>Steve Francia:</strong> Yeah, we&rsquo;re actually joined by three of them. You just happen to be regularly joined by one of them.</p><p><strong>Carmen Andoh:</strong> I&rsquo;m stealth. I&rsquo;m stealth.</p><p><strong>Mat Ryer:</strong> Okay, I&rsquo;ll do it again. So it&rsquo;s three of the brains behind GoDev.</p><p><strong>Steve Francia:</strong> And it&rsquo;s Go.dev.</p><p><strong>Mat Ryer:</strong> Okay, Go.dev. This is why we do it. So for anyone listening, this is how the sausages are made&hellip; [laughter] I have to do it again now, and make it sound like it was the first time. That&rsquo;s the hard bit, you all know it&hellip;</p><p><strong>Steve Francia:</strong> Yeah, you don&rsquo;t call it like GoogleCom. [laughter]</p><p><strong>Jon Calhoun:</strong> Actually&hellip; [laughter]</p><p><strong>Steve Francia:</strong> [01:17:15.14]</p><p><strong>Mat Ryer:</strong> Go.dev, okay. It&rsquo;s clever, because it&rsquo;s also the domain, isn&rsquo;t it?</p><p><strong>Steve Francia:</strong> Yeah.</p><p><strong>Mat Ryer:</strong> Got it, thank you. Good. Alright, let&rsquo;s do it again then, everyone. It&rsquo;s fine, I&rsquo;m not embarrassed.</p><p><strong>Steve Francia:</strong> I thought you did a really good job, by the way.</p><p><strong>Carmen Andoh:</strong> Same here.</p><p><strong>Steve Francia:</strong> Other than the obvious mistakes, it was really well done.</p><p><strong>Mat Ryer:</strong> [laughs] Yeah&hellip; Yeah. Okay, well there we go. This is why we do iterative development.</p>
]]></content:encoded></item><item><title>New Go Branding Strategy</title><link>https://spf13.com/p/new-go-branding-strategy/</link><pubDate>Thu, 03 May 2018 00:00:00 UTC</pubDate><guid>https://spf13.com/p/new-go-branding-strategy/</guid><media:content url="https://spf13.com/p/new-go-branding-strategy/front.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/new-go-branding-strategy/front.jpg"/><description>&lt;p>I joined the GoTime podcast and told them EVERYTHING about Go’s new branding strategy (and don’t worry, the gopher isn’t going anywhere!)&lt;/p>
&lt;p>Listen to the podcast at &lt;a href="https://changelog.com/gotime/79">https://changelog.com/gotime/79&lt;/a>&lt;/p>
&lt;h2 id="transcript">Transcript&lt;/h2>
&lt;p>&lt;strong>Adam Stacoviak:&lt;/strong> And we&amp;rsquo;re live, too&amp;hellip; Do you want a little music?&lt;/p>
&lt;p>&lt;strong>Carlisia Thompson:&lt;/strong> Yeah&amp;hellip;&lt;/p>
&lt;p>&lt;strong>Adam Stacoviak:&lt;/strong> Let&amp;rsquo;s get some music going here. This is our 8-bit, Steve. What do you think about the 8-bit? [music playing] Yes&amp;hellip;! Yes! Get it, BMC! Do you like that?&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/new-go-branding-strategy/front.jpg" alt="New Go Branding Strategy"/><p>I joined the GoTime podcast and told them EVERYTHING about Go’s new branding strategy (and don’t worry, the gopher isn’t going anywhere!)</p><p>Listen to the podcast at<a href="https://changelog.com/gotime/79">https://changelog.com/gotime/79</a></p><h2 id="transcript">Transcript</h2><p><strong>Adam Stacoviak:</strong> And we&rsquo;re live, too&hellip; Do you want a little music?</p><p><strong>Carlisia Thompson:</strong> Yeah&hellip;</p><p><strong>Adam Stacoviak:</strong> Let&rsquo;s get some music going here. This is our 8-bit, Steve. What do you think about the 8-bit? [music playing] Yes&hellip;! Yes! Get it, BMC! Do you like that?</p><p><strong>Erik St. Martin:</strong> Adam&rsquo;s just having too much fun with this&hellip;</p><p><strong>Adam Stacoviak:</strong> I&rsquo;ve got problems, okay? I&rsquo;ve got problems. Please do this show without me&hellip; [laughs]</p><p><strong>Break:</strong> [00:40]</p><p><strong>Erik St. Martin:</strong> Welcome back, everybody, to another episode of GoTime. Today&rsquo;s episode is #79, and on the show today we have myself, Erik St. Martin, and Carlisia Pinto&hellip;</p><p><strong>Carlisia Thompson:</strong> Hi, there.</p><p><strong>Erik St. Martin:</strong> And joining us today from behind the curtains is also Adam Stacoviak&hellip;</p><p><strong>Adam Stacoviak:</strong> It is me&hellip; I have arrived.</p><p><strong>Erik St. Martin:</strong> And our special guest for today is the product lead on the Go team,<a href="https://twitter.com/search?q=spf13&amp;src=typd">Steve Francia</a>. Welcome, Steve!</p><p><strong>Steve Francia:</strong> Thanks for having me.</p><p><strong>Erik St. Martin:</strong> Now, we&rsquo;ve had you on the show before, so I don&rsquo;t know whether we need like a whole intro, but do you wanna give just a little bit of background about yourself and the role you play on the Go team?</p><p><strong>Adam Stacoviak:</strong> Maybe what&rsquo;s changed since the last time we talked to you. Did anything change?</p><p><strong>Steve Francia:</strong> I&rsquo;ve gained weight since the last time you talked to me&hellip; [laughter]</p><p><strong>Adam Stacoviak:</strong> Aside from your weight&hellip; Maybe along your role. Did anything change in your role?</p><p><strong>Steve Francia:</strong> No. So I&rsquo;ve been at Google about 18 months now, a little more&hellip; Actually, closer to two years. I&rsquo;ve been the product lead at Google on the Go project the entire time. I think I&rsquo;ve settled into that role a little bit more over time, but it&rsquo;s been the same role. That&rsquo;s it, there&rsquo;s not a lot new with me as far as roles and stuff, so&hellip; Yeah.</p><p><strong>Adam Stacoviak:</strong> How excited are you?</p><p><strong>Steve Francia:</strong> [03:39] It&rsquo;s an exciting time, it really is. I&rsquo;ve had some good experiences in my career. I&rsquo;ve been a part of MongoDB since the very beginning, and took it to when it was the third most popular database. I was an early part of Docker&hellip; So I&rsquo;ve had some opportunities to be a part of something when it took off and it transformed, and Go is going through what I might even call a second surge, in that it&rsquo;s really hit its stride, and you can feel there&rsquo;s something tangible about it. This doesn&rsquo;t happen very often with languages or projects in general&hellip; And it&rsquo;s just a really exciting thing to be a part of.</p><p><strong>Carlisia Thompson:</strong> Elaborate on that a little more, please. What makes you feel this tangible thing, that Go is going through a second surge?</p><p><strong>Steve Francia:</strong> All projects kind of go through ebbs and flows, and that&rsquo;s just the nature of life. When I joined the Go project, we weren&rsquo;t tracking as close as we are now growth numbers, but it was lower than what we&rsquo;re seeing now, by a significant amount. In 2017 the Go adoption grew 76%, and that means over 700k developers adopted Go in 2017.</p><p><strong>Carlisia Thompson:</strong> Are you tracking that by number of downloads?</p><p><strong>Steve Francia:</strong> No.</p><p><strong>Carlisia Thompson:</strong> How do you track it?</p><p><strong>Steve Francia:</strong> We use two different metrics to arrive at that. They&rsquo;re both external surveys done of the broad developer community, and both of them paint Go as around 7% of developers using it&hellip; So that&rsquo;s how we arrived at it. It&rsquo;s the O&rsquo;Reilly survey and the Stack Overflow survey. We found those are the most accurate way of telling broad developers, and between the two, we figured that&rsquo;s a pretty good check. They do appeal to different audiences, they don&rsquo;t always get the exact same numbers, but they&rsquo;re always pretty close to each other.</p><p><strong>Adam Stacoviak:</strong> I was at a conference recently actually, just this past weekend, at<a href="https://zeit.co/day">Zeit</a>. A small internet company &ndash; I guess I shouldn&rsquo;t say small; it&rsquo;s sort of maybe an up and coming cloud service, so it&rsquo;s still in a smaller phase compared to other clouds comparatively&hellip; And one of the talks had Go in it; it was more like a front-end developer space, and I would imagine even seeing Go, and there&rsquo;s Go in there. And if you do a little scroll-back in the<a href="https://gophers.slack.com/messages/gotimefm">GoTime.fm channel</a> there, you&rsquo;ll see a<a href="https://files.slack.com/files-pri/T029RQSE6-FAJHS7DL7/dsc01933-2.jpg">slide</a> that says &ldquo;Why not write everything in Go?&rdquo; I was floored.</p><p><strong>Steve Francia:</strong> Yeah, on top of just the raw numbers we&rsquo;re seeing the number of conferences expanding, we&rsquo;re seeing more participation, we&rsquo;re seeing a greater diversity of talks, we&rsquo;re seeing talks from more diverse people as well, and all sorts and types of diversity. We&rsquo;re seeing an increase of Meetups, and not a day goes by really where you don&rsquo;t see some interesting project that was written in Go happening. There&rsquo;s just a lot of excitement happening around the whole ecosystem.</p><p><strong>Carlisia Thompson:</strong> More conferences&hellip;</p><p><strong>Steve Francia:</strong> Yeah, this year we&rsquo;ve added five new conferences, if I remember right. So I think we&rsquo;re up to 15 or 16<a href="https://github.com/golang/go/wiki/Conferences">dedicated Go conferences in 2018</a>.</p><p><strong>Erik St. Martin:</strong> Wow, that&rsquo;s just wild how fast it&rsquo;s grown.</p><p><strong>Steve Francia:</strong> [07:57] Yeah, crazy to think. I&rsquo;m excited for<a href="https://gophercon.is/">Go Europe</a>, which is in Iceland; it&rsquo;s coming up in I think three or four weeks now. I know this week is<a href="https://2018.gophercon.sg/">Go Singapore</a>&hellip; There&rsquo;s just a lot of conferences happening, and it&rsquo;s so much that it&rsquo;s hard to keep up with them all.</p><p><strong>Carlisia Thompson:</strong> Yeah. So let&rsquo;s talk about this branding&hellip; What prompted Google to take on this project? What was the reason behind it?</p><p><strong>Steve Francia:</strong> So I&rsquo;ll say it was mostly me&hellip; If you wanna blame someone, you can blame me. But it wasn&rsquo;t anyone from Google corporate that was saying &ldquo;Oh, we need to brand Go.&rdquo; It came mostly out of, I think, two things. When I joined the team, one of the first things that happened - just a little experience - was we sponsored the<a href="https://2019.dotgo.eu/">DotGo conference</a>, and<a href="https://twitter.com/enneff">Andrew Gerrand</a> had moved to a new project (he moved to<a href="https://upspin.io/">Upspin</a>), so that left me in charge of sponsorships.</p><p>So we&rsquo;re sponsoring DotGo, and they asked us for a blurb to go along with our sponsorship&hellip; So I started asking everybody, &ldquo;Well, what&rsquo;s our blurb? How do we talk about Go?&rdquo; Nobody had one. We really didn&rsquo;t know, and I asked people, and I wrote something, and I got lots of feedback, but&hellip; I got lots of feedback, and a lot of it was not consistent. Then came the idea that we really needed a more consistent way of talking about Go.</p><p>The idea behind the<a href="https://golang.org/s/brandbook">brand guidelines</a> that we published actually came out of &ndash; in spite of it being quite visual, the genesis of it came from that we needed a better way to talk about ourselves, and what the project was, and we needed it clear, and we needed to have it very digestible. So the branding actually started completely as text, and the visual element was added later to it.</p><p>If you look at the brand book that we&rsquo;ve now published, and there&rsquo;s a<a href="https://blog.golang.org/go-brand">blog post</a> on blog.golang.org on it, you&rsquo;ll see the first part is the brand, and that makes up the entire first half of the book, and it&rsquo;s all words&hellip; And they&rsquo;re pretty looking words, right? There&rsquo;s decorations around them, but they&rsquo;re just words. And we spent the majority of the time focused on this, and trying to figure it out. So that was my personal experience.</p><p>Then I&rsquo;ve done a number of<a href="https://blog.golang.org/survey2017-results">surveys of the Go community</a>, and two interesting things came out of those, as it relates to this. We found that there was a reoccurring theme of people that when they had tried Go, they fell in love with it&hellip; But they didn&rsquo;t know how to communicate its value to their teammates or to their managers. And historically, the best way we&rsquo;ve actually talked about Go was we&rsquo;ve had kind of an unofficial slogan of &ldquo;Try it and you&rsquo;ll like it!&rdquo; or &ldquo;Try it and you&rsquo;ll love it!&rdquo;, and that&rsquo;s reinforced by our website. When you go to the Golang website, what&rsquo;s the first thing you see? Anyone?</p><p><strong>Adam Stacoviak:</strong><a href="https://golang.org/">Try it</a>.</p><p><strong>Steve Francia:</strong> [11:50] You see &ldquo;Try Go.&rdquo; It&rsquo;s right at the top. Then you see a happy gopher and Download Go, which is also a way to try Go. That&rsquo;s kind of the way we reinforce it, and that&rsquo;s good, and for the early adopter audience that we&rsquo;ve served for a number of years, the idea that you can just try it is very valuable.</p><p>As we go to more mainstream programmers, people that might not come with a CS background, the idea of trying a static- compiled language is a bit intimidating, and a lot of them are looking just to find out more about it.</p><p>When we heard this very consistent feedback that people when they use Go they loved it, but they didn&rsquo;t know how to explain its value, we also heard feedback from people that are tech leads, or decision-makers, directors of engineering, CTOs etc. they didn&rsquo;t know what Go&rsquo;s value was. In our number of surveys and interviews we found they had heard concurrency and they&rsquo;ve heard performance, but they weren&rsquo;t really sure what Go&rsquo;s value was&hellip; And it&rsquo;s a tough thing, because with Go it&rsquo;s not a single feature that really produces a value, rather it&rsquo;s the amalgamation of all the features; when you add them all up it produces an experience that&rsquo;s really unlike any other in computer science, and it&rsquo;s that experience and how it scales over time that really produces the value. That&rsquo;s a very hard thing to convey, and we tried to capture it the best we could with this brand.</p><p><strong>Carlisia Thompson:</strong> That is a good point, an experience IS hard to communicate. People might have shared experiences, but also specific, distinct experiences, but I think having a guideline that helps them communicate different aspects of the experience could be very helpful.</p><p><strong>Steve Francia:</strong> That was our intent. To go into a little bit more (if you&rsquo;d like) of our process going through this - because I think it&rsquo;s pretty insightful&hellip;</p><p><strong>Carlisia Thompson:</strong> Yeah.</p><p><strong>Steve Francia:</strong> We worked with a branding agency. We recognized this was not a core strength of our engineering team, branding, and the first thing that he did - the person we worked with, his name is Adam, and his agency is<a href="http://withininternational.com/">Within</a>&hellip; The first thing that he did was he just set a series of interviews; he interviewed all of the early project members, as well as a bunch of members of the Go team, to just get their feedback on what they thought Go was, and how they talked about Go. These were about 30-45 minute interviews.</p><p>Then he took all of that together and came up &ndash; he tried to distill it down to really its core essence. Then he worked with myself a lot,<a href="https://twitter.com/broady">Chris Broadford</a> worked a lot on this, as well as<a href="https://twitter.com/_rsc">Russ Cox</a>, and a bunch of other people. I think those were the primary three.</p><p>We just kept trying to distill it down further and further and further. It&rsquo;s amazing how much time it takes to come up with a small number of words. I believe it&rsquo;s Mark Twain who famously said &ldquo;I&rsquo;m sorry I wrote you a long letter, I didn&rsquo;t have time to write you a short one.&rdquo; I&rsquo;m paraphrasing, that&rsquo;s not the exact quote, but&hellip; It really took a long time to distill it right down to the essence of what we believe Go is.</p><p><strong>Carlisia Thompson:</strong> [16:03] And I particularly loved the Tone of Voice section of the brand book, because it tries to really narrow it down&hellip; Because it&rsquo;s one thing for you to say one word that tries to encapsulate what the language or what the community is all about; here we have a few words about what Gophers are, and corresponding words about what Gophers are not. I wanna go through the list, for people who are looking at this&hellip; Gophers are concise, Gophers are not verbose; they&rsquo;re genuine, not dubious; they&rsquo;re friendly, not exclusive; direct, not ambiguous; thoughtful, not reactive; humble, not haughty. Is that how you say that word?</p><p><strong>Steve Francia:</strong> That&rsquo;s right.</p><p><strong>Carlisia Thompson:</strong> So I really like that the effort was made to describe what Gophers are not. It&rsquo;s really helpful, and it&rsquo;s really helpful when you are thinking of how to behave in a community, what is acceptable, or how to write code, what are good idioms - you start thinking about these things, and it helps.</p><p><strong>Steve Francia:</strong> Thank you. I think especially with the growth that we&rsquo;re going through, we can&rsquo;t expect our culture to spread through all of this growth unless we codify it, and try and lead&hellip; So that&rsquo;s a bunch of this, around like &ldquo;Well, we need a single place as a reference to the entire global community&rdquo;, whether you&rsquo;re from Australia, you&rsquo;re from Singapore, you&rsquo;re from China, or you&rsquo;re from Brazil, or you&rsquo;re from Seattle, or anywhere, where you can have a single document that really reinforced what it meant to be part of Go. That was our goal of what we tried to do here.</p><p><strong>Adam Stacoviak:</strong> I think branding was probably an extremely tough exercise, and the fact that you all started with words and interviews is a testament to the faithfulness to describe exactly what Go is, but then also what a programmer using Go may or may not be like, because a lot of branding is not really at all the visual part of it, while maybe some of the backlash or some of the surprise from the community is based on the visual pieces of it.</p><p>It&rsquo;s the understanding who you are and why you do what you do, to explain who you are, is really the core component of a brand. You can&rsquo;t show off who you are or visualize who you are unless you know who you are.</p><p><strong>Steve Francia:</strong> What&rsquo;s that?</p><p><strong>Adam Stacoviak:</strong> I guess maybe what are your hopes here? I know that this may have been not a surprise to you, obviously, because you were involved behind the scenes, but I think for many it was like, &ldquo;Okay, Go is almost nine years old&hellip;&rdquo;, and here comes this - either brand or re-brand; I&rsquo;m not really sure if this is a re-brand, because I&rsquo;m not sure there ever was a true brand in place, to this degree&hellip; What are your hopes for the community to respond? When you released this, Steve - you wrote the article, the post on the Go blog - what was your anticipation? Were you surprised? What were you most surprised about? What were your hopes for releasing this to the world?</p><p><strong>Steve Francia:</strong> [19:47] I&rsquo;ll answer the first question - is it a brand or a re-brand? I&rsquo;ll say there&rsquo;s not a lot new here. In a sense, our real goal here was &ndash; as I said, I kind of started from that first experience I had maybe two weeks into joining the Go team, of having to write a blurb of who we are. I talked to Robert Griesemer and he gave me some feedback; I talked to Andrew, and he gave me completely different feedback; I talked to Ian, and it was different again. We really wanted to come up with what would be our story, our concise story that represents not only the Go team at Google, but the entire Go community, that we can have one way of talking about it. That really was the primary goal.</p><p>The other part was when everything is done kind of ad-hoc, you don&rsquo;t have a lot of opportunities to make decisions, and I would describe the historical brand as mostly ad-hoc. When we are asked a question, when we need a blurb for this - we wrote a blurb for that; when we needed a website that looked like this, we did that.<a href="https://www.instagram.com/reneefrench/">Renee</a> has been fantastic in providing lots of wonderful Gopher designs, as well as a logo, which - I learned after that blog post launched - a lot of people didn&rsquo;t know we had a logo before.</p><p>Everything was kind of disconnected in how it was designed, and we often designed something for an immediate need, without looking at the holistic picture. With this, we really took the opportunity to say &ldquo;Look at all these pieces we&rsquo;ve done over the last 10 years. How can we put them together and make some real decisions about which are the ones that we want to be our voice, or our mission, or our look?&rdquo;</p><p>Now, there&rsquo;s some new looks here. Definitely, the logo went through an evolution from Rene&rsquo;s hand-drawn into a vectored image&hellip; And Rennee has used a lot of different colors over the years, and we definitely used that as inspiration as we came up with our color palette here. But yeah, a lot of these ideas had been floating around, but most of it was to provide just a single point that people could use as an anchor, and hopefully answer that question when people ask &ldquo;How do I communicate Go&rsquo;s value?&rdquo; They can look at this and say &ldquo;Well, this is what Go is.&rdquo;</p><p>We&rsquo;ve written a real clear description, and I&rsquo;ll read it for those who don&rsquo;t have it:<em>&ldquo;Go is an open source programming language that enables the production of simple, efficient and reliable software at scale.&rdquo;</em> That&rsquo;s really what Go is, the best articulation we&rsquo;ve ever heard or we were able to come up with of really what Go is. As we continue through it, our hope is that people use this as a reference, and that it can help unite the community.</p><p><strong>Carlisia Thompson:</strong> Yeah, I got really caught up on the logo and the visual aspects of the branding, and I totally missed the point&hellip; I mean, the point is completely different, and I&rsquo;m really glad you&rsquo;re here to tell us and people like me who might have missed the point, too. And in fact, I don&rsquo;t remember that we had a logo, and that was the question that I was gonna ask - so you just said that we did have a logo, but I don&rsquo;t remember what it was&hellip;</p><p><strong>Steve Francia:</strong> You are not alone in that, as we learned very clearly from some of the feedback we got. People misunderstood that Go had a logo, and the logo was the Gopher.</p><p><strong>Carlisia Thompson:</strong> [24:03] Yes.</p><p><strong>Steve Francia:</strong> So when we said we have a new logo, I think this is really &ndash; it was obviously a misunderstanding, but it came out of people&rsquo;s love for the Gopher. The people have fallen in love with &ndash; this is the human side of a very technical project that we all love. I think there&rsquo;s no one that doesn&rsquo;t love the Gopher, and the reaction that we got was, I think, mostly stemming from that - people love the Gopher, and the thought of it not being around kind of gave people a shock.</p><p>That said, on our blog you can actually see the original logo. Not in the most recent post, but in a post a number of years ago, that we wrote on the Gopher&hellip; I&rsquo;m actually looking it up right now, as we&rsquo;re talking. So it&rsquo;s on<a href="https://blog.golang.org/gopher">blog.golang.org/gopher</a>. This goes through the history of the gopher, as well as Renee&rsquo;s history with Plan 9 and other things, and it also talks about our initial logo, and it has a picture of it there.</p><p><strong>Carlisia Thompson:</strong> With the black background?</p><p><strong>Steve Francia:</strong> That&rsquo;s right, the one with the black background.</p><p><strong>Carlisia Thompson:</strong> Okay.</p><p><strong>Steve Francia:</strong> And if you watch some of the old videos, you&rsquo;ll actually see Brad and<a href="https://www.youtube.com/watch?v=rKnDgT73v8s">Rob</a> and others wearing T-shirts with this logo on it.</p><p><strong>Carlisia Thompson:</strong> That is true, I remember that. I remember those T-shirts.</p><p><strong>Steve Francia:</strong> So this logo was the official Go logo, although it wasn&rsquo;t used very heavily. We used it on some of those T-shirts, and it ended up [unintelligible 00:26:06.01] but it&rsquo;s not on the blog, it&rsquo;s not in a number of other places. We&rsquo;ve ended up using the Gopher far more when we created swag.</p><p>So that&rsquo;s the old logo&hellip; The new logo actually started from a very similar place, and you can see it ended in a very similar place.</p><p><strong>Carlisia Thompson:</strong> It&rsquo;s very similar.</p><p><strong>Steve Francia:</strong> And this logo&hellip; Renee drew it &ndash; I might not be accurate on this, but a number of years ago. I wanna say 2008 or 2009. A very long time ago.</p><p><strong>Break:</strong> [26:46]</p><p><strong>Adam Stacoviak:</strong> What&rsquo;s interesting too is this blog post - I was actually gonna ask this question, in hopes of stirring up the [unintelligible 00:27:39.20] and story of the Gopher. I was not aware of this blog post, but this shares that; it has the history of Renee making it for a radio station called WFMU for a fundraiser they had, and it had a second appearance at Bell Labs, with Bob Flandrena&rsquo;s avatar, and then again for Plan 9 as a mascot, and then I guess when the open source happened for Go, Renee suggested to adopt the mascot, and the Gopher was born then, right around 2009.</p><p>[28:15] It&rsquo;s an interesting process, and you said, in a way, ad-hoc. So this gopher has kind of like made its way through several different forms and several different reasons for even being, to now be the beloved mascot of gophers.</p><p><strong>Steve Francia:</strong> Yeah, it&rsquo;s amazing what an impact it&rsquo;s had on the project, and we owe Renee a huge amount of gratitude for her contribution to it. I think she really provided for us kind of our identity. We don&rsquo;t call ourselves &ndash; in Python they call themselves Pythonistas, and everyone has different monikers. We don&rsquo;t call ourselves the Go-ers, or anything like that. We&rsquo;re gophers. And that comes from Renee&rsquo;s mascot. And even<a href="https://www.gophercon.com/">GopherCon</a> and everything that&rsquo;s come since, it all really stems from Renee&rsquo;s mascot. I think she did an amazing job providing an identity for us, and our goal with the visual branding here was to really take Renee&rsquo;s work and to build on it, and to try and consolidate it down.</p><p>Renee did a lot of work with gophers, and colors, and the logo&hellip; She didn&rsquo;t do a lot of work with the website and other things, so our objective here was to really create a holistic presence for Go. You see the brand book, and it has some of the things&hellip; As I mentioned in our blog post, we&rsquo;re also working on revamping our website to follow this new brand, and we&rsquo;re pretty close to having the blog ready to launch. It should be a few more weeks. And that&rsquo;s where we&rsquo;re starting - we&rsquo;re starting with the blog; we&rsquo;d like to get the community involved as early as possible, and we hope to be able to take the work that we did on the blog and apply it to the website, and keep going.</p><p>As a part of this, we&rsquo;re also extending our blog to support multiple languages, which is something we&rsquo;ve never had before, and on follow-on reasoning using the same technology back-end for the website, which will also enable us to have multiple languages. There&rsquo;s lots of components to our website, and we&rsquo;re gonna focus more on the static content first, rather than things like<a href="https://play.golang.org/">Play</a>, where it&rsquo;s more interactive&hellip; But we&rsquo;re gonna stage it out, and hopefully have a consistent brand and feel across all of the different Go websites.</p><p><strong>Adam Stacoviak:</strong> Was Renee involved at all in this process with Adam and the team, to interviewing and kind of self-examining the process?</p><p><strong>Steve Francia:</strong> Rennee was - she was very involved. In fact, a lot of people were involved at the beginning for the interview, and then we spent a lot of time after their interview just working through everything and trying to consolidate things down, and that was a much smaller group. Then we&rsquo;d go back to the larger group just for feedback every once in a while.</p><p>[31:47] Renee spent less time on the verbal part of the brand, but she spent a considerable part on the visual part of the brand, and she did so over time. She was very involved with it. She helped pick the color pallete, she helped name the colors, particularly the Gopher Blue one&hellip; She worked with us on every part of the visual aspect.</p><p><strong>Carlisia Thompson:</strong> That sounds fantastic. I mean, I don&rsquo;t know&hellip; Whoever was involved, you guys did a really good job. I personally really like it, so I&rsquo;m just gonna put my bias upfront. I love it, I think it came out really well. Good job!</p><p><strong>Steve Francia:</strong> Thank you.</p><p><strong>Adam Stacoviak:</strong> Not that this is that important to dive into, but I think it&rsquo;s kind of interesting the stark exact opposite response - and I know Hacker News isn&rsquo;t the best place to have comments, it&rsquo;s not the best place to meet the most loving programmers; however, there is such a<a href="https://news.ycombinator.com/item?id=16935084">backlash</a> from so many people&hellip; I wonder why people feel like they should respond that way.</p><p><strong>Carlisia Thompson:</strong> I didn&rsquo;t see that. I mean, I didn&rsquo;t look, either.</p><p><strong>Adam Stacoviak:</strong> None of it seems really positive. Steve, I&rsquo;m sure you had to dig into some of this, or at least be like &ldquo;Come on - really, guys?&rdquo; Someone says they&rsquo;re incredibly sad, the logo is awful, it looks like somebody else&rsquo;s logo&hellip; There&rsquo;s a lot of just immediate gut responses, it seems, from some people, potentially even the larger community here on Hacker News&hellip; But again, we understand what Hacker News is; comments can tend to be not very positive. They seem to be right on point with Hacker News&rsquo; way of being somewhat negative about this process, and just bashing rather than uplifting; it drives me crazy.</p><p><strong>Steve Francia:</strong> So what I saw&ndash; first, I wanna say I think a lot of this just comes from the fact of how passionate people are. I think people love the Gopher, I think there&rsquo;s a lot of people that really love Go, and the thought of something changing has always been hard for people.</p><p>The brand is really the essence of something. There&rsquo;s a visual element, as well as all the text&hellip; It really defines what the essence of something is, and people were worried that their beloved language and mascot etc. were changing. I think what we saw was a reaction to &ndash; you know, if people didn&rsquo;t love Go, if they weren&rsquo;t so passionate around it, we wouldn&rsquo;t have seen that. So I think it&rsquo;s a testament to how passionate people are around it.</p><p>Also, what we&rsquo;ve noticed&hellip; The language on the blog post - I looked at it after this feedback and I&rsquo;ve spent quite a bit of time on it&hellip; It&rsquo;s right in the very beginning that it says &ldquo;Built upon the great foundation that Renee French established, and rest easy, our beloved Gopher mascot remains the center of our brand.&rdquo; As you scroll down, the Gopher is very present; it&rsquo;s featured in the video that shows our Go logo design process and all the different &ndash; not all, but many of the iterations we went through with the logo. It&rsquo;s also very prominent in the slide presentation, as well as it&rsquo;s prominent in the brand book, all of which are featured.</p><p>[35:33] So I think we communicated the Gopher was very part of our brand well. Because the Gopher was a consistent part, but not the new part, we didn&rsquo;t heavily feature the Gopher here, but made sure that it was included&hellip; But we focused more on things that were new and different. In spite of that, I think what we saw was some people reacting to some people&rsquo;s reactions.</p><p>Some people misunderstood that the new logo was replacing our mascot, the Gopher, and they started tweeting about that, or posting comments about it, and then people reacted to that post, rather than finding out for themselves that that&rsquo;s not accurate. So it kind of escalates&hellip; When people have a misunderstanding, and then people look at that without going to the source, it always escalates things, and that&rsquo;s just a bit of a statement of where we live today, and the kind of world &ndash; I remember life before the internet, and how hard it was to find information; you had to drive to places, or walk to the libraries&hellip;</p><p><strong>Adam Stacoviak:</strong> And you had payphones&hellip;</p><p><strong>Steve Francia:</strong> Payphones&hellip; I remember we had these card catalogs, you had to look up &ndash; there were these giant dressers with all these papers in them that told you where to find things&hellip; It was very hard to find information, and now it&rsquo;s very easy, and still people are resistant to doing so.</p><p><strong>Adam Stacoviak:</strong> I think that&rsquo;s funny too, because it seemed like the Gopher wasn&rsquo;t really going anywhere; it also didn&rsquo;t seem like - unless you read somewhere - visually, it didn&rsquo;t seem like the Gopher, unless you looked hard, at least just real quickly at this blog post, the Gopher was kind of missing, quickly&hellip; From a quick visual glance.</p><p><strong>Steve Francia:</strong> Yeah, I agree. You have to either press play or just scroll down a little bit, or click on any of the things. Yeah, I agree, and especially when other people are saying it. So I think what we saw was people reacting to reactions, and&hellip;</p><p><strong>Adam Stacoviak:</strong> Misinformation.</p><p><strong>Carlisia Thompson:</strong> But it&rsquo;s sort of easy to see how people could have been misled, because like Adam was saying, the Gopher is not on the post itself; of course, if you go into the document, the Gopher is there&hellip; So maybe if they didn&rsquo;t go that far&hellip;</p><p><strong>Steve Francia:</strong> First you<a href="https://www.youtube.com/watch?v=V4t-ymImW6c">play the video</a>, which I know not everybody wants to play videos. Or if you scroll to the bottom, the last image has multiple Gophers on it&hellip; But again, we didn&rsquo;t anticipate that people would have&hellip; I mean, shame on me; I should have anticipated more that people&ndash;</p><p><strong>Adam Stacoviak:</strong> No, no, no, that&rsquo;s not what we&rsquo;re saying at all, either&hellip;</p><p><strong>Steve Francia:</strong> I&rsquo;m gonna say that&hellip; If I could have done it again&ndash;</p><p><strong>Adam Stacoviak:</strong> [laughs] Shame on you, Steve.</p><p><strong>Steve Francia:</strong> If I could have done it again, I would have put the Gopher more probably at the top. And I didn&rsquo;t anticipate that people would have made the misunderstanding. That&rsquo;s on me.</p><p><strong>Carlisia Thompson:</strong> Can you not edit the post?</p><p><strong>Steve Francia:</strong> I could, but we thought about it, and the reality is the post is pretty clear. The words are clear that the mascot is staying there, we&rsquo;re not intimidating anything about the mascot going, if you click through the things&hellip; And again, as most people reacting to reactions, by the time the post went live, that was the time that people needed to hear that the Gopher was there in the beginning. So the window was really before it was posted, and we missed the window, but you know, I think if you give it time&hellip;</p><p>First, here&rsquo;s a thing about change - people are always nervous at the beginning about change. Give them time - and I don&rsquo;t expect that everyone is gonna love it&hellip; It&rsquo;s a subjective thing; not everybody loves every painting, not everybody loves every color&hellip; You know, nothing appeals universally, but I think with a lot of people, give it time and it&rsquo;s gonna calm a lot of their fears.</p><p><strong>Carlisia Thompson:</strong> [39:47] One really strong reaction that I saw people having was that the playfulness of Go was there and now it&rsquo;s not, because this logo is not as playful. Then, of course, it goes back to people equating the logo with the Gopher, and the Gopher is not going away (we&rsquo;ve covered that), but that brings up a point too, which is when you codified something, it means now that is the right way of doing things, and if there is a right way, there is a wrong way, right? So how do we handle this, how do we know&hellip;? Because okay, Google sponsors things, you need to have your blurb, you need to have a logo&hellip; But how about us? How will we be using this in the wrong way, or what if we don&rsquo;t use any of this - would it be wrong? Are we gonna get a call from Google&rsquo;s lawyers, saying &ldquo;Hey, you&rsquo;re not using the proper material&rdquo;? [laughter] How does it apply to everybody else?</p><p><strong>Steve Francia:</strong> So I&rsquo;m gonna answer this in two ways. One, there&rsquo;s a few things here that are copyrighted, the logo being one of them, and the logo does have guidelines for its usage. So I wanna be clear that the logo needs to be used appropriately according to those guidelines. I wanna be clear with that upfront.</p><p>Beyond that, you are welcome to use this or not use this. This is meant as a guide for the community; no one came down from the mountain with stone tablets. We think it&rsquo;s gonna be a valuable asset. We hope it&rsquo;s something that the community embraces and uses. We fully expect everyone to continue to do their own thing, as they have. We just finished up<a href="http://gothamgo.com/">GothamGo</a>, and it continued to have its own brand&hellip; And I know<a href="https://www.gophercon.com/">GopherCon</a> this year is using a theme of race cars, and we fully expect them to continue their brand.</p><p><strong>Carlisia Thompson:</strong> I was gonna ask what was gonna be the theme for this year&hellip; [laughs] Thank you&hellip;</p><p><strong>Erik St. Martin:</strong> It&rsquo;s all over the website already&hellip; Have you not been on the website?</p><p><strong>Carlisia Thompson:</strong> Oh, okay&hellip; I didn&rsquo;t know that, sorry. [laughs]</p><p><strong>Adam Stacoviak:</strong><a href="https://www.gophercon.com/">GopherCon.com</a>, y&rsquo;all.</p><p><strong>Carlisia Thompson:</strong> Sorry, Steve, that was such a detour&hellip;</p><p><strong>Steve Francia:</strong> Anyway, yeah. So I think people are welcome to use their own brand. We think this is something that can help inspire the community. We hope the community follows the values, we would like that to happen. We want people that are thoughtful, we want people that are friendly, but each group is welcome to adopt what they want to from this; there is no consequence for not&ndash; as long as people follow the<a href="https://golang.org/conduct">code of conduct</a>, right? That&rsquo;s independent of this, and that does have consequences.</p><p><strong>Carlisia Thompson:</strong> So what does it mean when you say that the Go logo is copyrighted? That sounds pretty serious. Does it mean that we have to credit Google when we use it? Does it mean we cannot alter it, or what is it?</p><p><strong>Steve Francia:</strong> Our logo is more flexible that&rsquo;s used than most logos, but there&rsquo;s guidelines within the brand book on what acceptable use is. We talked about what to license it under and spent some time with our open source legal team, and their advice was<em>copyright the logo</em> is the appropriate thing to do. It lets people use it under fair use rights and under the guidelines that we&rsquo;ve set forth, but they can&rsquo;t make modifications, they can&rsquo;t sell it, they can&rsquo;t do different things to it because it&rsquo;s copyrighted.</p><p><strong>Carlisia Thompson:</strong> But can I place it anywhere without crediting anybody, or do I have to worry about giving credits?</p><p><strong>Steve Francia:</strong> There&rsquo;s no credit needed.</p><p><strong>Adam Stacoviak:</strong> [44:04] The point of a copyright is just to say that it&rsquo;s their mark and that no one else can use the mark in a trademarked or copyrighted scenario, and as a copyright holder you have to protect your copyright, because otherwise you don&rsquo;t have a copyright.</p><p><strong>Steve Francia:</strong> That&rsquo;s right. And I&rsquo;ll just say, I encourage people to ignore what I&rsquo;ve said, but<a href="https://golang.org/s/brandbook">read the document</a>. There&rsquo;s two pages on what is acceptable use, with lots of diagrams and pictures of what to do and what not to do. We hope the Go community uses this, we hope it becomes &ndash; I don&rsquo;t think it&rsquo;s gonna replace the Gopher in any sense, but I do think that it&rsquo;s a nice accent; it definitely reinforces our brand. The Gopher is wonderful, and it&rsquo;s fun, and it&rsquo;s playful; it&rsquo;s not immediately recognizable as the word &ldquo;Go&rdquo; is. If you&rsquo;re not familiar with the Gopher, and Go, but you see the word &ldquo;Go&rdquo;, you&rsquo;re gonna associate that.</p><p><strong>Adam Stacoviak:</strong> I think of it like maybe on product websites&hellip; Like when you go to a service and they support certain languages, what do you they put in place of Go now? They probably use the Gopher.</p><p><strong>Steve Francia:</strong> They might, or a lot just come up with their own logo or their own thing.</p><p><strong>Adam Stacoviak:</strong> Right. And what ends up happening is that there&rsquo;s never a match.</p><p><strong>Steve Francia:</strong> Exactly. There&rsquo;s no consistency&hellip; So that&rsquo;s what we&rsquo;re trying to provide here, is that consistency, so that when you see this mark, you know it&rsquo;s the language. And yeah, please read the document; it talks about all the different ways to use it.
I was at GothamGo, I was the MC for the third or fourth year in a row, and I was thrilled that a number of the speakers used the logo on their decks. It was nice to see that consistency. Not everybody used it, and that was fine. I didn&rsquo;t expect anybody to, except<a href="https://twitter.com/Cassandraoid">Cassandra</a>, who used<a href="https://golang.org/s/presentation-theme">the actual deck</a> that we distribute, but she was also part of the process of creating it&hellip;</p><p><strong>Carlisia Thompson:</strong> So just to clarify for people - on the blog post that is on the Golang website there is a<a href="(https://golang.org/s/presentation-theme)">link</a> to download the master slides that you can use, that are already branded with the colors and the logo.</p><p><strong>Steve Francia:</strong> That&rsquo;s right, that&rsquo;s right. And there&rsquo;s also a<a href="https://golang.org/s/brandbook">link</a> there to the brand book that we&rsquo;ve been talking about. Those links are right next to each other under the download section.</p><p><strong>Carlisia Thompson:</strong> And talking about the website, going back a little bit - is the website going to be decoupled from the language repo?</p><p><strong>Steve Francia:</strong> Yes, the plan is to decouple the website from the language repo, and partly because &ndash; there was value in coupling it, but as we need to scale into different languages and different things, we can&rsquo;t see another way but to decouple them. That said, there will remain documentation as part of the distribution, but the website itself will be decoupled, at least that&rsquo;s the current strategy.</p><p><strong>Carlisia Thompson:</strong> Yeah, I hope so, because the website would only be updated once there was a release&hellip; [laughs]</p><p><strong>Steve Francia:</strong> [47:51] Yeah, right now it&rsquo;s every six months, and&hellip; Yeah, part of the new design is also to provide a little more contextual information towards what&rsquo;s happening now, and trying to keep our community members, our users more informed&hellip; And every six months is just not frequent enough.</p><p><strong>Carlisia Thompson:</strong> Yeah&hellip; If you have a typo you wanna fix, you&rsquo;ve gotta wait six months. [laughs] Or some new information, like a new link you wanna add, you&rsquo;ve gotta wait six months.</p><p><strong>Steve Francia:</strong> I&rsquo;m pretty sure we can fix typos within six months, but our goal is to &ndash; it&rsquo;d be great on our homepage if we had things like upcoming conferences, and keep our global community more informed, and that&rsquo;s not possible every six months. We don&rsquo;t have dates and links to the conferences; they are just too dynamic for that.</p><p><strong>Adam Stacoviak:</strong> What are you doing to move faster on those fronts? You&rsquo;ve just mentioned being decoupled&hellip; One of the things that helps a language succeed, other than obviously being a good language, is its supportive community, which Go does very well, but it does seem like there&rsquo;s some slowness around these kinds of things, that could be sped up. Not so much that it&rsquo;s bad, just like, how are you kind of optimizing for those things, to make those things a bit more faster?</p><p><strong>Steve Francia:</strong> It&rsquo;s a good question.</p><p><strong>Adam Stacoviak:</strong> I mean, obviously, Cassandra came on the team recently, so you&rsquo;ve got community things happening, so there&rsquo;s some change happening; I&rsquo;m just curious how it&rsquo;s playing out.</p><p><strong>Steve Francia:</strong> Yeah, I would actually defer to Cassandra on that. She&rsquo;s doing an amazing job of really devising strategies and trying to help this community scale. I&rsquo;ll say one of the smartest things we&rsquo;ve done is actually step out of the way as Google, and let the community do what it does. That&rsquo;s been very productive, it&rsquo;s been very beneficial.</p><p>We&rsquo;ve also realized there&rsquo;s a balance there, and especially as we grow, there&rsquo;s a lot of value in adding support. One of the things we&rsquo;ve recently done - which I don&rsquo;t know that we&rsquo;ve talked about publicly, because it&rsquo;s not public - is we&rsquo;ve set up a communication channel for the different conference organizers, so that they&rsquo;re able to talk to each other and start comparing things and trying to get more consistency. Google doesn&rsquo;t have any stake in that, it&rsquo;s not like they have to follow the guidelines or anything we&rsquo;re setting forth; we&rsquo;re not doing any of that, we&rsquo;re just providing a communication channel. But trying to do things like that more often I think is a way to let the community do the brilliant job that it&rsquo;s already doing, but also support them so they can support each other better, and do it better at scale. But the real answer is probably one that Cassandra could give you better.</p><p><strong>Carlisia Thompson:</strong> So I get that a concise, clean brand is easier to communicate, so I get that part&hellip; I&rsquo;m wondering if there is a hope that Go will be seen as mature as it is, that we will also have an impact on adoption not from the perspective of people understanding what Go does - that&rsquo;s, of course, a big part if you&rsquo;re going to adopt a language - but also because it will seem more serious and mature, and also that Google is investing in the language to the point of even wanting to do this&hellip; Is there anything like that in the general thinking for the reason to come up with this branding?</p><p><strong>Steve Francia:</strong> [51:59] It&rsquo;s a great question. I&rsquo;m gonna answer it by pointing us to another part &ndash; in fact, it&rsquo;s the final part that we haven&rsquo;t really talked about yet, of the brand guide. There&rsquo;s a section in it called<em>Our Audience</em> and&hellip; We&rsquo;ve never done this before. Go has had kind of an implicit audience from the beginning, of generally systems programmers with a CS background. And even though we&rsquo;ve never articulated that, if you read through our material that&rsquo;s been developed, and our documentation, it&rsquo;s kind of the implicit audience. We don&rsquo;t explain programming concepts anywhere, we expect that you know them, throughout our documentation. We often make comparisons to different languages (like C) in the documentation.</p><p>As part of this, we set forth that we really &ndash; for where we are, and the growth that we&rsquo;re experiencing, and our goals, we believe that Go could be the next mainstream language, with broad adoption across the industry. And to get there, we recognize that there was three different audiences we needed to focus on, and we&rsquo;ve articulated them in the brand book. The first one is potential in new programmers. These potential Go programmers and new programmers - meaning people new to programming - this is an audience that we haven&rsquo;t ever targeted in the way that we want to target now&hellip; So this is an explicit declaration that we believe our audience is now people new to Go and new to programming. That has broad impact across all that we do. And we talk about the key messages that we want to target for that audience, and I&rsquo;ll leave it to the listeners to read what they are in the brand book.</p><p>Our second is Technical Decision-Makers, which we use CIOs, CTOs and tech leads. These are the people that are often responsible for choosing architecture, approving architecture, and we wanna make sure that they have the support that they need. As someone who&rsquo;s been in that role many times, I&rsquo;m familiar with the &ndash; largely, your goal that&rsquo;s always running through the back of your mind is &ldquo;What are the risks in doing something?&rdquo; As you know, in technical decisions there&rsquo;s always trade-offs, and trying to understand what the risks are of a given trade-off or a given technology is important&hellip; So we have specific messages that we&rsquo;d like to land for that, and this is part of the rebrand.</p><p>The third audience is existing Go users. We definitely want to embrace these new audiences, but also embrace our existing audience, and that&rsquo;s the audience that&rsquo;s served us well for ten years. We have key messages targeted towards that audience, as well.</p><p>So I think as you read through this, you&rsquo;ll see&hellip; This is an answer to your question - part of it is conveying maturity; not just in visual, but in our language and everything else. We really wanna communicate the reality that Go is ready for production use, that you&rsquo;re not taking a risk to use it.</p><p>[56:01] One of the challenges and opportunities of joining Google is you get to learn a lot of information that you didn&rsquo;t know as a member of the community. Now I&rsquo;ve got an opportunity to work with many companies who&rsquo;ve embraced Go, some of which have been vocal about it, and some of which have not&hellip; And it&rsquo;s amazing to see the ones who haven&rsquo;t, and how Go adoption is much broader than I ever knew as a community member&hellip; And how these companies have embraced Go, and how often thousands of programmers are using Go within these major companies, that for their own reasons haven&rsquo;t been vocal about talking about that yet.</p><p>We&rsquo;re trying to surface that a bit more, and let people know that Go is ready, and Go is mature, and Go is a safe decision to make. So I hope that answers the question&hellip; I think that part of it is really &ndash; we&rsquo;re trying to target different audiences, with different messages than we have in the past, and a big part of that is letting decision-makers know the value of Go, and how it&rsquo;s not a risky decision to make.</p><p><strong>Carlisia Thompson:</strong> It does answer the question, it makes very good sense&hellip; And it also made me very curious to ask you how is the adoption of Go inside Google now? Has that grown in the past year?</p><p><strong>Steve Francia:</strong> I know we don&rsquo;t talk about things like this. I&rsquo;ll say broadly - Google does not share internal language usage, and I&rsquo;ll just point out what is public already, which is this week we announced<a href="https://github.com/google/gvisor">gVisor</a>, which is a new container runtime that works with Kubernetes and Docker. It is a sandboxed container runtime; it was announced a couple days ago. I believe it might have been announced at<a href="https://events.linuxfoundation.org/events/kubecon-cloudnativecon-europe-2018/">KubeCon</a>, which is also happening this week&hellip; But I think it&rsquo;s been a part of Google for years; we&rsquo;ve just released it. It is I think a industry-transformative; it has the power to transform our industry, particularly in cloud. It brings a brand new approach to running containers in a secure and isolated way, and this entire application is written in Go.</p><p>I think you&rsquo;ll see a lot of core Google projects that are being open sourced that are written in Go, and that&rsquo;s probably the best answer I have for that question.</p><p><strong>Carlisia Thompson:</strong> Thank you. I know why you can say it&rsquo;s limited, but we always try to ask anyway. Someday, somebody will slip, I promise. I promise the listeners&hellip; [laughter]</p><p><strong>Steve Francia:</strong> Yeah, as long as it&rsquo;s not me&hellip; [laughter] Yeah, I encourage people to check out gVisor. You can see it at<a href="https://github.com/google/gvisor">github.com/google/gvisor</a>. You can download it, it&rsquo;s open source. For all those people who are in our&ndash;</p><p><strong>Carlisia Thompson:</strong> I haven&rsquo;t looked at it yet&hellip; What is the equivalent of it out there that I would know?</p><p><strong>Steve Francia:</strong> There isn&rsquo;t any&hellip;</p><p><strong>Carlisia Thompson:</strong><a href="https://kubernetes.io/">Kubernetes</a>? I don&rsquo;t know. What would it be&hellip;?</p><p><strong>Steve Francia:</strong> [01:00:07.01] So it&rsquo;s a brand new approach to securing containers&hellip; And there&rsquo;s a post here that goes through it, but in short, historically we&rsquo;ve used &ndash; in spite of how light containers are and how much power and benefit they bring, they don&rsquo;t provide good isolation. It&rsquo;s not one of their strengths, it&rsquo;s not part of the design. So historically, there&rsquo;s been two approaches that were used to provide that kind of isolation to them. One is to use virtual machines to emulate hardware, and that approach is expensive, but effective.</p><p>There&rsquo;s a second approach, which is a rule-based execution, which is using things like SELinux and AppArmor. gVisor creates a third approach, that takes some of the advantages of each, but it takes a more simple approach. It&rsquo;s a lot lighter than the virtualized approach, and it&rsquo;s simpler than the AppArmor approach. Again, it&rsquo;s a runtime for containers in a secure way, that works with Kubernetes and works with Docker.</p><p><strong>Carlisia Thompson:</strong> Cool. I see now what you&rsquo;re saying.</p><p><strong>Steve Francia:</strong> I encourage people to read the [post](<a href="https://cloudplatform.googleblog.com/2018/05/Open">https://cloudplatform.googleblog.com/2018/05/Open</a> sourcing-gVisor-a-sandboxed-container-runtime.html), the readme around it. It&rsquo;s transformative in the way that it&rsquo;s gonna make containers&hellip; In my mind, it&rsquo;s really &ndash; and I&rsquo;ve been part of the containers space for a very long time&hellip; This really is the project that tackles the biggest gap in what containers can do. With gVisor, I think containers are in a place where they really are the future, and there&rsquo;s no more gaps. gVisor closes the last gap.</p><p><strong>Erik St. Martin:</strong> Yeah, I&rsquo;m actually really excited about it, and I&rsquo;m kind of sad I haven&rsquo;t got to play with it yet. Just getting back from Chicago and getting caught up, and about to leave for Seattle, so I&rsquo;m like, &ldquo;Nooo&hellip;.!&rdquo;</p><p><strong>Steve Francia:</strong> Airplanes are good places to do work. You&rsquo;ve just gotta download stuff, because Wi-Fi is not that good.</p><p><strong>Erik St. Martin:</strong> This is true.</p><p><strong>Steve Francia:</strong> Yeah, it&rsquo;s fun to play with, and to look at&hellip; You know, written in Go.</p><p><strong>Erik St. Martin:</strong> So I know we were running short on time&hellip; Do we have time for projects and news? Probably not. We might have to skip to #FreeSoftwareFriday.</p><p><strong>Adam Stacoviak:</strong> We&rsquo;ve got about two minutes on the clock.</p><p><strong>Erik St. Martin:</strong> Two minutes on the clock&hellip; Alright, how fast can we do this? So gVisor was in the projects and news thing, and Steve mentioned it. Go 1.10.2 and Go 1.9.5 is out&hellip; There will be a link in the show notes to this really cool<a href="https://github.com/golang/go/blob/master/src/cmd/compile/README.md">intro to the compiler</a>, that is actually in the Go GitHub repo.</p><p>I found a cool project called<a href="https://github.com/ericfreese/rat/blob/master/README.md">Rat</a>, we&rsquo;ll link to that in the show notes. That&rsquo;s a cool way of like running multiple commands and windowing them side by side, and then annotating them based on kind of patterns that show up in there. So that&rsquo;s super cool. I think that&rsquo;s everything&hellip; Did I get it in two minutes? [laughs]</p><p><strong>Adam Stacoviak:</strong> Let&rsquo;s see&hellip; You have&hellip;</p><p><strong>Carlisia Thompson:</strong> Let&rsquo;s say so.</p><p><strong>Adam Stacoviak:</strong> Yeah, 35 seconds left.</p><p><strong>Erik St. Martin:</strong> That should be a segment, once in a while&hellip; As fast as you can, 60 seconds or 120 seconds, as many things as you can mention&hellip;</p><p><strong>Adam Stacoviak:</strong> Go in two minutes. I like it.</p><p><strong>Erik St. Martin:</strong> [01:04:05.26] Alright. So #FreeSoftwareFriday - did anybody have anyone or anything they wanna give a shout-out to?</p><p><strong>Carlisia Thompson:</strong> No&hellip;</p><p><strong>Erik St. Martin:</strong> I&rsquo;ve got a good one&hellip;<a href="https://twitter.com/b0rk">Julia Evans</a> - if you&rsquo;re not following her on Twitter, you should, but she always puts out these amazing little graphic cards, explaining complex things in very easy to digest ways. Speaking of her, she&rsquo;s releasing a zine with (I think there&rsquo;s like) 20 or something of them in there, called Bite Size Linux. We will<a href="https://gumroad.com/l/bite-size-linux">link</a> in the show notes to where you can pick that up if you wanna give her some love.</p><p><strong>Adam Stacoviak:</strong> Excellent.</p><p><strong>Steve Francia:</strong> I&rsquo;ll give a shout-out to &ndash; so we had, as I mentioned, GothamGo just last week, and I saw a brilliant talk from<a href="https://twitter.com/deadprogram">Ron Evans</a> about<a href="https://gocv.io/">GoCV</a>. Ron Evans - I know he was on podcast very recently (maybe even last episode), but we know him from<a href="https://gobot.io/">Gobot</a> and all the work he does with Go and embedded, and as part of that he started working on Go vision stuff - detecting different faces, and it can do different [unintelligible 01:05:30.12] and he gave a really interesting talk.</p><p>I&rsquo;ll give one more - there was another talk by a man named<a href="https://github.com/ajstarks?tab=repositories">Anthony Starks</a> about Go SVG. I was blown away by this talk. The amount of work that he&rsquo;s done with<a href="https://www.youtube.com/watch?v=ze6O2Dj5gQ4">SVG in Go</a> was phenomenal, and the maturity of the libraries that he&rsquo;s built is just &ndash; I was blown away by it. So big shout-out to both of them. I learned about these projects and I just wanna pass them along, because I&rsquo;m excited to play with both of them.</p><p><strong>Erik St. Martin:</strong> Yeah, and Ron is an absolute trip to hang out with. So if you&rsquo;re ever at a conference he&rsquo;s at, walk up and talk to him, it&rsquo;s amazing. At GopherCon we always do a Gobot room that he hangs out in.</p><p><strong>Adam Stacoviak:</strong> I met Ron a couple years back, I wanna say potentially our first year there&hellip; I don&rsquo;t know, I can&rsquo;t remember, but I just remember thinking like &ldquo;This guy is fascinating!&rdquo; Anyways&hellip; That&rsquo;s Ron. Always a pleasure.</p><p><strong>Steve Francia:</strong> I&rsquo;m gonna put a link to Anthony&rsquo;s GitHub account in the Slack channel. He also built this amazing<a href="https://github.com/ajstarks/deck">tool to generate slide decks</a>, and he presented with it, and his was by far the prettiest one there. Frankly, for me - I can&rsquo;t stand XML, I try to avoid it as much as possible, but that&rsquo;s why I&rsquo;m glad people like Anthony exist&hellip; They make nice libraries so I don&rsquo;t have to write XML.</p><p><strong>Erik St. Martin:</strong> Alright, so I think we are about at time, or probably over&hellip; But Adam, the producer, is on the show, so he can&rsquo;t really give us a hard time about that.</p><p><strong>Adam Stacoviak:</strong> Nope. Nope.</p><p><strong>Steve Francia:</strong> I wanna say I&rsquo;m thrilled you all had me on the show, because it gave me a chance to tell the story around the branding, that it was clear that it needed to be told, and the blog post didn&rsquo;t come close to telling the story of how we created it, and why we created it, and all of the depth in that brand book. I hope that people take the opportunity to really read it. We spent &ndash; I can&rsquo;t tell you how many countless hours. The Go team invested a considerable amount of time in writing that document, because we consider it of the highest value to the project. And to be able to tell that story - I&rsquo;m very grateful to be able to be on this show today.</p><p><strong>Adam Stacoviak:</strong> [01:08:22.10] I&rsquo;ll say you&rsquo;ve got an open invite&hellip; When you have things like this, this important to the Go community at large, I would welcome even collaboration to give you all an opportunity to come on a show like this, that hopefully communicates to the largest Go community we can, in a larger podcast form&hellip; So we&rsquo;d welcome having you back on again in the future.</p><p><strong>Steve Francia:</strong> I appreciate it. It&rsquo;s always a pleasure to be here.</p><p><strong>Carlisia Thompson:</strong> Yeah, keep this in mind, because we could time things. For example, it was pure luck that today was the opening; I think it was really good that you came on the show to talk about this. We weren&rsquo;t sure that we were gonna have enough things to talk about, but it turned out that we did, and I thought it was very insightful.</p><p><strong>Steve Francia:</strong> I appreciate it. You&rsquo;re right, it was a&hellip; What do they call it? It was fortunistic. There&rsquo;s a better word for that&hellip;</p><p><strong>Carlisia Thompson:</strong> Opportunistic.</p><p><strong>Steve Francia:</strong> When things just work out right, and this was one of them.</p><p><strong>Adam Stacoviak:</strong> Serendipitous?</p><p><strong>Steve Francia:</strong> That&rsquo;s the word that I was looking for.</p><p><strong>Adam Stacoviak:</strong> There you go. I got your back, Steve, don&rsquo;t worry.</p><p><strong>Steve Francia:</strong> I was like&hellip; I knew I couldn&rsquo;t get it. It&rsquo;s serendipitous that this happened, and you&rsquo;re right, we need to be proactive about it.</p><p><strong>Adam Stacoviak:</strong> Yeah, we&rsquo;re glad to work together however we can to make sure that the Go community at large has the right information to be excited, to be concise, and to be purposeful in their work.</p><p><strong>Steve Francia:</strong> That&rsquo;s what our goal is. We&rsquo;re friendly, genuine&hellip; That&rsquo;s what we&rsquo;re going for. Concise - yes, but not so much in a 45-minute podcast&hellip; But definitely direct and thoughtful, we&rsquo;re trying.</p><p><strong>Carlisia Thompson:</strong> Yeah, it looks like you guys are trying.</p><p><strong>Erik St. Martin:</strong> Alright, so I think we are definitely over now, so I suppose that we should wrap things up. Thanks so much for coming on, Steve. I&rsquo;m really glad we got to talk about that, and to talk about the real reason that the branding was done&hellip; That it wasn&rsquo;t so much about the logo, and that that was more a by-product of the core thing that you all were going for. Hopefully this clears up a lot.</p><p>So thanks, Steve, for coming on the show, thanks Adam for jumping in with us - it&rsquo;s always fun to have you walk out from behind the curtain&hellip;</p><p><strong>Adam Stacoviak:</strong> I try.</p><p><strong>Erik St. Martin:</strong> And as always, thank you to all of you, the listeners. Definitely follow us on<a href="https://twitter.com/GoTimeFM">Twitter</a>. You can hit us up at<a href="https://github.com/GoTimeFM/ping">ping</a> to give suggestions for guests or topics, and with that, goodbye everybody! We&rsquo;ll see you next week.</p>
]]></content:encoded></item><item><title>Go Developer Survey</title><link>https://spf13.com/p/go-developer-survey/</link><pubDate>Thu, 09 Mar 2017 00:00:00 UTC</pubDate><guid>https://spf13.com/p/go-developer-survey/</guid><media:content url="https://spf13.com/p/go-developer-survey/front.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/go-developer-survey/front.jpg"/><description>&lt;p>I joined GoTime to talk about the results of the 2016 Go Developer Survey and other interesting Go projects and news.&lt;/p>
&lt;p>Listen to the podcast at &lt;a href="https://changelog.com/gotime/38">https://changelog.com/gotime/38&lt;/a>&lt;/p>
&lt;h2 id="transcript">Transcript&lt;/h2>
&lt;p>&lt;strong>Erik St. Martin:&lt;/strong> Welcome back, everybody, to another episode of GoTime. Today&amp;rsquo;s episode is number 38, and our sponsors for today are Backtrace and the Ultimate Go Training Series. Today on the show we have myself, Erik St. Martin, Carlisia Pinto is also on the show - say hello, Carlisia&amp;hellip;&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/go-developer-survey/front.jpg" alt="Go Developer Survey"/><p>I joined GoTime to talk about the results of the 2016 Go Developer Survey and other interesting Go projects and news.</p><p>Listen to the podcast at<a href="https://changelog.com/gotime/38">https://changelog.com/gotime/38</a></p><h2 id="transcript">Transcript</h2><p><strong>Erik St. Martin:</strong> Welcome back, everybody, to another episode of GoTime. Today&rsquo;s episode is number 38, and our sponsors for today are Backtrace and the Ultimate Go Training Series. Today on the show we have myself, Erik St. Martin, Carlisia Pinto is also on the show - say hello, Carlisia&hellip;</p><p><strong>Carlisia Thompson:</strong> Hi, everybody.</p><p><strong>Erik St. Martin:</strong> And standing in for Brian today we have Johnny Boursiquot.</p><p><strong>Johnny Boursiquot:</strong> Hey, hey.</p><p><strong>Erik St. Martin:</strong> And our special guest today is a long-time member of the Go community and has a number of well-known projects that I&rsquo;m pretty sure all of us have used. He recently became the community manager for the Go team&hellip; Please welcome Steve Francia.</p><p><strong>Steve Francia:</strong> Hey!</p><p><strong>Erik St. Martin:</strong> So how&rsquo;s things in the Go community management world? Actually, give everybody a little bit of a background on yourself first, for anybody who might not be familiar with you already.</p><p><strong>Carlisia Thompson:</strong> And tell us your correct title, because I don&rsquo;t think that&rsquo;s it.</p><p><strong>Steve Francia:</strong> That is not my correct title&hellip; We can start there. My correct title isn&rsquo;t all that accurate either, but I&rsquo;m the Go team technical program manager, with an emphasis on the external usage of Go. But it&rsquo;s really an interesting role that does have community management as a part of it. Also, a good element of it is product management. Largely, I&rsquo;m working to be a voice for the Go users to the Go team, and help strategically align the Go project in a scalable way, that meets the needs of all of its users.</p><p><strong>Erik St. Martin:</strong> So this is from the perspective of people outside of Google itself, and their usage of Go and their needs, as opposed to internal&hellip;?</p><p><strong>Steve Francia:</strong> It&rsquo;s all-purpose, but it&rsquo;s not specific to Google&rsquo;s needs. I treat Google like every other company that uses Go. We definitely are listening to their needs, but I&rsquo;m not focused on those needs any more than I am any company that uses Go.</p><p><strong>Johnny Boursiquot:</strong> So do you have a counterpart inside of Google who is focused on what Google needs from Go? Or how does that strategy work out?</p><p><strong>Steve Francia:</strong> There&rsquo;s another project manager that&rsquo;s focused on cloud usage, and he does both internal, but primarily external usage. I don&rsquo;t know if we have yet, but we&rsquo;re looking to bring in someone similar to work with internal users and understand them a little better. But for the last few months, I&rsquo;ve been kind of juggling both, and not well. I have to prioritize all users, versus just one set.</p><p><strong>Johnny Boursiquot:</strong> I remember when you first joined in this capacity at Google, one of the very first things you were involved in was the whole dependency management conversation.</p><p><strong>Steve Francia:</strong> Yeah.</p><p><strong>Johnny Boursiquot:</strong> Is that something that you&rsquo;re sort of pushing internally, or did you just sort of bring it in as something to be addressed and then move on to other things? How does that relationship between the community and you advocating on our behalf to Google - how does that work, typically?</p><p><strong>Steve Francia:</strong> [04:02] As someone &ndash; we didn&rsquo;t really go into my background yet, so I&rsquo;ll speak briefly to it, because it&rsquo;s a good introduction to this topic. Prior to joining Google and the Go team at Google, I ran engineering in open source at Docker, and before that I ran engineering and lead open source in the developer experience at MongoDB. At Mongo I first discovered Go, we adopted it for a number of our projects there, and I personally fell in love with the language and started working on some side projects, some of which have grown far larger than I ever would have expected them to.</p><p><a href="https://github.com/gohugoio/hugo">Hugo</a> is one of them, it&rsquo;s a website generator. When I sat down to write it, I knew how I wanted it to work, but there was libraries that I needed to create it that didn&rsquo;t exist yet, so I wrote a number of libraries in tandem with Hugo. One of them is called<a href="https://github.com/spf13/cobra">Cobra</a>, another is called<a href="https://github.com/spf13/viper">Viper</a>. Those have really been broadly adopted through the Go community. So I came in from having a unique perspective of using Go both for personal side projects, as well as in a company environment, and having had those experiences, I was pretty familiar with some of the pains and rough edges, and dependency management was one. I highlighted that one with the team&hellip; It wasn&rsquo;t something that the team wasn&rsquo;t already aware of.</p><p>The team does listen to the users and tries to understand&hellip; One of the challenges is that the team works inside the Google infrastructure, so dependency management was something that they didn&rsquo;t have their own intimate familiarity with, in the same way that the users experience it.</p><p><strong>Erik St. Martin:</strong> I think also in addition to that though, there&rsquo;s also a distinction for who&rsquo;s responsibility is it, right? Is dependency management part of the language or not, right?</p><p><strong>Steve Francia:</strong> Yeah. Through a series of conversations we&rsquo;ve tried a couple different things. One was we formed a working group, and I was closely part of this;<a href="https://twitter.com/peterbourgon">Peter Bourgon</a> really drove this effort, to kind of address this need. It was a combination of people from the community and the Go team working together on it. Through that we&rsquo;ve done a lot of diligence, had lots of conversations with different users trying to understand those needs&hellip; We&rsquo;re working on a prototype which has been released, and we&rsquo;re also looking at &ndash; I think we&rsquo;re coming to the conclusion that for it to really work, it needs to be something that the Go tooling is aware of.</p><p>I&rsquo;m not sure what conversation or experience arrived at that, but that was a critical thing for us to understand, because all the efforts by the community can only go so far. Without the Go leadership understanding the need, and realizing that it&rsquo;s something that to really be successful we need to make all of the tooling aware of, they could never bridge that gap. So getting the understanding to the team was a critical milestone in this.
There&rsquo;s still a long road ahead to delivering the right solution, but the work that the working group is doing is a huge first step towards that.</p><p><strong>Carlisia Thompson:</strong> Just to get that straight&hellip; Peter Bourgon was leading the design and the specs, and<a href="https://twitter.com/sdboyer">Sam Boyer</a> is leading the implementation - is that right?</p><p><strong>Steve Francia:</strong> [07:57] I wouldn&rsquo;t frame it that way. I think Peter&rsquo;s leading the efforts. Peter is the one who really got the group together and ensured that they had meetings regularly and kind of set up the schedule. I&rsquo;d call him more like a project lead. There&rsquo;s four people on the working group; I think Sam is definitely one of the active people in that, but there&rsquo;s four of them. I think they&rsquo;re all contributing quite a bit. I&rsquo;m not sure if one of them is the lead of it over another, but I know they all meet regularly and are building stuff together.</p><p><strong>Carlisia Thompson:</strong> Yeah, we had him talking to us two I think.</p><p><strong>Erik St. Martin:</strong> Yeah, I think it was two episodes back. Yeah, I think Sam focused on the packaging solver, kind of like the dependencies.</p><p><strong>Steve Francia:</strong> Yeah, Sam loves GPS and that problem, and he&rsquo;s really spent a lot of time on it, so it makes sense that he&rsquo;d be focused on it.</p><p><strong>Carlisia Thompson:</strong> And I don&rsquo;t want to leave a question unanswered&hellip;<a href="https://twitter.com/corylanou">Cory LaNou</a> is asking who is the person on the Google Cloud&rsquo;s side that&rsquo;s doing the work of advocacy? I think that must be<a href="https://twitter.com/francesc">Francesc Campoy</a>?</p><p><strong>Steve Francia:</strong> Yeah, Frances is the advocate for all of Go and Google Cloud, as well.</p><p><strong>Carlisia Thompson:</strong> Got it.</p><p><strong>Erik St. Martin:</strong> Recently - this was just a couple of days ago - you had published a survey from 2016 on the Go blog. I&rsquo;d love to chat a little bit about that and maybe some of the things that surprised you, some of the things that you&rsquo;re proud about, things that you wanna work on in the future based on what you observed from this.</p><p><strong>Steve Francia:</strong> Yes, so for those who aren&rsquo;t familiar, the Go team has never done a survey of this kind before, and it was a pretty massive undertaking; to be honest, I&rsquo;ve never done a survey of this kind before either, but I recognize that there was definitely a need to get data from our users and to listen to them and to collect as much information as we could. So we set out to create a survey and to get our users&rsquo; voices heard, and we did. We went through and we created a survey, we refined it through user testing and sent it to the community, and we had a phenomenal response. Over 3,500 people responded to the survey and we gained lots of insights into the different ways that we can address the needs of the Go community.</p><p>I will say a lot of the things that we learned were confirmations of the things that we had already suspected, but by doing a survey, it gave us great metrics around knowing&hellip; Like, &ldquo;Okay, we know this is a problem for some users&hellip; Now we know this is a problem for 30% of users&rdquo;, where before it was somewhat speculative how big of a problem different things were.</p><p>So a lot of the things were reinforcement, but also giving a lot more accuracy into the extent of some of the challenges that we had. And of course, there were some new things that surprised &ndash; I won&rsquo;t speak for the whole Go team, but there were definitely things in here that surprised me when I saw them.</p><p><strong>Erik St. Martin:</strong> I think the other thing that doing the survey and having the metrics works well for is being able to basically timeline it out and to look next year and see how much you&rsquo;ve grown and solved some of these problems. Prior to that, like you said, it&rsquo;s all been speculation.</p><p><strong>Steve Francia:</strong> I think one of the great things here is we do establish a baseline, and we&rsquo;re able to see progress and how the community and user base evolves over time.</p><p><strong>Erik St. Martin:</strong> Yeah, one of the things I was surprised to see was more than half of the participants use Go at work, and we can only speculate about a couple of years ago, but I&rsquo;d have to venture a guess that there were a few big companies using Go in 2013-2014, but I&rsquo;d say most people were probably hobbyists back then&hellip; It certainly wasn&rsquo;t half.</p><p><strong>Steve Francia:</strong> [12:05] Yeah, if we go back&hellip; It depends how far we go back, but there was certainly a point - probably around the first GopherCon - when it was clear that Go was of interest to a large group of people, and yet the adoption wasn&rsquo;t quite there. And that&rsquo;s a normal growth curve of any technology - companies won&rsquo;t adopt something if there&rsquo;s not people that can do it, that know how to use it, so it really has to start with people&rsquo;s interest.</p><p>I guess we were all fortunate that Go developed the interest, and as we&rsquo;ve seen it progress, companies are adopting Go more and more readily, so more and more users are being paid to write Go.</p><p><strong>Erik St. Martin:</strong> What do you think the developer pool looks like right now? Obviously, you can only speculate there, but do you think that people have a hard time finding Go developers right now?</p><p><strong>Steve Francia:</strong> I think there&rsquo;s a number of different factors to this. The first one is Go is actually a really easy language to learn and to pick up, and especially to read. This makes it so that a lot of companies aren&rsquo;t looking for Go developers; they&rsquo;re transitioning existing developers to Go, and that&rsquo;s a viable option. We&rsquo;re seeing that a lot across a lot of companies.</p><p>It&rsquo;s also the case that we don&rsquo;t have a great marketplace yet to find Go developers, especially ones with experience, because Go is relatively young, so a lot of job requisites&hellip; You need to have 5-10 years Java experience, or whatever the language is. It&rsquo;s gonna be very hard to find a Go developer with five years experience; there&rsquo;s just not that many out there, as the language is pretty young.
So it&rsquo;s kind of an interesting dynamic&hellip; I think in time this is one of the things that will definitely sort itself out, but it&rsquo;s pretty easy to adopt Go, and at the same time, the language being so young, it&rsquo;s hard to find people with many years of experience.</p><p><strong>Johnny Boursiquot:</strong> This is where I think that obviously the makeup of the community is critical as well. I think in my travels to the Go community I find very enthusiastic people within the community. They&rsquo;re passionate about the language, and beyond that, they&rsquo;re passionate about building a great community. If you&rsquo;re attracting people who not only care about the language, but they also care about bringing everybody else, basically attracting other people into the community, you&rsquo;re gonna help solve this supply versus demand problem that obviously the business is gonna be looking at.</p><p>We do a lot within the Go community, whether it&rsquo;s through meetups or through community events&hellip; There&rsquo;s a lot going on to attract people to the community. I think that&rsquo;s gonna help a lot.</p><p><strong>Steve Francia:</strong> Yeah, I think it&rsquo;s always a chicken and the egg problem here, but I think we&rsquo;ve got a great community and really passionate people that love the language. And yes, a little more than half are using Go at work, which is great, but slightly higher is the number of people who are programming Go outside of work. These are mostly people who do it out of passion, and I think that just speaks to &ndash; these are people that love to program and they found a language that they really love using, and that&rsquo;s something that other people see and they catch on.</p><p>I think there&rsquo;s some work that we need to do to make Go &ndash; around the resources&hellip; Not really changing the language, but better resources and more support around our new users, but I think there&rsquo;s a lot of the core ingredients there that make Go just a wonderful language, and people are gonna adopt it; people are already adopting it at a pretty brisk pace and I think that&rsquo;s gonna continue.</p><p><strong>Carlisia Thompson:</strong> [16:20] There is so much to talk about community, and there&rsquo;s a lot about community in the survey&hellip; One thing that caught my attention related to community is a question that says, &ldquo;What is the biggest challenge facing the Go project today?&rdquo; and the top answer with about two percent (there were many answers to that) was &ldquo;community.&rdquo; I don&rsquo;t know what that could mean&hellip; Do you have an idea, Steve?</p><p><strong>Steve Francia:</strong> Yeah, so one of the challenges we have with the survey is it&rsquo;s really easy to present accurate results with multiple choice, or questions with already determined answers. And questions that had open text box answers - it&rsquo;s much harder to present that data. What we&rsquo;ve done here is really kind of a simple metric - how often a given word appeared. In this specific question you&rsquo;re talking about, there really wasn&rsquo;t anything that could be gleaned by using that approach. There were just too many words and not enough consistency across them.</p><p>Reality is I was able to read all of the answers to every question, and there were tens of thousands of comments that people left. In this specific question there really wasn&rsquo;t a theme that emerged. I don&rsquo;t think there are things that the users really fear as big challenges the Go project faces.</p><p>I think there was a bunch of comments that people expressed, and a lot of them were even comments that said, &ldquo;Because of this, we don&rsquo;t really have concerns.&rdquo; So in this specific question, there&rsquo;s not a lot you can gain from that chart.</p><p><strong>Erik St. Martin:</strong> Alright&hellip; Because basically if I said &ldquo;The community needs to come to a consensus on dependency management&rdquo;, dependency management is actually the thing that should be bumped up, not the word &lsquo;community&rsquo;, right?</p><p><strong>Steve Francia:</strong> Yeah, exactly. A good example of a question where this did work well is when we asked people about what would improve the Go documentation. Overwhelmingly, the most common word was &rsquo;examples&rsquo;. In reading through the hundreds of responses that we got to that, it was very clearly the case that users want more examples. With that chart, popular word did demonstrate pretty well what people expressed.</p><p><strong>Carlisia Thompson:</strong> Yeah.</p><p><strong>Johnny Boursiquot:</strong> Along those lines&hellip; The survey tried to also gauge what other languages are people coming from, that are sort of adopting Go. I&rsquo;d be interested in your take of whether Go itself is seen as an elitist language, that it attracts a certain kind of developer or a certain kind of individual with previous experience in another programming language, be it dynamic or static. Do you think that Go is a good language for beginners and people who have never programmed before? Do you think there are things that we can do to attract the brand new to programming folks to the language, to the community?</p><p><strong>Steve Francia:</strong> I heard a few different questions there, and I&rsquo;ll try and address each of them. For me, one of the big surprises from the survey was often I think of Go - and I think most of us do - as a language that people convert to from a different language&hellip; Mostly because Go is such a new language, most people already learned another language and they&rsquo;re coming to Go. And they bring with them - just like learning any new language - the foundation.</p><p>[20:19] I think one of the interesting things that I learned from the survey was one-third of the people who said that they had experience in Go said that that was the language they had the most experience in, more than any other language. This for me conveyed the idea that Go isn&rsquo;t just a language for people to convert to. It&rsquo;s a language that people are learning programming through, that they&rsquo;re coming to for the first time, or it&rsquo;s a language they&rsquo;ve spent the most - I won&rsquo;t say most time in, because we asked expertise, and time isn&rsquo;t a very accurate measure of expertise, but it&rsquo;s the language that they felt they had the most knowledge about, and they felt the most comfortable using.
I think that was really interesting&hellip; I didn&rsquo;t expect that, and partly, I guess, I come in with my own perspective. I knew a good number of languages before Go, but it&rsquo;s interesting that a lot of users consider it their language of most experience. In fact, more users were in that bucket than any other bucket.</p><p><strong>Erik St. Martin:</strong> I&rsquo;m actually really surprised by that, because I probably come in with the same preconceptions, that most of us have experiences with other languages, we have years of history with those languages, so it takes a long time for our skill in Go to overtake our knowledge in a language we came from. So that&rsquo;s actually really surprising to hear that. People are getting more experience and expertise in Go than the languages they came from.</p><p><strong>Steve Francia:</strong> For me what I realized was a lot of people are coming from dynamic languages. JavaScript and Python are the two biggest languages; there&rsquo;s others in the list, but there are definitely some properties of dynamic languages that differ from Go. If we look at a lot of the documentation, the experience that the Go project has catered to with its early adopters, it wasn&rsquo;t as much the dynamic languages. For me, that was one thing that I learned through this. The second thing was what we just talked about, that a lot of people are coming to Go for the first time, or that their Go experience has eclipsed their experience in other languages.</p><p><strong>Erik St. Martin:</strong> I think it&rsquo;s about time for our first sponsored break, but after that I wanna chat a little bit about the way people are using Go, because I found some of that stuff interesting, too. Our first sponsor for today is Backtrace.</p><p><strong>Break:</strong> [22:54]</p><p><strong>Erik St. Martin:</strong> Alright, we are back talking to Steve Francia, and we&rsquo;re talking about the 2016 survey results and some of the stuff that we find interesting there. Before the break I mentioned the uses of Go. One of the things that I actually found surprising was that web development actually seemed to overtake systems programming on there, because it felt at least in the early days that people struggled with how to do web stuff, because - as we were discussing - a lot of people come from JavaScript and Python and Ruby into Go, so they&rsquo;re used to having things like Django and Rails and things like that. So I actually find it interesting that web development is the leader in the uses.</p><p><strong>Steve Francia:</strong> [24:25] I&rsquo;ll clarify a little bit&hellip; We asked two questions, and they&rsquo;re easy to mix up because they&rsquo;re very related. One was &ldquo;What areas do you work in?&rdquo; and in that one, web development was overwhelmingly the number one option. If I think about that&hellip; I work for Google - is that a web development company? It probably is.</p><p><strong>Erik St. Martin:</strong> That&rsquo;s fair.</p><p><strong>Steve Francia:</strong> Google probably checks a lot of these boxes, actually&hellip; But the internet is such a prevalent part of what people do&hellip; At first I was surprised by that, but the more I thought about it &ndash; you know, there&rsquo;s a lot of companies that are in web development, and this was one of the questions where you could pick as many answers as you wanted, so it does apply pretty broadly.</p><p>But there&rsquo;s another question, &ldquo;What do you write in Go?&rdquo; and in this one &ldquo;web services&rdquo;, defined as a service returning HTML, was still over 50% of what people used Go to create. Now, this was another one where the total percentage is added up far more than a hundred, because people could choose more than one. But I think it&rsquo;s illustrative. There&rsquo;s no question people are creating web services with Go, and in large amounts.</p><p><strong>Erik St. Martin:</strong> And even though they don&rsquo;t rank as high on the list, other surprising ones that were in there were embedded devices, people writing Internet of Things devices using Go.</p><p><strong>Steve Francia:</strong> Yeah&hellip; It was interesting the spectrum that &ndash; in the options that we asked, a lot of them were well represented. It showed a lot more diversity than I expected. I&rsquo;ll just speak for myself there, I was surprised by the diversity of the different areas that people worked in and used Go.</p><p><strong>Erik St. Martin:</strong> Yeah. I&rsquo;ve heard of some embedded stuff and security stuff, but I didn&rsquo;t think that it was enough to register. I didn&rsquo;t think it would show up, I thought it would be lumped into other&hellip;</p><p><strong>Carlisia Thompson:</strong> So when you look at these answers in particular, Steve, do you have a feeling that the answers that are more popular by the areas where you want to invest in, or the opposite, you wanna bring up the areas that are less popular?</p><p><strong>Steve Francia:</strong> It&rsquo;s a good question&hellip; I honestly don&rsquo;t think popularity was a big factor for what we were gonna invest in, alone; I think it&rsquo;s a combination of looking at where our weaknesses are, and comparing that to what the demand is for those things, and trying to pair those together. A lot of this post identifies some of our (I&rsquo;ll call them) challenges that we have ahead of us.</p><p>One of the things that I felt best from this was most of the challenges, the vast majority of the challenges identified were ones that were (I&rsquo;ll call them) growing pains for a new technology that&rsquo;s really emerging into the mainstream. Not many of the challenges were really fundamental things. In fact, I would posit that none of them were things that were fundamental to the language or the ecosystem. So it gave me a lot of confidence knowing, &ldquo;Yes, like everything, we have challenges ahead of us, but to meet those challenges, it&rsquo;s gonna require effort from us and the community to do it.&rdquo; But they&rsquo;re not fundamental things that we can&rsquo;t fix.</p><p>[28:12] I think if we look at the challenges, many of them would apply across all of those industries, or most of those industries. There were not many challenges that we looked at that applied only to one.</p><p><strong>Carlisia Thompson:</strong> And what challenges are these that you&rsquo;re thinking about?</p><p><strong>Steve Francia:</strong> For me, from reading through all this, I think we identified a number of challenges. When we asked people what changes would improve Go most, they identified pretty clearly what I think are two of our biggest challenges. One is the lack of generics. I know sometimes we feel like it&rsquo;s a broken record, but we recognize it&rsquo;s a challenge. The Go team&rsquo;s stance hasn&rsquo;t changed, it continues to be that we&rsquo;re looking into a solution there.</p><p>Package management was the second highest identified change that would improve Go the most. Now, we look beyond those, just what would improve Go, and we see another picture of people&rsquo;s user experience. When we asked people what&rsquo;s the biggest challenge they face using Go, it kind of shed some new light on people&rsquo;s individual challenges. Some of the things that were identified in that were &ndash; there&rsquo;s a steeper learning curve, and our documentation and tutorials are lacking. As we talked about, examples was a big part of that.</p><p>There&rsquo;s also something that came forward here, which was it&rsquo;s not the easiest thing for users to convey the value of Go to other people, particularly to their management. I think there&rsquo;s a lot of things we can do there, but one of the things that I thought of (pretty obvious) was there&rsquo;s a lot of companies that are using Go for lots of different things that most people don&rsquo;t have any idea about. I think it would do our whole ecosystem a lot of good to talk to these companies, get them - if they&rsquo;re willing - to do a case study and post that in a central place.</p><p>I think there&rsquo;s a lot of places where we can point to, you know, &ldquo;This company is using Go, and how it transformed them. This other company, because of Go, they were able to reduce their costs. Because of Go, this other company, they were able to deliver a project much faster than they would have with their existing systems.&rdquo;</p><p>I think that there&rsquo;s a lot that we can do to just surface some of the great things that Go is already doing. That will help some of these challenges.</p><p><strong>Erik St. Martin:</strong> Is there somewhere like a canonical place for case studies for people who do that? I know we commonly see them pop up on Reddit and Hacker News, and reduced from 2,000 servers to two and things like that, but I don&rsquo;t think there&rsquo;s a single place that we could point an executive to show them a bunch of case studies.</p><p><strong>Steve Francia:</strong> There isn&rsquo;t that I&rsquo;m aware of today, but I believe that there will be some time during 2017, or at least I&rsquo;d like there to be. Go is changing - or I&rsquo;ll say the audience for Go is changing a bit. If you look at our web page and the material around it, it hasn&rsquo;t changed in a number of years. It&rsquo;s really catered towards the early adopter, and the early adopter is not our audience anymore. The early adopters adopted it, and now we&rsquo;re going for the later adopters, the more mainstream adopters, and more of the decision makers. So I think there&rsquo;s work to be done on adjusting our messaging to match the audience of today, and I think case studies is a part of that.</p><p><strong>Erik St. Martin:</strong> [32:14] Yeah, and it&rsquo;s difficult too, even just in the convincing teammates thing. Even people who have been in the Go world for a number of years, it&rsquo;s &ldquo;Give me your elevator pitch for why you should use Go&rdquo;, and it&rsquo;s really hard to think of just like a silver bullet; it&rsquo;s all the little things combined that make it so great to work with.</p><p><strong>Steve Francia:</strong> I don&rsquo;t wanna misquote our users, but I think what came through from reading all the commentary was people that use Go really love it. I think it was pretty clear, like &ldquo;If you try Go, you&rsquo;ll see why&rdquo;, but it&rsquo;s hard to convey that until you try it. And I think you articulated well why - it&rsquo;s not like there&rsquo;s two things that we can &ndash; &ldquo;Well, Go does this, so you should use it.&rdquo; It&rsquo;s really a bunch of little things that come together to really make a great experience.</p><p><strong>Carlisia Thompson:</strong> I usually tell people that they have to try it and stick to it for a while, so they can get that experience. It doesn&rsquo;t come right away; it&rsquo;s not like you write a Hello World little program and you get it.</p><p><strong>Erik St. Martin:</strong> But there&rsquo;s a struggle in learning or adopting any technology, and you need to&hellip; I think Katrina Owen put it really well during her talk, it&rsquo;s like &ldquo;Your need for learning it needs to overcome your need to quit.&rdquo; You have to have a reason to wanna learn that so bad that you kind of suffer through what you find to be oddities in the language because it&rsquo;s different than what you&rsquo;re used to for you to get the comfort and the love for the language. So I think that it&rsquo;s really hard to just &ndash; it&rsquo;s like convincing somebody to use Vim. I can tell them, &ldquo;No, it&rsquo;s great. You&rsquo;re gonna be super productive in it&rdquo;, and they&rsquo;re still gonna look at me like, &ldquo;Yeah, but the learning curve&hellip;&rdquo;</p><p><strong>Steve Francia:</strong> Yeah, I think that&rsquo;s well put, and there&rsquo;s really two different ways to address that, and if we do it right, we&rsquo;ll address them both. One is reduce that learning curve. Get rid of a lot of the parts that are painful for people; make it easier to learn. The second one is demonstrate the value that people would receive from learning this. There&rsquo;s lots of different approaches to doing that, and I think one of them would be highlight or showcase success stories using Go.
I think if we can approach it from both sides, that&rsquo;s definitely something that we collectively as the Go community can help to improve. I definitely know that&rsquo;s something I&rsquo;m gonna be focused on over the next year.</p><p><strong>Carlisia Thompson:</strong> Talking about what you&rsquo;re gonna be focused on over the next year, can you give us an idea of what&rsquo;s in the pipeline, the order, the priorities&hellip;? What&rsquo;s the biggest thing for this year?</p><p><strong>Steve Francia:</strong> For me, my role is really gonna be focused on the user experience and what it means to be a part of our community, and supporting that as much as possible. I can&rsquo;t give you my full playbook for the year, because honestly, I&rsquo;m still writing it. I think it&rsquo;s a very evolving thing, but I can tell you some of the highlights of it.</p><p>One area we&rsquo;re trying to improve is the ability for people to contribute to the Go project, and in additional capacities - not just in programming, but in other capacities. And there&rsquo;s efforts underway to improve that, and we hope to really increase the number of contributors to the Go project.</p><p>We&rsquo;re also trying to build more open and inclusive - we call them community working groups, where people are in an organized working group and are working towards a solution, or to address a need in Go.</p><p>[36:07] This is somewhat new territory for Go, and every community need to figure out how it&rsquo;s going to do this. That&rsquo;s in the place that we&rsquo;re in, we&rsquo;re trying to figure it out&hellip; We&rsquo;re gonna run a little experiment over the next few months with our first inclusive working group, which you&rsquo;ll be hearing about pretty soon. With that, we&rsquo;re hoping to be the prototype that we can use more and more.</p><p>Other things that I&rsquo;m working on is trying to &ndash; well, first, just make sure that all of the events around the world are supported. There&rsquo;s a number of Go conferences which all of you on the call know about, as all of you are responsible for at least one of them, and so am I. So we&rsquo;re all responsible for at least one of them&hellip; So there&rsquo;s the conferences, and then there&rsquo;s meetups all over the world. We&rsquo;re trying to get a program set up to support those and make sure that they have all the things that they need.</p><p>Then I&rsquo;m also working pretty hard on the new user experience, what it feels like coming to Go, from the very beginning of going to our website, to installing Go, to going through other things, whether it&rsquo;s the tour or the documentation, but what it is to learn Go. I think that&rsquo;s gonna keep me busy for most of the year, doing those things.</p><p>A lot of these things are somewhat interactive and experimental. We&rsquo;re gonna try things and do experiments. Some of them are gonna work, and we&rsquo;re gonna double down on the ones that do; some of them aren&rsquo;t gonna work, and we&rsquo;re gonna learn why and we&rsquo;re gonna try and continue to evolve our approach.</p><p><strong>Erik St. Martin:</strong> One of the things you mentioned was actually contributing, and I wanted to dig into that a little bit&hellip; But first, let&rsquo;s take our second sponsored break. Our second sponsor for today is Ultimate Go.</p><p><strong>Break:</strong> [38:07]</p><p><strong>Erik St. Martin:</strong> Alright, and we&rsquo;re back, talking to Steve Francia. Before we took the sponsored break, we were talking about your goals for this year, and you had mentioned contribution to the project. That was really interesting, to see how many people felt that they weren&rsquo;t welcome. It really took me off-guard too, because I&rsquo;ve always thought the Go community was very welcoming. Did you get anything from the comments about why people might not have felt welcome? It&rsquo;s overwhelming to look at the project and figure out how to contribute, or is it the community?</p><p><strong>Steve Francia:</strong> [39:42] I&rsquo;ll say what my opinion is about this; I can&rsquo;t speak to if the survey responses &ndash; because we didn&rsquo;t ask this specific question as a free text response, but I think one of the things is, if you look at the Go team&hellip; This is my personal opinion - I look at the Go team and I see Rob Pike, Robert Griesemer and Ken Thompson and Brad Fitzpatrick and Russ Cox&hellip; All of these people - Ian Lance Taylor - just luminaries who had long careers of really successful technologies and books, and it&rsquo;s easy to be intimidated and feel like you can&rsquo;t live up to it, or &ldquo;What value could I add to the efforts?&rdquo;</p><p>I was talking to<a href="https://twitter.com/kytrinyx">Katrina Owen</a> about this, and I asked her &ldquo;How do you feel?&rdquo; and she said, &ldquo;I feel like as long as I&rsquo;m one of the smartest people alive, that I&rsquo;m welcome to contribute.&rdquo; I&rsquo;m paraphrasing her, those weren&rsquo;t her exact words. I kind of felt the same way, and then I became a member of the Go team, and I thought to myself, &ldquo;Well, I guess I am smart enough&rdquo;, but I remember feeling that way before I joined the team. I remember going through this experience of &ldquo;Well, they hired me&hellip; I suppose I am smart enough, and now I&rsquo;m starting to make contributions to the project.&rdquo; But I think it is intimidating, and I think there&rsquo;s also this sense of &ldquo;They don&rsquo;t need my help.&rdquo; And I wanna dispel both of those myths.</p><p>The first one is &ldquo;We do need your help.&rdquo; There&rsquo;s a lot of work to be done, and we absolutely do need more people to contribute. The project will not be successful as it should be without your help. The second one, you are smart enough to contribute, and reality is don&rsquo;t be discouraged when people give you feedback that you need to make changes.</p><p>I&rsquo;ve been fortunate for the last few months to see how the team interacts with each other, and they are constantly giving each other feedback, and it is very normal for people to go through many revisions of something before you get it right. That&rsquo;s how you learn, that&rsquo;s how you grow. The team is willing to give that kind of feedback and invest in people so they will learn. I think it&rsquo;s actually a really great opportunity to be able to make contributions, and even if you don&rsquo;t feel like you&rsquo;re ready today, this is how you become ready. Give it a try, get the feedback and try and do your best. There&rsquo;s also lots of different entry points into the project. I am not qualified to contribute to the compiler or to the linker, and I&rsquo;m not gonna. But there&rsquo;s plenty of areas in the project that I do feel that I can contribute. There&rsquo;s parts of the standard library, there&rsquo;s definitely parts of the website and documentation that I feel that I can contribute to.</p><p>So regardless of your technical experience, there&rsquo;s different areas that you&rsquo;re gonna be able to contribute to, and through that you&rsquo;ll learn the process and you&rsquo;ll get to know the people, and you&rsquo;ll be adding a lot of value.</p><p><strong>Erik St. Martin:</strong> I guess that&rsquo;s a fair observation too, that a lot of people might feel intimidated and embarrassed when their code review comes up, the way they do&hellip; Not everybody perceives the feedback the same way; some people take it more personally, other people see it as a learning opportunity, to learn from people who know and understand the language and the project better.</p><p><strong>Steve Francia:</strong> This is also one of the few questions &ndash; because we were able to segment the data in lots of different ways and try and learn from that&hellip; This was one of the few questions where people that were not active Go users - as defined by they didn&rsquo;t select &ldquo;I use Go at work&rdquo; or &ldquo;I use Go not at work&rdquo;&hellip; So if they didn&rsquo;t select either of those options, this was one of the questions that they actually scored better on. So non-active Go users felt more welcome to contribute to the project than active Go users.</p><p>[44:18] What conclusions can we draw from that? I don&rsquo;t think we can draw exact conclusions, but I think we can speculate that it&rsquo;s likely because they aren&rsquo;t as familiar with the process. You always feel welcome until you&rsquo;re closer, and then you recognize that &ldquo;Oh, this is kind of intimidating.&rdquo;</p><p><strong>Erik St. Martin:</strong> Yeah, and I think some of the other stuff too is there&rsquo;s a lot of quick wins and stuff in the GitHub issues. Some of the Gerrit stuff can get confusing, but there&rsquo;s also a lot of formal papers that go back and forth, and working documents where people will work on&hellip; You know, you always see that the big changes come through that way, and a lot of people aren&rsquo;t used to working in that process either. They&rsquo;re used to taking a ticket and kind of working on it, as opposed to collaborating on a big document or specification before digging in. So I wonder if some of that also adds to the intimidation of what&rsquo;s required to be involved.</p><p><strong>Steve Francia:</strong> Yeah, so for me there&rsquo;s been a bit of a culture shift joining Google and joining the Go team, because most of my background is startups. I&rsquo;m really trying to learn this lesson - the Go team really cares about getting things right and doing things the right way; in startups, there&rsquo;s often pressure to get something now, versus something perfect. I don&rsquo;t say that the Go team strives &ndash; they probably do strive for perfection, but they&rsquo;re trying to do the best job possible. It is a bit of a shift to think, &ldquo;Okay, I felt like this was good enough, but they want me to make four more changes&rdquo;, and at the end of the day, for me, I&rsquo;m trying to learn the lesson &ldquo;This is just making it all better.&rdquo; It makes me look better, having contributed something even of higher quality, but it really is raising the bar for what I&rsquo;m used to. It&rsquo;s interesting to get that feedback&hellip; When Russ gives feedback on things &ndash; I meet with him weekly and I still step back a little and say, &ldquo;Wow, what can I learn from this?&rdquo; And I can&rsquo;t believe I&rsquo;m actually getting feedback from Russ, or Rob, or whoever it is.</p><p>Definitely, part of it is recognize that they&rsquo;re trying to make you or your contributions even better than they are, so it&rsquo;s not about rejecting you or your contributions, it&rsquo;s about helping to make them even better.</p><p><strong>Erik St. Martin:</strong> Yeah, I think it&rsquo;s important to take the feedback constructively, that it&rsquo;s not a personal attack, and it&rsquo;s really hard sometimes. I remember one of the first contributions I ever tried to make - this was a few years ago - several of the Go team I think were going back and forth on the ticket; they each had their own theory on how it should work, and finally I was like, &ldquo;Alright, I give up on this&hellip;&rdquo;, because it was like balling back and forth between the two&hellip; You know, you just take it in stride; you&rsquo;re like, &ldquo;Okay, there seems to be a lot of internal discussion on the implementation of this. This probably isn&rsquo;t the right ticket&rdquo;, and I just kind of moved on to another one. But a lot of people will take that personally, that it&rsquo;s lost time, and it&rsquo;s that and the other&hellip; It&rsquo;s difficult.</p><p><strong>Steve Francia:</strong> There&rsquo;s also an observation that I&rsquo;ve made over the last few months: if there&rsquo;s not a right answer that emerges, the Go team leadership is not against postponing it until there is one. So the need to have something versus the need to have the right thing&hellip; Again, this for me is a bit of a culture shift. There&rsquo;s a lot of things where it&rsquo;s like &ldquo;It would be nice to have this, but we don&rsquo;t really know the right way to do it yet. We&rsquo;re gonna continue to think about it, but we&rsquo;re okay with waiting until we have the right answer.&rdquo;</p><p><strong>Erik St. Martin:</strong> [48:09] That&rsquo;s one of the things when we talk about the little things that are part of the language and the way the team and the community operates&hellip; I think that that&rsquo;s one of the things we can appreciate, because Go doesn&rsquo;t have a lot of baggage and weird quirks because of these things that were just kind of rushed, and now there&rsquo;s tons of code in the wild that requires it, so it can&rsquo;t be removed or fixed.</p><p><strong>Johnny Boursiquot:</strong> *coughs* JavaScript *coughs*.</p><p><strong>Steve Francia:</strong> Yeah, it&rsquo;s been really enlightening to me to see&hellip; So, one of the privileges of my job is to participate in a weekly proposal review meeting, and to see the thought and care that goes into every single proposal, which anyone can make. Anyone can make a proposal as an issue on GitHub, and every single week - or almost every single week - you&rsquo;ve got the Go project leadership reviewing that. They take time and thought and they talk about every single one. And just to see the care and attention that goes into every one of these ideas that are proposed has been just a real treat for me.</p><p><strong>Erik St. Martin:</strong> Johnny, were you about to say something?</p><p><strong>Johnny Boursiquot:</strong> No, I was taking a jab at JavaScript, when you said &ldquo;rushing things out and paying for the consequences later.&rdquo; [laughter] But to your point, Steve, it&rsquo;s hard to interpret tone when you&rsquo;re getting the feedback. Just today I was watching some feedback between Matt Aimonetti, a well-known member of the community, making a suggestion for<code>go vet</code> to raise a flag when you don&rsquo;t have enough members for a SQL when you&rsquo;re reading information back and assigning it to some sort of struct, or whatever it is&hellip; When you don&rsquo;t have enough of these values. So basically, he&rsquo;s raising that as &ldquo;Hey, it would be nice if<code>go vet</code> could flag that.&rdquo;</p><p>The Go team members were then sort of chiming in, going back and forth&hellip; Although it was very cordial, the back and forth was very to the point. There was no sugar coating, it was all about technical details or implications of taking on such a feature. The things that perhaps Matt didn&rsquo;t know about that the Go team knows about&hellip; It was a very quick back and forth.</p><p>From the outside looking in, you&rsquo;re thinking &ldquo;Wow, is the Go team mad at him for making these suggestions?&rdquo;, but I&rsquo;m pretty sure that&rsquo;s not how they&rsquo;re seeing it. It&rsquo;s really just about giving you the raw technical impact of &ndash; that raw feedback. There was no sugar coating about it. I think that&rsquo;s something that can be very intimidating for somebody who&rsquo;s not used to working that way. You might be working in an environment where people had to sort of use a lot of buffer words, to make you read in between the lines. It&rsquo;s really not that way at all when interacting with the Go team, I found.</p><p><strong>Erik St. Martin:</strong> I think that when people are very busy, as the Go team I&rsquo;m sure is, they skip a lot of the pleasantries. The Go team&rsquo;s responses are very succinct and matter-of-fact. People read it the way they mean to read it. So if you come into the process feeling intimidated and then you get a very succint answer, you feel like you&rsquo;re being shrugged off because they&rsquo;re validating your fear of not being worthy type of ordeal. Whereas people who are regular contributors are just used to that; it&rsquo;s just a quick response, so they don&rsquo;t really read too much into it.</p><p><strong>Steve Francia:</strong> Yeah, I think you said it well. This is something that I know the Go team is actually working on - the fact is people are taking a step of courage to propose something or to send a patch, and they have a lot of emotion sometimes riding on that, and when you have someone that you admire (I will say) shoot you down - even though that&rsquo;s not what&rsquo;s happening; that&rsquo;s the way it sometimes feels - you definitely react differently.</p><p>[52:10] I know as a team, we&rsquo;ve been working on how to communicate in a way that&rsquo;s encouraging. It&rsquo;s a work in progress, but in my 6-7 months here I&rsquo;ve seen improvement of that; people are not just saying no, they&rsquo;re saying &ldquo;Here&rsquo;s why no&rdquo; or &ldquo;Here&rsquo;s what we need for this to go further.&rdquo; So to give them a path forward, rather than just a wall.</p><p>I think that&rsquo;s a big thing for us that the Go team is learning - people take our words with a lot more weight than sometimes we realize. We&rsquo;re trying to be better about understanding people&rsquo;s feelings. That&rsquo;s something we&rsquo;re working on.</p><p>But I will say the team itself cares deeply about their users and community, and each other. I&rsquo;ve honestly never been part of a team that really supported each other as well as this team. I see the way that we talk about the community and the amount of time and attention that we spend on the users, and it&rsquo;s remarkable to me. That comes across being on the team, of how much they really do care and value each user and contributor, even if sometimes in their messaging it doesn&rsquo;t come across.</p><p><strong>Erik St. Martin:</strong> I think even outside community involvement helps too, right? Most in the same respect that teambuilding exercises help with co-workers. You interact with people in a different form and you learn that they&rsquo;re people, and things like that, and then your interactions with them in the work environment are perceived differently.</p><p>I know coming for me personally, getting to see and watch the Go team interact with people at conferences really shows how much they care about what people are using the language for, and that it&rsquo;s meeting their needs and things like that. So when you see those succinct or matter-of-fact responses, you don&rsquo;t really think about it much because you&rsquo;ve seen them as a person. People new to the community may only see them for the prestige of the things that they&rsquo;ve done and their current roles, so when they see that response, it carries more weight, like you said.</p><p><strong>Steve Francia:</strong> It&rsquo;s also the case that the team itself knows each other pretty well, and some of the more active contributors, I think you always need to be reminded of &ndash; a lot of our conversations and dialogues are done completely open and transparent, the vast majority of it. And even if we know each other well, we can be short with each other, but lots of people are reading that that don&rsquo;t know our relationship already, so sometimes we need to be reminded that even if we have a good relationship and we&rsquo;re interacting back and forth, there&rsquo;s still a need to be mindful of the people who see that and aren&rsquo;t aware, or don&rsquo;t know us already.</p><p><strong>Erik St. Martin:</strong> I know you&rsquo;re a pretty busy guy, and I think we&rsquo;re about out of time. I think we have a couple of minutes though if everybody wants to do #FreeSoftwareFriday.</p><p><strong>Carlisia Thompson:</strong> I actually don&rsquo;t have one today.</p><p><strong>Erik St. Martin:</strong> How about you, Johnny? Do you wanna give a shoutout to a project or a maintainer?</p><p><strong>Johnny Boursiquot:</strong> Yeah, definitely<a href="https://github.com/gobuffalo/buffalo">Go Buffalo</a>. I&rsquo;ve been playing around with it to sort of stand up a project that I&rsquo;ve taken on, and I was quite surprised how easy it was to get going&hellip; I mean, obviously, beyond reading just the introductory stuff on the main page (I think it&rsquo;s gobuffalo.io), it was really quite easy to get going. So kudos to<a href="https://twitter.com/markbates">Mark Bates</a>, the lead contributor to that. Very good job! I&rsquo;m looking forward to contributing something back to that.</p><p><strong>Erik St. Martin:</strong> [56:03] How about you, Steve? Did you wanna give a shoutout to anybody?</p><p><strong>Steve Francia:</strong> Yeah, for me the one project that I use more than any other project is Fatih&rsquo;s<a href="https://github.com/fatih/vim-go">Vim-go</a> project. I&rsquo;ve been a long-time user of Vim, and one of my projects that&rsquo;s been popular for a while is my Vim Distribution, which is really just my own personal Vim configuration that happens to be adopted by tens of thousands of people. And that&rsquo;s really what happened, I&rsquo;m not being short when I say that. It wasn&rsquo;t intended to be a project, it was just my Vim configuration. But to see what Fatih has done with the Go integration, it&rsquo;s just phenomenal&hellip; The amount of time and effort that he puts into it; it really benefits me a lot, and as the survey demonstrated, a lot of our users. I was shocked to see how many users were Vim users in Go.</p><p><strong>Erik St. Martin:</strong> Yeah, I think it was Vim and VS Code that were topping everybody out.</p><p><strong>Steve Francia:</strong> Well, Vim was overwhelmingly the most used, and VS Code was, for me shockingly, the second most, given how young it is. But it just barely edged out&hellip;</p><p><strong>Carlisia Thompson:</strong> Over Atom.</p><p><strong>Steve Francia:</strong> &hellip; IntelliJ and Atom and Sublime.</p><p><strong>Erik St. Martin:</strong> Okay, so Vim-go far surpassed number two.</p><p><strong>Steve Francia:</strong> Yeah.</p><p><strong>Erik St. Martin:</strong> Fatih&rsquo;s work on that has just been tremendous. I use it as well. He&rsquo;s got a Patreon set up too for anybody who uses that. We all love to show support to people who work on these projects and give up their free time.</p><p>So one that I actually only recently started using which is really cool, I guess it&rsquo;s called<a href="https://github.com/xo/usql">usql</a>, for Universal SQL. It&rsquo;s written in Go, and it allows you to talk to SQLite, Microsoft SQL Server, MySQL, Postgres - all using the same command line tool. And one of the cool things that I liked about it was there&rsquo;s future plan for things like Cassandra and CockroachDB, and things like that. I thought that was really cool. I&rsquo;m always struggling to find database tools. I like consistency. I hate to have to learn a new command line tool to interact with each database type&hellip;</p><p>Alright, so with that, I wanna thank everybody for being on the show. Huge thank you to you, Steve, for coming on the show and talking with us today.</p><p><strong>Steve Francia:</strong> Happy to do it. Thanks for inviting me.</p><p><strong>Erik St. Martin:</strong> And thank you to all the listeners who are listening live and will be listening to this. Huge shoutout to our sponsors, Backtrace and Ultimate Go. Forward this to anybody who might like to listen to our weekly podcast. We are on<a href="https://twitter.com/GoTimeFM">Twitter</a>,<a href="https://github.com/GoTimeFM/ping">ping</a> if you wanna be on the show or have suggestions for topics or guests. With that, goodbye everybody! We&rsquo;ll see you next week!</p><p><strong>Steve Francia:</strong> Bye!</p><p><strong>Carlisia Thompson:</strong> Goodbye, everyone.</p><p><strong>Johnny Boursiquot:</strong> Bye!</p>
]]></content:encoded></item><item><title>Hugo goes global</title><link>https://spf13.com/p/hugo-goes-global/</link><pubDate>Fri, 07 Oct 2016 10:56:02 -0400</pubDate><guid>https://spf13.com/p/hugo-goes-global/</guid><media:content url="https://spf13.com/p/hugo-goes-global/planet.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/hugo-goes-global/planet.jpg"/><description>&lt;p>Hugo is going Global! Hugo 0.17, released today, is our best and fastest
release ever! &lt;strong>Hugo 0.17 is nearly twice as fast as Hugo 0.16&lt;/strong> and adds
&lt;strong>full support for multilingual websites&lt;/strong> with i18n support throughout all
of Hugo.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/hugo-goes-global/planet.jpg" alt="Hugo goes global"/><p>Hugo is going Global! Hugo 0.17, released today, is our best and fastest
release ever!<strong>Hugo 0.17 is nearly twice as fast as Hugo 0.16</strong> and adds<strong>full support for multilingual websites</strong> with i18n support throughout all
of Hugo.</p><p>Hugo is going global with our 0.17 release. We put a lot of thought into
how we could extend Hugo to support multilingual websites with the most
simple and elegant experience. Hugo’s multilingual capabilities rival
the best web and documentation software, but Hugo’s experience is
unmatched. If you have a single language website, the simple Hugo
experience you already love is unchanged. Adding additional languages to
your website is simple and straightforward. Hugo has been completely
internally rewritten to be multilingual aware with translation and
internationalization features embedded throughout Hugo.</p><p>Hugo continues its trend of each release being faster than the last.
It’s quite a challenge to consistently add significant new functionality
and simultaneously dramatically improve performance.<a href="//github.com/bep">@bep</a> has made it his personal mission to apply the
Go mantra of “Enable more. Do less” to Hugo. Hugo’s consistent
improvement is a testament to his brilliance and his dedication to his
craft. Hugo is further benefited from the performance improvements from
the Go team in the Go 1.7 release.</p><p>This release represents<strong>over 300 contributions by over 70
contributors</strong> to the main Hugo code base. Since last release Hugo has<strong>gained 2000 stars, 50 new contributors and 20 additional themes.</strong></p><p>Hugo now has:</p><ul><li>12,000 stars on GitHub</li><li>370+ contributors</li><li>110+ themes</li></ul><p><a href="//github.com/bep">@bep</a> continues to lead the project with the
lionshare of contributions and reviews. A special thanks to<a href="//github.com/bep">@bep</a> and<a href="//github.com/abourget">@abourget</a> for
their considerable work on multilingual support.</p><p>A big welcome to newcomers<a href="//github.com/MarkDBlackwell">@MarkDBlackwell</a> ,<a href="//github.com/bogem">@bogem</a> and<a href="//github.com/g3wanghc">@g3wanghc</a> for
their critical contributions.</p><h3 id="highlights">Highlights</h3><p><strong>Multilingual Support:</strong> Hugo now supports multiple languages
side-by-side. A single site can now have multiple languages rendered
with full support for translation and i18n.</p><p><strong>Performance:</strong> Hugo is faster than ever! Hugo 0.17 is not only our
fastest release, it’s also the most efficient. Hugo 0.17 is<strong>nearly
twice as fast as Hugo 0.16</strong> and uses about 10% less memory. This means
that the same site will build in nearly half the time it took with Hugo
0.16. For the first time Hugo sites are averaging well under 1ms per
rendered content.</p><p><strong>Docs overhaul:</strong> This release really focused on improving the
documentation.<a href="http://gohugo.io">Gohugo.io</a> is more accurate and
complete than ever.</p><p><strong>Support for Mac OS Sierra</strong></p><h3 id="new-features">New Features</h3><ul><li>Multilingual support<a href="//github.com/spf13/hugo/issues/2303">#2303</a></li><li>Allow content expiration<a href="//github.com/spf13/hugo/issues/2137">#2137</a></li><li>New templates functions:<ul><li><code>querify</code> function to generate query strings inside templates<a href="//github.com/spf13/hugo/issues/2257">#2257</a></li><li><code>htmlEscape</code> and<code>htmlUnescape</code> template functions<a href="//github.com/spf13/hugo/issues/2287">#2287</a></li><li><code>time</code> converts a timestamp string into a time.Time structure<a href="//github.com/spf13/hugo/issues/2329">#2329</a></li></ul></li></ul><h3 id="enhancements">Enhancements</h3><ul><li>Render the shortcodes as late as possible<a href="//github.com/spf13/hugo/commit/ed0985404db4630d1b9d3ad0b7e41fb186ae0112">ed0985</a></li><li>Remove unneeded casts in page.getParam<a href="//github.com/spf13/hugo/issues/2186">#2186</a></li><li>Automatic page date fallback<a href="//github.com/spf13/hugo/issues/2239">#2239</a></li><li>Enable safeHTMLAttr<a href="//github.com/spf13/hugo/issues/2234">#2234</a></li><li>Add TODO list support for markdown<a href="//github.com/spf13/hugo/issues/2296">#2296</a></li><li>Make absURL and relURL accept any type<a href="//github.com/spf13/hugo/issues/2352">#2352</a></li><li>Suppress ‘missing static’ error<a href="//github.com/spf13/hugo/issues/2344">#2344</a></li><li>Make summary, wordcount etc. more efficient<a href="//github.com/spf13/hugo/issues/2378">#2378</a></li><li>Better error reporting in<code>hugo convert</code><a href="//github.com/spf13/hugo/issues/2440">#2440</a></li><li>Reproducible builds thanks to govendor<a href="//github.com/spf13/hugo/issues/2461">#2461</a></li></ul><h3 id="fixes">Fixes</h3><ul><li>Fix shortcode in markdown headers<a href="//github.com/spf13/hugo/issues/2210">#2210</a></li><li>Explicitly bind livereload to hugo server port<a href="//github.com/spf13/hugo/issues/2205">#2205</a></li><li>Fix Emojify for certain text patterns<a href="//github.com/spf13/hugo/issues/2198">#2198</a></li><li>Normalize file name to NFC<a href="//github.com/spf13/hugo/issues/2259">#2259</a></li><li>Ignore emacs temp files<a href="//github.com/spf13/hugo/issues/2266">#2266</a></li><li>Handle symlink change event<a href="//github.com/spf13/hugo/issues/2273">#2273</a></li><li>Fix panic when using URLize<a href="//github.com/spf13/hugo/issues/2274">#2274</a></li><li><code>hugo import jekyll</code>: Fixed target path location check<a href="//github.com/spf13/hugo/issues/2293">#2293</a></li><li>Return all errors from casting in templates<a href="//github.com/spf13/hugo/issues/2356">#2356</a></li><li>Fix paginator counter on x86-32<a href="//github.com/spf13/hugo/issues/2420">#2420</a></li><li>Fix half-broken self-closing shortcodes<a href="//github.com/spf13/hugo/issues/2499">#2499</a></li></ul>]]></content:encoded></item><item><title>I’m joining the Go team at Google</title><link>https://spf13.com/p/im-joining-the-go-team-at-google/</link><pubDate>Thu, 15 Sep 2016 16:15:03 UTC</pubDate><guid>https://spf13.com/p/im-joining-the-go-team-at-google/</guid><media:content url="https://spf13.com/p/im-joining-the-go-team-at-google/kai-wenzel-06MHFfYv6YY-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/im-joining-the-go-team-at-google/kai-wenzel-06MHFfYv6YY-unsplash.jpg"/><description>&lt;p>I am honored to share that I have joined Google as a member of the Go team and will be primarily based in NYC.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/im-joining-the-go-team-at-google/kai-wenzel-06MHFfYv6YY-unsplash.jpg" alt="I’m joining the Go team at Google"/><p>I am honored to share that I have joined Google as a member of the Go team and will be primarily based in NYC.</p><h2 id="why-i-joined">Why I joined</h2><p>My passion has always been building great products, ecosystems and experiences through open source. The desire to create transformative experiences has led me down some wonderful and life changing roads. I’ve been fortunate enough to combine that passion with employment for most of the last decade.</p><p>I encountered<a href="https://www.mongodb.com/">MongoDB</a> soon after it’s inception. Realizing that it had the power to fundamentally improve how people created software, I joined MongoDB to help guide the product and ecosystem responsible for the developer experience (UX, web, docs, eng, advocacy). During my time at MongoDB, we grew from an obscure 30 person startup to eventually becoming the 4th most popular DB in the world. I had been part of a successful fast-growth open source startup that fundamentally changed the way software was written by demonstrating that alternatives to relational databases were viable. I felt like I had reached the peak of my career.</p><p>At MongoDB, I also managed our drivers team which consisted of developing client libraries in over a dozen programming languages. It was on this team that I first encountered<a href="https://golang.org/">Go</a>. Go has the nearly perfect balance of readability, expressibility and simplicity. More importantly, it makes writing software fun again. I soon stopped writing software in any other languages and immersed myself in the Go community. I wrote<a href="https://gohugo.io/">software</a>,<a href="https://github.com/spf13/cobra">libraries</a>,<a href="http://spf13.com/presentation">presentations</a>,<a href="http://spf13.com/tags/go">blog posts</a> and even<a href="https://gophercon.com/">organized</a>,<a href="http://gothamgo.com/">conferences</a>. As I had before, I recognized that this technology had the potential to revolutionize how software was written at a fundamental level.</p><p>Upon leaving MongoDB, I took notice of another small open source startup that started to gain some traction.<a href="https://www.docker.com/">Docker</a> was going to revolutionize how software is distributed and scaled and I wanted to be a part of it. I joined Docker to lead their open source operations and strategy with responsibility for engineering, governance, docs and advocacy. I helped guide Docker to participate in the establishment of the OCI and CNCF and helped refine the developer and contributor experience of Docker, resulting in one of the most actively contributed to projects in history.</p><p>After leaving Docker, I really didn’t know where I wanted to go next. I had spent the last 15 years at startups and wondered about life outside of the startup world. As I contemplated my next path it became apparent that my &ldquo;burnout&rdquo; from working at many consecutive fast growth startups was more than burnout. Towards the end of 2015 my health rapidly deteriorated. I was diagnosed with Babesia and Bartonella, two nasty blood diseases which caused anemia and chronic fatigue syndrome. The past year has been spent undergoing intensive treatment and in recovery, unable to work.</p><p>Going through a long term illness changes you. You see life through a different lens, perhaps a more mortal one. As my health started to improve, a number of organizations approached me about joining. These opportunities ranged widely from a partner at a VC to a VP Eng at a big bank to a founder of a 2 person startup.</p><p>I considered each opportunity from many angles. Which would be the best opportunity to continue to let me recover while also being the best decision for my career? I worried that my health would be a limiting factor and wondered if I should play it safe. I wondered if it was time to act my age and take the &ldquo;grown up&rdquo; job where I would have grown up things like an expense account and an executive assistant and would no longer be the only guy on the train in a t-shirt and shorts. I worried that if I took an non-executive role that it would be perceived as a step backwards and perhaps meant closing that path forever. I wondered if I would be able to make an impact without a large staff reporting to me. I also considered the impact each role would have on my family. I wondered if I would be happy working at a corporation instead of a startup.</p><p>During this time, an opportunity came to join the Go team at Google. I had a hard time even believing it was happening. Here was a team whose members I’ve looked up to since I first started programming and using UNIX as a teenager. I’m still nervous at times talking to many of the people on the team. I worried that I wasn’t up to the level of everyone else on the team. I even felt guilty thinking that I shouldn’t to be paid to do what I’ve spent the last few years doing in my spare time.</p><p>I struggled with the decision, probably much more than I should have. I had a moment of clarity which put everything in perspective. This happened at GopherCon, the largest Go conference, while I was at the dinner for the speakers and volunteers. As I looked around the room I saw so many people who I genuinely admire and love. It put everything in perspective about what really matters in life. I knew that happiness comes from doing things you love with people you love. I realized that I couldn’t take any other role because it would mean leaving this community family I had become a part of. I love Go. I love the Go community. I love open source. If I have an opportunity to take a position that not only combines those three, but also enables me to support them I had to take it.</p><h2 id="my-role">My Role</h2><p>I have a fairly unique role on the Go team. To my knowledge it’s the first of its kind at Google. My entire objective is to make the Go user and developer experience phenomenal. As someone who writes<a href="http://github.com/spf13/viper">widely used</a><a href="http://github.com/spf13/cobra">libraries</a> and<a href="http://github.com/spf13/hugo">applications</a> and has led teams at companies developing with Go I’ll bring a unique perspective to the Go team about Go usage outside Google.</p><p>In many ways this role is similar to the very unique roles I played previously at MongoDB &amp; Docker where I was responsible for developer experience and open source. All three of these roles incorporate elements of product management, user/developer experience, advocacy, branding &amp; messaging, engineering, management, business development and strategy.</p><p>Some things I’ll be responsible for include:</p><ul><li>Refining the Go developer experience for beginners and experts alike<ul><li>Creating educational resources for Go adoption and best practices</li><li>Defining/refining tooling, websites, etc</li></ul></li><li>Refining the Go contributor experience (std lib, tools, compiler, etc)</li><li>Increasing the collaboration &amp; communication between the Go team and the community</li><li>Gathering data &amp; feedback from enterprises, users, developers, integrators and provide insights to the Go team</li><li>Supporting the community by working with them to define processes, make connections and organize</li><li>Establishing partnerships with different vendors, products, organizations and enterprises to propel Go’s adoption, ecosystem and usage</li></ul><h2 id="i-need-your-help">I need your help</h2><p>Of all the things I’ll be doing,<strong>listening is the most important aspect of my role</strong>.</p><p>I want to hear from you. If you have ideas or feedback, no matter how crazy or silly, big or small, email me at:<a href="mailto:spf@golang.org">spf@golang.org</a>. I’d love to hear from you!</p><p><strong>Some questions I need your help to answer:</strong></p><ul><li>What is missing from the Go ecosystem?</li><li>What needs do you have that Go isn’t satisfying?</li><li>What should the Go community be doing that it isn’t today?</li><li>What questions do you have about Go?</li><li>How can the Go project better support you?</li><li>Where would you like to be more involved?</li></ul><p>Finally, a huge thank you to everyone in the Go and open source communities. A special thank you to<a href="https://twitter.com/gniemeyer">@gniemeyer</a> for introducing me to Go and patiently mentoring me through my first project and<a href="https://twitter.com/bepsays">@bepsays</a> for taking on an extra load on Hugo and my other projects as my illness prevented me from actively participating.</p><p>I feel extremely fortunate to be able to do what I love. I am in the debt of the giants that have gone before me and created all the languages, tools, books, ideas, etc that make it possible for me to be in this role. I believe strongly that the only way to pay back that debt is to pay it forward and create a better experience, a stronger ecosystem and a welcoming community which we can only do together. I look forward to working with all of you in this new role!</p>]]></content:encoded></item><item><title>How To Be A Good Open Source Community Member</title><link>https://spf13.com/p/how-to-be-a-good-open-source-community-member/</link><pubDate>Tue, 17 Mar 2015 15:24:07 -0500</pubDate><guid>https://spf13.com/p/how-to-be-a-good-open-source-community-member/</guid><media:content url="https://spf13.com/p/how-to-be-a-good-open-source-community-member/hannah-busing-Zyx1bK9mqmA-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/how-to-be-a-good-open-source-community-member/hannah-busing-Zyx1bK9mqmA-unsplash.jpg"/><description>&lt;p>A friend of mine who is a very talented writer recently became
intrigued with open source and asked me to help her to understand how to
be a good open source community member.&lt;/p>
&lt;p>Open source is one of the most unusual things in the world. Is there any other
profession where highly skilled professionals donate their free time to give
their work away for free? Many spend long hours at their day
jobs, just to spend their nights and weekends doing the same thing.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/how-to-be-a-good-open-source-community-member/hannah-busing-Zyx1bK9mqmA-unsplash.jpg" alt="How To Be A Good Open Source Community Member"/><p>A friend of mine who is a very talented writer recently became
intrigued with open source and asked me to help her to understand how to
be a good open source community member.</p><p>Open source is one of the most unusual things in the world. Is there any other
profession where highly skilled professionals donate their free time to give
their work away for free? Many spend long hours at their day
jobs, just to spend their nights and weekends doing the same thing.</p><p>I’ve been involved in open source for nearly 20 years &ndash; I’ve started some of my
own successful community based projects (<a href="http://gohugo.io">Hugo</a>,<a href="http://vim.spf13.com">spf13-vim</a>,<a href="http://github.com/spf13/cobra">Cobra</a>,<a href="http://github.com/spf13/viper">Viper</a>, Zoop), contributed to many others and
been responsible for leading some of the most popular commercial open source
projects in history (<a href="http://docker.com">Docker</a> &amp;<a href="http://mongodb.org">MongoDB</a>).</p><p>Over the years I’ve learned 3 rules that, when followed, are sure to make you a
good open source citizen.</p><h1 id="rule-1-assume-good-will">Rule 1. Assume good will</h1><p>Not only is this a good rule for open source, but it’s also a good rule for life.
A lot of open source communication is done online in written formats.
Community members come from all over the world and from very different
cultures, so while most open source work is done in English,
it’s often not a community member’s first language. Far too often I’ve seen
these differences can lead to barriers and discord in the community when people
assume that others are operating with malicious intent. While it’s true
that there are some mean people out there, I have found that it’s always
best to assume that people mean well until they prove otherwise.</p><h1 id="rule-2-attitude-of-appreciation">Rule 2. Attitude of appreciation</h1><p>Open source is built on on the backs of willing volunteers. Many people
want to help out and contribute their time and talents to the best of
their abilities. Far too often maintainers of projects have the attitude
of “you’re not good enough”. I’ve even seen projects reject great contributions
because of a spelling mistake in a comment. If you want to foster a
healthy community (or participate in one), you need to cultivate an attitude of
appreciation. This attitude manifests in different ways.</p><p>With all of my open source projects, as at the Docker project, we’ve
adopted a policy of never saying “no”, but instead using contributor
errors as opportunities to teach our community members how to make it a
“yes”. Sometimes this works by showing them how to write better code,
tests, or documentation. Sometimes it’s teaching them a valuable skill.
This policy is generally helpful for the project overall, as once
someone is taught they often have a desire to return the favor and pay
it forward by helping other, less experienced members.</p><p>Another way appreciation is manifested is by accepting contributions
even when they aren’t quite right. Oftentimes someone has taken a lot of
time to contribute to a project, perhaps your project, and they didn’t
get absolutely everything right along the way. Perhaps the documentation
isn’t quite up to snuff, or the test coverage could be better. Remember
that not everyone comes from the same background &ndash; if English isn’t
their first language they may be embarrassed or unable to produce the
quality documentation you need. In these cases, I’ve found it’s best to
appreciate what they’ve done, take what they contributed, and carry it
the rest of the way for them. Some people worry that contributors will
be offended if you add to their contribution, but in my experience
they’ve always been very appreciative.</p><p>Lastly, one of the most important ways to show an attitude of
appreciation is to be responsive and thoughtful to questions, and
especially contributions, that people provide. If you aren’t able to do
this yourself, perhaps it’s time to ask for help. You’ll find great
community members who are happy to support.</p><h1 id="rule-3-dont-be-afraid-to-jump-in-ask-questions-contribute">Rule 3. Don&rsquo;t be afraid to jump in&hellip; ask questions, contribute.</h1><p>Open source is made up of volunteers. Volunteers who don’t wait for an
invitation to jump in and try to contribute. One of the best things you
can do is ask “what can I do to help?”. I promise that most open source
communities will not only provide many opportunities, but also the
support you need to be successful.</p><p>Many people are afraid that their work will be rejected if they submit
it, and this fear prevents them from contributing. I guarantee that two
things will happen as you contribute to open source: 1) some of your
work will be rejected, and 2) you will learn far more from these rejections
than any other way. I speak not only from personal experience, but from
conversations with many friends who are active contributors. To ensure
that your contribution has the best chance of being accepted, discuss it
with the project maintainers beforehand, during and after. They will be
very open to helping.</p>
]]></content:encoded></item><item><title>Hugo Summer 2014 Update</title><link>https://spf13.com/p/hugo-summer-2014-update/</link><pubDate>Thu, 02 Oct 2014 13:28:42 -0400</pubDate><guid>https://spf13.com/p/hugo-summer-2014-update/</guid><media:content url="https://spf13.com/p/hugo-summer-2014-update/mateo-giraud-wtBex4wQw60-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/hugo-summer-2014-update/mateo-giraud-wtBex4wQw60-unsplash.jpg"/><description>&lt;p>Hugo, the fast and flexible static site generator, is really coming of
age. I wanted to give a quick update about the progress Hugo has been
making over the past couple months.&lt;/p>
&lt;h1 id="new-website">New Website&lt;/h1>
&lt;p>Hugo can now be found at &lt;a href="http://gohugo.io">http://gohugo.io&lt;/a>. Update your bookmarks.&lt;/p>
&lt;h1 id="new-team-members">New Team Members&lt;/h1>
&lt;p>I want to formally welcome our newest team members.&lt;/p>
&lt;p>&lt;a href="https://github.com/tatsushid">Tatsushi Demachi&lt;/a> has been making
excellent contributions hugo, particularly with extensions to the
template capabilities. The two biggest additions to the layouts, where and
groupBy both came from him.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/hugo-summer-2014-update/mateo-giraud-wtBex4wQw60-unsplash.jpg" alt="Hugo Summer 2014 Update"/><p>Hugo, the fast and flexible static site generator, is really coming of
age. I wanted to give a quick update about the progress Hugo has been
making over the past couple months.</p><h1 id="new-website">New Website</h1><p>Hugo can now be found at<a href="http://gohugo.io">http://gohugo.io</a>. Update your bookmarks.</p><h1 id="new-team-members">New Team Members</h1><p>I want to formally welcome our newest team members.</p><p><a href="https://github.com/tatsushid">Tatsushi Demachi</a> has been making
excellent contributions hugo, particularly with extensions to the
template capabilities. The two biggest additions to the layouts, where and
groupBy both came from him.</p><p><a href="https://github.com/anthonyfok">Anthony Fok</a> is on a mission to improve
the Hugo documentation. He’s making improvements across the entire
documentation and we all benefit from his efforts.</p><p><a href="http://npf.io/">Nate Finch</a> has joined and injected some much needed
support. He’s been helping everywhere, from code contributions, to
supporting developers to setting up our new discussion forum (see
below).</p><p>Hugo doesn’t have a official “team”. We welcome contributions from
everyone and have received contributions by over 90 people so far. If
anyone is interested in helping out, please do. Once you’ve made a few
contributions ask for contributor access. Currently Nate and Steve
manage this.</p><h1 id="new-discussion-forum">New Discussion Forum</h1><p>Hugo has a brand<a href="http://discuss.gohugo.io">new discussion forum</a>. It
became apparent to me that google groups was no longer serving our
growing community. We really needed a discussion forum that had a great
web experience as well as the ability to continue with the email only
interface. I also wanted the ability to easily categorize things into
different channels. Lastly I didn’t want people to need to setup new
accounts. We decided to go with<a href="http://www.discourse.org/">Discourse</a>,
an open source modern discussion platform. It provided all the features
we needed and has been great for our community. We soft launched it and
within two weeks the amount of discussions being had has risen
significantly. Most importantly, users are helping other users.</p><p>Nate contributed a lot of work setting it all up. He wrote up his
experience on his blog at<a href="http://npf.io/2014/10/deploy-discourse-juju/">deploy discourse with
juju</a>.</p><h1 id="v012-release">v0.12 Release</h1><p>A lot has happened since Hugo v0.11.0 was released. Most of the work has been
focused on polishing the theme engine and adding critical functionality to the
templates.</p><p>This release represents over 90 code commits from 28 different contributors.</p><ul><li>10<a href="https://github.com/spf13/hugothemes">new themes</a> created by the community</li><li>fully themable<a href="http://hugo.spf13.com/templates/partials">partials</a></li><li><a href="http://hugo.spf13.com/templates/404/">404 template</a> support in themes</li><li><a href="http://hugo.spf13.com/extras/shortcodes/">shortcode</a> support in themes</li><li><a href="http://hugo.spf13.com/templates/views/">views</a> support in themes</li><li>inner<a href="http://hugo.spf13.com/extras/shortcodes/">shortcode</a> content now treated as markdown</li><li>support for header ids in markdown (# header {#myid})</li><li><a href="http://hugo.spf13.com/templates/list">where</a> template function to filter lists of content, taxonomies, etc</li><li><a href="http://hugo.spf13.com/templates/list">groupby</a> &amp;<a href="/templates/list">groupbydate</a> methods to group pages</li><li>taxonomy<a href="http://hugo.spf13.com/taxonomies/methods/">pages list</a> now sortable, filterable, limitable &amp; groupable</li><li>general cleanup to taxonomies &amp; documentation to make it more clear and consistent</li><li><a href="http://hugo.spf13.com/showcase/">showcase</a> returned and has been expanded</li><li>pretty links now always have trailing slashes</li><li><a href="http://hugo.spf13.com/overview/configuration/">baseurl</a> can now include a subdirectory</li><li>better feedback about draft &amp; future post rendering</li><li>a variety of improvements to<a href="http://gohugo.io">the website</a></li></ul><h1 id="whats-next">What’s next?</h1><p>The community is really expanding. Alongside the new discussion forum we
are also launching a hugo blog where updates like this will reside in
the future.</p><p>We will also be launching a theme gallery where users can view the
various themes available for Hugo.</p><p>We’re focused on the v0.13 release. There’s a lot to look forward to in
this release. Check the<a href="https://github.com/spf13/hugo/issues?q=is%3Aopen+is%3Aissue+milestone%3Av0.13">v0.13 Milestone</a> for which tickets we are working on.</p>
]]></content:encoded></item><item><title>Evangelism is NOT Sales</title><link>https://spf13.com/p/evangelism-is-not-sales/</link><pubDate>Wed, 24 Sep 2014 13:17:48 -0400</pubDate><guid>https://spf13.com/p/evangelism-is-not-sales/</guid><media:content url="https://spf13.com/p/evangelism-is-not-sales/priscilla-du-preez-Q7wGvnbuwj0-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/evangelism-is-not-sales/priscilla-du-preez-Q7wGvnbuwj0-unsplash.jpg"/><description>&lt;p>I recently had a discussion with a CFO of a technology company. We were
meeting because he is trying to better understand the role technical
evangelism could play within his company. Ten minutes into our
conversation he said, &amp;ldquo;so evangelism is pretty much rogue sales&amp;rdquo;.
Internally I cringed. I politely corrected him that the two could not be
further apart.&lt;/p>
&lt;p>Allow me to be a bit philosophical or rather, etymological here.
Evangelism is an apt title for what it does. Let&amp;rsquo;s look back at the
origin of the word. The Old English &amp;lsquo;gōdspell&amp;rsquo; (a union of two words
good and spell. Spell meaning news here. This is a translation of the
Greek word &amp;rsquo;euangélion&amp;rsquo; which also means good news. Breaking it down
further, this is &amp;rsquo;eu-&amp;rsquo; + &amp;lsquo;angelos&amp;rsquo;. Angelos means messenger and eu-
means good. So this is someone who brings good news. Throughout the
centuries the words have developed strong religious overtones, the
initial terms were more generally used.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/evangelism-is-not-sales/priscilla-du-preez-Q7wGvnbuwj0-unsplash.jpg" alt="Evangelism is NOT Sales"/><p>I recently had a discussion with a CFO of a technology company. We were
meeting because he is trying to better understand the role technical
evangelism could play within his company. Ten minutes into our
conversation he said, &ldquo;so evangelism is pretty much rogue sales&rdquo;.
Internally I cringed. I politely corrected him that the two could not be
further apart.</p><p>Allow me to be a bit philosophical or rather, etymological here.
Evangelism is an apt title for what it does. Let&rsquo;s look back at the
origin of the word. The Old English &lsquo;gōdspell&rsquo; (a union of two words
good and spell. Spell meaning news here. This is a translation of the
Greek word &rsquo;euangélion&rsquo; which also means good news. Breaking it down
further, this is &rsquo;eu-&rsquo; + &lsquo;angelos&rsquo;. Angelos means messenger and eu-
means good. So this is someone who brings good news. Throughout the
centuries the words have developed strong religious overtones, the
initial terms were more generally used.</p><p>Sales comes from the Old English &lsquo;sellan&rsquo; which means to give. More
specifically &lsquo;sellan&rsquo; meant to give up (someone) to an enemy in exchange
for money;</p><p>So Evangelism means bringing of good news and sales means betraying a
colleague for money. Sounds like the definition of things haven&rsquo;t
changed much in thousands of years.</p><p>In modern usage, the two roles of sales and evangelism are about as
different as the original definitions. An evangelist role is to increase
awareness and excitement through sharing his/her own experiences. The
goal is not and can never be sales. The entire operation depends on
authenticity, an authentic personal experience.</p><p>Good sales people are authentic, but an authentic sales person means
something completely different. It means being honest about intentions
and a sales persons intentions are to make a sale. A sales person rarely
speaks from their own experience. Especially in technology, they
typically cite other&rsquo;s experiences in place of their own.</p><p>Good evangelists are not motivated by what they can gain from a
relationship. Instead they are motivated by a genuine excitement and
passion around a technology and want to share that with others.</p>
]]></content:encoded></item><item><title>Pointers vs References</title><link>https://spf13.com/p/pointers-vs-references/</link><pubDate>Tue, 01 Jul 2014 00:00:00 UTC</pubDate><guid>https://spf13.com/p/pointers-vs-references/</guid><media:content url="https://spf13.com/p/pointers-vs-references/joshua-sortino-LqKhnDzSF-8-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/pointers-vs-references/joshua-sortino-LqKhnDzSF-8-unsplash.jpg"/><description>&lt;p>Some languages including C, C++ support pointers. Other languages including
C++, Java, Python, Ruby, Perl and PHP all support references. On the surface
both references and pointers are very similar, both are used to have one
variable provide access to another. With both providing a lot of the same
capabilities, it’s often unclear what is different between these different
mechanisms. In this article I will illustrate the difference between
pointers and references.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/pointers-vs-references/joshua-sortino-LqKhnDzSF-8-unsplash.jpg" alt="Pointers vs References"/><p>Some languages including C, C++ support pointers. Other languages including
C++, Java, Python, Ruby, Perl and PHP all support references. On the surface
both references and pointers are very similar, both are used to have one
variable provide access to another. With both providing a lot of the same
capabilities, it’s often unclear what is different between these different
mechanisms. In this article I will illustrate the difference between
pointers and references.</p><h2 id="why-does-this-matter">Why does this matter</h2><p>Pointers are at the very core of effective Go. Most programmers are learning Go
with a foundation in one of the languages mentioned above. Consequently
understanding the difference between pointers and references is critical to
understanding Go. Even if you are coming from a language that uses pointers,
Go’s implementation of pointers differs from C and C++ in that it retains some
of the nice properties of references while retaining the power of pointers.</p><p>The remainder of this article is written with the intent of speaking
broadly about the concept of references rather than about a specific
implementation. We will be using Go as the reference implementation for
pointers.</p><h2 id="what-is-the-difference">What is the difference?</h2><p>A pointer is a variable which stores the address of another variable.</p><p>A reference is a variable which refers to another variable.</p><p>To illustrate our point, use the following example in C++ which supports
both pointers and references.</p><pre><code>int i = 3;
int *ptr = &amp;i;
int &amp;ref = i;</code></pre><p>The first line simply defines a variable. The second defines a pointer
to that variable’s memory address. The third defines a reference to the
first variable.</p><p>Not only are the operators different, but you use the differently as
well. With pointers must use the * operator to dereference it. With a
reference no operator is required. It is understood that you are
intending to work with the referred variable.</p><p>Continuing with our example, the following two lines will both change
the value of i to 13.</p><pre><code>*ptr = 13;
ref = 13;</code></pre><p>You may be asking, what happens if I try to access the ptr directly
without dereferencing first. This takes us to our second critical
difference between pointers and references. Pointers can be reassigned
while references cannot. In other words, a pointer can be assigned to a
different address.</p><p>Consider the following example in Go:</p><pre><code>package main
import "fmt"
var ap *int
func main() {
a := 1 // define int
b := 2 // define int
ap = &amp;a
// set ap to address of a (&amp;a)
// ap address: 0x2101f1018
// ap value : 1
*ap = 3
// change the value at address &amp;a to 3
// ap address: 0x2101f1018
// ap value : 3
a = 4
// change the value of a to 4
// ap address: 0x2101f1018
// ap value : 4
ap = &amp;b
// set ap to the address of b (&amp;b)
// ap address: 0x2101f1020
// ap value : 2
}</code></pre><p>So far you could do all of the above in a reasonably similar manner
using references, and often with a simpler syntax.</p><p>Stay with me, the following example will illustrate why pointers are
more powerful than references.</p><p>Extending the function above:</p><pre><code> ...
ap2 := ap
// set ap2 to the address in ap
// ap address: 0x2101f1020
// ap value : 2
// ap2 address: 0x2101f1020
// ap2 value : 2
*ap = 5
// change the value at the address &amp;b to 5
// ap address: 0x2101f1020
// ap value : 5
// ap2 address: 0x2101f1020
// ap2 value : 5
// If this was a reference ap &amp; ap2 would now
// have different values
ap = &amp;a
// change ap to address of a (&amp;a)
// ap address: 0x2101f1018
// ap value : 4
// ap2 address: 0x2101f1020
// ap2 value : 5
// Since we've changed the address of ap, it now
// has a different value then ap2
}</code></pre><p>You can experiment and play yourself at go play:<a href="http://play.golang.org/p/XJtdLxFoeO">http://play.golang.org/p/XJtdLxFoeO</a></p><p>The key to understanding the difference is in the second example.</p><p>If we were working with references we would not be able to change the
value of b through *ap and have that reflected in *ap2. This is
because once you make a copy of a reference they are now independent.
While they may be referring to the same variable, when you manipulate
the reference it will change what it refers to, rather than the
referring value.</p><p>The final example demonstrates the behavior when you change the
assignment of one of the pointers to point to a new address. Due to the
limitations of references this is the only operation available.</p><p>Stay tuned&hellip; Next post will feature another property exclusively available to
pointers, the pointer pointer.</p><p>For more information on pointers I’ve found the following resources helpful</p><ul><li><a href="http://www.goinggo.net/2013/07/understanding-pointers-and-memory.html">understanding pointers and memory allocation</a></li><li><a href="http://dave.cheney.net/2014/03/17/pointers-in-go">Pointers in Go</a></li><li><a href="http://www.golang-book.com/8">Pointers</a></li></ul>
]]></content:encoded></item><item><title>Is Go an Object Oriented language?</title><link>https://spf13.com/p/is-go-an-object-oriented-language/</link><pubDate>Mon, 09 Jun 2014 01:18:04 UTC</pubDate><guid>https://spf13.com/p/is-go-an-object-oriented-language/</guid><media:content url="https://spf13.com/p/is-go-an-object-oriented-language/chris-ried-ieic5Tq8YMk-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/is-go-an-object-oriented-language/chris-ried-ieic5Tq8YMk-unsplash.jpg"/><description>&lt;p>To truly understand what it means to be ‘object-oriented’ you need to look back
at the origination of the concept. The first object oriented language, simula,
emerged in the 1960s. It introduced objects, classes, inheritance and
subclasses, virtual methods, coroutines, and a lot more. Perhaps most
importantly, it introduced a paradigm shift of thinking of data and logic as
completely independent.&lt;/p>
&lt;p>While you many not be familiar with Simula, you are no doubt familiar with
languages that refer to it as their inspiration including Java, C++, C# &amp;amp;
Smalltalk, which in turn have been the inspiration for Objective C, Python,
Ruby, Javascript, Scala, PHP, Perl&amp;hellip; a veritable list of nearly all popular
languages in use today. This shift in thinking has taken over, so much so that
most programmers alive today have never written code any other
way.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/is-go-an-object-oriented-language/chris-ried-ieic5Tq8YMk-unsplash.jpg" alt="Is Go an Object Oriented language?"/><p>To truly understand what it means to be ‘object-oriented’ you need to look back
at the origination of the concept. The first object oriented language, simula,
emerged in the 1960s. It introduced objects, classes, inheritance and
subclasses, virtual methods, coroutines, and a lot more. Perhaps most
importantly, it introduced a paradigm shift of thinking of data and logic as
completely independent.</p><p>While you many not be familiar with Simula, you are no doubt familiar with
languages that refer to it as their inspiration including Java, C++, C# &amp;
Smalltalk, which in turn have been the inspiration for Objective C, Python,
Ruby, Javascript, Scala, PHP, Perl&hellip; a veritable list of nearly all popular
languages in use today. This shift in thinking has taken over, so much so that
most programmers alive today have never written code any other
way.</p><p>Since a standard definition doesn’t exist, for the purpose of our
discussion we will provide one.</p><p>Rather than structure programs as code and data, an object-oriented
system integrates the two using the concept of an &ldquo;object&rdquo;. An object is
an abstract data type that has state (data) and behavior (code).</p><p>Perhaps as a consequence of the initial implementation having inheritance and
polymorphism, a feature virtually all of the derivatives also adopted,
definitions of object oriented programming typically also include those
features as requirements.</p><p>We will look at how Go does objects, polymorphism and inheritance and allow you
to make your own conclusion.</p><h1 id="objects-in-go">Objects in Go</h1><p>Go doesn’t have a something called &lsquo;object&rsquo;, but &lsquo;object&rsquo; is only a word that
connotes a meaning. It’s the meaning that matters, not the term itself.</p><p>While Go doesn’t have a type called ‘object’ it does have a type that
matches the same definition of a data structure that integrates both
code and behavior. In Go this is called a &lsquo;struct&rsquo;.</p><p>A &lsquo;struct&rsquo; is a kind of type which contains named fields and methods.</p><p>Let’s use an example to illustrate this:</p><pre><code>type rect struct {
width int
height int
}
func (r *rect) area() int {
return r.width * r.height
}
func main() {
r := rect{width: 10, height: 5}
fmt.Println("area: ", r.area())
}</code></pre><p>There’s a lot we could talk about here. It’s probably best to walk
through the code line by line and explain what is happening.</p><p>The first block is defining a new type called a &lsquo;rect&rsquo;. This is a struct
type. The struct has two fields, both of which are type int.</p><p>The next block is defining a method bound to this struct. This is
accomplished by defining a function and attaching (binding) it to a
rect. Technically, in our example it is really attached to a pointer to
a rect. While the method is bound to the type, Go requires us to have a
value of that type to make the call, even if the value is the zero value
for that type (in the case of a struct the zero value is nil).</p><p>The final block is our main function. The first line creates a value of type
rect. There are other syntaxes we could use to do this, but this is the most
idiomatic way. The second line prints to the output the result of calling the
area function on our rect ‘r’.</p><p>To me this feels very much like an object. I am able to create a
structured data type and then define methods that interact with that
specific data.</p><p>What haven&rsquo;t we done? In most object oriented languages we would be using the
&lsquo;class&rsquo; keyword to define our objects. When using inheritance it is a good
practice to define interfaces for those classes. In doing so we would be
defining an inheritance hierarchy tree (in the case of single inheritance).</p><p>An additional thing worth noting is that in Go any named type can have
methods, not only structs. For example I can define a new type ‘Counter’
which is of type int and define methods on it. See an example at<a href="http://play.golang.org/p/LGB-2j707c">http://play.golang.org/p/LGB-2j707c</a></p><h1 id="inheritance-and-polymorphism">Inheritance and polymorphism</h1><p>There are a few different approaches to defining the relationships
between objects. While they differ quite a bit from each other, all
share a common purpose as a mechanism for code reuse.</p><ul><li>Inheritance</li><li>Multiple Inheritance</li><li>Subtyping</li><li>Object composition</li></ul><h2 id="single--multiple-inheritance">Single &amp; Multiple Inheritance</h2><p>Inheritance is when an object is based on another object, using the same
implementation. Two different implementations of inheritance exist. The
fundamental distinction between them is whether an object can inherit from a
single object or from multiple objects. This is a seemingly small distinction,
but with large implications. The hierarchy in single inheritance is a tree,
while in multiple inheritance it is a lattice. Single inheritance languages
include PHP, C#, Java and Ruby. Multiple inheritance languages include Perl,
Python and C++.</p><h2 id="subtyping-polymorphism">Subtyping (polymorphism)</h2><p>In some languages subtyping and inheritance are so interwoven that this
may seem redundant to the previous section if your particular
perspective comes from a language where they are tightly coupled.
Subtyping establishes an is-a relationship, while inheritance only
reuses implementation. Subtyping defines a semantic relationship between
two (or more) objects. Inheritance only defines a syntactic
relationship.</p><h2 id="object-composition">Object Composition</h2><p>Object composition is where one object is defined by including other objects. Rather
than inheriting from them, the object contains them. Unlike the is-a
relationship of subtyping, object composition defines a has-a relationship.</p><h2 id="inheritance-in-go">Inheritance in Go</h2><p>Go is intentionally designed without any inheritance at all. This does not mean
that objects (struct values) do not have relationships, instead the Go authors have
chosen to use a alternative mechanism to connote relationships. To many
encountering Go for the first time this decision may appear as if it cripples
Go. In reality it is one of the nicest properties of Go and it resolves decade
old issues and arguments around inheritance.</p><h2 id="inheritance-is-best-left-out">Inheritance is best left out</h2><p>The following really drives home this point. It comes from a JavaWorld
article titled<a href="http://www.javaworld.com/article/2073649/core-java/why-extends-is-evil.html">why extends is
evil</a>
:</p><blockquote><p>The Gang of Four Design Patterns book discusses at length replacing
implementation inheritance (extends) with interface inheritance
(implements).</p></blockquote><blockquote><p>I once attended a Java user group meeting where James Gosling (Java&rsquo;s
inventor) was the featured speaker. During the memorable Q&amp;A session,
someone asked him: &ldquo;If you could do Java over again, what would you
change?&rdquo; &ldquo;I&rsquo;d leave out classes,&rdquo; he replied. After the laughter died
down, he explained that the real problem wasn&rsquo;t classes per se, but
rather implementation inheritance (the extends relationship). Interface
inheritance (the implements relationship) is preferable. You should
avoid implementation inheritance whenever possible.</p></blockquote><h1 id="polymorphism--composition-in-go">Polymorphism &amp; Composition in Go</h1><p>Instead of inheritance Go strictly follows the<a href="http://en.wikipedia.org/wiki/Composition_over_inheritance">composition over
inheritance principle</a>.
Go accomplishes this through both subtyping (is-a) and object
composition (has-a) relationships between structs and interfaces.</p><h2 id="object-composition-in-go">Object Composition in Go</h2><p>The mechanism Go uses to implement the principle of object composition
is called embedded types. Go permits you to embed a struct within a
struct giving them a has-a relationship.</p><p>An good example of this would be the relationship between a Person and
an Address.</p><pre><code>type Person struct {
Name string
Address Address
}
type Address struct {
Number string
Street string
City string
State string
Zip string
}
func (p *Person) Talk() {
fmt.Println("Hi, my name is", p.Name)
}
func (p *Person) Location() {
fmt.Println("I’m at", p.Address.Number, p.Address.Street, p.Address.City, p.Address.State, p.Address.Zip)
}
func main() {
p := Person{
Name: "Steve",
Address: Address{
Number: "13",
Street: "Main",
City: "Gotham",
State: "NY",
Zip: "01313",
},
}
p.Talk()
p.Location()
}</code></pre><h3 id="output">Output</h3><pre><code>> Hi, my name is Steve
> I’m at 13 Main Gotham NY 01313</code></pre><p><a href="http://play.golang.org/p/LigPIVT2mf">http://play.golang.org/p/LigPIVT2mf</a></p><p>Important things to realize from this example is that Address remains a
distinct entity, while existing within the Person. In the main function
we demonstrate that you can set the p.Address field to an address, or
simply set the fields by accessing them via dot notation.</p><h2 id="pseudo-subtyping-in-go">Pseudo Subtyping in Go</h2><p><strong>AUTHORS NOTE:</strong><br><em>In the first version of this post it made the
incorrect claim that Go supports the is-a relationship via Anonymous
fields. In reality Anonymous fields appear to be an is-a relationship by
exposing embedded methods and properties as if they existed on the outer
struct. This falls short of being an is-a relationship for reasons now
provided below. Go does have support for is-a relationships via
interfaces, covered below. The current version of this post refers to
Anonymous fields as a pseudo is-a relationship because it looks and
behaves in some ways like subtyping, but isn’t.</em></p><p>The pseudo is-a relationship works in a similar and intuitive way. To extend
our example above. Let’s use the following statement. A Person can talk. A
Citizen is a Person therefore a citizen can Talk.</p><p>This code depends on and adds to the code in the example above.</p><pre><code>type Citizen struct {
Country string
Person
}
func (c *Citizen) Nationality() {
fmt.Println(c.Name, "is a citizen of", c.Country)
}
func main() {
c := Citizen{}
c.Name = "Steve"
c.Country = "America"
c.Talk()
c.Nationality()
}</code></pre><h3 id="output-1">Output</h3><pre><code>> Hi, my name is Steve
> Steve is a citizen of America</code></pre><p><a href="http://play.golang.org/p/eCEpLkQPR3">http://play.golang.org/p/eCEpLkQPR3</a></p><p>We accomplish this pseudo is-a relationship in go using what is called an
Anonymous field. In our example Person is an anonymous field of Citizen.
Only the type is given, not the field name. It assumes all of the
properties and methods of a Person and is free to use them or promote
it’s own.</p><h3 id="promoting-methods-of-anonymous-fields">Promoting Methods of anonymous fields</h3><p>An example of this would be that citizens Talk just as People do, but in
a different way.</p><p>For this we simply define Talk for *Citizen, and run the same main
function as defined above. Now instead of calling *Person.Talk(),
*Citizen.Talk() will be called instead.</p><pre><code>func (c *Citizen) Talk() {
fmt.Println("Hello, my name is", c.Name, "and I'm from", c.Country)
}</code></pre><h3 id="output-2">Output</h3><pre><code>> Hello, my name is Steve and I'm from America
> Steve is a citizen of America</code></pre><p><a href="http://play.golang.org/p/jafbVPv5H9">http://play.golang.org/p/jafbVPv5H9</a></p><h2 id="why-anonymous-fields-are-not-proper-subtyping">Why Anonymous Fields are not proper Subtyping</h2><p>There are two distinct reasons why this cannot be considered proper subtyping.</p><h3 id="1-the-anonymous-fields-are-still-accessible-as-if-they-were-embedded">1. The anonymous fields are still accessible as if they were embedded.</h3><p>This isn’t necessarily a bad thing. One of the issues with multiple inheritance
is that languages are often non obvious and sometimes even ambiguous as to which
methods are used when identical methods exist on more than one parent class.</p><p>With Go you can always access the individual methods through a property which
has the same name as the type.</p><p>In reality when you are using Anonymous fields, Go is creating an accessor with
the same name as your type.</p><p>In our example from above the following code would work:</p><pre><code>func main() {
c := Citizen{}
c.Name = "Steve"
c.Country = "America"
c.Talk() // &lt;- Notice both are accessible
c.Person.Talk() // &lt;- Notice both are accessible
c.Nationality()
}</code></pre><h4 id="output-3">Output</h4><pre><code>> Hello, my name is Steve and I'm from America
> Hi, my name is Steve
> Steve is a citizen of America</code></pre><h3 id="2-true-subtyping-becomes-the-parent">2. True subtyping becomes the parent</h3><p>If this was truly subtyping then the anonymous field would cause the outer
type to become the inner type. In Go this is simply not the case. The two
types remain distinct. The following example illustrates this:</p><pre><code>package main
type A struct{
}
type B struct {
A //B is-a A
}
func save(A) {
//do something
}
func main() {
b := B
save(&amp;b); //OOOPS! b IS NOT A
}</code></pre><h4 id="output-4">Output:</h4><pre><code>> prog.go:17: cannot use b (type *B) as type A in function argument
> [process exited with non-zero status]</code></pre><p><a href="http://play.golang.org/p/dt1mTXW-BH">http://play.golang.org/p/dt1mTXW-BH</a></p><p><em>The previous example came directly from a<a href="https://news.ycombinator.com/item?id=7868870">response to this
post</a> on Hacker News. Thanks
Optymizer!</em></p><h2 id="true-subtyping-in-go">True Subtyping in Go</h2><p><em>Go interfaces are pretty unique in how they work. This section
focuses only on how they pertain to subtyping which will not do them
proper justice. See the further reading section at the end of the post
to learn more.</em></p><p>As we wrote above, subtyping is the is-a relationship. In Go each type
is distinct and nothing can act as another type, but both can adhere to
the same interface. Interfaces can be used as input and output of
functions (and methods) and consequently establish an is-a relationship
between types.</p><p>Adherence to an interface in Go is defined not through a keyword like
‘using’ but through the actual methods declared on a type. In<a href="http://golang.org/doc/effective_go.html#interfaces_and_types">Efficient
Go</a> it
refers to this relationship as ‘if something can do this, then it can be
used here.’ This is very important because it enables one to create an
interface that types defined in external packages can adhere to.</p><p>Continuing with the example from above, we add a new function, SpeakTo
and modify the main function to try to SpeakTo a Citizen and a Person.</p><pre><code>func SpeakTo(p *Person) {
p.Talk()
}
func main() {
p := Person{Name: "Dave"}
c := Citizen{Person: Person{Name: "Steve"}, Country: "America"}
SpeakTo(&amp;p)
SpeakTo(&amp;c)
}</code></pre><h3 id="output-5">Output</h3><pre><code>> Running it will result in
> prog.go:48: cannot use c (type *Citizen) as type *Person in function argument
> [process exited with non-zero status]</code></pre><p><a href="http://play.golang.org/p/lvEjaMQ25D">http://play.golang.org/p/lvEjaMQ25D</a></p><p>As expected, this fails. In our code a Citizen isn’t a Person, even
though they share many of the same properties, they are viewed as
distinct types.</p><p>However if we add an interface called Human and use that as the input
for our SpeakTo function it will all work as intended.</p><pre><code>type Human interface {
Talk()
}
func SpeakTo(h Human) {
h.Talk()
}
func main() {
p := Person{Name: "Dave"}
c := Citizen{Person: Person{Name: "Steve"}, Country: "America"}
SpeakTo(&amp;p)
SpeakTo(&amp;c)
}</code></pre><h3 id="output-6">Output</h3><pre><code>> Hi, my name is Dave
> Hi, my name is Steve</code></pre><p><a href="http://play.golang.org/p/ifcP2mAOnf">http://play.golang.org/p/ifcP2mAOnf</a></p><p>There are two critical points to make about subtyping in Go:</p><ol><li><p>We can use Anonymous fields to adhere to an interface. We can also
adhere to many interfaces. By using Anonymous fields along with
interfaces we are very close to true subtyping.</p></li><li><p>Go does provide proper subtyping capabilities, but only in the using
of a type. Interfaces can be used to ensure that a variety of
different types can all be accepted as input into a function, or even
as a return value from a function, but in reality they retain their
distinct types. This is clearly displayed in the main function where
we cannot set Name on Citizen directly because Name isn’t actually a
property of Citizen, it’s a property of Person and consequently not
yet present during the initialization of a Citizen.</p></li></ol><h2 id="go-object-oriented-programming-without-objects-or-inheritance">Go, Object-oriented programming without objects or inheritance</h2><p>As we have demonstrated here, the fundamental concepts of object
orientation are alive and well in Go in spite of some terminology
differences. The terminology differences are essential as the mechanisms
used are in fact different from most object oriented languages.</p><p>Go utilizes structs as the union of data and logic. Through composition,
has-a relationships can be established between Structs to minimize code
repetition while staying clear of the brittle mess that is inheritance.
Go uses interfaces to establish is-a relationships between types without
unnecessary and counteractive declarations.</p><p>Welcome to the new &lsquo;object&rsquo;-less OO programming model.</p><h2 id="discussion">Discussion</h2><p>Join the discussion on<a href="https://news.ycombinator.com/item?id=7868485">hacker
news</a> and<a href="http://www.reddit.com/r/golang/comments/27p2bc/is_go_an_object_oriented_language_spf13com/">Reddit -
Golang</a></p><h2 id="further-reading">Further Reading</h2><ul><li><a href="http://nathany.com/good/">http://nathany.com/good/</a></li><li><a href="http://www.artima.com/lejava/articles/designprinciples.html">http://www.artima.com/lejava/articles/designprinciples.html</a></li><li><a href="http://www.goinggo.net/2014/05/methods-interfaces-and-embedded-types.html">http://www.goinggo.net/2014/05/methods-interfaces-and-embedded-types.html</a></li></ul>
]]></content:encoded></item><item><title>9 MongoDB 2.6 Drivers Released</title><link>https://spf13.com/p/9-mongodb-2.6-drivers-released/</link><pubDate>Mon, 07 Apr 2014 00:00:00 UTC</pubDate><guid>https://spf13.com/p/9-mongodb-2.6-drivers-released/</guid><media:content url="https://spf13.com/p/9-mongodb-2.6-drivers-released/ash-from-modern-afflatus-NQ6Lh81BTRs-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/9-mongodb-2.6-drivers-released/ash-from-modern-afflatus-NQ6Lh81BTRs-unsplash.jpg"/><description>&lt;p>I’m pleased to announce the coordinated release of drivers in 9
languages in preparation for the release of MongoDB 2.6. This is the
largest driver release in the history of MongoDB, both in terms of code
changes as well as in terms of drivers released. Official Drivers for C,
C++, C# (.net), Java, Node.js, PHP, Python, Ruby and Scala were all
released with Perl following shortly. In the upcoming weeks community
drivers will be updated to take advantage of the new features present
in MongoDB 2.6. With both community and official drivers MongoDB is
supported in over two dozen languages and platforms.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/9-mongodb-2.6-drivers-released/ash-from-modern-afflatus-NQ6Lh81BTRs-unsplash.jpg" alt="9 MongoDB 2.6 Drivers Released"/><p>I’m pleased to announce the coordinated release of drivers in 9
languages in preparation for the release of MongoDB 2.6. This is the
largest driver release in the history of MongoDB, both in terms of code
changes as well as in terms of drivers released. Official Drivers for C,
C++, C# (.net), Java, Node.js, PHP, Python, Ruby and Scala were all
released with Perl following shortly. In the upcoming weeks community
drivers will be updated to take advantage of the new features present
in MongoDB 2.6. With both community and official drivers MongoDB is
supported in over two dozen languages and platforms.</p><p>The new drivers support the following features:</p><h2 id="write-operations">Write Operations</h2><ul><li>Full support for the new MongoDB<a href="http://docs.mongodb.org/master/reference/method/Bulk/#Bulk">Bulk Operations</a></li><li>Seamless Support for the new MongoDB<a href="http://docs.mongodb.org/master/release-notes/2.6/#new-write-operation-protocol">Write Operations</a></li></ul><h2 id="aggregation-improvements">Aggregation Improvements</h2><ul><li>Writing<a href="http://docs.mongodb.org/master/release-notes/2.6/#aggregation-enhancements">aggregation results to a collection</a></li><li><a href="http://docs.mongodb.org/master/release-notes/2.6/#aggregation-enhancements">Aggregation cursors</a></li><li>Improved<a href="http://docs.mongodb.org/master/release-notes/2.6/#aggregation-enhancements">aggregation sorting</a></li><li><a href="http://docs.mongodb.org/master/release-notes/2.6/#aggregation-enhancements">Aggregation explain</a></li></ul><h2 id="security-improvements">Security Improvements</h2><ul><li><a href="http://docs.mongodb.org/master/release-notes/2.6/#security-improvements">x.509 Authentication</a></li><li><a href="http://docs.mongodb.org/master/release-notes/2.6/#ldap-support-for-authentication">LDAP Support for Authentication</a></li><li>Support for (server side)<a href="http://docs.mongodb.org/master/reference/command/parallelCollectionScan/">parallel collection scanning</a></li></ul><h2 id="general-improvements">General Improvements</h2><ul><li><a href="http://docs.mongodb.org/master/release-notes/2.6/#text-search-integration">Text Search</a></li><li>Support for<a href="https://jira.mongodb.org/browse/SERVER-2212">Server Side Query Timeouts</a></li><li>Better<a href="http://docs.mongodb.org/master/release-notes/2.6/#index-build-enhancements">Index Creation</a></li></ul><p>A more complete list can be found on the<a href="http://docs.mongodb.org/master/release-notes/2.6/">MongoDB 2.6 Release Notes</a></p><p>In addition to these general feature individual improvements were made
to each driver. Please refer to the release notes of each individual
driver (linked below):</p><ul><li><a href="https://github.com/mongodb/mongo-c-driver/releases">C 0.94.0</a></li><li><a href="https://github.com/mongodb/mongo-cxx-driver/releases">C++ 0.0-2.6</a></li><li><a href="https://github.com/mongodb/mongo-csharp-driver/releases">C# 1.9.0</a></li><li><a href="http://mongodb.github.io/casbah/whats_new.html#casbah-2-7-and-mongo-db-2-6-features">Casbah 2.7.0</a> (Scala)</li><li><a href="https://github.com/mongodb/mongo-java-driver/releases">Java 2.12.0</a></li><li><a href="https://www.npmjs.org/package/mongodb">Node 1.4.0</a></li><li><a href="http://api.mongodb.org/python/current/changelog.html">Python 2.7</a></li><li><a href="http://pecl.php.net/package/mongo/1.5.0">PHP 1.5.0</a></li><li><a href="https://github.com/mongodb/mongo-ruby-driver/releases">Ruby 1.10.0</a></li></ul>
]]></content:encoded></item><item><title>Cross Compiling with Go</title><link>https://spf13.com/p/cross-compiling-with-go/</link><pubDate>Fri, 28 Feb 2014 00:00:00 UTC</pubDate><guid>https://spf13.com/p/cross-compiling-with-go/</guid><media:content url="https://spf13.com/p/cross-compiling-with-go/firos-nv-Z2c6ounF-iE-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/cross-compiling-with-go/firos-nv-Z2c6ounF-iE-unsplash.jpg"/><description>&lt;p>One of the great features of golang is that you can compile executables
for many different platforms and architectures from a single machine. It’s
really nice to be able to provide executables of
&lt;a href="https://gohugo.io">Hugo&lt;/a> for a bunch of different platforms and
architectures without having to have all these different machines in
a build cluster.&lt;/p>
&lt;p>As I’ve been working with Hugo, I’ve wanted to make the experience of
cross compiling as easy and painless as possible. My first attempt was
following the &lt;a href="http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1">excellent guide by Dave
Cheney&lt;/a>.
It provides a bash script that automated the process, but wasn’t very
customizable. I started writing another script to adjust the behavior to
what I needed when I came across &lt;a href="https://github.com/laher/goxc">goxc&lt;/a>. Inspired by Dave’s script,
&lt;a href="https://github.com/laher/goxc">goxc&lt;/a> is a go application that not only cross compiles, but also
can compress the different binaries and package them with the readme and
license. It’s customizable and easy to use.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/cross-compiling-with-go/firos-nv-Z2c6ounF-iE-unsplash.jpg" alt="Cross Compiling with Go"/><p>One of the great features of golang is that you can compile executables
for many different platforms and architectures from a single machine. It’s
really nice to be able to provide executables of<a href="https://gohugo.io">Hugo</a> for a bunch of different platforms and
architectures without having to have all these different machines in
a build cluster.</p><p>As I’ve been working with Hugo, I’ve wanted to make the experience of
cross compiling as easy and painless as possible. My first attempt was
following the<a href="http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1">excellent guide by Dave
Cheney</a>.
It provides a bash script that automated the process, but wasn’t very
customizable. I started writing another script to adjust the behavior to
what I needed when I came across<a href="https://github.com/laher/goxc">goxc</a>. Inspired by Dave’s script,<a href="https://github.com/laher/goxc">goxc</a> is a go application that not only cross compiles, but also
can compress the different binaries and package them with the readme and
license. It’s customizable and easy to use.</p><p>Here are the necessary steps to be able to cross compile including the
gotchas that are important.</p><h2 id="step-1-prep-go-to-be-able-to-cross-compile">Step 1. Prep Go to be able to cross compile</h2><p>We need to compile go from source to be able to cross compile. While any
host can be used, I use OSX as the host. If you are on a different
platform or prefer to build go yourself follow the excellent<a href="http://golang.org/doc/install/source">documentation on building Go from
source</a>. The following instructions
are how I prepare go for cross compilation on OSX.</p><pre><code>brew update
brew install go --cross-compile-all</code></pre><p>If you already have go installed, use</p><pre><code>brew reinstall go --cross-compile-all</code></pre><p>After this step please check your $PATH and make sure it’s setup
correctly.</p><p>I also check that<code>go version</code> returns the version I’m expecting.</p><pre><code>go version
go version go1.2 darwin/amd64</code></pre><p>I also check that the build happened properly and the system has all the
right file it needs to be able to cross compile. You should see a lot of
platforms and architectures under the /pkg/ directory inside GOROOT.</p><pre><code>ls `go env GOROOT`/pkg
darwin_386 freebsd_386 freebsd_arm linux_amd64 netbsd_386 netbsd_arm openbsd_386 plan9_386 windows_386
darwin_amd64 freebsd_amd64 linux_386 linux_arm netbsd_amd64 obj openbsd_amd64 tool windows_amd64</code></pre><p>If any of these checks return unexpected results then don’t continue.
Please check your steps and make sure that you didn’t miss anything. As
a last resource, carefully building manually from source should resolve
any issues.</p><h2 id="step-2-get-goxc">Step 2. Get goxc</h2><pre><code>go get github.com/laher/goxc</code></pre><p>Then prepare goxc to be able to cross compile.</p><pre><code>goxc -t</code></pre><h2 id="step-3-prep-the-source-and-dependencies">Step 3. Prep the source and dependencies</h2><p>I like to start with a clean GOPATH so I have the latest of all dependencies.</p><pre><code>rm -rf ~/.gopath
mkdir ~/.gopath
GOPATH=$HOME/.gopath
go get github.com/spf13/hugo
go test github.com/spf13/hugo/...</code></pre><p>Note, this is not the gopath I use to develop with. I use a temporary
gopath when building to ensure that I have the latest versions of each
library and dependency.</p><h2 id="step-4-configuring-goxc">Step 4. Configuring goxc</h2><p>For many people the defaults will work. I customize goxc slightly to fit
my situation. I prefer to provide the version and include that in the
build package. I also like to format the built packages a bit differently.
We also don’t want to build the plan9 binary due to lack of watcher support for the OS.</p><p>We could use the following command to build each time.</p><pre><code>goxc -d="$HOME/Code/GoBuilds/" -bc="linux windows darwin freebsd netbsd" -pv=0.10 -o="{{.Dest}}{{.PS}}{{.AppName}}{{.PS}}{{.Version}}{{.PS}}{{.AppName}}_{{.Version}}_{{.Os}}_{{.Arch}}{{.Ext}}"</code></pre><p>Instead of typing this each and every time, I prefer to use the support
goxc has for a config file. Creating a configuration file is very
straightforward since goxc does it for you. Type the same line but append
‘-wc’ at the end and it will create a config file with these settings
specific to your project. For me I prefer to leave out the packageversion
setting in the config file. Since I will provide that each time.</p><pre><code>goxc -d="$HOME/Code/GoBuilds/" -bc="linux windows darwin freebsd netbsd" -o="{{.Dest}}{{.PS}}{{.AppName}}{{.PS}}{{.Version}}{{.PS}}{{.AppName}}_{{.Version}}_{{.Os}}_{{.Arch}}{{.Ext}}"
cat .goxc.json
{
"ArtifactsDest": "/Users/spf13/Code/GoBuilds/",
"OutPath": "{{.Dest}}{{.PS}}{{.AppName}}{{.PS}}{{.Version}}{{.PS}}{{.AppName}}_{{.Version}}_{{.Os}}_{{.Arch}}{{.Ext}}",
"BuildConstraints": "linux windows darwin freebsd netbsd",
"ConfigVersion": "0.9"
}%</code></pre><h2 id="step-5-cross-compiling">Step 5. Cross Compiling</h2><p>With the config file in place, building is as simple as</p><pre><code>goxc -pv=”0.10”</code></pre><p>The goxc program will run for a while first building all dependencies for
each architecture and platform. This will take most of the time. At the
end it will build your application for each arch and os.</p><p>If all goes well the output should resemble the following:</p><div class="transcript"><pre><code>
[goxc:xc] 2014/03/01 11:11:55 Parallelizing xc for 13 platforms, using max 7 of 8 processors
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {linux 386}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {linux amd64}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {linux arm}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {windows 386}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {windows amd64}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {darwin 386}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {darwin amd64}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {freebsd 386}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {freebsd amd64}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {freebsd arm}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {netbsd 386}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {netbsd amd64}.
[goxc:xc] 2014/03/01 11:11:55 mainDirs : [/Users/spf13/Code/hugo]
[goxc:xc] 2014/03/01 11:11:55 building hugo for platform {netbsd arm}.
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=linux GOARCH=386]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_386 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=linux GOARCH=amd64]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_amd64 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=windows GOARCH=386]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_windows_386.exe .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=windows GOARCH=amd64]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_windows_amd64.exe .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=darwin GOARCH=386]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_darwin_386 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=darwin GOARCH=amd64]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_darwin_amd64 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=freebsd GOARCH=386]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_386 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=freebsd GOARCH=amd64]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_amd64 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=freebsd GOARCH=arm]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_arm .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=netbsd GOARCH=386]
[goxc:xc] 2014/03/01 11:11:55 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_386 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=netbsd GOARCH=arm]
[goxc:xc] 2014/03/01 11:11:59 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_arm .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=linux GOARCH=arm]
[goxc:xc] 2014/03/01 11:11:59 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_arm .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:11:55 specified env vars for 'go': [GOOS=netbsd GOARCH=amd64]
[goxc:xc] 2014/03/01 11:11:59 invoking '/usr/local/Cellar/go/1.2/libexec/bin/go build -ldflags " -X main.BUILD_DATE '2014-03-01T11:11:55-05:00' -X main.VERSION '0.10' " -o /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_amd64 .' from '/Users/spf13/Code/hugo'
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_386' is an ELF file (arch: EM_386, osabi: ELFOSABI_NONE)
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_386' is an ELF file (arch: EM_386, osabi: ELFOSABI_FREEBSD)
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_darwin_386' is a Mach-O file (arch: Cpu386)
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_windows_386.exe' is a PE file, arch: 332 (332='X86' and 34404='AMD64')
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_amd64' is an ELF file (arch: EM_X86_64, osabi: ELFOSABI_NONE)
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_windows_amd64.exe' is a PE file, arch: 34404 (332='X86' and 34404='AMD64')
[goxc:xc] 2014/03/01 11:12:04 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_amd64' is an ELF file (arch: EM_X86_64, osabi: ELFOSABI_FREEBSD)
[goxc:xc] 2014/03/01 11:12:05 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_darwin_amd64' is a Mach-O file (arch: CpuAmd64)
[goxc:xc] 2014/03/01 11:12:05 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_arm' is an ELF file (arch: EM_ARM, osabi: ELFOSABI_FREEBSD)
[goxc:xc] 2014/03/01 11:12:05 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_386' is an ELF file (arch: EM_386, osabi: ELFOSABI_NETBSD)
[goxc:xc] 2014/03/01 11:12:05 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_amd64' is an ELF file (arch: EM_X86_64, osabi: ELFOSABI_NETBSD)
[goxc:xc] 2014/03/01 11:12:05 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_arm' is an ELF file (arch: EM_ARM, osabi: ELFOSABI_NETBSD)
[goxc:xc] 2014/03/01 11:12:05 File '/Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_arm' is an ELF file (arch: EM_ARM, osabi: ELFOSABI_NONE)
[goxc:xc] 2014/03/01 11:12:05 Task xc succeeded
[goxc:codesign] 2014/03/01 11:12:05 Task codesign succeeded
[goxc:copy-resources] 2014/03/01 11:12:05 resources: [README.md LICENSE.md]
[goxc:copy-resources] 2014/03/01 11:12:05 Copying file /Users/spf13/Code/hugo/README.md to /Users/spf13/Code/GoBuilds/hugo/0.10/README.md
[goxc:copy-resources] 2014/03/01 11:12:05 Copying file /Users/spf13/Code/hugo/LICENSE.md to /Users/spf13/Code/GoBuilds/hugo/0.10/LICENSE.md
[goxc:copy-resources] 2014/03/01 11:12:05 Task copy-resources succeeded
[goxc:archive-zip] 2014/03/01 11:12:05 Parallelizing archive-zip for 10 platforms, using max 7 of 8 processors
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_windows_386.zip
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_windows_amd64.zip
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_darwin_386.zip
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_386.zip
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_386.zip
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_arm.zip
[goxc:archive-zip] 2014/03/01 11:12:11 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_darwin_amd64.zip
[goxc:archive-zip] 2014/03/01 11:12:12 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_freebsd_amd64.zip
[goxc:archive-zip] 2014/03/01 11:12:12 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_arm.zip
[goxc:archive-zip] 2014/03/01 11:12:12 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_netbsd_amd64.zip
[goxc:archive-zip] 2014/03/01 11:12:12 Task archive-zip succeeded
[goxc:archive-tar-gz] 2014/03/01 11:12:12 Parallelizing archive-tar-gz for 3 platforms, using max 7 of 8 processors
[goxc:archive-tar-gz] 2014/03/01 11:12:14 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_386.tar.gz
[goxc:archive-tar-gz] 2014/03/01 11:12:14 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_arm.tar.gz
[goxc:archive-tar-gz] 2014/03/01 11:12:15 Artifact(s) archived to /Users/spf13/Code/GoBuilds/hugo/0.10/hugo_0.10_linux_amd64.tar.gz
[goxc:archive-tar-gz] 2014/03/01 11:12:15 Task archive-tar-gz succeeded
[goxc:pkg-build] 2014/03/01 11:12:18 Task pkg-build succeeded
[goxc:rmbin] 2014/03/01 11:12:18 Task rmbin succeeded
[goxc:downloads-page] 2014/03/01 11:12:18 Task downloads-page succeeded</code></pre></div><h2 id="addendum">Addendum</h2><p>A few people have commented on<a href="http://www.reddit.com/r/golang/comments/1zjg2r/cross_compiling_with_go/">reddit</a> with additional information.</p><p>Some have reported success using<a href="https://github.com/mitchellh/gox">gox</a>. I have yet to play with it
but<a href="http://mitchellh.com">Mitchell</a> is known for writing excellent
software so I would expect nothing less here.<a href="https://github.com/mitchellh/gox">Gox</a> does less than<a href="https://github.com/laher/goxc">goxc</a>, but that’s the point.</p><p>Cgo has issues when cross compiling. If you depend on cgo then you’re
probably going to be better off building on the native platforms. The go
tool will disable cgo support by default. To explicitly enable cgo, set CGO_ENABLED=1.</p>
]]></content:encoded></item><item><title>Why I use spf13-vim</title><link>https://spf13.com/p/why-i-use-spf13-vim/</link><pubDate>Fri, 17 Jan 2014 00:00:00 UTC</pubDate><guid>https://spf13.com/p/why-i-use-spf13-vim/</guid><media:content url="https://spf13.com/p/why-i-use-spf13-vim/spf13-vim-screenshot.png" medium="image"/><media:thumbnail url="https://spf13.com/p/why-i-use-spf13-vim/spf13-vim-screenshot.png"/><description>&lt;p>&lt;a href="http://vim.spf13.com">spf13-vim&lt;/a>, a completely cross platform
distribution of vim plugins and resources for Vim, GVim and MacVim stays
true to it&amp;rsquo;s vim roots while adding modern features including a plugin
management system, a curated plugin set with customized configuration,
advanced autocomplete, tags, support for dozens of languages and much
more.&lt;/p>
&lt;p>I recently read a thread where the author asked for feedback on whether
or not to use spf13-vim. Responses varied greatly with some people
loving it to others claiming it was bloated and overkill. Some suggested
everyone should create their own configuration from scratch. Not
surprisingly many of these criticisms were accompanied by links to
people&amp;rsquo;s own vim configurations. With so many options out there, why
would anyone use spf13-vim. While I can&amp;rsquo;t speak for anyone else, here
are four reasons why I use spf13-vim.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/why-i-use-spf13-vim/spf13-vim-screenshot.png" alt="Why I use spf13-vim"/><p><a href="http://vim.spf13.com">spf13-vim</a>, a completely cross platform
distribution of vim plugins and resources for Vim, GVim and MacVim stays
true to it&rsquo;s vim roots while adding modern features including a plugin
management system, a curated plugin set with customized configuration,
advanced autocomplete, tags, support for dozens of languages and much
more.</p><p>I recently read a thread where the author asked for feedback on whether
or not to use spf13-vim. Responses varied greatly with some people
loving it to others claiming it was bloated and overkill. Some suggested
everyone should create their own configuration from scratch. Not
surprisingly many of these criticisms were accompanied by links to
people&rsquo;s own vim configurations. With so many options out there, why
would anyone use spf13-vim. While I can&rsquo;t speak for anyone else, here
are four reasons why I use spf13-vim.</p><p>First, a bit of history&hellip; spf13-vim started as my personal vim
configuration. As long as I can remember I&rsquo;ve obsessed with user
experience and spent an embarrassingly large amount of time customizing
each and every single action. As many others have, I put my
configuration on github, not with the intent to share it with others,
but to have a safe place to keep it for when I setup new computers.</p><h2 id="1-vanilla-vim-like">1. Vanilla Vim like</h2><p>In designing spf13-vim I took extreme caution with every decision I made
and made certain to not override any essential Vim functionality . I had
invested years in becoming proficient in vanilla Vim and didn&rsquo;t want to
throw any of those muscle memories away. I also wanted to remain
completely comfortable in vanilla Vim. At the same time I wanted to
smooth over some of the rougher parts and provide additive features.
Virtually every one of the vanilla keystrokes and actions remain untouched.</p><p>A handful of default keystrokes have been remapped. A few of what I
consider some of the less useful behaviors have been adjusted to be more
consistent with the overall vim experience. For example, the first thing
people learn in Vim is how uses &lsquo;hjkl&rsquo; for cursor movement, spf13-vim
adds ctrl+hjkl to move around windows and &lsquo;HL&rsquo; (shift+hl) to move
between tabs. Since these are common actions, it felt decidedly
unvim-like to hide them behind commands or multiple keystrokes. These
tab movements override Vim&rsquo;s default behavior of moving to the top &lsquo;H&rsquo;
and bottom &lsquo;L&rsquo; of the window. Something I don&rsquo;t ever use.</p><h2 id="2-customizability">2. Customizability</h2><p>Continuing with the history, over time people found it and began to use
it for themselves. Recognizing this I adding more flexibility to
spf13-vim which provided the ability for people to use spf13-vim as a
foundation, but add their own customizations to configure it precisely
to fit their own needs.</p><p>Perhaps you work differently than I do and use the default &lsquo;H&rsquo; &amp;
&lsquo;L&rsquo; functionality. spf13-vim wraps each one of the overrides
with an conditional statement enabling users to easily customize it
exactly to their needs. Most users find spf13-vim default requires
little customization but are happy to discover how easy it is to craft
their personalized vim experience.</p><h2 id="3-power-of-the-masses">3. Power of the masses</h2><p>The strength and heart of open source comes from people recognizing
together we can make something better than any of us could alone. As
more and more people began to use spf13-vim, many of them desired to
contribute back. While spf13-vim started as my personal project, it has
grown from mine to ours. I use vim to write in a few languages, and
invested time discovering and customizing the best plugins for those
languages, collectively the users of spf13-vim support far more
languages than any one person would be able to. I love when I edit a
file in a language I haven&rsquo;t used before and someone else has already
crafted a customized experience in spf13-vim.</p><p>spf13-vim benefits greatly from contributions from it&rsquo;s completely
diverse user base. This ensures regardless of your development stack or
purpose, spf13-vim likely meets your needs. With support for many
different languages, plugins and uses, vim could become weighted down.
spf13-vim makes it trivial to include only the features you would use by
defining a simple list.</p><p>One of the primary reasons I hear for people abandoning Vim is properly
configuring vim is too difficult and plugins tend to be incompatible
with each other. With many active and engaged users working together
issues and incompatibilities are discovered and fixed by the users
together quickly.</p><p>The vim plugin community is always evolving. New plugins come out daily.
With many different users exploring and experimenting with new plugins
this results in vim configuration using the latest and greatest. Without
investing countless hours exploring, each user benefits greatly from the
combined efforts of everyone. spf13-vim receives many pull requests each
week keeping our collective vim experience fresh.</p><h2 id="4-the-community">4. The community</h2><p>The primary reason I love using spf13-vim is the great community. This
goes beyond the power of the masses, the spf13-vim users are some of the
most patient and kind people I&rsquo;ve ever encountered. The<a href="https://groups.google.com/forum/#!forum/spf13-vim-discuss">spf13-vim
mailing list</a>
is full of people, sometimes naive, asking for help. I am consistently
impressed with the willingness of spf13-vim users to help.</p><p>I remember back to when I first learned Vim. It was overwhelming at
times and frustrating. After 8 years using Vim full time I still feel
this way from time to time. Anyone who has tried to use Vim can likely
relate. How wonderful it is to have a group of helpful users available
and willing to assist.</p><p>When I<a href="http://spf13.com/presentation">speak</a> at conferences I&rsquo;m most
often recognized for vim configurations. People come up and tell me how
happy they are to &ldquo;use me&rdquo;. How lucky I am to be part of this great
project that bears my name. A big thanks to the talented users (and
contributors) of the greatest vim experience.</p><p>That&rsquo;s why I use<a href="http://vim.spf13.com">spf13-vim</a>. Why do you?</p>
]]></content:encoded></item><item><title>A modern CLI Commander for go</title><link>https://spf13.com/p/a-modern-cli-commander-for-go/</link><pubDate>Thu, 07 Nov 2013 00:00:00 UTC</pubDate><guid>https://spf13.com/p/a-modern-cli-commander-for-go/</guid><media:content url="https://spf13.com/p/a-modern-cli-commander-for-go/godwin-angeline-benjo-DY0z8geIsX8-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/a-modern-cli-commander-for-go/godwin-angeline-benjo-DY0z8geIsX8-unsplash.jpg"/><description>&lt;p>While developing &lt;a href="https://gohugo.io">Hugo&lt;/a> I became disappointed
with the interface limitations flags alone provide. A quick look at
virtually any command line application (ls, grep, less, etc) reveals
that most applications overuse flags to do everything and often allow
conflicting flags to be applied.&lt;/p>
&lt;p>Even though hugo is relatively simple, we already had the ability to
stack flags that didn&amp;rsquo;t make sense. You can set the port using &amp;ndash;port
but this only has an effect if you also specified &amp;ndash;server. Clearly
another mechanism is needed.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/a-modern-cli-commander-for-go/godwin-angeline-benjo-DY0z8geIsX8-unsplash.jpg" alt="A modern CLI Commander for go"/><p>While developing<a href="https://gohugo.io">Hugo</a> I became disappointed
with the interface limitations flags alone provide. A quick look at
virtually any command line application (ls, grep, less, etc) reveals
that most applications overuse flags to do everything and often allow
conflicting flags to be applied.</p><p>Even though hugo is relatively simple, we already had the ability to
stack flags that didn&rsquo;t make sense. You can set the port using &ndash;port
but this only has an effect if you also specified &ndash;server. Clearly
another mechanism is needed.</p><p>Modern applications like git, brew and go use sub commands to control
actions that the application would perform. Each action in turn has a
set of flags associated with it. It&rsquo;s a great pairing that works well.</p><p>I quick something search for existing libraries turned up a few. Mostly
based off of the code written for the go tool, which wasn&rsquo;t intended to
be a general purpose library, but people began using it nonetheless.</p><p>I was disappointed to discover than none met my needs.
Unwilling to be deterred, I decided to build Cobra, a commander for
modern CLI go applications.</p><h2 id="nested-sub-commands">Nested Sub Commands</h2><p>A core requirement for Hugo commands was the ability to nest
subcommands. A planned feature of Hugo is the ability to install themes,
shortcodes and more from a central repository. While a possible
interface could look like &lsquo;hugo get &ndash;type=shortcode &ndash;name&rsquo;, I prefer
the interface &lsquo;hugo get shortcode NAME&rsquo;.</p><p>This preferred interface could be accomplished while using existing
libraries, it would be through manual parsing of strings following the
command. This made no sense to me. If we already have a mechanism to
parse strings on the command line, why not use what we already have.</p><p><strong>Cobra supports as subcommands as many levels deep as you want to nest
them.</strong></p><h2 id="commands-all-the-way">Commands all the way</h2><p>Existing libraries all define a top level controller object which has
builders for each of the commands (of which they only support one
level). To me this seemed unnecessary and definitively un-go-like.</p><p>In Cobra, everything is a command or a flag. The top level of the
application is a command which optional can run an action and optionally
have subcommands (at least one of these two is required). Each of the
children commands then can in turn have an action and children and so
forth.</p><p>Additionally<strong>creating a command is as simple as creating a struct.</strong> No
inflexible NewCommand methods needed.</p><h2 id="posixgnu-flags">POSIX/GNU Flags</h2><p>The go standard flag library is great. I really appreciate it&rsquo;s
simplicity and power. For unknown reasons the authors decided to throw
out decades of flag standards and define their own. I&rsquo;m not a huge fan
of the GNU/POSIX style flags, but they work well enough and it&rsquo;s what
most people expect. If there&rsquo;s ever a place to do things in a new way,
this doesn&rsquo;t seem like it. Cobra has full support for POSIX flag
functionality provided by the<a href="https://github.com/ogier/pflag">pflag
libary</a>, a fork of the flag standard
library which maintains the same interface while adding POSIX
compliance.</p><p>Cobra has tight integration with this flag library.<strong>Flags can be defined
globally, for a sub tree or for a specific command.</strong></p><h2 id="extensibility">Extensibility</h2><p>In each of the existing libraries they had code that had conditional
logic to check if the first string was &lsquo;help&rsquo;, then they ran a different
code path. This hard coded logic meant that if you used these libraries
you either had to fork them or were stuck with their help routine.
Additionally I have a philosophical issue with using conditional logic
to handle a specific command. If you are building a commander to handle
arbitrary commands, why not use that mechanism to define help.</p><p>Cobra&rsquo;s help functionality is a command and provides a high degree of
customization without forking.</p><h2 id="conclusion">Conclusion</h2><p>Find Examples, Documentation &amp; Cobra at<a href="http://github.com/spf13/cobra">http://github.com/spf13/cobra</a></p><p>Contributions and feedback welcome.</p>
]]></content:encoded></item><item><title>Refactoring with go fmt</title><link>https://spf13.com/p/refactoring-with-go-fmt/</link><pubDate>Mon, 07 Oct 2013 00:00:00 UTC</pubDate><guid>https://spf13.com/p/refactoring-with-go-fmt/</guid><media:content url="https://spf13.com/p/refactoring-with-go-fmt/alex-chumak-zGuBURGGmdY-unsplash.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/refactoring-with-go-fmt/alex-chumak-zGuBURGGmdY-unsplash.jpg"/><description>&lt;p>I&amp;rsquo;ve recently been getting into go. I&amp;rsquo;ve built a &lt;a href="https://gohugo.io">few
applications&lt;/a> &lt;a href="https://spf13.com/post/announcing-cobra">and&lt;/a> &lt;a href="http://spf13.com/project/nitro">libraries&lt;/a>.&lt;/p>
&lt;p>For this post, let&amp;rsquo;s explore the &amp;lsquo;gofmt&amp;rsquo; or &amp;lsquo;go fmt&amp;rsquo; tool further.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/refactoring-with-go-fmt/alex-chumak-zGuBURGGmdY-unsplash.jpg" alt="Refactoring with go fmt"/><p>I&rsquo;ve recently been getting into go. I&rsquo;ve built a<a href="https://gohugo.io">few
applications</a><a href="/post/announcing-cobra">and</a><a href="http://spf13.com/project/nitro">libraries</a>.</p><p>For this post, let&rsquo;s explore the &lsquo;gofmt&rsquo; or &lsquo;go fmt&rsquo; tool further.</p><p>Go ships with a basic set of tools common to most languages and
development environments. Like most things with go, the tools are simple
in design, but powerful in function.</p><ul><li>go build – compile the code</li><li>go install – install (and build) a package</li><li>go get – download and install packages including dependencies</li><li>go test – run test suites and benchmarks</li><li>go doc – generate and view documentation</li><li>go fmt – format and refactor your code</li><li>go run – build and run an app</li></ul><p>First thing to note, &lsquo;go fmt&rsquo; is just an alias for &lsquo;gofmt -l -w&rsquo;. When
following along, please take note as the two accept different parameters.</p><h2 id="using-gofmt-to-format-code">Using gofmt to format code</h2><p>We&rsquo;ve had decades of endless argument and debate about the correct
format of software. Each language has it&rsquo;s own different idioms and
changes and many have multiple differing standards. Golang has done away
with these endless debates once and for all by shipping a formatter
that ensures that all go code follows the exact same format.</p><p>Go fmt isn&rsquo;t without it&rsquo;s detractors. People complain that go fmt isn&rsquo;t
customizable and that it puts braces where they don&rsquo;t want them. A standard
isn&rsquo;t customizable, and it&rsquo;s this thinking that has caused so much controversy
in every other language. Go fmt is great. Not only does it know the correct
format, but it understands go code. It properly lines up definitions, properly
wraps if statements when they grow to long and ensures that your code
completely conforms to the standard.</p><p>The best part of this is that all my code complies with the format
standard perfectly and I&rsquo;ve never read the go format policy. I just
write code and run go fmt on that code and immediately my code
conforms.</p><h3 id="preview-which-changes-gofmt-will-make">Preview which changes gofmt will make</h3><p>The following command will show you all the changes gofmt will make in
diff format.</p><pre><code>$ gofmt -d path-to-code</code></pre><p>Given a file, it operates on that file; given a directory, it operates
on all .go files in that directory, recursively.</p><h3 id="format-your-code">Format your code</h3><p>The following command will make changes directly to your source files.</p><pre><code>$ gofmt path-to-code
or
$go fmt -l -w -s path-to-code</code></pre><p>Here is an example of the kind of changes gofmt would make</p><pre><code> func (f *Filesystem) Files() []*File {
- if len(f.files)&lt;1 {f.captureFiles()}
+ if len(f.files) &lt; 1 {
+ f.captureFiles()
+ }
return f.files
}</code></pre><p>Given a file, it operates on that file; given a directory, it operates
on all .go files in that directory, recursively.</p><h3 id="simplify-mode">Simplify mode</h3><p>&lsquo;gofmt&rsquo; can also simplify code where appropriate with the additional -s
flag. I have found that simplify is safe to use and only will modify
code when it&rsquo;s obvious and clear.</p><p>Here is an example of the kind of changes simplify would make.</p><pre><code>- final = append(final, first[start:len(first)]...)
+ final = append(final, first[start:]...)</code></pre><h2 id="using-gofmt-to-refactor-code">Using gofmt to refactor code</h2><p>gofmt is much more powerful than simply eliminating arguments about code
formatting. It can also restructure your code. Unlike using traditional
unix tools like awk and grep, gofmt understands go code and can be used
to restructure your code easily.</p><p>gofmt uses patterns to identify changes to make to your code. Patterns
are established in the first half the expression followed by a &lsquo;->&rsquo; then
used by the second half of the expression.</p><p>Use the flag -d instead of -w to check what gofmt will do prior to
running it.</p><h3 id="examples">Examples</h3><p>To check files for unnecessary parentheses (example from the docs):</p><pre><code>gofmt -r '(a) -> a' -l *.go
diff hugolib/summary.go gofmt/hugolib/summary.go
for i, line := range rstLines {
if strings.HasPrefix(line, "&lt;body>") {
- rstLines = (rstLines[i+1 : len(rstLines)-3])
+ rstLines = rstLines[i+1 : len(rstLines)-3]
}
}
diff parser/parse_frontmatter_test.go gofmt/parser/parse_frontmatter_test.go
- if (err == nil) != test.errIsNil {
+ if err == nil != test.errIsNil {</code></pre><p>Rename a field in a struct. Notice how it not only changes the
definition, but every place that the value is set or referenced.</p><pre><code>gofmt -r 'a.Info -> a.Information' -d ./
diff hugolib/site.go gofmt/hugolib/site.go
func (s *Site) initializeSiteInfo() {
- s.Info = SiteInfo{
+ s.Information = SiteInfo{
- page.Site = s.Info
+ page.Site = s.Information
- s.Info.Indexes = s.Indexes.BuildOrderedIndexList()
+ s.Information.Indexes = s.Indexes.BuildOrderedIndexList()
- s.Info.LastChange = s.Pages[0].Date
+ s.Information.LastChange = s.Pages[0].Date
for _, p := range s.Pages {
- p.Site = s.Info
+ p.Site = s.Information
}
- n.Data["OrderedIndex"] = s.Info.Indexes[plural]
+ n.Data["OrderedIndex"] = s.Information.Indexes[plural]
return &amp;Node{
Data: make(map[string]interface{}),
- Site: s.Info,
+ Site: s.Information,
}</code></pre>]]></content:encoded></item><item><title>Go Go Hugo blog</title><link>https://spf13.com/p/go-go-hugo-blog/</link><pubDate>Mon, 17 Jun 2013 00:00:00 UTC</pubDate><guid>https://spf13.com/p/go-go-hugo-blog/</guid><media:content url="https://spf13.com/p/go-go-hugo-blog/spf13-responsive.jpg" medium="image"/><media:thumbnail url="https://spf13.com/p/go-go-hugo-blog/spf13-responsive.jpg"/><description>&lt;p>After after a few months of work I&amp;rsquo;m happy to display the newest incarnation of spf13.com.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/go-go-hugo-blog/spf13-responsive.jpg" alt="Go Go Hugo blog"/><p>After after a few months of work I&rsquo;m happy to display the newest incarnation of spf13.com.</p><p>The past few years this blog has powered by wordpress and drupal prior to that. Both are
are fine pieces of software, but over time I became increasingly disappointed with
how they are both optimized for writing content even though significantly most common
usage is reading content. Due to the need to load the PHP interpreter on each request
it could never be considered fast and consumed a lot of memory on my VPS.
I have been intrigued by the recent trend of static site generation, and
determined that the next version of my blog should be generated by one. I also
began looking into the resolutions and devices used by visitors to my blog
and they varied greatly. It didn&rsquo;t make sense to cater the experience to the
common one, largely because there wasn&rsquo;t one. After 5 years and a two engines
this site accumulated a lot of cruft. Poorly rendered html from wordpress wysiwyg.
Incorrectly automatically cropped thumbnails. I took this opportunity to clean it
all and<strong>focus on the content</strong>.</p><h2 id="static-site-generator">Static Site Generator</h2><p>Determined to use a static site generator I reviewed the commonly used ones. While
I didn&rsquo;t do a thorough investigation, I discovered that all were relatively slow
taking minutes to render this blog. Additionally calling it a blog is overly
simplifying things, there&rsquo;s a lot of different content types on this website.
Since I was already looking for a good project to write in golang I decided to build
my own static site generator called hugo. I also determined to
optimize the website for speed, performance and presentation. Like many
of the other static site generators it takes a similar approach of
using markdown with front matter with the meta data and generates html files for
apache, nginx or another web server to serve up. I&rsquo;m preparing Hugo for it&rsquo;s initial
release and will blog more about it then.</p><h2 id="responsive-design">Responsive Design</h2><p>The most noticeable part of the new design is the responsive layout. Go ahead, give it a
try: resize the window and watch as the design adjust to fill the narrowest or largest of
screens. Many people using responsive design optimize for smaller screens and ignore
higher resolution monitors. Since my readership comprises a wide variety of screens and devices
including hi res monitors. This design is optimized for even the highest of resolutions
to both place the focus on the content as well as utilize the available space.</p><h2 id="retina-friendly">Retina Friendly</h2><p>10gen, my employer graciously provided me with an excellent Retina display mac book.
Ever since, it&rsquo;s been a bit disappointing viewing some websites which suddenly
looked unimpressive on this new display. I wanted every image and shape to look
crisp and clean on any display. The optimal way to do this is through heavy use of
vector based icon fonts which cleanly scale to any size. The logo and all glyphs
on this site are rendered using a single icon font. All photographs have been
optimized for retina displays and compressed using JPEGmini. It looks great on
a retina display.</p><h2 id="fast-browsing">Fast browsing</h2><p>In the previous incarnation of this site which ran wordpress, the site performance was
adequate. According to pingdom it was faster that 86% of all tested websites, but I was
never satisfied. The total page size was 1.5 MB and an average page contained over 82 requests.</p><figure class="twothirds center hid"><img src="https://spf13.com/p/go-go-hugo-blog/pingdom-old.png" alt="Pingdom of former spf13.com"/><figcaption><p>
Pingdom of former spf13.com</p></figcaption></figure><p>Now, the number of requests for a typical page is around 10. Including network transfer time
(the majority of load time) the load is around a quarter of a second on a cold load. Given
modern browsers and caching subsequent results will be around 100 ms. The page size is under
150kb and is now faster than 99% of all tested websites.</p><figure class="twothirds center hid"><img src="https://spf13.com/p/go-go-hugo-blog/pingdom-new.png" alt="Pingdom of current spf13.com"/><figcaption><p>
Pingdom of current spf13.com</p></figcaption></figure><h2 id="easy-navigation">Easy Navigation</h2><p>Lastly navigation has been greatly simplified. Since most visitors enter through a post
rather than the homepage, I put the focus on the content itself. Other than the top level
navigation which brings you to the different content types, the rest of the content is
accessed through similar content. If you are viewing a presentation or post on MongoDB,
you are likely interested in MongoDB and would be interested in similar content which
is available via tags and topic links available on the page.</p><h2 id="thank-you">Thank you</h2><p>I present this new blog to you and hope you find it valuable. Over the next
few weeks I&rsquo;ll be following up this post with a series of detailed how-tos based
on the experience of building this site.</p><p><strong>Thank you for visiting, and tell me what you think in the comments.</strong></p>]]></content:encoded></item><item><title>MongoDB Driver days hackathon round up</title><link>https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/</link><pubDate>Fri, 16 Nov 2012 00:00:00 UTC</pubDate><guid>https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/</guid><media:content url="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/mongodb-gh-projects.png" medium="image"/><media:thumbnail url="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/mongodb-gh-projects.png"/><description>&lt;p>Two times a year the drivers team at 10gen gathers together for a face
to face meeting to spend time together working on issues and setting
forth our goals for the upcoming six months. In September 2012 we all
converged on New York City for the second ever driver days. This time we
split up into teams for a hack-a-thon. As maintainers of drivers &amp;amp;
integrations in over a dozen different languages while we are on the
same team, it isn’t often that we actually work together on the same
codebase. The hack-a-thon gave us a chance to do just that. We split up
into 5 teams each having members from different languages. Without
further ado, here is what we came up with.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/mongodb-gh-projects.png" alt="MongoDB Driver days hackathon round up"/><p>Two times a year the drivers team at 10gen gathers together for a face
to face meeting to spend time together working on issues and setting
forth our goals for the upcoming six months. In September 2012 we all
converged on New York City for the second ever driver days. This time we
split up into teams for a hack-a-thon. As maintainers of drivers &amp;
integrations in over a dozen different languages while we are on the
same team, it isn’t often that we actually work together on the same
codebase. The hack-a-thon gave us a chance to do just that. We split up
into 5 teams each having members from different languages. Without
further ado, here is what we came up with.</p><p><em>Disclaimer.. Each project currently represents exactly one evenings
worth of work. Our intent is to pick the best project or two, polish
them up and move them to the<a href="https://github.com/10gen-labs">10gen Labs</a>
account on github.</em></p><p>As with all things open source, contributions welcome.</p><h2 id="mongo-contributor-hub">Mongo Contributor Hub</h2><figure><img src="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/mongodb-gh-projects.png" alt="mongodb contributor hub screenshot"/></figure><p>Ever wonder what type of open source MongoDB related projects are being
developed these days? We did. So we hacked together a quick Github
search &amp; explore interface for any project Github reports as associated
to MongoDB! Projects are organized by language, fully searchable and
sorted by followers and forks. Built with Nodejs, Express and MongoDB.</p><p><a href="https://github.com/TylerBrock/mongo-contributor-hub">https://github.com/TylerBrock/mongo-contributor-hub</a></p><h2 id="try-aggro">Try Aggro</h2><figure><img src="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/try-aggro-1.png" alt="try aggro screenshot"/></figure><p>With thirteen challenging questions you’ll learn the ins and outs of
aggregation with MongoDB. Will you be able to complete all the
challenges and become an aggregation master?</p><p><a href="https://github.com/rozza/try-aggro">https://github.com/rozza/try-aggro</a></p><h2 id="mongodbodata">MongoDB.OData</h2><figure><img src="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/MongoDB.OData.png" alt="MongoDB.OData screenshot"/></figure><p>OData is a highly used protocol with clients in .NET, Java, jquery, and
many more. It makes sense to be able to support these clients with a
MongoDB backend. With OData v3, the protocol is now rich enough to
support the rich document model MongoDB already provides. MongoDB.OData
let’s you expose your entites (MongoDB documents), complex types
(MongoDB embedded documents), and collections (MongoDB arrays) via OData
and includes full support for queries and OData service operations.
Support for updating is almost ready.</p><p><a href="https://github.com/craiggwilson/mongo-dotnet-odata">https://github.com/craiggwilson/mongo-dotnet-odata</a></p><h2 id="slow-query-profiler">Slow Query Profiler</h2><figure><img src="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/pXLc4.png" alt="slow-query-profiler"/></figure><p>Logging slow queries is essential for any database application, and
MongoDB makes doing so relatively painless with its database profiler.
Unfortunately, making sense of the system.profile collection and tying
its contents back to your application requires a bit more effort. The
heart of mongoqp<a href="https://github.com/jmikola/mongoqp">Mongo Query
Profiler</a> is a bit of map/reduce JS
that aggregates those queries by their BSON skeleton (i.e. keys
preserved, but values removed). With queries reduced to their bare
structure, any of their statistics can be aggregated, such as average
query time, index scans, counts, etc.</p><p>As big fans of<a href="http://genghisapp.com">Genghis</a>, a single-file MongoDB
admin app, the initial intent was to contribute a new UI with the
profiler results, but one night was not enough time to wrap our heads
around Backbone.js and develop the query aggregation. Instead, we
whipped up a quick frontend using the<a href="http://silex-project.org">Silex</a>
PHP micro-framework. With the hack day deadline no longer looming, there
should be plenty of time to get this functionality ported over to
Genghis. Additionally, the map/reduce JS may also show up in Tyler
Brock’s<a href="https://github.com/TylerBrock/mongo-hacker">mongo-hacker</a> shell
enhancement package.</p><p>While presenting mongoqp to our co-workers, we learned about<a href="https://github.com/dcrosta/professor">Dan
Crosta’s professor</a>, which already
provides many of the features we hoped to implement, such as incremental
data collection. We think there is still a benefit to developing the JS
innards of mongoqp and getting its functionality ported over to other
projects, but I would definitely encourage you to check out professor if
you’d like a stand-alone query profile viewer.</p><p><a href="https://github.com/jmikola/mongoqp">https://github.com/jmikola/mongoqp</a></p><h2 id="aggregation-pipeline-web-interface">Aggregation Pipeline Web Interface</h2><figure><img src="https://spf13.com/p/10gen-driver-days-mongodb-hack-a-thon/Screen-Shot-2012-10-01-at-3.20.19-PM.png" alt="aggregation pipeline web interface"/></figure><p>We built a web app for the new aggregation framework. It allows you to
create pipelines using a web interface, making it easy for a user to
play around with the new framework without having to use the command
syntax. Users can incrementally add pipeline operators to test running
aggregations with different operators, and can use the easy interface as
an educational tool to learn how the pipelines work. The app also allows
you to pipe the results of aggregation framework jobs straight to
user-defined output collections and see a history of past jobs along
with their run-time. The app is built in Ruby on Rails, using the
MongoMapper ODM.</p><p><a href="https://github.com/estolfo/aggre-great">https://github.com/estolfo/aggre-great</a></p>
]]></content:encoded></item><item><title>The Biggest Myths Surrounding Disaster Recovery</title><link>https://spf13.com/post/top-4-biggest-myths-surrounding-disaster-recovery/</link><pubDate>Thu, 04 Oct 2012 00:00:00 UTC</pubDate><guid>https://spf13.com/post/top-4-biggest-myths-surrounding-disaster-recovery/</guid><media:content url="https://spf13.com/post/top-4-biggest-myths-surrounding-disaster-recovery/5046906103_f14d189099_b.jpg" medium="image"/><media:thumbnail url="https://spf13.com/post/top-4-biggest-myths-surrounding-disaster-recovery/5046906103_f14d189099_b.jpg"/><description>&lt;p>There are a variety of reasons businesses either do not have a disaster
recovery plan or their current plan is substandard.  The beliefs of the
people in charge of developing these processes (business owners and IT
department) play a significant role in how effective the overall
strategy will be.  This is problematic when the decision-makers have
bought into one or more of the common myths surrounding disaster
recovery.&lt;/p>
&lt;h2 id="myth--disaster-recovery-is-expensive-and-resource-intensive">Myth – Disaster Recovery is Expensive and Resource Intensive&lt;/h2>
&lt;p>One of the biggest reasons businesses put off developing a disaster
recovery strategy is because they believe it will become too expensive
and resource intensive.  As a result, they view it as more of a luxury
than a necessity.  The truth is as technology continues to evolve; the
costs associated with disaster recovery continue to fall. 
Virtualization, standardization, and automation have all played key
roles in making disaster recovery more affordable.  They have reduced
the number of people required to restore systems which significantly
decreases personnel costs.  In fact, a streamlined disaster recovery
strategy can require only one person.  Virtualization also reduces the
initial capital investment because redundant physical infrastructure is
no longer necessary.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/post/top-4-biggest-myths-surrounding-disaster-recovery/5046906103_f14d189099_b.jpg" alt="The Biggest Myths Surrounding Disaster Recovery"/><p>There are a variety of reasons businesses either do not have a disaster
recovery plan or their current plan is substandard.  The beliefs of the
people in charge of developing these processes (business owners and IT
department) play a significant role in how effective the overall
strategy will be.  This is problematic when the decision-makers have
bought into one or more of the common myths surrounding disaster
recovery.</p><h2 id="myth--disaster-recovery-is-expensive-and-resource-intensive">Myth – Disaster Recovery is Expensive and Resource Intensive</h2><p>One of the biggest reasons businesses put off developing a disaster
recovery strategy is because they believe it will become too expensive
and resource intensive.  As a result, they view it as more of a luxury
than a necessity.  The truth is as technology continues to evolve; the
costs associated with disaster recovery continue to fall. 
Virtualization, standardization, and automation have all played key
roles in making disaster recovery more affordable.  They have reduced
the number of people required to restore systems which significantly
decreases personnel costs.  In fact, a streamlined disaster recovery
strategy can require only one person.  Virtualization also reduces the
initial capital investment because redundant physical infrastructure is
no longer necessary.</p><h2 id="myth--after-planning-there-is-no-way-to-accurately-run-a-test">Myth – After Planning, There is No Way to Accurately Run a Test</h2><p>Many businesses suffer from an ineffective disaster recovery plan and
don’t even realize it.  This is because they do not believe a full-scale
test is possible without significantly disrupting day-to-day
activities.  Virtualization allows recovery plans to be tested against
significant failures multiple times to ensure the plan is consistently
effective, without disrupting day-to-day activities.  Not only are tests
easy to run, but virtualization also eliminates the need to transport
the IT team to multiple locations.</p><h2 id="myth--creating-and-managing-a-disaster-recovery-solution-requires-special-skills">Myth – Creating and Managing a Disaster Recovery Solution Requires “Special” Skills</h2><p>A common hesitation, especially among small businesses, is the belief
that developing a disaster recovery solution requires a special set of
skills.  This myth largely stems from traditional manual data recovery
because end-users had to deal with duplicate, silent infrastructures
across multiple sites.  Virtualization standardizes the disaster
recovery process by encapsulating operating systems, applications, and
servers.  This includes all the configuration data.  As a result, the
entire process is now much less complex than it used to be. 
Additionally, once the solution is in place it can be reliably tested
and executed by staff.  Since this is all taken care of via automated
processes, no special skills are required.</p><h2 id="myth--disaster-recovery-plans-are-like-an-insurance-policy-that-never-gets-used">Myth – Disaster Recovery Plans Are like an Insurance Policy that Never Gets Used</h2><p>The most common myths which prevent businesses from taking disaster
recovery seriously are that it is unnecessary.  They believe disaster
recovery is a sunk cost similar to a car insurance policy of someone who
never gets an accident.  Even if a disaster never happens, the recovery
plan still provides a variety of benefits to the business.  One of the
most common uses is as a migration plan template anytime a business
switches data centers.  Depending upon the industry, disaster recovery
plans may also be a compliance requirement. In order to accurately
assess the need for a new or<a href="http://www.datafoundry.com/disaster-recovery/">improved disaster recovery
plan</a> these myths must be
eliminated from a business’s belief structure.  As long as these myths
remain, the odds of successfully implementing an efficient disaster
recovery strategy are slim. Tony Spinks believes every company should
consider using Disaster recovery services.  These services are critical
for keeping businesses running after system failures.  Data Centers
offering disaster recovery services provide the redundancy.</p>
]]></content:encoded></item><item><title>Protecting Intellectual Property on Your Blog</title><link>https://spf13.com/post/protect-intellectual-property-on-your-blog/</link><pubDate>Mon, 24 Sep 2012 00:00:00 UTC</pubDate><guid>https://spf13.com/post/protect-intellectual-property-on-your-blog/</guid><media:content url="https://spf13.com/post/protect-intellectual-property-on-your-blog/3084905055_694483b898_b.jpeg" medium="image"/><media:thumbnail url="https://spf13.com/post/protect-intellectual-property-on-your-blog/3084905055_694483b898_b.jpeg"/><description>&lt;p>The protection of your intellectual property, or any information that
you post to your blog, forum or website, can be a tricky subject. While
there are those unscrupulous few out there in the cyber world who will
purposely copy your words as their own, there are more people that are
simply ignorant of the laws, unaware that they are stealing when they
copy and reuse your musings. According to a criminal lawyer at an
Orlando based firm that we spoke to, there are steps that you can take
to make sure that your intellectual property is protected. Here’s what
you can do:&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/post/protect-intellectual-property-on-your-blog/3084905055_694483b898_b.jpeg" alt="Protecting Intellectual Property on Your Blog"/><p>The protection of your intellectual property, or any information that
you post to your blog, forum or website, can be a tricky subject. While
there are those unscrupulous few out there in the cyber world who will
purposely copy your words as their own, there are more people that are
simply ignorant of the laws, unaware that they are stealing when they
copy and reuse your musings. According to a criminal lawyer at an
Orlando based firm that we spoke to, there are steps that you can take
to make sure that your intellectual property is protected. Here’s what
you can do:</p><p><strong>1. Obfuscate Your Code</strong></p><p>To protect yourself against thieves, use software like Dotfuscator and
JavaScript Obfuscator. These types of software programs will obfuscate
your coding, making your content more difficult to steal by making a
program’s source code difficult to read by humans. When someone tries to
copy and paste your blog entry, they’ll be left with unreadable, useless
coding. Other helpful software includes vGuard, Jasob and Salamander
.NET Obfuscator.</p><p><strong>2. Post a Permissions Policy</strong></p><p>A page of your website or blog should be dedicated to an explicit
permissions policy. This policy will tell others what they can and can’t
do with the content that you have posted. The key to a great permissions
policy is clarity; people should know exactly what it is that they can
do without your permission and when they’ll need to contact you. Once
you’ve published your policy, you’ll have something to point to if
someone violates it.</p><p><strong>3. Contact the Violator</strong></p><p>If you find that your content has been used by someone else, the first
thing to do is to send a polite email to the violator. 99 times out of
100, the person who used your content has no idea that they’ve done
anything wrong. Kindly thank them for finding your content interesting
enough to use on their own site, point to your permissions policy, and
offer suggestions as to how the person can use your content legally.</p><p><strong>4. Demand Removal</strong></p><p>If you’ve found the one person with whom a polite email doesn’t work,
you’ll need to escalate your efforts. Sit down and draft an email
demanding that the offender remove your content from their site
immediately. While it’s still suggested that you remain tactful and
polite, you may want to be a bit more forceful. Direct the offender to
your permissions policy again, letting them know that they are violating
copyright laws by allowing your content to remain public on their page.</p><p><strong>5. Contact the Hosting Site</strong></p><p>If steps two and three haven’t worked with the violator, you’ll need to
contact their hosting site. Find a site online that will allow you to
search for the person’s domain registration and, once you do, send an
email to the hosting service. Let the hosting service know the steps you
have taken and that you are now requesting removal of the web site. The
powers-that-be at the hosting site will investigate your claim and, if
it is found to be with merit, will take the site down.</p><p><strong>6. Get Legal Help</strong></p><p>At the end of the day, your last bit of recourse may be found in hiring
an attorney. A criminal defense lawyer can go to bat for you, helping
you to have the offending content removed from cyberspace.</p><p><em>If you find that someone has copied your content for their own blog, be
flattered; it means that they’ve found your content useful or relevant.
Remember that most people don’t understand that they are violating any
laws, and an email is often enough to get your content removed from the
offending website. If you follow the steps above, you’ll ensure that
your intellectual property remains yours.</em></p><p>Katie Hewatt is a legal researcher and contributing author for the<a href="http://orlandocriminalteam.com">Florida Law Firm of Katz &amp; Phillips</a>,
which deals with Internet crime cases. The Orlando law firm keeps up to
date with the latest technology online and the ever changing cyber
crimes involved with it.</p>
]]></content:encoded></item><item><title>Giving the most viewed presentation on slideshare ever at OSCON</title><link>https://spf13.com/post/how-i-gave-the-most-viewed-presentation-in-the-history-of-oscon/</link><pubDate>Mon, 17 Sep 2012 00:00:00 UTC</pubDate><guid>https://spf13.com/post/how-i-gave-the-most-viewed-presentation-in-the-history-of-oscon/</guid><media:content url="https://spf13.com/post/how-i-gave-the-most-viewed-presentation-in-the-history-of-oscon/oscon_spf13.jpg" medium="image"/><media:thumbnail url="https://spf13.com/post/how-i-gave-the-most-viewed-presentation-in-the-history-of-oscon/oscon_spf13.jpg"/><description>&lt;p>At OSCON 2012 in Portland I gave a presentation on &lt;a href="http://spf13.com/presentation/building-your-first-mongodb-app-oscon-2012" title="Building your first MongoDB app – OSCON 2012">building your first
MongoDB
application&lt;/a>.
Over 150 people were in the audience, a pretty significant number of
this type of hands on tutorial. Certainly worth the weeks of preparation
that went into developing it. While at OSCON I put the slides online at
SlideShare where during the four day conference the amassed over 20k
views and within a couple weeks over 30k views. Within a month it had
been viewed more than ten times the total attendees at OSCON, one of the
largest technical conferences in the world.&lt;/p></description><content:encoded>&lt;![CDATA[<p><img src="https://spf13.com/post/how-i-gave-the-most-viewed-presentation-in-the-history-of-oscon/oscon_spf13.jpg" alt="Giving the most viewed presentation on slideshare ever at OSCON"/><p>At OSCON 2012 in Portland I gave a presentation on<a href="http://spf13.com/presentation/building-your-first-mongodb-app-oscon-2012" title="Building your first MongoDB app – OSCON 2012">building your first
MongoDB
application</a>.
Over 150 people were in the audience, a pretty significant number of
this type of hands on tutorial. Certainly worth the weeks of preparation
that went into developing it. While at OSCON I put the slides online at
SlideShare where during the four day conference the amassed over 20k
views and within a couple weeks over 30k views. Within a month it had
been viewed more than ten times the total attendees at OSCON, one of the
largest technical conferences in the world.</p><p>How was this presentation so successful that it amassed more views in
it’s first week than any other presentation had accumulated over 12
years? Here are the four critical things I did to generate such an
amazingly high number of views.</p><h1 id="have-an-interesting--unique-topic">Have an interesting &amp; unique topic</h1><p>The first two items are focused on the preparation. Your topic needs to
be something that people are both interested in and find interesting. To
be both it should be unique about something popular. I’m really
passionate about building great things and so are a lot of people. Like
many people out there I’ve looked into using new technologies to make
the process of building applications easier and more enjoyable. This
behavior led me to explore NoSQL solutions which led me to<a href="http://MongoDB.org">MongoDB</a>. MongoDB is one of the most popular
technologies right now. It’s claiming a significant lead over other
NoSQL technologies and catching quickly to the leaders in the very
established relational space. Remember I’m commenting here on popularity
and interest. This is easily discoverable by looking at things like
google trends or frequency of mentions on niche sites like hacker news.
With popularity comes noise. To stand out from the noise you need a
unique topic or take on it. In giving this presentation I chose to focus
on ‘writing your first ruby application backed by MongoDB’. From
skeleton to deployment. To my knowledge this hadn’t been done before and
was something that stood out to people.</p><h1 id="make-it-broad-and-approachable">Make it broad and approachable</h1><p>To reach the largest group of people you need to appeal to a large group
of people. This means giving a presentation that is approachable that
many different kinds of interested people could follow along and find
value in. Given that this presentation was aimed at first time MongoDB
users without much development experience it really resonated with a lot
of people. One nice thing about OSCON is that it attracts a really
diverse crowd. If  it was appropriate for the audience there, it would
work well for the broader Internet audience which OSCON is
a microcosm of.</p><h1 id="cater-to-the-online-audience">Cater to the online audience</h1><p>Whenever I create my slide decks I’m always focused on two audiences.
The live audience that will see the presentation projected onto a screen
and the remote audience that will be viewing it on slideshare via their
computers/laptops/tablets etc. Most people ignore that second group, but
a good presentation will always reach more people online than in person.
If anything it’s the group that can’t afford to be ignored. I ensure
that the slides flow well even without my narration. I give them to a
few friends without the accompanying talking and see how well they can
follow them. I make sure to use good layouts that use the space well and
are readable when on the projector from the back of the room as well as
when embedded on a web page. It’s important when using slideshare and
the other sites that you review the presentation on them as well as
embedded as conversion is sometimes destructive, especially if you are
using a unsupported font.</p><h1 id="give-it-a-good-start">Give it a good start</h1><p>Success begets success. During the live presentation I put the slides up
on slideshare so that the attendees could follow along at their own
pace. Since the audience was largely working with the code in the
presentation it made a lot of sense for them to bring it up on their
laptops. With the 150+ audience members all viewing the presentation
that gave it a very big initial push. A few of them also tweeted it
which helped even more people to view and follow it. Slideshare has a
ranking algorithm that tracks when a lot of people view a presentation
in a short amount of time and flag it as a “hot” presentation. Within a
couple of hours it had 600+ views and a couple dozen tweets on twitter.</p><p>That evening I got an email from slide share that my presentation was
getting a lot of views. I got a second email that it was experiencing a
high volume of tweets as well. It continued to climb up the ranks. The
next morning it was selected as the SlideShare presentation of the day.</p><p>@slideshare: &lsquo;#OSCON 2012 MongoDB Tutorial&rsquo; by @spf13 is a #SlideShare presentation of the day<a href="http://t.co/74DqqsJR">http://t.co/74DqqsJR</a> cc @oscon on Twitter<a href="http://twitter.com/slideshare/status/225393208581038080%22">http://twitter.com/slideshare/status/225393208581038080"</a></p><p>On Tuesday it had amassed an outstanding 7k+ views</p><p>From there it became a presentation of the week. It was featured
prominently on the home page where it remained for the next 3 days at
which point over 22k people had viewed it.</p><p>Once it fell off the home page and popular/week lists and tweets became
less regular the number of views were still significant, but had slowed
to a few hundred a day. At the time of this writing it’s over 30k views
and climbing.</p><p><a href="http://spf13.com/post/how-to-deliver-great-conference-tutorials/" title="How to deliver a great conference tutorial">See also my post on “How to deliver a great conference
tutorial”</a> where
I walk though how to prepare and deliver an effective conference
tutorial.</p>
]]></content:encoded></item></channel></rss>