<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: julia ferraioli</title>
    <description>The latest articles on Forem by julia ferraioli (@juliaferraioli).</description>
    <link>https://forem.com/juliaferraioli</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F61306%2Fb5039a0f-994e-4c18-98dd-bb4978dd7898.jpg</url>
      <title>Forem: julia ferraioli</title>
      <link>https://forem.com/juliaferraioli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juliaferraioli"/>
    <language>en</language>
    <item>
      <title>Open source and social systems</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Fri, 09 Dec 2022 12:37:15 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/open-source-and-social-systems-3l6o</link>
      <guid>https://forem.com/juliaferraioli/open-source-and-social-systems-3l6o</guid>
      <description>&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://www.juliaferraioli.com/blog/2022/open-source-social-systems/" rel="noopener noreferrer"&gt;juliaferraioli.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Free/libre open source software (often referred to as FLOSS, FOSS, or OSS &lt;sup id="fnref1"&gt;1&lt;/sup&gt;) exists to reclaim the ability to freely collaborate after the 1978 report from the United States's &lt;a href="https://web.archive.org/web/20220402203304/https://repository.law.uic.edu/cgi/viewcontent.cgi?article=1573&amp;amp;context=jitpl" rel="noopener noreferrer"&gt;Commission on New Technological Uses of Copyrighted Works (CONTU)&lt;/a&gt; and subsequent &lt;a href="https://web.archive.org/web/20220122175147/https://digitalcommons.law.ggu.edu/cgi/viewcontent.cgi?referer=&amp;amp;httpsredir=1&amp;amp;article=1344&amp;amp;context=ggulrev" rel="noopener noreferrer"&gt;1984 Third Circuit Apple Computer, Inc. v. Franklin Computer case&lt;/a&gt; which rendered both compiled software &lt;em&gt;and&lt;/em&gt; source code copyrightable &lt;sup id="fnref2"&gt;2&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;This was a victory for corporations, who increasingly saw the sale of software as a major revenue stream and therefore FLOSS as a threat. While proponents of FLOSS cared primarily about the freedoms and creativity that open source software development granted them, the mechanism they used to push back against proprietary interests was legal: licenses that outlined the rights and responsibilities of developing and consuming FLOSS.&lt;/p&gt;

&lt;p&gt;These licenses (and the &lt;a href="https://opensource.org/osd" rel="noopener noreferrer"&gt;definition of open source&lt;/a&gt;) revolved around the &lt;em&gt;output&lt;/em&gt; of open source development, and that shaped the narrative of open source that still exists to this day. Little focus is on the &lt;em&gt;social systems&lt;/em&gt; that produce open source software, which include the relationships, environments, and structures that underlie FLOSS. These social systems, often referred to as &lt;em&gt;sociotechnical&lt;/em&gt; systems, cannot be separated from the output of FLOSS without fundamentally misunderstanding open source.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sociotechnical systems are an &lt;em&gt;integral aspect&lt;/em&gt; of the various ecosystems that comprise the overarching open source ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is helpful to frame open source as many different, interacting ecosystems. They evolve, respond to stimuli, compete, collaborate, have cultures, and follow norms. Actions that impact an open source ecosystem can have ripple effects beyond that ecosystem – and beyond the world of proprietary technology or even technology altogether.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Well-meaning initiatives or regulations can shift the open source landscape in &lt;strong&gt;unpredictable&lt;/strong&gt; ways, and affect the ecosystem for years to come.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bringing in experts with an understanding of complex networks and social sciences can help navigate these ecosystems, and provide insight into the ramifications of external forces.&lt;/p&gt;

&lt;p&gt;Shifting the view of open source from the &lt;strong&gt;resulting code&lt;/strong&gt; to the &lt;strong&gt;social systems that create the code&lt;/strong&gt; is critical when driving towards long-term sustainability of technology as a whole.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Major (or minor, depending on your perspective) differences exist between FLOSS, FOSS, and OSS; for the sake of readability this article uses FLOSS as the overarching term. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;I am not a lawyer and none of this should be construed as legal advice. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>opensource</category>
      <category>sociotechnicalsystems</category>
      <category>sustainability</category>
      <category>ecosystems</category>
    </item>
    <item>
      <title>How to empower your open source users and contributors</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Sat, 04 Jun 2022 15:20:11 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/how-to-empower-your-open-source-users-and-contributors-17c4</link>
      <guid>https://forem.com/juliaferraioli/how-to-empower-your-open-source-users-and-contributors-17c4</guid>
      <description>&lt;p&gt;&lt;em&gt;This article is cross-posted from &lt;a href="https://leaddev.com/building-better-software/how-empower-your-open-source-users-and-contributors"&gt;The Lead Dev&lt;/a&gt; and &lt;a href="https://www.juliaferraioli.com/blog/2022/empowering-your-oss-community/"&gt;juliaferraioli.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When the concept of open source first emerged, people collaborated on projects very intentionally. Without today's vast internet and information retrieval systems, the network of people (largely researchers) working on these shared systems largely grew via word-of-mouth. If you were working on a piece of software with folks outside of your institution, you likely would have communicated with them directly prior to them ever viewing a single line of code.&lt;/p&gt;

&lt;p&gt;Even as more of the world gained access to the internet, finding information was a challenge. &lt;a href="https://en.wikipedia.org/wiki/Usenet"&gt;Usenet&lt;/a&gt;, a distributed discussion platform that came out of University of North Carolina at Chapel Hill and Duke University in 1980, arrived on the scene as a popular way to &lt;a href="https://opensource.com/article/21/10/global-communication-open-source"&gt;discover and communicate&lt;/a&gt; about software with freely available source code. Still, the effort needed to start using or contributing to a new project was high.&lt;/p&gt;

&lt;p&gt;In order to find resources that you needed, such as source code or documentation (if any existed), you’d generally have to contact the author of the project. But eventually, &lt;a href="https://carlhendy.com/history-of-search-engines/"&gt;web search improved&lt;/a&gt;, and with the rise of hosting and distribution platforms such as &lt;a href="https://sourceforge.net/"&gt;SourceForge&lt;/a&gt; it became much easier to find information about how to use and contribute to open source. Improvements in infrastructure, hardware, and computer science reduced the cost of experimentation and simultaneously increased the reach of freely modifiable and distributable software.&lt;/p&gt;

&lt;p&gt;Barriers to people embracing open source started falling away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking down the barriers to open source
&lt;/h2&gt;

&lt;p&gt;Open source is more accessible to new contributors than ever before, in part due to the user experience improvements pushed forward by platforms such as &lt;a href="https://bitbucket.org/"&gt;BitBucket&lt;/a&gt;, &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;, and &lt;a href="https://gitlab.com/"&gt;GitLab&lt;/a&gt;. They provide a way to discover new repositories and view their source. This means that you can browse and understand a project before becoming deeply invested. It has the added benefit for people with resource constraints, such as disk space or network bandwidth, because you no longer have to clone an entire repository (copy the files to your computer) in order to view its contents.&lt;/p&gt;

&lt;p&gt;That said, there's still a fair amount of improvement that can be made to the open source experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four ways to empower open source users and contributors
&lt;/h2&gt;

&lt;p&gt;Last time, we extended the initial &lt;a href="https://leaddev.com/agile-other-ways-working/vision-social-model-open-source"&gt;social model of open source&lt;/a&gt; by outlining &lt;a href="https://leaddev.com/agile-other-ways-working/why-open-source-projects-should-embrace-operational-transparency"&gt;why open source projects should provide information about how they operate&lt;/a&gt;. This time, we'll explore how projects can take a similar approach to helping users and contributors engage with them.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Documentation
&lt;/h3&gt;

&lt;p&gt;Technical documentation existed &lt;a href="https://web.archive.org/web/20120803131120/http://www.hps.cam.ac.uk/people/taub/structures_and_strategies.pdf"&gt;long&lt;/a&gt; &lt;a href="https://www.joh.cam.ac.uk/library/library_exhibitions/schoolresources/astrolabe/chaucer"&gt;before&lt;/a&gt; the first line of code. Good documentation rests at that intersection between art and science, with technical writing expertise being highly sought-after in open source projects. Creating documentation for open source poses several challenges, including the sheer variety of audiences that need the docs! One of the most effective ways that a project can lower barriers to becoming involved is by specifying not only where documentation lives but also what &lt;em&gt;type&lt;/em&gt; of documentation is available.&lt;/p&gt;

&lt;p&gt;Consider the example set by the Python programming language, which points to &lt;a href="https://www.python.org/doc/"&gt;several sets of documentation&lt;/a&gt; targeting different skill levels and roles.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Issues
&lt;/h3&gt;

&lt;p&gt;While many projects these days choose to take reports of issues alongside where their code is hosted, some prefer to use an open source or third-party solution, such as &lt;a href="https://www.bugzilla.org/"&gt;Bugzilla&lt;/a&gt; or &lt;a href="https://trac.edgewall.org/"&gt;Trac&lt;/a&gt;. Wherever a project takes reports of issues and discusses them, making it very clear where community members should report current issues makes it an easier experience for them. As a side benefit, it lowers costs for maintainers by reducing the amount of redirection they need to do.&lt;/p&gt;

&lt;p&gt;Jaeger sets a good example of this, by &lt;a href="https://www.jaegertracing.io/get-in-touch/#report-issues-on-github"&gt;specifying where its issue trackers live&lt;/a&gt;, as well as where to file various types of issues.&lt;/p&gt;

&lt;p&gt;Bonus points if a project publishes guides or &lt;a href="https://github.com/jaegertracing/.github/tree/main/.github/ISSUE_TEMPLATE"&gt;templates&lt;/a&gt; for how to file issues!&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Discussion
&lt;/h3&gt;

&lt;p&gt;The frequency of communication between maintainers and users is of increasing importance to adopters, and can be a factor when making technology decisions. However, facilitating conversation between contributors and users alike signals a thoughtfulness and intentionality that benefits all participants in the project's community. Projects that make a point of documenting official channels for discussion encourage the growth of a healthy community, allowing community members to support each other.&lt;/p&gt;

&lt;p&gt;An example is how Apache Beam lists its &lt;a href="https://beam.apache.org/community/contact-us/"&gt;various discussion fora&lt;/a&gt; and when to use each.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Contributing
&lt;/h3&gt;

&lt;p&gt;As the complexity of software increases, so does the complexity of contributing to open source. Projects may have language-specific style guidelines that they ask modifications to follow, or processes that must be adhered to when a new contributor wants to pick up a bug to fix. While these working agreements might on occasion seem overly prescriptive to prospective contributors, they are there to maximize the success of everyone involved. Contributors minimize the amount of wasted effort, and maintainers minimize the amount of back-and-forth answering questions and requesting changes in reviews.&lt;/p&gt;

&lt;p&gt;Generally, setting these expectations improves morale!&lt;/p&gt;

&lt;p&gt;Inkscape's &lt;a href="https://gitlab.com/inkscape/inkscape/-/blob/master/CONTRIBUTING.md"&gt;CONTRIBUTING.md&lt;/a&gt; file outlines some general guidance as well as instructions about decision-making, building, testing, and documentation.&lt;/p&gt;

&lt;p&gt;Along the same lines of providing contributor guidelines is documenting processes that architectural development should follow, such as how Bazel calls out &lt;a href="https://bazel.build/contribute/design-documents"&gt;how to make larger-scale changes&lt;/a&gt; to the core project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflections
&lt;/h2&gt;

&lt;p&gt;Another way to think about open source is through the lens of empowerment. You are empowered to see the source code of the software you use. You are empowered to modify it, distribute it, and learn from it. So why not take that to its logical conclusion and empower your community members with the information they need to be productive with and within your open source project?&lt;/p&gt;

&lt;p&gt;These are just a few community-focused elements that you might consider through our social model of open source, though they are common to many if not most projects. (There are a few missing elements from our social model that we will address in the subsequent post.)&lt;/p&gt;

&lt;p&gt;The next time you are updating the README for your project, review it to see if you are empowering your community with resources that will make them successful, whether as users, contributors, or future co-maintainers.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>socialmodel</category>
      <category>empowerment</category>
    </item>
    <item>
      <title>Why open source projects should embrace operational transparency</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Sat, 04 Jun 2022 15:18:30 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/why-open-source-projects-should-embrace-operational-transparency-49dk</link>
      <guid>https://forem.com/juliaferraioli/why-open-source-projects-should-embrace-operational-transparency-49dk</guid>
      <description>&lt;p&gt;&lt;em&gt;This article is cross-posted from &lt;a href="https://leaddev.com/agile-other-ways-working/why-open-source-projects-should-embrace-operational-transparency"&gt;The Lead Dev&lt;/a&gt; and &lt;a href="https://www.juliaferraioli.com/blog/2022/social-model-operational-transparency/"&gt;juliaferraioli.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From operating systems to CSS frameworks, &lt;a href="https://opensource.com/article/17/8/enterprise-open-source-advantages"&gt;open source gives creators the ability&lt;/a&gt; to accelerate development, learn from communities of experts, and incorporate thoroughly-reviewed code. At its heart, open source concerns freedoms relating to code, but an open source project is a complex system that happens to focus on code.&lt;/p&gt;

&lt;p&gt;In my &lt;a href="https://leaddev.com/agile-other-ways-working/vision-social-model-open-source"&gt;last article&lt;/a&gt;, we started to explore how we might move past the typical focus on the open source license and instead develop a social model that captures additional complexity. As a recap, we established that the technical model of open source describes what you can and cannot do with it, typically by way of the project's license, whereas the social model describes how open source interacts (or doesn’t) with the larger ecosystem and the people within it. That initial article addressed capturing the purpose of a project based on its specific goals within the open source ecosystem.&lt;/p&gt;

&lt;p&gt;In this second piece, we will continue to develop the social model of open source by exploring the benefits of operational transparency, and outlining some key characteristics that maintainers should aim to make publicly available.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benefits of operational transparency
&lt;/h2&gt;

&lt;p&gt;A key benefit to open source is that anyone can examine the code they incorporate, but how the project operates is just as important to a project's success as the functionality itself. With open source making up &lt;a href="https://www.sonatype.com/hubfs/SSC/Software_Supply_Chain_Inforgraphic.pdf?t=1468857601884"&gt;an estimated 90%&lt;/a&gt; of today's modern technology, it’s increasingly critical to make operational information readily available to the public, so that you can empower contributors and users to evaluate projects based on the criteria important to them. &lt;/p&gt;

&lt;p&gt;The operational characteristics of an open source project are often thought of as fundamentals to the teams behind them, and yet they’re rarely communicated well beyond the maintainers. This is a lost opportunity, as open source projects that clearly, concisely, and consistently articulate how they operate give contributors and users the social frameworks that they need to work well within the project.&lt;/p&gt;

&lt;p&gt;Here are some high-priority details that projects should aim to make publicly available:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The decision-making model
&lt;/h3&gt;

&lt;p&gt;A vital part of running an open source project is deciding how to run the project. While ‘governance’ is an ever-expanding term, its primary concern is around how decisions get made and who gets to make them. (&lt;a href="https://www.theopensourceway.org/"&gt;The Open Source Way&lt;/a&gt; has a fantastic, comprehensive &lt;a href="https://www.theopensourceway.org/the_open_source_way-guidebook-2.0.html#_project_and_community_governance"&gt;guidebook around open source governance&lt;/a&gt;.) Whether a project is managed by a &lt;em&gt;benevolent dictator for life&lt;/em&gt; (BDFL) or is &lt;em&gt;foundation-backed&lt;/em&gt;, clearly communicating the model in use benefits potential contributors and project alike.&lt;/p&gt;

&lt;p&gt;An example is Node.js which &lt;a href="https://nodejs.org/en/about/governance/"&gt;openly shares&lt;/a&gt; that it follows a consensus seeking decision-making model.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The project's affiliations
&lt;/h3&gt;

&lt;p&gt;As more companies start to create open source as part of their strategic initiatives, it can instill a &lt;a href="https://thenewstack.io/survey-shows-how-developers-and-their-employers-measure-good-open-source-citizenship/"&gt;healthy amount of skepticism in potential adopters&lt;/a&gt;. When a project is run by a corporation, decisions about the future of the project can (but not necessarily) become opaque to the end-user. That said, a corporate-sponsored project may also have the ability to focus on security, developer experience, and usability in a way that independent projects cannot, as they can leverage the time, talent, and treasure of the company.&lt;/p&gt;

&lt;p&gt;By identifying the affiliation of a project, whether it be a company, government, non-profit, or individual, it allows consumers to make informed decisions based on their own strategy and values.&lt;/p&gt;

&lt;p&gt;An example is &lt;a href="https://github.com/microsoft/TypeScript"&gt;TypeScript&lt;/a&gt;’s open affiliation with Microsoft.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The funding sources
&lt;/h3&gt;

&lt;p&gt;While open source is free (&lt;a href="https://opensource.com/article/17/2/hidden-costs-free-software#:~:text=We're%20used%20to%20hearing,puppy%20isn't%20really%20free."&gt;as in puppy&lt;/a&gt;) to consume, it is most definitely not free to create. From bandwidth and infrastructure to time, costs can add up. For people looking to build products by integrating with open source software, the price of switching components can be high as interoperability between projects is rare. Exposing how the project supports itself provides a two-fold benefit: 1) people deciding on a technology can evaluate if the project fits their risk profile, and 2) current integrators can clearly see when a project becomes at risk of running out of capital.&lt;/p&gt;

&lt;p&gt;Plus, &lt;a href="https://wptavern.com/open-collective-is-a-new-transparent-way-to-fund-open-source-projects"&gt;financial transparency&lt;/a&gt; is right in line with open source values.&lt;/p&gt;

&lt;p&gt;An example is Homebrew which has been &lt;a href="https://opencollective.com/homebrew/transactions"&gt;openly funded&lt;/a&gt; by GitHub sponsors, OpenCollective, and Patreon.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The maintainers and the core team
&lt;/h3&gt;

&lt;p&gt;As incidents such as &lt;a href="https://security.googleblog.com/2021/12/understanding-impact-of-apache-log4j.html"&gt;log4j&lt;/a&gt; and &lt;a href="https://heartbleed.com/"&gt;Heartbleed&lt;/a&gt; have shown us, open source software that provides key functionality for many services and applications is often maintained by only a &lt;a href="https://money.cnn.com/2014/04/18/technology/security/heartbleed-volunteers/"&gt;handful&lt;/a&gt; of &lt;a href="https://web.archive.org/web/20211122084644/https://logging.apache.org/log4j/2.x/log4j-web/team-list.html"&gt;people&lt;/a&gt;. Additionally, information about the people maintaining projects may be difficult to find, forcing users to trawl the project's metadata through mailing lists, commit history, etc… in order to determine the size of the core team. Effectiveness of a team may be dependent on the number of members, but there are &lt;a href="https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1744-6570.2008.00114.x"&gt;many other variables&lt;/a&gt; that influence how well a team manages their processes.&lt;/p&gt;

&lt;p&gt;Publishing an up-to-date list of core team members, even without any information beyond usernames, can signal when a piece of software is in danger of becoming under-maintained or effectively unmaintained. In turn, this opens up an opportunity for users to step up and offer to take a more active role within a crucial dependency.&lt;/p&gt;

&lt;p&gt;An example is Font-Awesome which &lt;a href="https://github.com/FortAwesome/Font-Awesome#team"&gt;publicly shares&lt;/a&gt; its team list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transparency helps everyone
&lt;/h2&gt;

&lt;p&gt;Openness is about more than just code; it is also about how we make decisions, how we support ourselves, how we prioritize issues, and how we delegate responsibilities.&lt;/p&gt;

&lt;p&gt;Of course, the operational details that a project considers important may vary, and maintainers will choose to highlight those that are most relevant to them. A project in its beginning phase might not yet have a formalized governance model or funding, while a more established project may have a variety of defined roles and responsibilities.&lt;/p&gt;

&lt;p&gt;But wherever possible, increasing transparency around how work gets done sets clear expectations for contributors, raises the visibility of when a project is in need of support, and reduces the amount of effort that falls on the maintainers' collective  shoulders. &lt;/p&gt;

&lt;p&gt;Keep an eye out for my next article where we'll explore how to incorporate dynamics and conventions around communication into our social model of open source.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>socialmodel</category>
      <category>transparency</category>
    </item>
    <item>
      <title>A vision for a social model of open source</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Sat, 04 Jun 2022 15:15:03 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/a-vision-for-a-social-model-of-open-source-1ag2</link>
      <guid>https://forem.com/juliaferraioli/a-vision-for-a-social-model-of-open-source-1ag2</guid>
      <description>&lt;p&gt;&lt;em&gt;This article is cross-posted from &lt;a href="https://leaddev.com/agile-other-ways-working/vision-social-model-open-source"&gt;The Lead Dev&lt;/a&gt; and &lt;a href="https://www.juliaferraioli.com/blog/2022/social-model-oss/"&gt;juliaferraioli.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Open source software (OSS) in spirit has &lt;a href="https://en.wikipedia.org/wiki/Public-domain_software#Early_academic_public-domain_software_ecosystem"&gt;existed since the 1950s&lt;/a&gt;, when researchers and academics shared source code with each other, treating code as a common good. After a &lt;a href="https://digitalcommons.law.ggu.edu/cgi/viewcontent.cgi?article=1344&amp;amp;context=ggulrev"&gt;court decision&lt;/a&gt; rendered code copyrightable in 1984, the Free/Libre/Open Source Software (FLOSS) movement started in earnest. Just a few years later, the first license that embodied the spirit of open source was created, though it is debated whether this was the &lt;a href="https://opensource.com/article/19/4/history-mit-license"&gt;GPL or MIT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Open source is software where the code is available for anyone to use, integrate, examine, modify, and distribute. Christine Peterson coined the term in 1998, and the &lt;a href="https://opensource.org"&gt;Open Source Initiative&lt;/a&gt; crafted the commonly accepted &lt;a href="https://opensource.org/osd"&gt;open source definition&lt;/a&gt; (OSD) shortly thereafter. The OSD adds requirements that prohibit discrimination against people, groups, fields, or technology. Because of the complex legal, technical, and social criteria around open source, most of these are covered by a license attached to the software.&lt;/p&gt;

&lt;p&gt;That said, there’s so much more to open source than what fits into a license. It does not cover development philosophies, social structures, governance, or anything else that makes open source the rich ecosystem that it is today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical model versus social model of open source
&lt;/h2&gt;

&lt;p&gt;Defining open source by what you can and cannot do with it is the &lt;em&gt;technical model&lt;/em&gt; of open source. It describes the minimum set of criteria for what software needs to do for others to be able to safely use it. This technical model works for establishing this baseline, giving everyone assurances that they can use software without getting into legal hot water.&lt;/p&gt;

&lt;p&gt;Some take the position that software is not open source unless it accepts contributions, or has a governance structure, or has maintainers actively engaged with their users. People bring their own opinion to what open source is, and that can lead to mismatched expectations. &lt;/p&gt;

&lt;p&gt;Instead of overloading the technical model of open source, we can overlay a social model that adds nuance and further describes aspects of a project.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;social&lt;/em&gt; &lt;em&gt;model&lt;/em&gt; of open source describes the sociotechnical expectations of how open source interacts (or doesn’t) with the larger ecosystem and the people within it.&lt;/p&gt;

&lt;p&gt;I’ll be writing a series of articles defining the characteristics of a social model of open source. In this first article, we will start developing this model by considering the &lt;em&gt;purpose&lt;/em&gt; of different open source projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking down open source projects by purpose
&lt;/h2&gt;

&lt;p&gt;The first step to creating a social model of open source is to think about how projects differ from each other.&lt;/p&gt;

&lt;p&gt;In her book &lt;em&gt;&lt;a href="https://bit.ly/roads-and-bridges"&gt;Roads and Bridges: The Unseen Labor Behind Our Digital Infrastructure&lt;/a&gt;&lt;/em&gt; (pp. 20-21), Nadia Eghbal takes an analytical approach, describing different categories of software based on their function: frameworks, languages, libraries, and servers. These categories frame &lt;em&gt;how&lt;/em&gt; software is used by developers or end-users, and help people find and identify open source projects of interest.&lt;/p&gt;

&lt;p&gt;With a social model in mind, let’s take a different approach to categorizing projects, and instead consider the high-level purpose of _why _something is open source.&lt;/p&gt;

&lt;p&gt;Below are a few example categories that can apply to open source projects. Focusing on the purpose (or purposes) of open source projects allows everyone to better understand the motivations of projects and have realistic expectations for how the project will operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Collaboration
&lt;/h3&gt;

&lt;p&gt;Most well-known, larger projects fall into this bucket. Collaborative projects are what many people think of when they hear the words open source. They aim to bring the expertise of a wide range of people to build technology, together. Examples of collaborative projects include &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/python/cpython"&gt;Python&lt;/a&gt; and &lt;a href="https://github.com/kubernetes/kubernetes"&gt;Kubernetes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demonstration
&lt;/h3&gt;

&lt;p&gt;Demos are often snapshots in time, created to showcase an aspect of technology. They are typically small, self-contained, and single-purpose. Demonstrative projects can range from the practical stress-testing of a particular feature to creative, wacky ways to use them. Examples include &lt;a href="https://github.com/webrtc/samples"&gt;WebRTC samples&lt;/a&gt; and the &lt;a href="https://github.com/dependabot/demo"&gt;Dependabot Demo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Education
&lt;/h3&gt;

&lt;p&gt;With all the different frameworks, languages, tools, and more available to developers, educational projects are invaluable. Educational projects demonstrate best practices, patterns, and concepts. These projects are open source so everyone can learn from them. Examples of educational projects include &lt;a href="https://github.com/sdras/intro-to-vue"&gt;Intro to Vue.js&lt;/a&gt; and &lt;a href="https://github.com/campoy/whispering-gophers"&gt;Whispering Gophers&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validation
&lt;/h3&gt;

&lt;p&gt;We have seen how important validation and verification is for reproducing results in research, which is why more and more journals and conferences are requesting that article or paper submissions are paired with reference implementations. These projects rarely see updates or bug fixes, but it is important for them to be open source in order for others to study the code, learn from them, and incorporate the methodologies into their own applications. Examples include &lt;a href="https://github.com/computational-imaging/ACORN"&gt;ACORN&lt;/a&gt; and &lt;a href="https://github.com/twitter-research/lmsoc"&gt;LMSOC&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Facilitation
&lt;/h3&gt;

&lt;p&gt;Projects whose purpose is facilitative generally help people use other technologies, most often proprietary technologies. These may be tools, SDKs, or other utilities. It is useful for them to be open source so that developers can extend or customize them to suit their own purposes. Examples of facilitative projects are &lt;a href="https://github.com/launchdarkly/ld-find-code-refs"&gt;ld-find-code-refs&lt;/a&gt; and the &lt;a href="https://github.com/netlify/cli"&gt;Netlify CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Experimentation
&lt;/h3&gt;

&lt;p&gt;The vast majority of open source projects in the wild fall under this characterization! These are the seeds of new projects, projects that are for tinkering around, and aren’t necessarily ready or even intended for others to use. Examples of experimental projects include &lt;a href="https://github.com/juliaferraioli/tex-customizations"&gt;Tex Customizations&lt;/a&gt; and &lt;a href="https://github.com/MylesBorins/install-next"&gt;install-next&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developing the social model, together
&lt;/h2&gt;

&lt;p&gt;The purpose of open source software is just one characteristic of a social model. There are others that we can and will explore together in future articles. By developing a shared understanding and vocabulary of open source beyond the license, we help maintainers, contributors, and users communicate and collaborate in a way that enriches the spirit of open source.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>socialmodel</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Why your git email address matters</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Sun, 10 Apr 2022 20:02:31 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/why-your-git-email-address-matters-ej</link>
      <guid>https://forem.com/juliaferraioli/why-your-git-email-address-matters-ej</guid>
      <description>&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://www.juliaferraioli.com/blog/2022/your-git-email-matters/"&gt;juliaferraioli.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you were getting started with open source – and especially with git, you probably ran across guidance that told you to run commands such as this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email yourname@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to set your git username and email address.&lt;/p&gt;

&lt;p&gt;It's an easy way to make sure that whichever repository you're contributing to, and wherever its canonical source lives, your commits are associated with &lt;em&gt;you&lt;/em&gt;. Effectively signing your name or open source identity to your commits is a Good Thing™, because it allows the project to identify recurring contributors, (selfishly) provides people like me a way to do some analysis on git data, and more.&lt;/p&gt;

&lt;p&gt;That said, the email address that you use matters.&lt;/p&gt;

&lt;p&gt;We all operate in different &lt;em&gt;contexts&lt;/em&gt;. I have personal, volunteer, side-project, and corporate contexts – and different email addresses associated with each of them. The email address that I use for a specific commit tells the project in which context my contribution has been made.&lt;/p&gt;

&lt;p&gt;So in addition to (or instead of) running setting a global configuration for your email address, you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git config user.email yourname@company.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;within your clone of a specific repository to configure the email address that your commits should use. If you have set a global &lt;code&gt;user.email&lt;/code&gt; as well, that's what commits will use if you haven't set one within a repository (&lt;a href="https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup#_your_identity"&gt;git-scm documentation that describes this behavior&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;As open source gains traction in nearly all (quite possibly all) industries with more companies and organizations contributing back to open source projects they use (also a Good Thing™), it is important to signal under which context people are contributing. Am I being a good open source citizen by fixing bugs in a framework that my employer uses? Am I trying to improve a library that &lt;a href="https://opensourcestories.org"&gt;opensourcestories.org&lt;/a&gt; uses? Or am I contributing because I find the project interesting?&lt;/p&gt;

&lt;p&gt;These are some possible scenarios where the additional information provided by your commit's email address can give maintainers more insight into your motivations.&lt;/p&gt;

&lt;p&gt;It's a bit more work for you, but transparency is a core value of open source. Be transparent about your affiliation, and be thoughtful about your email address!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>git</category>
      <category>bestpractices</category>
      <category>transparency</category>
    </item>
    <item>
      <title>So you're working from home: a primer, part 2</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Wed, 11 Mar 2020 04:00:00 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/so-you-re-working-from-home-a-primer-part-2-g6l</link>
      <guid>https://forem.com/juliaferraioli/so-you-re-working-from-home-a-primer-part-2-g6l</guid>
      <description>&lt;p&gt;Hopefully you’ve identified rituals for your “commute” and have set up your space in a way that’s conducive to work. But how do you go from turning around and asking your colleague a question to communicating and collaborating in a much more...intentional way?&lt;/p&gt;

&lt;h2&gt;
  
  
  The virtual “turn around” (🎶bright eyes🎶)
&lt;/h2&gt;

&lt;p&gt;If you work on a team that’s used to being largely in person together (or in clusters), working from home is going to hit you pretty hard. There are a number of ways to create a virtual space for communicating off-the-cuff, from low-bandwidth to high-bandwidth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team chat/Slack/etc... you may already have one, but if you’ve been working in an office setting, your group chat has likely languished. Revitalize it!&lt;/li&gt;
&lt;li&gt;Create a social channel for your team on Slack/IRC/etc… it’s tempting to &lt;em&gt;only&lt;/em&gt; communicate for work, but you socialize with your team as well. Make a space for pet pictures, articles, survival tips. &lt;/li&gt;
&lt;li&gt;Schedule a q&amp;amp;a meeting every day, or a few times a week, have a 30 minute meeting dedicated to asking the questions that pop up. This does require some attentiveness -- write down your questions and bring them to the meeting.&lt;/li&gt;
&lt;li&gt;Create a stable video call (Hangouts Meet, Zoom, etc…) that people can drop into when they’ve got a question, or even when they just want company.&lt;/li&gt;
&lt;li&gt;Hang out virtually with your colleagues all day on a video call! Don’t turn that video off. STARE DOWN YOUR COLLEAGUES ALL DAY.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which to choose depends entirely on your team’s habits and personality, but make sure you’ve got buy in from the whole team. It only works if the team is on board!&lt;/p&gt;

&lt;h2&gt;
  
  
  Making virtual meetings not suck
&lt;/h2&gt;

&lt;p&gt;Let’s face it, many of us only tolerate meetings in the best of times. Believe it or not, virtual meetings can actually be better than in-person ones. However, it takes some work.&lt;/p&gt;

&lt;p&gt;First, do you really need that meeting? If you can’t set an agenda or have a clear goal (and that goal can definitely be something like “reduce social isolation”) then it’s an email waiting to happen -- and probably always was. Or, if it’s a working session, consider just setting up dedicated time on the calendar to work on project &lt;em&gt;x&lt;/em&gt;, and don’t make people join a meeting at all. Your team members are adults; you don’t need to &lt;em&gt;see&lt;/em&gt; them working to know that they are.&lt;/p&gt;

&lt;p&gt;If you’re going full steam ahead with a video call, lay down some ground rules. You’re going to have a bunch of isolated folks eager to talk. Have one person lead the meeting, and it’s got to be someone who will keep track of the agenda and time. Navigating participation will be a bit harder. You can go full out formal and make people raise their hands to talk, or you can have the meeting lead make sure that everyone has their voice heard. Their favorite phrase may become “I believe that Wonder Woman was saying something; let’s go back to her.” Finally, have a rotating note-taker. Having concrete notes makes it easier for people whose connections drop, or who can’t make the meeting.&lt;/p&gt;

&lt;p&gt;You’ll note that those recommendations are just as applicable to in-person meetings as they are to remote ones. That’s by design! These habits are good to get into in general.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combating isolation
&lt;/h2&gt;

&lt;p&gt;As I mentioned, work isn’t just about getting stuff done; it has a social aspect as well. If your colleagues are following the recommendations at &lt;a href="https://staythefuckhome.com"&gt;staythefuckhome.com&lt;/a&gt;, then they’re going to be combating social isolation. Manufacture some excuses to not talk about work. Here are some ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start a costume contest with household items (h/t &lt;a href="https://twitter.com/amcasari"&gt;Amanda Casari&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Hold serendipity calls where you talk about random topics, like what you’d do if aliens landed (h/t &lt;a href="https://twitter.com/megansanicki"&gt;Megan Byrd-Sanicki&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Create a team book club, but with topics (Pluto, the color green, dinosaurs, salt versus sugar)&lt;/li&gt;
&lt;li&gt;Eat lunch together! Share your recipes with each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a difficult time for many, so be aware that your colleagues may be stressed. Above all, be kind to each other.&lt;/p&gt;

</description>
      <category>wfh</category>
      <category>remotework</category>
      <category>tipsandtricks</category>
      <category>career</category>
    </item>
    <item>
      <title>So you're working from home: a primer, part 1</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Mon, 09 Mar 2020 04:00:00 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/so-you-re-working-from-home-a-primer-part-1-1m2i</link>
      <guid>https://forem.com/juliaferraioli/so-you-re-working-from-home-a-primer-part-1-1m2i</guid>
      <description>&lt;p&gt;With so many people suddenly working remotely, I thought I’d share some tips that I’ve learned over the years as I’ve worked from home. As many are discovering, it’s not just a matter of opening up your laptop on your couch and getting to work. There are lots of distractions and differences -- some subtle, some not -- when working from home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting ready and winding down
&lt;/h2&gt;

&lt;p&gt;If you’ve been working from an office primarily, you probably have a commute. However stressful or relaxing it might be, it’s a period of &lt;em&gt;transition&lt;/em&gt;. You’re gearing up for work or mentally setting it aside. I’ve learned that I can’t just stop working for the day and dive into “home mode;” if I do, my partner gets work-me instead of partner-me.&lt;/p&gt;

&lt;p&gt;Try to build a “commute” into your day. This could take many forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat with your partner&lt;/li&gt;
&lt;li&gt;Make yourself a longer breakfast (news reading as you see fit)&lt;/li&gt;
&lt;li&gt;Take the dog/iguana/cat/self for a walk&lt;/li&gt;
&lt;li&gt;Do some light straightening/cleaning up&lt;/li&gt;
&lt;li&gt;Write an email to a friend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This puts some time in between work and the rest of the day, giving your brain the mental buffer that it needs to prepare or relax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing your space
&lt;/h2&gt;

&lt;p&gt;I am lucky enough to have a room that I’ve made into an office, but I realize that this isn’t an option for everyone. Wherever you choose to work, make it your space &lt;em&gt;for&lt;/em&gt; work. This might mean setting up a monitor, or putting your notebook, whiteboard, fidget toy, and chapstick nearby.&lt;/p&gt;

&lt;p&gt;If you do have a desk, lay it out as close to your office desk as you can. Keep it as clean (or messy) as your office desk usually is. Take some time to check your ergonomics; you’re going to be here for some time, not just nights and weekends. Things that don’t annoy you in the off time will suddenly become intolerable during working hours, so try to anticipate them in advance so you can fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting down to work
&lt;/h2&gt;

&lt;p&gt;Working from home requires a bit more discipline than working in an office. Everything that you like to do in your off time is now at your fingertips! So that means there are lots of -- ooh, shiny object! That would look great on my side ta -- distractions. Your brain will still be putting together grocery lists, brainstorming ideas for dates, and thinking about the last episode of &amp;lt;insert favorite TV show here&amp;gt;.&lt;/p&gt;

&lt;p&gt;In addition to preparing the space you’ll be working in, get into a ritual of setting things down. Physically put away your tablet, turn off or suspend your gaming rig, clear your work space of non-work &lt;em&gt;stuff&lt;/em&gt;. If something is still nagging at you, get it done and set it down. With the example of a grocery list, round it out on your phone or notebook and then set those behind you.&lt;/p&gt;

&lt;p&gt;Keep yourself accountable. Each day, in your team’s Slack/chat/IRC, say what you’re aiming to accomplish. This is your work version of a gym buddy. Or, you can ask someone on your team to be your work buddy, and you can keep each other accountable. Introvert? Make a checklist instead, and check off those items (preferably with a flourish, but you do you).&lt;/p&gt;

&lt;p&gt;That’s part 1! In &lt;a href="https://dev.to/juliaferraioli/so-you-re-working-from-home-a-primer-part-2-g6l"&gt;part 2&lt;/a&gt;, I’ll talk about collaboration and productive meetings.&lt;/p&gt;

</description>
      <category>wfh</category>
      <category>remotework</category>
      <category>tipsandtricks</category>
      <category>career</category>
    </item>
    <item>
      <title>Using buffer to set image descriptions</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Mon, 11 Mar 2019 14:03:04 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/using-buffer-to-set-image-descriptions-4921</link>
      <guid>https://forem.com/juliaferraioli/using-buffer-to-set-image-descriptions-4921</guid>
      <description>&lt;p&gt;&lt;em&gt;This is cross-posted from &lt;a href="https://www.juliaferraioli.com/blog/2019/01/setting-image-descriptions/" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Descriptions on images, also known as &lt;a href="https://en.wikipedia.org/wiki/Alt_attribute" rel="noopener noreferrer"&gt;alt-text&lt;/a&gt;, are important for people reading your content using a screen reader or other assistive technology. Screen readers synthesize on-screen text, which allows people who are blind or have low vision to interact with technology. However, images cannot be "read out loud" the same way that text can, so screen readers rely on the person posting the image to set the description via alt-text, and synthesize that property instead.&lt;/p&gt;

&lt;p&gt;This used to primarily concern designers and software developers, who would make sure that each image had its alt-text properly set so that everyone could use what they built. Now, many sites rely heavily upon user content, which means that sites leave setting the descriptions up to the users who post the images. Unfortunately, providing these descriptions is not always very discoverable -- if possible at all.&lt;/p&gt;

&lt;center&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuliaferraioli.com%2Fblog%2Fimages%2Fsetting-image-descriptions%2Fimage-sharing-flow.png" alt="A flow chart depicting an image and description pointing to buffer, which then points to Twitter and Instagram"&gt;&lt;/center&gt;

&lt;center&gt;**My typical flow to share images and setting alt-text**&lt;/center&gt;

&lt;p&gt;I've been relying more and more on &lt;a href="https://buffer.com" rel="noopener noreferrer"&gt;buffer&lt;/a&gt; to facilitate providing alt-text for different sites. This lets me set the description with services that allow it via the API (&lt;a href="https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-metadata-create" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;) while simultaneously sharing it to services that don't (Instagram, LinkedIn). If sharing a link, it also gives me the ability to select what image to use from the article, &lt;em&gt;and&lt;/em&gt; provide alt-text for that as well.&lt;/p&gt;

&lt;p&gt;Actually figuring out &lt;em&gt;how&lt;/em&gt; to enter a description isn't super discoverable on desktop. You have to hover over the image itself to get the "add description" option:&lt;/p&gt;

&lt;center&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuliaferraioli.com%2Fblog%2Fimages%2Fsetting-image-descriptions%2Fbuffer-browser.png" alt='The buffer web-based posting interface, with the mouse hovering over an uploaded image, which displays the hover-text "Click to expand &amp;amp; add description"'&gt;&lt;/center&gt;

&lt;center&gt;**Adding image descriptions in a browser**&lt;/center&gt;

&lt;p&gt;I like the mobile experience better, because the option to add the description is clearly visible:&lt;/p&gt;

&lt;center&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuliaferraioli.com%2Fblog%2Fimages%2Fsetting-image-descriptions%2Fbuffer-app.png" alt='The buffer Android app interface with an image uploaded and a clearly visible button labeled "Add Description"'&gt;&lt;/center&gt;

&lt;center&gt;**Adding image descriptions in the app**&lt;/center&gt;

&lt;p&gt;That's &lt;em&gt;how&lt;/em&gt; to set alt-text using buffer, but what should the alt-text actually be? There's a lot of guidance online, but &lt;a href="https://support.siteimprove.com/hc/en-gb/articles/115000013031-Accessibility-Image-Alt-text-best-practices" rel="noopener noreferrer"&gt;this site explains some best practices&lt;/a&gt; for crafting the text itself. My rules of thumb are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be concise: alt-text will be read out loud by a screen reader&lt;/li&gt;
&lt;li&gt;Aim for parity: convey the same information that you expect the user would glean from the image&lt;/li&gt;
&lt;li&gt;It's not a caption: alt-text should provide information, not commentary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully, this gives you a strategy for making your social content accessible. I'll cross my fingers that more platforms will add support for setting alt-text, not just in their user interfaces but in their APIs as well, so that integrations like &lt;a href="https://buffer.com" rel="noopener noreferrer"&gt;buffer&lt;/a&gt; can take advantage of them. Go forth and describe!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>tipstricks</category>
      <category>socialmedia</category>
    </item>
    <item>
      <title>2FA, SMS, and you</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Sat, 11 Aug 2018 12:47:06 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/2fa-sms-and-you-35f2</link>
      <guid>https://forem.com/juliaferraioli/2fa-sms-and-you-35f2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is cross-posted from &lt;a href="https://www.juliaferraioli.com/blog/2018/08/2fa-sms-you/"&gt;my blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Multi-factor_authentication"&gt;2-Factor Authentication (2FA)&lt;/a&gt; or Multi-Factor Authentication (MFA) are ways of securing accounts above and beyond normal password protection. Typically, we think of 2FA as something you know (your password) and something you have (a device). The idea is that if you compromise one, you still can’t get access to the protected resource.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pY2MEk7d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://juliaferraioli.com/blog/images/2fa-sms-you/lock.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pY2MEk7d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://juliaferraioli.com/blog/images/2fa-sms-you/lock.jpg" alt="Image of an antique lock" title="Image of an antique lock"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;strong&gt;Antique, ornate lock&lt;/strong&gt;&lt;/center&gt;

&lt;p&gt;A room protected by a keypad and ID card reader is a great example of 2FA. You might be able to guess the code, but you’d also need a valid ID card to get access to the locked room.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What about biometrics? Good question. Technically, still something you know (the password) and something you have (a retina/fingerprint/etc…), but stored biometrics make me nervous. I steer clear.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Some) 2FA Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm"&gt;Time-based One-Time Password&lt;/a&gt; (TOTP)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Universal_2nd_Factor"&gt;Universal Second Factor&lt;/a&gt; (U2F)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/SMS"&gt;SMS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At a high level, here's how each works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TOTP&lt;/strong&gt; works via app, on your phone, browser extension, or command line, and generates you with a time-limited code to provide when logging into an account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;U2F&lt;/strong&gt; works by configuring a device (you may have heard of Yubikey), and supplying that device every time you log into an account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SMS&lt;/strong&gt; works by getting a text with a code that you enter every time you log into your account.&lt;/p&gt;

&lt;p&gt;2FA isn’t all that complicated in practice. It’s an extra step, yes, but worth configuring to protect your account(s).&lt;/p&gt;

&lt;p&gt;However, not all 2FA is created equal. I have had to help more than one person recover accounts protected by SMS-based 2FA. &lt;a href="https://motherboard.vice.com/en_us/article/vbqax3/hackers-sim-swapping-steal-phone-numbers-instagram-bitcoin"&gt;SIM hijacking&lt;/a&gt; is when someone takes over your phone number and can therefore intercept your calls and texts. Some sites / apps who use SMS-based 2FA will allow password-resetting via SMS or voice alone. If someone hijacks your SIM, they can get access to those accounts without needing to know (or guess!) your password.&lt;/p&gt;

&lt;p&gt;That’s why I recommend not using SMS-based 2FA. If you’re against carrying around an additional device, set up a TOTP app (like &lt;a href="https://support.google.com/accounts/answer/1066447"&gt;Google Authenticator&lt;/a&gt;) on your phone. Let’s face it, you probably carry it around anyway. U2F is my preference, but that can be a bigger hurdle if you’re just starting with 2FA.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here’s a good &lt;a href="https://www.theverge.com/2017/6/17/15772142/how-to-set-up-two-factor-authentication"&gt;general guide&lt;/a&gt; on how to set up 2FA. If you want to go the U2F route, you'll probably want to get a &lt;a href="https://www.yubico.com/products/yubikey-hardware/"&gt;YubiKey&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recovery codes -- download them, store them.&lt;/li&gt;
&lt;li&gt;Keep your passwords strong -- 2FA isn’t a replacement for a good password.&lt;/li&gt;
&lt;li&gt;Use a password manager -- a trusted password manager can store the TOTP seeds, if you need to use more than one device.&lt;/li&gt;
&lt;li&gt;Back up off-site -- for the truly paranoid, store backup codes, devices in an off-site, offline location like a safety deposit box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt;: What if a provider only allows SMS-based 2FA?&lt;/p&gt;

&lt;p&gt;Great question, but one there’s not an easy answer to. It depends on a lot of stuff. First, evaluate whether you really need that account. If not, then there’s no issue. If you do need that account…&lt;/p&gt;

&lt;p&gt;Evaluate your risk profile. If this account is compromised, how much damage is it going to do? If it’s not going to do any, I might not recommend securing it with SMS in the first place. If it has the chance to do damage, then I’d investigate the policies of how the provider allows account recovery and make a call based on that. Definitely still use a unique password, and definitely make the request for other 2FA options!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Need provider-specific advice for securing your accounts? &lt;a href="https://twofactorauth.org/"&gt;twofactorauth.org&lt;/a&gt; is a great way to figure out what they support and how to go about enabling it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Have other questions? Let me know and I'll try to answer them.&lt;/p&gt;

</description>
      <category>2fa</category>
      <category>mfa</category>
      <category>security</category>
      <category>technology</category>
    </item>
    <item>
      <title>Testing in Go: testing floating point numbers</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Wed, 20 Jun 2018 12:25:21 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/testing-in-go-testing-floating-point-numbers-4i0a</link>
      <guid>https://forem.com/juliaferraioli/testing-in-go-testing-floating-point-numbers-4i0a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is cross-posted from &lt;a href="https://juliaferraioli.com/blog/2018/06/golang-testing-floats/" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been working on a library that includes some vector manipulations in Go, trying to follow good development practices and starting with writing my tests first. But early on, I ran into a bit of a problem: floating points.&lt;/p&gt;

&lt;h1&gt;
  
  
  The problem
&lt;/h1&gt;

&lt;p&gt;Now, we know that floating points are an issue in programming, by the very nature of how they're represented in memory. I loved Julia Evans's brief explanation of how floats work in her &lt;a href="https://jvns.ca/linux-comics-zine.pdf" rel="noopener noreferrer"&gt;Linux Comics Zine&lt;/a&gt; (scroll down to the sixth panel), and for a more in-depth explanation, see &lt;a href="http://www.toves.org/books/float/#s2.1" rel="noopener noreferrer"&gt;this piece&lt;/a&gt; by Carl Burch.&lt;/p&gt;

&lt;p&gt;My problem: after writing my implementation of a vector addition function, I couldn't get the tests to pass, because comparing equality of floating point numbers is...hard. I'd be comparing an expected result of &lt;code&gt;{2,3}&lt;/code&gt; to an actual result of &lt;code&gt;{1.99999999, 3.00000000002}&lt;/code&gt;. Those values don't pass muster for traditional equality.&lt;/p&gt;

&lt;p&gt;I looked up best practices of how to unit test functions that returned floating point numbers and overwhelmingly found the recommendation of "don't". (Not helpful, y'all.) One recommended using a tolerance -- that is, if the absolute difference between the expected number and the actual number was under a specified tolerance, you counted them as being equal.&lt;/p&gt;

&lt;p&gt;That was pretty easy to implement, and it looked like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="n"&gt;got&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tolerance&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Got %v, expected %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;h1&gt;
  
  
  Defining a comparer
&lt;/h1&gt;

&lt;p&gt;However, I recently started to reimplement my library, and in the process switched over to testing using the cmp package. The cmp package is a much more robust way of testing for equality, and in exploring it I found that you can define a comparer function that makes this a lot cleaner. This is the comparer function from the documentation, which uses a bit more refined logic than my initial one above:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;tolerance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;.00001&lt;/span&gt;
&lt;span class="n"&gt;opt&lt;/span&gt;  &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comparer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;tolerance&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Then, when you run your test, you use the comparer function when testing for equality:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"got %v, wanted %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Your tests are much more clean, and you can easily use a comparer function that works for your use case.&lt;/p&gt;

&lt;h1&gt;
  
  
  Postscript
&lt;/h1&gt;

&lt;p&gt;However... you have to be careful with your comparer function! The one above is straight from the cmp docs. But straight away I ran into a test failure that I didn't expect: when trying to perform operations on zero vectors, it failed, &lt;em&gt;hard&lt;/em&gt;. Which led to this exchange between me and my tests:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuliaferraioli.com%2Fblog%2Fimages%2Fgolang-testing-floats%2Ftwitter-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuliaferraioli.com%2Fblog%2Fimages%2Fgolang-testing-floats%2Ftwitter-screenshot.png" title="Screenshot of a frustrated tweet" alt="More&amp;lt;br&amp;gt;
Me: Tests, why are you failing?&amp;lt;br&amp;gt;
Tests: Not telling.&amp;lt;br&amp;gt;
Me: It's a simply equality check! Nothing complex -- I swear!&amp;lt;br&amp;gt;
Tests: Mmmhmmm.&amp;lt;br&amp;gt;
Me: This was my baseline test. The simplest test case I could think of.&amp;lt;br&amp;gt;
Tests: Suuuure.&amp;lt;br&amp;gt;
Me: Let me look. Wait...are you dividing by ZERO!?!&amp;lt;br&amp;gt;
Tests: 😈"&gt;&lt;/a&gt;&lt;br&gt;
Frustrated tweet, &lt;a href="https://twitter.com/juliaferraioli/status/1004770471227940864" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yep, when all the values in a vector are zero, I wind up dividing by zero. So my actual comparer function looks like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="n"&gt;opt&lt;/span&gt;  &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comparer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;tolerance&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Of course, the same logic (&lt;code&gt;diff / mean&lt;/code&gt;) would have had the same issue without using the &lt;code&gt;cmp&lt;/code&gt; comparer option, so this amusing story is about the general case.&lt;/p&gt;

&lt;p&gt;But, that said, it took 8 lines of code to make my tests actually test what I care about. So if you're doing scientific computation, don't forget about your comparer function!&lt;/p&gt;

&lt;p&gt;Go test!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All code in this blog post is released under the &lt;a href="https://www.apache.org/licenses/LICENSE-2.0" rel="noopener noreferrer"&gt;Apache 2.0 license&lt;/a&gt; and &lt;a href="https://github.com/juliaferraioli/code_snippets/tree/master/blogs/cmp-testing/floats" rel="noopener noreferrer"&gt;can be found on GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>testing</category>
      <category>softwareengineering</category>
      <category>technology</category>
    </item>
    <item>
      <title>Nevertheless, julia ferraioli Coded</title>
      <dc:creator>julia ferraioli</dc:creator>
      <pubDate>Thu, 08 Mar 2018 15:46:44 +0000</pubDate>
      <link>https://forem.com/juliaferraioli/nevertheless-julia-ferraioli-coded--5ha4</link>
      <guid>https://forem.com/juliaferraioli/nevertheless-julia-ferraioli-coded--5ha4</guid>
      <description>&lt;h2&gt;
  
  
  I began/continue to code because...
&lt;/h2&gt;

&lt;p&gt;I started to code in high school, in a computer science course that was half geeks and half people trying to fill a graduation requirement. I'm honestly not sure which group I belonged to at the start. We were the last year that computer science was taught in C++ (shoutout to Borland!) and I'm forever grateful for that.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coding had me at "Hello, world!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I arrived at Bryn Mawr College, I was still pretty determined to pursue a different path, but took more CS classes for fun. And more. And more. I played with graphics, I caused kernel panics, I built robots and made them zoom around, I did nifty stuff with machine learning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmmfss5l07b8w8e9sdssv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmmfss5l07b8w8e9sdssv.jpg" title="Ironing Mylar for our robotic blimp" alt="julia ferraioli standing at a table with an iron" width="453" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I knew it, this was my path.&lt;/p&gt;

&lt;p&gt;I first fell in love with coding because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I could make things, that weren't there before, happen&lt;/li&gt;
&lt;li&gt;It was a codification of logic, which made sense in a world that didn't&lt;/li&gt;
&lt;li&gt;Every new project was a new adventure with new problems&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I still love coding because of the people. While the technical challenges are still enjoyable, I take deep satisfaction in building things that help other people.&lt;/p&gt;

&lt;h2&gt;
  
  
  I recently overcame...
&lt;/h2&gt;

&lt;p&gt;Oh my. Well, I'm not exactly private about my health struggles. The last round of whatever-the-hell-is-wrong-with-me threatened my ability to see. I had no idea how I'd continue to code without my sight. Software bugs I can fix. Biological ones I cannot. Looking at a future without my chosen profession was terrifying and demoralizing.&lt;/p&gt;

&lt;p&gt;While eventually I got my sight back, I had also started to develop a personal tool set for coping with low vision, that I think has made me a better engineer. I rely less on what I see, and more on internal reasoning. My mental scratch pad is a lot bigger now than it used to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  I want to brag about...
&lt;/h2&gt;

&lt;p&gt;I actually have a couple of things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source @ Google
&lt;/h3&gt;

&lt;p&gt;My job at Google is dedicated to supporting open source. Most of the time, this means a lot of internal work to make sure that engineers at Google are supported in their open source efforts, and much of it isn't public facing. However...&lt;/p&gt;

&lt;p&gt;While I was only involved in the starting phase for &lt;a href="https://opensource.google.com/" rel="noopener noreferrer"&gt;opensource.google.com&lt;/a&gt;, I helped with the initial design and beginnings of implementation for the &lt;a href="https://opensource.google.com/projects" rel="noopener noreferrer"&gt;project explorer&lt;/a&gt;. Not only does this showcase some of Google's open source projects, but it starts to show the depth of involvement of Google in the broader open source community.&lt;/p&gt;

&lt;p&gt;I think it looks pretty shiny, too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I Hug That?
&lt;/h3&gt;

&lt;p&gt;Okay, so I'm still absurdly proud of the &lt;a href="https://imgur.com/a/T1QNL" rel="noopener noreferrer"&gt;little demo&lt;/a&gt; I built using Google CloudML, "Can I Hug That?". (You can see a video of it in action &lt;a href="https://youtu.be/Ja2hxBAwG_0?t=8m57s" rel="noopener noreferrer"&gt;here&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fx3l7zvphjee0lq90wprm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fx3l7zvphjee0lq90wprm.png" title="This octopus is likely huggable" alt="a screenshot of a stuffed octopus which shows that has a .696 huggability rating" width="697" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a technical perspective, this isn't hard to do. So I'm not bragging about the engineering side of it (and I really shouldn't; the server code is a bit messy). But I do want to brag about the concept, because the goal was to pick a problem that we couldn't use a pre-trained model to solve, make it clear why a custom model would be the right approach, and make it understandable and approachable without a machine learning background.&lt;/p&gt;

&lt;p&gt;In short, I wanted to make machine learning friendly. &lt;em&gt;I wanted to make machine learning huggable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And, based on the feedback I got on the talk and demo, that's exactly what I accomplished. I am super proud of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  I look up to...
&lt;/h2&gt;

&lt;p&gt;I'd like to specifically call out &lt;a href="https://twitter.com/ashleymcnamara" rel="noopener noreferrer"&gt;Ashley McNamara&lt;/a&gt; for being an inspiration, both for her technical leadership and community leadership. Her path into and through software engineering is a shining example of determination and skill -- one that I hope to follow. And can we talk about her art? I’ve never seen such &lt;a href="https://github.com/ashleymcnamara/gophers" rel="noopener noreferrer"&gt;cute gophers&lt;/a&gt; in my life.&lt;/p&gt;

&lt;p&gt;Lastly, Ashley reached out to me when I felt so stuck in my life that things seemed lost, and talked me through it. I don’t know if she realizes just how much that meant to me. Thanks, Ashley.&lt;/p&gt;

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