nus-talk/nus.html

554 lines
22 KiB
HTML
Raw Normal View History

2024-09-14 13:27:25 +00:00
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<meta name="author" content="Julian Ospald" />
<title>Two decades of Open Source</title>
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<link rel="stylesheet" type="text/css" media="screen, projection, print"
href="https://www.w3.org/Talks/Tools/Slidy2/styles/slidy.css" />
<script src="https://www.w3.org/Talks/Tools/Slidy2/scripts/slidy.js"
charset="utf-8" type="text/javascript"></script>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Two decades of Open Source</h1>
<p class="author">
Julian Ospald
</p>
<p class="date">Sep 20, 2024</p>
</div>
<div id="introduction" class="title-slide slide section level1">
<h1>Introduction</h1>
</div>
<div id="about-me" class="slide section level2">
<h1>About me</h1>
<ul>
<li>From Germany</li>
<li>Studied CS</li>
<li>Haskell developer</li>
<li>I love open source</li>
</ul>
</div>
<div id="professional-career" class="slide section level2">
<h1>Professional career</h1>
<ul>
<li>Software Engineer in R&amp;D (automotive industry)</li>
<li>Go Backend Developer (online advertisement platform</li>
<li>Haskell Developer at <strong>Capital Match</strong> (invoice
financing platform in Singapore)</li>
<li>Haskell Developer at <strong>IOHK</strong> (Cardano Blockchain)</li>
<li>Haskell Freelancer (blockchain and others)</li>
<li>Haskell Developer at <strong>Standard Chartered Bank</strong></li>
<li>Haskell Freelancer (chimney sweeper app for german businesses)</li>
</ul>
</div>
<div id="open-source-career" class="slide section level2">
<h1>Open Source career</h1>
<ul>
<li>Gentoo Linux developer (core team), 2012-2016
<ul>
<li>Ebuild development (packaging)</li>
<li>Code review</li>
<li>Development of a <a
href="https://www.gentoo.org/glep/glep-0066.html">git workflow</a></li>
</ul></li>
<li>Author of GHCup (the Haskell installer), ca. 2019</li>
<li>Maintainer of Haskell core libraries: filepath, unix, os-string,
file-io</li>
<li>Implementation of the <a
href="https://hasufell.github.io/posts/2022-06-29-fixing-haskell-filepaths.html">Abstract
FilePath Proposal</a></li>
<li>Member of the Haskell Core Libraries Comittee 2023-2026</li>
<li>Haskell Influencer (Haskell Foundation, …)</li>
</ul>
</div>
<div id="open-source" class="title-slide slide section level1">
<h1>Open Source</h1>
</div>
<div id="what-is-open-source" class="slide section level2">
<h1>What is Open Source</h1>
<ul>
<li><img src="osi.png" id="id" class="class" height="32" /> A group of
licenses (see OSI)
<ul>
<li><em>Not</em> free software</li>
<li><em>Not</em> copyleft</li>
</ul></li>
<li>🧑‍🤝‍🧑 A community
<ul>
<li>volunteers</li>
<li>companies</li>
</ul></li>
<li>🔮 A philosophy
<ul>
<li>sharing</li>
<li>collaboration</li>
<li>transparency</li>
</ul></li>
</ul>
</div>
<div id="popular-open-source-projects" class="slide section level2">
<h1>Popular Open Source projects</h1>
<ul>
<li><img src="512px-Tux.svg.png" id="id" class="class" height="32" />
Linux kernel
<ul>
<li>1500 developers from 200-250 companies</li>
</ul></li>
<li><img src="firefox.png" id="id" class="class" height="32" />
Firefox</li>
<li><img src="vscode.png" id="id" class="class" height="32" />
VSCode</li>
<li><img src="blender.png" id="id" class="class" height="32" />
Blender</li>
<li><img src="haskell_logo.png" id="id" class="class" height="32" /> GHC
(The Haskell compiler)</li>
</ul>
</div>
<div id="value-proposition-of-open-source" class="slide section level2">
<h1>Value proposition of Open Source</h1>
<ul>
<li>⚗️ the scientific method
<ul>
<li>share your results</li>
<li>allow people to replicate it</li>
</ul></li>
<li>🔓 access to a community
<ul>
<li>users</li>
<li>collaborators</li>
</ul></li>
<li>🕸️ network effects</li>
</ul>
</div>
<div id="reality-of-open-source" class="slide section level2">
<h1>Reality of Open Source</h1>
<ul>
<li>most projects…
<ul>
<li>are one-man shows</li>
<li>have no users</li>
<li>are underdocumened</li>
<li>have horrible code</li>
</ul></li>
<li>writing new code is easy, maintenance is hard</li>
<li>most maintainers
<ul>
<li>dont get paid</li>
<li>will stop maintenance at some point</li>
<li>dont care much about their users</li>
</ul></li>
</ul>
</div>
<div id="gentoo-and-package-management"
class="title-slide slide section level1">
<h1>Gentoo and package management</h1>
</div>
<div id="what-is-gentoo" class="slide section level2">
<h1>What is Gentoo</h1>
<ul>
<li>a Linux distribution
<ul>
<li>rolling release</li>
<li>source based</li>
</ul></li>
<li>19000 packages (program, library, …)</li>
<li>200 core developers (at its peak)</li>
<li>over 1000 contributors</li>
</ul>
</div>
<div id="how-does-a-linux-distro-work-relationships"
class="slide section level2">
<h1>How does a Linux distro work (relationships)</h1>
<p><img src="packager_relationships.svg" id="id" class="class"
height="500" /></p>
</div>
<div id="how-does-a-linux-distro-work-activities"
class="slide section level2">
<h1>How does a Linux distro work (activities)</h1>
<p><img src="install.svg" id="id" class="class" height="500" /></p>
</div>
<div id="a-typical-ebuild" class="slide section level2">
<h1>A typical ebuild</h1>
<div class="sourceCode" id="cb1"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a><span class="va">EAPI</span><span class="op">=</span>8</span>
<span id="cb1-2"><a href="#cb1-2" tabindex="-1"></a></span>
<span id="cb1-3"><a href="#cb1-3" tabindex="-1"></a><span class="va">DESCRIPTION</span><span class="op">=</span><span class="st">&quot;A dummy package&quot;</span></span>
<span id="cb1-4"><a href="#cb1-4" tabindex="-1"></a><span class="va">HOMEPAGE</span><span class="op">=</span><span class="st">&quot;https://dummy.org&quot;</span></span>
<span id="cb1-5"><a href="#cb1-5" tabindex="-1"></a><span class="va">SRC_URI</span><span class="op">=</span><span class="st">&quot;https://github.com/dummy/dummy/archive/refs/tags/</span><span class="va">${PV}</span><span class="st">.tar.gz -&gt; </span><span class="va">${P}</span><span class="st">.tar.gz&quot;</span></span>
<span id="cb1-6"><a href="#cb1-6" tabindex="-1"></a></span>
<span id="cb1-7"><a href="#cb1-7" tabindex="-1"></a><span class="va">LICENSE</span><span class="op">=</span><span class="st">&quot;BSD-3&quot;</span></span>
<span id="cb1-8"><a href="#cb1-8" tabindex="-1"></a><span class="va">SLOT</span><span class="op">=</span><span class="st">&quot;0&quot;</span></span>
<span id="cb1-9"><a href="#cb1-9" tabindex="-1"></a><span class="va">KEYWORDS</span><span class="op">=</span><span class="st">&quot;~amd64 ~x86 &quot;</span></span>
<span id="cb1-10"><a href="#cb1-10" tabindex="-1"></a><span class="va">IUSE</span><span class="op">=</span><span class="st">&quot;debug&quot;</span></span>
<span id="cb1-11"><a href="#cb1-11" tabindex="-1"></a></span>
<span id="cb1-12"><a href="#cb1-12" tabindex="-1"></a><span class="va">RDEPEND</span><span class="op">=</span><span class="st">&quot;dev-util/boost&quot;</span></span>
<span id="cb1-13"><a href="#cb1-13" tabindex="-1"></a></span>
<span id="cb1-14"><a href="#cb1-14" tabindex="-1"></a><span class="va">PATCHES</span><span class="op">=</span><span class="va">(</span> <span class="st">&quot;</span><span class="va">${FILESDIR}</span><span class="st">&quot;</span>/<span class="va">${PN}</span>-4.9.2-disable_python_rpath.patch<span class="va">)</span></span>
<span id="cb1-15"><a href="#cb1-15" tabindex="-1"></a></span>
<span id="cb1-16"><a href="#cb1-16" tabindex="-1"></a><span class="fu">src_configure()</span> <span class="kw">{</span></span>
<span id="cb1-17"><a href="#cb1-17" tabindex="-1"></a> <span class="ex">econf</span> <span class="va">$(</span><span class="ex">use_enable</span> debug<span class="va">)</span></span>
<span id="cb1-18"><a href="#cb1-18" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb1-19"><a href="#cb1-19" tabindex="-1"></a></span>
<span id="cb1-20"><a href="#cb1-20" tabindex="-1"></a><span class="fu">src_compile()</span> <span class="kw">{</span></span>
<span id="cb1-21"><a href="#cb1-21" tabindex="-1"></a> <span class="ex">emake</span></span>
<span id="cb1-22"><a href="#cb1-22" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb1-23"><a href="#cb1-23" tabindex="-1"></a></span>
<span id="cb1-24"><a href="#cb1-24" tabindex="-1"></a><span class="fu">src_test()</span> <span class="kw">{</span></span>
<span id="cb1-25"><a href="#cb1-25" tabindex="-1"></a> <span class="ex">emake</span> test</span>
<span id="cb1-26"><a href="#cb1-26" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb1-27"><a href="#cb1-27" tabindex="-1"></a></span>
<span id="cb1-28"><a href="#cb1-28" tabindex="-1"></a><span class="fu">src_install()</span> <span class="kw">{</span></span>
<span id="cb1-29"><a href="#cb1-29" tabindex="-1"></a> <span class="ex">emake</span> DESTDIR=<span class="st">&quot;</span><span class="va">${D}</span><span class="st">&quot;</span> install</span>
<span id="cb1-30"><a href="#cb1-30" tabindex="-1"></a><span class="kw">}</span></span></code></pre></div>
</div>
<div id="packaging-challenges" class="slide section level2">
<h1>Packaging challenges</h1>
<ul>
<li>no standard on build systems (make, autotools, meson, cmake, …)
<ul>
<li>=&gt; an abstraction over build systems</li>
</ul></li>
<li>thousands of different execution environments (fragility)
<ul>
<li>system configuration</li>
<li>package configuration</li>
<li>platform, architecture</li>
</ul></li>
<li>reverse dependencies
<ul>
<li>shipping a “chain” instead of a single artifact</li>
</ul></li>
<li>high impact on small mistakes (e.g. assuming a specific shell)</li>
</ul>
</div>
<div id="packaging-challenges-pt-2." class="slide section level2">
<h1>Packaging challenges (pt 2.)</h1>
<ul>
<li>communication between teams/maintainers</li>
<li>execution of large changes
<ul>
<li>e.g. introduction of LibreSSL</li>
<li>e.g. changing of fundamental workflows (from CVS to git)</li>
</ul></li>
<li>monitoring upstream changes and making decisions about
compatibility/stability
<ul>
<li>when to update</li>
</ul></li>
</ul>
</div>
<div id="what-is-a-distro-really" class="slide section level2">
<h1>What is a Distro really?</h1>
<ul>
<li>a user experience
<ul>
<li>LTS distros vs rolling release</li>
<li>binary vs source based</li>
<li>choice of init system</li>
</ul></li>
<li>plug and play (everything works)</li>
<li>deviating from the happy path (fixing issues)</li>
<li>combining components to a coherent system (init system, coreutils,
kernel, …)</li>
<li>a choice of <strong>defaults</strong></li>
</ul>
</div>
<div id="ghcup" class="title-slide slide section level1">
<h1>GHCup</h1>
</div>
<div id="demo" class="slide section level2">
<h1>Demo</h1>
<p><img src="ghcup.png" id="id" class="class" height="500" /></p>
</div>
<div id="state-of-2019-haskell-installers" class="slide section level2">
<h1>State of 2019 (Haskell Installers)</h1>
<ul>
<li>stack is the only “Haskell Installer”</li>
<li>no unified alternative for cabal users</li>
<li>distro packages, nix, manual installs, …</li>
<li>😭</li>
</ul>
</div>
<div id="how-it-started" class="slide section level2">
<h1>How it started</h1>
<ul>
<li>🤹 small team at work (Capital Match), using different platforms
<ul>
<li>originally used stack</li>
<li>distro packages constantly out of date</li>
</ul></li>
<li>🦾 first version was 165 LOC
<ul>
<li>Posix shell</li>
</ul></li>
<li><img src="linux.png" id="id" class="class" height="32" /> only
supported linux and mac</li>
<li><img src="rust.png" id="id" class="class" height="32" /> inspired by
<strong>rustup</strong></li>
<li>support from haskell.org</li>
</ul>
</div>
<div id="ghcup-today" class="slide section level2">
<h1>GHCup today</h1>
<p><a
href="https://taylor.fausak.me/2022/11/18/haskell-survey-results/#s2q1">Haskell
Survey 2022</a>:</p>
<p><img src="survey.png" /></p>
<ul>
<li>over <strong>17k</strong> LOC Haskell</li>
<li>supports all platforms: Linux, Windows, macOS, FreeBSD</li>
<li>first thing new Haskell users get exposed to</li>
</ul>
</div>
<div id="what-is-ghcup-simplified" class="slide section level2">
<h1>What is GHCup (simplified)?</h1>
<div class="sourceCode" id="cb2"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-L</span> <span class="dt">\</span></span>
<span id="cb2-2"><a href="#cb2-2" tabindex="-1"></a> <span class="st">&#39;https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-linux.tar.xz&#39;</span> <span class="kw">|</span></span>
<span id="cb2-3"><a href="#cb2-3" tabindex="-1"></a> <span class="fu">tar</span> <span class="at">-xJ</span> <span class="at">-C</span> /tmp <span class="kw">&amp;&amp;</span></span>
<span id="cb2-4"><a href="#cb2-4" tabindex="-1"></a> <span class="bu">cd</span> /tmp/ghc-9.6.5-x86_64-unknown-linux/ <span class="kw">&amp;&amp;</span></span>
<span id="cb2-5"><a href="#cb2-5" tabindex="-1"></a> <span class="ex">./configure</span> <span class="at">--prefix</span><span class="op">=</span><span class="st">&quot;</span><span class="va">$HOME</span><span class="st">/.local&quot;</span> <span class="kw">&amp;&amp;</span></span>
<span id="cb2-6"><a href="#cb2-6" tabindex="-1"></a> <span class="fu">make</span> install <span class="kw">&amp;&amp;</span></span>
<span id="cb2-7"><a href="#cb2-7" tabindex="-1"></a> <span class="fu">rm</span> <span class="at">-rf</span> /tmp/ghc-9.6.5-x86_64-unknown-linux/</span></code></pre></div>
</div>
<div id="what-is-ghcup-really" class="slide section level2">
<h1>What is GHCup really?</h1>
<ul>
<li><img src="open-box.png" id="id" class="class" width="32"
height="32" /> installer (portable)</li>
<li><img src="debian.png" id="id" class="class" width="32"
height="32" /> distribution channel</li>
<li><img src="feedback.png" id="id" class="class" width="32"
height="32" /> feedback channel</li>
<li><img src="qa.png" id="id" class="class" width="32" height="32" />
testing/QA gateway</li>
<li><img src="user.png" id="id" class="class" width="32" height="32" />
provider of sane defaults (e.g. “recommended” GHC version)</li>
<li><img src="chain-saw.png" id="id" class="class" width="32"
height="32" /> glue for holistic toolchain experience
<ul>
<li>VSCode, stack, cabal-install integration</li>
</ul></li>
<li><img src="ghaction.png" id="id" class="class" width="32"
height="32" /> CI provisioning (e.g. github actions)</li>
</ul>
</div>
<div id="the-difference-to-gentoo" class="slide section level2">
<h1>The difference to Gentoo</h1>
<ul>
<li>one-man project (mostly)</li>
<li>much tighter coupling between upstream (e.g. GHC developers) and
downstream (GHCup developers)
<ul>
<li>heavier on relationship issues</li>
</ul></li>
<li>much more responsibility</li>
<li>position of authority</li>
</ul>
</div>
<div id="relationships-in-detail" class="slide section level2">
<h1>Relationships in detail</h1>
<p>Dependencies:</p>
<ul>
<li>supported tools
<ul>
<li>GHC</li>
<li>Cabal</li>
<li>HLS</li>
<li>Stack</li>
</ul></li>
<li>decisions that affect us
<ul>
<li>release frequency</li>
<li>upstream CI</li>
<li>platform support</li>
<li>binary distributions (the
<code>.tar.gz</code>/<code>.zip</code>)</li>
</ul></li>
</ul>
</div>
<div id="relationships-in-detail-1" class="slide section level2">
<h1>Relationships in detail</h1>
<p>Dependents:</p>
<ul>
<li><img src="haskell_logo.png" id="id" class="class" height="32" />
Haskell developers
<ul>
<li>beginners, advanced, students, companies</li>
</ul></li>
<li><img src="person.png" id="id" class="class" width="32"
height="32" /> end users (e.g. compiling pandoc from source)</li>
<li><img src="ghaction.png" id="id" class="class" width="32"
height="32" /> GitHub CI
<ul>
<li>GitHub images, Haskell repos</li>
</ul></li>
<li>🪞 mirrors
<ul>
<li><a href="https://mirror.sjtu.edu.cn/docs/ghcup">sjtug</a></li>
</ul></li>
<li>🧰 tools
<ul>
<li><a
href="https://github.com/haskell/vscode-haskell">vscode-haskell</a>, <a
href="https://play.haskell.org/">Haskell playground</a>, <a
href="https://github.com/williamboman/nvim-lsp-installer">nvim-lsp-installer</a></li>
</ul></li>
</ul>
</div>
<div id="other" class="slide section level2">
<h1>Other</h1>
<ul>
<li><p>the idea of a distribution is to create a user experience</p>
<ul>
<li>you log into your computer and install a program and everything just
works</li>
<li>or: something doesnt work… what are your next steps?</li>
</ul></li>
<li><p>you create an experience</p></li>
<li><p>the distribution is that brings all the pieces together:
installation, service management (systemd, openrc, initd), kernel
updates, support</p></li>
<li><p>lesson: composition</p>
<ul>
<li>functions</li>
<li>libraries</li>
<li>programs (unix)</li>
</ul></li>
<li><p>lesson: specifications</p>
<ul>
<li>LSP (open source milestone)</li>
</ul></li>
<li><p>lesson: caring about features and code instead of maintenance and
collaborations</p></li>
<li><p>dicatorships work</p></li>
<li><p>decision making (processes)</p>
<ul>
<li>lightweight when risk of mistakes is low (can revert?)</li>
</ul></li>
<li><p>tests in CI are garbage</p></li>
<li><p>reverse dependencies &lt;-&gt; me &lt;-&gt; users</p></li>
<li><p>collaboration vs boundaries, communication</p></li>
<li><p>what distribution work taught me for programming</p></li>
<li><p>posix principles and their connection to functional programming
(streams)</p></li>
<li><p>strings</p></li>
<li><p>open source politics</p></li>
<li><p>how to drive change</p></li>
<li><p>how to handle contributions (contribution experience, PRs,
documentation, mentoring,. ..)</p></li>
<li><p>collaboration</p></li>
<li><p>relationship between industry and FOSS</p></li>
<li><p>what is the main currency (money vs energy)</p></li>
<li><p>bus factor</p></li>
<li><p>feedback from universities regarding Haskell tooling</p></li>
<li><p>respect other projects when contributing</p></li>
<li><p>enabling and supporting (switching from coding wizard to support
role)</p></li>
<li><p>project life cycles</p></li>
<li><p>support</p></li>
<li><p>stability vs. ..</p></li>
<li><p>boundaries vs collaboration</p></li>
<li><p>trust, respect, relationship</p></li>
<li><p>working mode in open source</p></li>
<li><p>dealing with expectations</p></li>
<li><p>how to test (on the end users system)</p></li>
<li><p>what if you diverge from the happy path</p></li>
<li><p>why is stability an interesting goal?</p></li>
</ul>
</div>
</body>
</html>