|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199 |
- <!doctype html><!-- This is a valid HTML5 document. -->
- <!-- Screen readers, SEO, extensions and so on. -->
- <html lang=fr>
- <!-- Has to be within the first 1024 bytes, hence before the <title>
- See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
- <meta charset=utf-8>
- <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
- <!-- The viewport meta is quite crowded and we are responsible for that.
- See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
- <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
- <!-- Required to make a valid HTML5 document. -->
- <title>The Minimally-nice Open Source Software Maintainer (archive) — David Larlet</title>
- <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
- <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
- <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
- <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
- <link rel="manifest" href="/manifest.json">
- <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
- <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
- <meta name="apple-mobile-web-app-title" content="David Larlet">
- <meta name="application-name" content="David Larlet">
- <meta name="msapplication-TileColor" content="#da532c">
- <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
- <meta name="theme-color" content="#f0f0ea">
- <!-- That good ol' feed, subscribe :p. -->
- <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
-
- <meta name="robots" content="noindex, nofollow">
- <meta content="origin-when-cross-origin" name="referrer">
- <!-- Canonical URL for SEO purposes -->
- <link rel="canonical" href="https://brson.github.io/2017/04/05/minimally-nice-maintainer">
-
- <style>
- /* http://meyerweb.com/eric/tools/css/reset/ */
- html, body, div, span,
- h1, h2, h3, h4, h5, h6, p, blockquote, pre,
- a, abbr, address, big, cite, code,
- del, dfn, em, img, ins,
- small, strike, strong, tt, var,
- dl, dt, dd, ol, ul, li,
- fieldset, form, label, legend,
- table, caption, tbody, tfoot, thead, tr, th, td,
- article, aside, canvas, details, embed,
- figure, figcaption, footer, header, hgroup,
- menu, nav, output, ruby, section, summary,
- time, mark, audio, video {
- margin: 0;
- padding: 0;
- border: 0;
- font-size: 100%;
- font: inherit;
- vertical-align: baseline;
- }
- /* HTML5 display-role reset for older browsers */
- article, aside, details, figcaption, figure,
- footer, header, hgroup, menu, nav, section { display: block; }
- body { line-height: 1; }
- blockquote, q { quotes: none; }
- blockquote:before, blockquote:after,
- q:before, q:after {
- content: '';
- content: none;
- }
- table {
- border-collapse: collapse;
- border-spacing: 0;
- }
-
- /* http://practicaltypography.com/equity.html */
- /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
- /* https://www.filamentgroup.com/lab/js-web-fonts.html */
- @font-face {
- font-family: 'EquityTextB';
- src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
- font-weight: 300;
- font-style: normal;
- font-display: swap;
- }
- @font-face {
- font-family: 'EquityTextB';
- src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
- font-weight: 300;
- font-style: italic;
- font-display: swap;
- }
- @font-face {
- font-family: 'EquityTextB';
- src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
- url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
- font-weight: 700;
- font-style: normal;
- font-display: swap;
- }
-
- @font-face {
- font-family: 'ConcourseT3';
- src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
- url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
- font-weight: 300;
- font-style: normal;
- font-display: swap;
- }
-
-
- /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
- body {
- /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
- font-family: "EquityTextB", Palatino, serif;
- background-color: #f0f0ea;
- color: #07486c;
- font-kerning: normal;
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: subpixel-antialiased;
- text-rendering: optimizeLegibility;
- font-variant-ligatures: common-ligatures contextual;
- font-feature-settings: "kern", "liga", "clig", "calt";
- }
- pre, code, kbd, samp, var, tt {
- font-family: 'TriplicateT4c', monospace;
- }
- em {
- font-style: italic;
- color: #323a45;
- }
- strong {
- font-weight: bold;
- color: black;
- }
- nav {
- background-color: #323a45;
- color: #f0f0ea;
- display: flex;
- justify-content: space-around;
- padding: 1rem .5rem;
- }
- nav:last-child {
- border-bottom: 1vh solid #2d7474;
- }
- nav a {
- color: #f0f0ea;
- }
- nav abbr {
- border-bottom: 1px dotted white;
- }
-
- h1 {
- border-top: 1vh solid #2d7474;
- border-bottom: .2vh dotted #2d7474;
- background-color: #e3e1e1;
- color: #323a45;
- text-align: center;
- padding: 5rem 0 4rem 0;
- width: 100%;
- font-family: 'ConcourseT3';
- display: flex;
- flex-direction: column;
- }
- h1.single {
- padding-bottom: 10rem;
- }
- h1 span {
- position: absolute;
- top: 1vh;
- left: 20%;
- line-height: 0;
- }
- h1 span a {
- line-height: 1.7;
- padding: 1rem 1.2rem .6rem 1.2rem;
- border-radius: 0 0 6% 6%;
- background: #2d7474;
- font-size: 1.3rem;
- color: white;
- text-decoration: none;
- }
- h2 {
- margin: 4rem 0 1rem;
- border-top: .2vh solid #2d7474;
- padding-top: 1vh;
- }
- h3 {
- text-align: center;
- margin: 3rem 0 .75em;
- }
- hr {
- height: .4rem;
- width: .4rem;
- border-radius: .4rem;
- background: #07486c;
- margin: 2.5rem auto;
- }
- time {
- display: bloc;
- margin-left: 0 !important;
- }
- ul, ol {
- margin: 2rem;
- }
- ul {
- list-style-type: square;
- }
- a {
- text-decoration-skip-ink: auto;
- text-decoration-thickness: 0.05em;
- text-underline-offset: 0.09em;
- }
- article {
- max-width: 50rem;
- display: flex;
- flex-direction: column;
- margin: 2rem auto;
- }
- article.single {
- border-top: .2vh dotted #2d7474;
- margin: -6rem auto 1rem auto;
- background: #f0f0ea;
- padding: 2rem;
- }
- article p:last-child {
- margin-bottom: 1rem;
- }
- p {
- padding: 0 .5rem;
- margin-left: 3rem;
- }
- p + p,
- figure + p {
- margin-top: 2rem;
- }
-
- blockquote {
- background-color: #e3e1e1;
- border-left: .5vw solid #2d7474;
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 1rem;
- margin: 1.5rem;
- }
- blockquote cite {
- font-style: italic;
- }
- blockquote p {
- margin-left: 0;
- }
-
- figure {
- border-top: .2vh solid #2d7474;
- background-color: #e3e1e1;
- text-align: center;
- padding: 1.5rem 0;
- margin: 1rem 0 0;
- font-size: 1.5rem;
- width: 100%;
- }
- figure img {
- max-width: 250px;
- max-height: 250px;
- border: .5vw solid #323a45;
- padding: 1px;
- }
- figcaption {
- padding: 1rem;
- line-height: 1.4;
- }
- aside {
- display: flex;
- flex-direction: column;
- background-color: #e3e1e1;
- padding: 1rem 0;
- border-bottom: .2vh solid #07486c;
- }
- aside p {
- max-width: 50rem;
- margin: 0 auto;
- }
-
- /* https://fvsch.com/code/css-locks/ */
- p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
- font-size: 1rem;
- line-height: calc( 1.5em + 0.2 * 1rem );
- }
- h1 {
- font-size: 1.9rem;
- line-height: calc( 1.2em + 0.2 * 1rem );
- }
- h2 {
- font-size: 1.6rem;
- line-height: calc( 1.3em + 0.2 * 1rem );
- }
- h3 {
- font-size: 1.35rem;
- line-height: calc( 1.4em + 0.2 * 1rem );
- }
- @media (min-width: 20em) {
- /* The (100vw - 20rem) / (50 - 20) part
- resolves to 0-1rem, depending on the
- viewport width (between 20em and 50em). */
- p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
- font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
- margin-left: 0;
- }
- h1 {
- font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- h2 {
- font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- h3 {
- font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
- line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
- }
- }
- @media (min-width: 50em) {
- /* The right part of the addition *must* be a
- rem value. In this example we *could* change
- the whole declaration to font-size:2.5rem,
- but if our baseline value was not expressed
- in rem we would have to use calc. */
- p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
- font-size: calc( 1rem + .6 * 1rem );
- line-height: 1.5em;
- }
- p, li, pre, details {
- margin-left: 3rem;
- }
- h1 {
- font-size: calc( 1.9rem + 1.5 * 1rem );
- line-height: 1.2em;
- }
- h2 {
- font-size: calc( 1.5rem + 1.5 * 1rem );
- line-height: 1.3em;
- }
- h3 {
- font-size: calc( 1.35rem + 1.5 * 1rem );
- line-height: 1.4em;
- }
- figure img {
- max-width: 500px;
- max-height: 500px;
- }
- }
-
- figure.unsquared {
- margin-bottom: 1.5rem;
- }
- figure.unsquared img {
- height: inherit;
- }
-
-
-
- @media print {
- body { font-size: 100%; }
- a:after { content: " (" attr(href) ")"; }
- a, a:link, a:visited, a:after {
- text-decoration: underline;
- text-shadow: none !important;
- background-image: none !important;
- background: white;
- color: black;
- }
- abbr[title] { border-bottom: 0; }
- abbr[title]:after { content: " (" attr(title) ")"; }
- img { page-break-inside: avoid; }
- @page { margin: 2cm .5cm; }
- h1, h2, h3 { page-break-after: avoid; }
- p3 { orphans: 3; widows: 3; }
- img {
- max-width: 250px !important;
- max-height: 250px !important;
- }
- nav, aside { display: none; }
- }
-
- ul.with_columns {
- column-count: 1;
- }
- @media (min-width: 20em) {
- ul.with_columns {
- column-count: 2;
- }
- }
- @media (min-width: 50em) {
- ul.with_columns {
- column-count: 3;
- }
- }
- ul.with_two_columns {
- column-count: 1;
- }
- @media (min-width: 20em) {
- ul.with_two_columns {
- column-count: 1;
- }
- }
- @media (min-width: 50em) {
- ul.with_two_columns {
- column-count: 2;
- }
- }
-
- .gallery {
- display: flex;
- flex-wrap: wrap;
- justify-content: space-around;
- }
- .gallery figure img {
- margin-left: 1rem;
- margin-right: 1rem;
- }
- .gallery figure figcaption {
- font-family: 'ConcourseT3'
- }
-
- footer {
- font-family: 'ConcourseT3';
- display: flex;
- flex-direction: column;
- border-top: 3px solid white;
- padding: 4rem 0;
- background-color: #07486c;
- color: white;
- }
- footer > * {
- max-width: 50rem;
- margin: 0 auto;
- }
- footer a {
- color: #f1c40f;
- }
- footer .avatar {
- width: 200px;
- height: 200px;
- border-radius: 50%;
- float: left;
- -webkit-shape-outside: circle();
- shape-outside: circle();
- margin-right: 2rem;
- padding: 2px 5px 5px 2px;
- background: white;
- border-left: 1px solid #f1c40f;
- border-top: 1px solid #f1c40f;
- border-right: 5px solid #f1c40f;
- border-bottom: 5px solid #f1c40f;
- }
- </style>
-
- <h1>
- <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
- The Minimally-nice Open Source Software Maintainer (archive)
- <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
- </h1>
- <section>
- <article>
- <h3><a href="https://brson.github.io/2017/04/05/minimally-nice-maintainer">Source originale du contenu</a></h3>
- <p>Being involved in open source software is rewarding, yeah? You start
- off contributing to your favorite project, and it feels so
- heartwarming when that project’s maintainers recognize your
- effort. Then a few years later you somehow end up responsible for that
- project, and maybe some satellite projects, and people are clamoring
- for your attention, and your inbox is never empty, and it’s exhausting
- and terrifying, and the skills necessary to cope with all the
- personalities involved are entirely different from the skills you used
- to get your foot in the door in the first place.</p>
-
- <p>I love creating cool things, and releasing cool things, and receiving
- praise for cool things. To create ever cooler things though one needs
- to multiply their manpower, get help from others - to <em>collaborate</em>.
- Ugh. For me communicating with others is frightening, stressful,
- unpleasant, demoralizing, depressing. As the maintainer of a number of
- projects related to the <a href="https://www.rust-lang.org">Rust programming language</a>, I want to see
- my software grow and thrive, so must continually redouble my efforts
- to productively engage with their users and contributors.</p>
-
- <p>Any day where I am actively maintaining my software I might respond to
- dozens of messages online. It’s so much effort. But amidst all that
- work, it actually only takes a small amount of consistent effort to
- nurture a cooperative environment, one that makes participants feel
- appreciated, builds support from your userbase, encourages
- contributions, and reinforces a positive culture. Still, even though
- it’s quite simple to treat others right, it’s not simple to do it
- consistently: it requires discipline to build good habits. For me it’s
- a struggle.</p>
-
- <p>Here I’m going to describe a few guidelines on how to respond to
- people on bug reports, pull requests, and other forums. I don’t
- consider myself to be good at this; I definitely don’t follow my own
- advice consistently. But what I’ve scribbled down here reflects my
- basic gameplan for dealing with people, and having a clear gameplan
- makes it easier to rip through your responses to both the pleasant and
- the horrifying, quickly and correctly. My understanding of this
- subject is always evolving, but this is what’s near the top of my
- mind as of mid-2017.</p>
-
- <p>This simple advice might sound patronizing. And you might have
- different opinions about what it means to be nice to people. That’s
- fine. Perhaps consider whether you are following your own gameplan
- consistently, and how you might improve it.</p>
-
- <p>This is divided into two sections:</p>
-
- <ul>
- <li><a href="#a-case-study">A case study</a>. My lamentations at being a heartless
- jerkwad.</li>
- <li><a href="#the-techniques">The techniques</a>. Common techniques for dealing
- with people, as applied to open source software.</li>
- </ul>
-
- <p>If you just want a TL;DR for seven techniques of the minimally-nice
- open source software maintainer, then <a href="#summary">jump straight to the
- summary</a>.</p>
-
- <p><a name="a-case-study"/></p>
-
- <h1 id="a-case-study">A case study</h1>
-
- <p>The impetus for writing this was <a href="https://github.com/rust-lang/rfcs/pull/1644#issuecomment-224752975">a comment I made</a> on a recent
- Rust RFC. As usual, this was one of many threads I responded to that
- day. And as happens with some alarming frequency, I spent a large
- portion of the night regretting some of the things I said, and
- thinking about what I should have said differently. I’ll reproduce it
- here so you don’t need to click the link:</p>
-
- <blockquote>
- <p>I like the direction of this RFC generally.</p>
- </blockquote>
-
- <blockquote>
- <p><code class="highlighter-rouge">--explain</code> is a stable compiler interface. How can we change it? I
- agree that <code class="highlighter-rouge">--explain</code> is a sweet name for this functionality, but I
- think we need to use a different one.</p>
- </blockquote>
-
- <blockquote>
- <p>It’s not clear to me what the fate of error codes is here. My
- impression is that you are proposing to remove them, but your images
- contain the current –explain E0002. Can you make this more clear,
- and if you are removing error codes can you remove them from the
- graphics?</p>
- </blockquote>
-
- <blockquote>
- <blockquote>
- <p>“Famous programmers like John Carmack have praised the Elm error
- format.”</p>
- </blockquote>
- </blockquote>
-
- <blockquote>
- <p>John Carmack’s fame doesn’t really have any bearing on the validity
- of the proposal.</p>
- </blockquote>
-
- <blockquote>
- <p><em>Also, I don’t think RFCs should be giving props to other
- contributors in the summary. When creating the RFC process we made
- an explicit decision not to include author information, to avoid
- making RFC authorship itself an incentive (I think). If authorship
- is something that should be included in RFCs then the process itself
- should be modified to include that metadata, including crediting the
- actual author, not just their collaborators. If giving credit in the
- RFC text is something we want to encourage, then I don’t know that
- the summary is the place for it. The summary is for summarizing the
- content of the RFC.</em></p>
- </blockquote>
-
- <p>I’ve emphasized the part that haunted me most.</p>
-
- <p>I wrote this at the end of the day, in a hurry, between meetings. This
- was a proposal that I had opinions about, and I wanted to make sure
- they were heard. But it has to be done in the right way.</p>
-
- <p>Really, this comment wasn’t horrible. You’ve seen much worse I
- hope. But it bothered me. A lot. I didn’t follow my gameplan. I knew I
- had made a mistake when the author of the RFC messaged me privately,
- saying, more-or-less:</p>
-
- <blockquote>
- <p>jonathandturner: :( why don’t you want to credit people for their
- work?</p>
- </blockquote>
-
- <p>My comment on the thread sounded like I wanted to deny the
- contributors credit for the RFC. Is that really what I wanted? Well,
- honestly I am an overflowing flagon of resentment and spite, so
- perhaps this comment in the moment was a true reflection of my
- blackened heart, but after some back and forth with @jonathandturner,
- and some further reflection, I understood this was a dumb position to
- hold - being extremely generous with credit is one of the easiest and
- most powerful techniques for building community. Outright suggesting
- we deny credit looks petty and hostile.</p>
-
- <p>Let me go through my comment line by line and excoriate it.</p>
-
- <blockquote>
- <p>I like the direction of this RFC generally.</p>
- </blockquote>
-
- <p>I’m relieved that I started the comment this way, considering how
- negative the comment ended. This isn’t a fantastic opener, but at
- least it’s positive. Showing others appreciation is one of the simplest
- techniques for dealing with people. What I wrote here is just about
- the minimum appreciation I can express. It’s saying I like what they
- are thinking. It’s obviously setting the stage for less positive
- feedback later, but we don’t need to worry too much about that - even
- the slightest effort at showing appreciation tends to help soften
- interactions, though there is a risk of being seen as patronizing,
- particularly if all your praise is as curt as this.</p>
-
- <p>So this could have been better in an obvious way, just by expanding on
- what I liked about it. There were a lot of great facets to this RFC:
- the beauty and clarity of the proposed error messages; showing images
- of the proposed errors, etc. It’s a good RFC - I could dig out lots of
- little things to say positively about it. But doing so takes time and
- effort. I was in a hurry here to say the things I wanted to say, and
- didn’t take the time, but perhaps I should have. The more negative
- your main points are, the more worthwhile it is to soften them with
- positivity. And it’s prudent to show that positivity sometimes to
- avoid being a complete jerk.</p>
-
- <p>Another simple thing I could have done is thanked him for his
- work. When you work hard on something and then finally unveil it, it’s
- super satisfying when somebody thanks you, recognizing that work. We
- all long to feel appreciated. I might instead have opened with</p>
-
- <blockquote>
- <p>Thanks @jonathandturner! I’m glad to see some movement in this
- area. This is a super important proposal, the design looks well
- thought out, and I love how well composed it is. It’s obvious you’ve
- put a lot of effort into it.</p>
- </blockquote>
-
- <blockquote>
- <p>I like the direction of this RFC generally. The error messages are a
- huge improvement over what we have today. The way you are using
- colors to emphasize the different focal points of the errors makes
- things a lot more readable. And good idea including the images of
- your proposed messages in the RFC - that makes it simple to
- evaluate.</p>
- </blockquote>
-
- <p>OK, that’s really loading up the praise. And it’s all true. The above
- took me a few minutes to come up with, which is a fair bit of work
- just to grease the wheels. One might do more or less depending on the
- situation. Now that we’ve pumped him up we’re ready to crush his hopes -
- er, offer gentle, constructive criticism.</p>
-
- <p>So back in reality, I didn’t actually write all that - I wrote the
- impulsive thing, then tossed and turned all night regretting it. To
- make up for it the next day I posted <a href="https://github.com/rust-lang/rfcs/pull/1644#issuecomment-224968147">this followup</a>, reproduced
- here:</p>
-
- <blockquote>
- <p>@jonathandturner my comments could have been more constructive. Let
- me respond to myself.</p>
- </blockquote>
-
- <blockquote>
- <blockquote>
- <blockquote>
- <p>“Famous programmers like John Carmack have praised the Elm error
- format.”</p>
- </blockquote>
- </blockquote>
- </blockquote>
-
- <blockquote>
- <blockquote>
- <p>John Carmack’s fame doesn’t really have any bearing on the
- validity of the proposal.</p>
- </blockquote>
- </blockquote>
-
- <blockquote>
- <p>Maybe just change ‘fame’ to something more relevant, like
- ‘well-respected’, something that better indicates why his opinion is
- important.</p>
- </blockquote>
-
- <blockquote>
- <blockquote>
- <p>Also, I don’t think RFCs should be giving props to other
- contributors in the summary. When creating the RFC process we made
- an explicit decision not to include author information, to avoid
- making RFC authorship itself an incentive (I think). If authorship
- is something that should be included in RFCs then the process
- itself should be modified to include that metadata, including
- crediting the actual author, not just their collaborators. If
- giving credit in the RFC text is something we want to encourage,
- then I don’t know that the summary is the place for it. The
- summary is for summarizing the content of the RFC.</p>
- </blockquote>
- </blockquote>
-
- <blockquote>
- <p>I phrased this too strongly. I just had a sudden observation that
- we’ve developed ad-hoc ways to credit people that doesn’t fit into
- the process as implemented. I should have phrased this more like
- ‘maybe we should reconsider how to give credit in RFCs’. RFC process
- is organic so it may be perfectly fine to do it like this (author
- credit in the commit log, additional credits in the summary), but it
- is awkward. And I do believe we made an intentional decision not to
- credit people, and if that is changing it is important to
- acknowledge it.</p>
- </blockquote>
-
- <p>That was … ok, I’m still not particularly happy with it. It still
- appears a bit defensive of my dumb position. I wish I could do it
- again. I’ll never be happy. I’ll never, ever be happy.</p>
-
- <p>But the point is that it’s best to admit your mistakes, to yourself
- and others: Dale Carnegie recommends that “if you’re wrong, admit it
- quickly and emphatically”. People love to be right, so if you can
- admit that you are wrong and they are right, that can inspire great
- cooperation. And it usually doesn’t require any sacrifice at all to
- admit you are wrong besides getting over your own pride.</p>
-
- <p><a name="the-techniques"/></p>
-
- <h1 id="the-techniques">The techniques</h1>
-
- <p>So this relatively minor episode caused me to reevaluate how I
- communicate online. It’s not like I don’t know how to be nice. I
- believe that I do, but sometimes I forget momentarily. So here, to
- reinforce my own good behavior, and hopefully for your benefit, I’ve
- traced through my basic gameplan for responding to people online.
- When I stick to this plan things mostly go well, the people I
- encounter feel good about Rust and their association with it, and I
- feel relatively ok-ish about myself.</p>
-
- <p>The techniques here apply to any open source venues, like pull
- requests, issue trackers, mailing lists and forums.</p>
-
- <p><a name="respond-quickly"/></p>
-
- <h2 id="respond-quickly">Respond quickly</h2>
-
- <p>Immediately after users and contributors reach out to you is when they
- are most motivated to help you. Simply getting a quick response can
- make a frustrated user’s day. As a maintainer I’ve frequently seen
- expectant users express their appreciation: ‘thanks for the quick
- response!’. We know that other people’s time is valuable because our
- own time is valuable. By responding to an inquiry quickly we
- demonstrate that we respect the time they put into e.g. filing a bug
- report, and that we are sacrificing our time to help them. Even if I
- can’t think about a particular issue right now, and particularly if I
- <em>know</em> I’m not going to get to it any time soon, I will sometimes post
- a quick acknowledgement and validation of their concerns, like “thanks
- for the report. This does look troubling. I’m afraid I won’t be able
- to look into this soon, but help is appreciated”, etc.</p>
-
- <p>The longer you wait to respond to a contributor the less likely they
- are to stay engaged: only the most hearty contributors will return to
- the table after being ignored for a year. Sadly, it’s all too common
- that I come across an issue where the most recent comment is from
- someone seeking advice, long, long ago. Those contributors are lost
- forever, and their potential contributions with them.</p>
-
- <p>For me this is one of the hardest habits to maintain. The neverending
- crush of issues and threads in Rust is entirely overwhelming. I’d much
- rather I didn’t have to face other people’s problems constantly - I
- have so many of my own. It’s impossible to follow everything going on
- in Rust, so in practice I tend to restrict the threads I follow to
- specific areas, and to those people who are pinging me directly. There
- are long stretches where I just can’t face the endless tide of other
- people needing assistance, where I will just willfully ignore my
- inbox. I don’t recommend that. Better to be responsive.</p>
-
- <p>How quick is quick enough? 3 days. How scientific is this number? It’s
- not. You should respond as quick as you can, but reasonable people
- will give you a weekend without getting bent about it.</p>
-
- <p><a name="give-thanks"/></p>
-
- <h2 id="give-thanks">Give thanks</h2>
-
- <p>People like to feel appreciated. It’s a universal desire. And
- appreciation is something it costs us little to give, to spread about
- like parade candy. If you put just a moment’s thought to it, I know
- you can see something good in every person and every situation.</p>
-
- <p>The mere act of submitting a patch is awe-inspiring: another person
- cares enough about our project that they took the time to understand
- how it works, fix our problem, package it up, and submit their work
- for public criticism. That’s amazing. Do you remember the first patch
- you ever submitted upstream? I bet you were apprehensive. It’s a
- crucial moment that can determine the future relationship between the
- contributor and the project.</p>
-
- <p>So the first thing to do before mounting a response is to dig deep
- into your reserves of universal love, kindness, and compassion, and
- seek something to be thankful for. The more specific you can be the
- more it shows you care. Did they provide a reproducible test case in
- the issue report? Damn, that took some effort! Did they write tests
- for their patch? Noway! Usually I have to ask for those! If you keep
- thinking about it you’ll discover there’s a great deal to say thanks
- for: “Thanks @AHumanWithFeelings! I’ve been wanting to fix this
- issue for so long. I’m glad somebody finally stepped up to write a
- patch. This looks lovely!”</p>
-
- <p>Of course, not every encounter demands laying it on thick, but do say
- “thanks”. Even trivial patches that can merge without any feedback
- deserve some comment: just hit the merge button and write, “thanks!”,
- and they’ll feel good about the small part they played in your
- project’s ongoing success.</p>
-
- <p><a name="pay-a-compliment"/></p>
-
- <h2 id="pay-a-compliment">Pay a compliment</h2>
-
- <p>One of the primary duties of a software maintainer is to review
- others’ work. Every day, burning down the endless patch queue. And the
- bigger the project the more gruelling the work. Review is where
- everything comes together; it is the make-or-break point for
- contributors, their work, and their motivation to keep coming back.</p>
-
- <p>Under the exhausting crush of review responsibilities it’s easy to get
- tunnel vision; to bee-line for the shortest route to the end, zeroing
- in on the problems to be fixed, and moving on to the next patch.</p>
-
- <p>When you do this though you risk discouraging your contributor. The
- more work a patch needs the more the critiques pile up, and it can
- easily, and unintentionally, result in an avalanche of
- negativity. This is particularly likely to affect new contributors,
- who are least likely to understand project norms, and most likely to
- need guidance.</p>
-
- <p>A well-known technique to soften the weight of criticism is to pair it
- with praise. You’ve probably heard of the “compliment sandwich”:
- surrounding the criticism - the meat of your response - with a soft
- and squishy bun of praise. The compliment sandwich is considered so
- delectable because it is simple and effective. Before you launch into
- <em>what you really want to say</em>, try to look for something positive to
- point out first.</p>
-
- <p>When I review a patch I usually do it in two passes: first I skim
- through it with an open mind, with no preconceptions of what I expect
- to see. I’m trying to get in their head and see the solution from
- their point of view; and in particular trying to find things to like
- about their solution. Does the patch display good intuition even while
- getting the details wrong? That’s a good starting point. Did they do
- something clever that you hadn’t considered? Does their work
- demonstrate they’ve read the project’s contribution guidelines in a
- way most contributors don’t? You probably have a host of things you
- look for to indicate quality, as specific to your project. Make note
- of them as you read the patch, <em>and say them first thing in your
- response</em>. Myself, I always appreciate when a contributor writes <em>any
- tests at all</em>, and I adore contributors who write excellent tests. And
- I say so. To take this technique to the next level, be on the lookout
- for indicators of the contributor’s own values, and compliment them on
- things they are likely to take special pride in.</p>
-
- <p>By reading the whole text once I additionally reduce the chance of
- coming to mistaken conclusions, or leaving comments based on
- incomplete information. Often I’ve not considered a work as a whole
- and left a comment, then moments later realized that comment was
- mistaken and had to correct myself. Likewise, I find it frustrating
- when reading inline comments about my own work based on incorrect
- assumptions, and which I felt I had made clear if the respondent had
- only read further.</p>
-
- <p>So after I’ve done the first pass in a spirit of expansive generosity,
- and begun composing my review with praise, then I go back for the
- second pass and do the detailed review. Even here though I try to note
- positive things as well as things that need to be changed, etc.</p>
-
- <p>I’ve focused on reviews here, but the same applies to all
- correspondence. Bug report includes a reduced test case?
- Awesome. Forum post is well thought out and polite? Halleluja. Always
- be looking out for nice things to say about your peers and their work.</p>
-
- <p><a name="say-yes"/></p>
-
- <h2 id="say-yes">Say “yes”</h2>
-
- <p>In the midst of an internet argument it’s easy to lose sight of the
- humanity of the individual on the other side of the computer
- monitor. Your pulse quickens, your temperature rises, mind races. You
- know you are right, technically, morally. Whatever, you are right;
- they are wrong. Wrong, wrong, wrong, and you are going to prove it
- right now.</p>
-
- <p>But before you fly off the chain, prove your undeniable superiority,
- and prove that <em>they are wrong</em>, let me suggest instead that you do
- something better, that you do the opposite: that you <em>prove they are
- right</em>.</p>
-
- <p>Imagine the most exciting brainstorming session you ever had: you spit
- out a brilliant idea - your partner loves it! They respond
- enthusiastically by building on your idea. The conversation spirals
- ever upward in joyous rapture. It’s an amazing feeling, being on the
- same wavelength. By the end up the night you feel thrilled and
- intoxicated. That’s the power of positivity.</p>
-
- <p>It’s so rare. When it happens we want to capture that moment and save
- its precious essence forever. That’s the kind of magic you want your
- contributors to feel every time they file an issue.</p>
-
- <p>The opposite though is far more common, and it’s the death of useful
- discourse: “you’re wrong”, “that’s a bad idea”, “I call bs”, “meh”,
- “false”, etc. They all amount to a big fat “no”, and they all make the
- recipient feel disrespected and generate ill will. Bad vibes. This is
- the worst way to open a productive conversation, and people do it all
- the time. It’s shocking how tactless smart people can be. Such direct
- negativity erects a brick wall fortified with turrets and kettles of
- boiling oil in the middle of a conversation.</p>
-
- <p>“No” is a cardinal sin of persuasive argumentation. Don’t do
- it. Don’t do it. Don’t do it. No, no, no!</p>
-
- <p>Instead, say “yes” as fast as you can, and in every way you
- can. Literally just say “yes” first thing, then figure out what useful
- affirmation you can follow with to support that “yes”. If “yes” is too
- on-the-nose for your taste then there are a billion ways to
- paraphrase. “Yeah” is a great casual option, and my favorite. Follow
- that with a comma, “yeah, it’s true that …”, but there are so many
- other more subtle ways to drop a huge positivity bomb at the outset of
- your response: “totally”, “you’re right about …”, “indeed!”. If you
- put your mind to it you can spend a whole paragraph just saying “yes”.</p>
-
- <p>In the end, even if the solution is much different than their original
- proposal, by chaining your good ideas to their good ideas, they will
- feel successful. Per master thinker Blaise Pascal, “people are
- generally better persuaded by the reasons which they have themselves
- discovered than by those which have come into the mind of others.”</p>
-
- <p>Affirmation: it’s the secret weapon against belligerent jerkwads.</p>
-
- <p><a name="be-clear-about-what-you-expect"/></p>
-
- <h2 id="be-clear-about-what-you-expect">Be clear about what you expect</h2>
-
- <p>For contributors to stay engaged they need to know what’s next, what
- is expected of them. This applies to every level of the project, from
- bug reports to pull requests. If you want something, say so directly!
- And if you don’t want something, suggest concrete and viable
- alternatives. For the most part, if you are in a position of
- authority, contributors are <em>desperate</em> for you to give them
- direction. Leaving your desires ambiguous is one of the easiest ways
- to destroy contributors’ motivation and lose their manpower.</p>
-
- <p>This applies especially in two places: on the bug tracker, and during
- reviews. In both cases there is frequently a critical moment when you
- have the opportunity to provide clear direction, and though it
- requires some effort, failing to do so leaves a vacuum, and thus
- leaves potential precious manpower on the table.</p>
-
- <p>Your issue tracker, if it’s like Rust’s, is filled with bugs and
- feature requests that you would love to fulfill; but you will never,
- ever get to them yourself, not even if you live forever. These
- bugs frequently persist in a state of unknowing, where the solution
- is unclear, for weeks, months, years, accumulating debate and
- discussion about how to move forward. But eventually something clicks
- into place, and an acceptable solution becomes known to you. For
- simple bugs this moment can be immediately when it is filed; for more
- nuanced bugs it can take a long time. But when it happens, you have
- the opportunity to clear the way for contributors.</p>
-
- <p>On any bug where there is an acceptable solution, make it crystal
- clear what that solution is, and that <em>help is wanted</em>. Contributors
- are sometimes just waiting for a signal indicating how they can
- help. The more detail you can provide the better. Bugs with clear
- direction have 100% better chance of drawing contributions than those
- without. The larger your project, and the larger your contributor
- base, the more important it is that you consistently provide
- direction, and that contributors have a way to find the bugs that have
- reached this inflection point.</p>
-
- <p><a name="admit-your-mistakes"/></p>
-
- <h2 id="admit-your-mistakes">Admit your mistakes</h2>
-
- <p>Like variable bindings in a great many programming languages, our
- reality is supremely mutable. Conditions change, facts change, and so
- does our perception and understanding. Being wedded to past
- understanding and past resolutions is dogma. On the other hand,
- confronting change honestly and efficiently is a common trait of
- successful individuals and organizations. The agility to let old
- opinions go and steer a new course helps organizations stay relevant
- in the face of shifting fortunes, and helps us navigate difficult
- social situations in our daily lives.</p>
-
- <p>Differences of opinion are the root of many arguments. People make up
- their minds, assert themselves, refuse to listen to counterpoints,
- become angry, develop personal animosity toward those that don’t
- agree, and the conversation either reaches an ugly standstill, or
- devolves into a passionate feud. It’s a common failure mode, and we
- want to prevent it from happening as early as we can.</p>
-
- <p>Just like we want to say “yes”, and acknowledge others’ great ideas,
- it’s beneficial to look for situations where we can let go of our own
- ideas, our own dogma. It’s a hard thing to do: it’s so tempting to
- stick to what is comfortable; to force those difficult decisions that
- have already been decided to stay in the past; to never let go of our
- pride and admit we were wrong, or made mistakes.</p>
-
- <p>But it gets easier with practice, and you might even come to find that
- admitting your mistakes brings relief - it feels liberating to let
- things go, to get that weight off your mind.</p>
-
- <p>I find that there are very few designs and opinions that, when I look
- closely, I am deeply wedded to, and most often when somebody is angry
- at something I have done or some decision I have made, it is trivially
- true that I’ve made a mistake. Sometimes these are technical mistakes,
- and I can let them go by saying “yes, I see what you mean now. That
- was the wrong call. Are you interested in submitting a patch to fix
- it?”. Sometimes it’s more of a social or political mistake, that I
- haven’t expressed my motivations or intentions clearly and the other
- person is surprised and disappointed that some outcome is not what
- they expected. In these situations I try to acknowledge that the
- result has the downsides they’ve identified, and apologize that it
- doesn’t suit them, and move on. Note though that it’s best to avoid
- the sorts of backhanded non-apologies we often see from politicians
- (e.g. “I’m sorry you are angry”). Everybody sees through bullshit, and
- it’s more useful to focus on your own thoughts and feelings instead of
- mindreading others’.</p>
-
- <p><a name="be-effusive"/></p>
-
- <h2 id="be-effusive">Be effusive</h2>
-
- <p>This is another trick that is super-effective! A unique technique of
- the internet age, I’ve only begun to acknowledge its power recently.</p>
-
- <p>Don’t hesitate to go overboard with superlatives and punctuation:
- exclamation marks where they shouldn’t be, over-the-top adjectives,
- cute emoticon and emoji. I know that it took me a long time to come
- around to this point of view. It’s just bad writing to throw in
- exclamation marks and superfluous words, right? And emoji aren’t even
- words…</p>
-
- <p>“Oh, wow, thank you so much! 💖”</p>
-
- <p>Truth is that on the internet this is not bad writing, at least for
- one-on-one communication. It is effective writing. It’s well
- understood that conveying tone on the internet is <em>hard</em>:</p>
-
- <p>“Thanks.”</p>
-
- <p>What does that period mean? It looks so gruff. Are they pissed at me?!
- Are they having a bad day? On the internet the simple period can
- appear sarcastic, or angry. It’s so neutral that people will project
- whatever emotions they want on it. One must go out of their way to not
- only get their meaning across but also the tone - and for our purposes
- the tone we want is almost always one of abundant positivity and
- enthusiasm.</p>
-
- <p>To help you kickstart this habit, here’s a list of some of my
- favorite superlatives, emoticon, and emoji, when applied to
- technical communication in open source software communities:</p>
-
- <ul>
- <li>”!” (exclamation mark)</li>
- <li>“super-“</li>
- <li>“totally”</li>
- <li>“amazing”</li>
- <li>“awesome”</li>
- <li>“really”</li>
- <li><3 (heart)</li>
- <li><3 <3 <3 (triple-heart!)</li>
- <li>:-D (big-ol’ grin)</li>
- <li>😁 (grinning face with smiling eyes)</li>
- <li>😍 (smiling face with heart-shaped eyes)</li>
- <li>💖 (sparkling heart)</li>
- </ul>
-
- <p>These are just the ones in my own toolbag. There are so many others,
- and there’s lots of room for creative expression here. The younger you
- are the more of these weapons you probably have in your arsenal, what
- with all the texting and instagramming and tweeting. Deploy them
- without hesitation.</p>
-
- <p>There are limits to good taste here, but you probably have to decide
- them for yourself. Personally, I never use more than one exclamation
- point; two exclamation points is the epitome of tackiness 😜. And as a
- child of the 90’s I’m consistently tempted to sneak in a few
- “radical”s and “bodacious”es, to embody my life-long wish to become a
- Ninja Turtle, but sadly those adjectives seem to be out of style for
- the present moment. The time will come though.</p>
-
- <p>Just as a big smile can brighten someone’s day in the physical world,
- a little bit of 😍 goes a long way in the virtual world.</p>
-
- <p><a name="summary"/></p>
-
- <h1 id="summary">Summary</h1>
-
- <p>So that’s all you need to make everybody happy, and make everybody
- love you! Now you know the secret and you will never fail again.</p>
-
- <p>Ha, ha, no. No, not really. Not everything goes smoothly just by being
- nice. Some people are deeply broken. So many messed up people (maybe
- I’m one of them - maybe you are too). Typical social wheel-greasing
- doesn’t always work with them; they are hell-bent on sowing chaos,
- even if they don’t know it. The guidelines here are still applicable
- to these cases, because at least other, more reasonable, people will
- see that you are doing your best, but truly dealing with them
- effectively is a complex and uncertain matter. For another day.</p>
-
- <p>Some of what I’ve said here may have sounded sarcastic, I know. That’s
- me. I’m a deeply cynical individual, but I’m working on it. Effective
- communication though needs to be genuine, empathetic, and respectful.
- Everybody sees right through bullshit. Work on your empathy, work on
- being genuinely nice, but until then, fake it ‘till you make it. If I
- practice good communication habits consistently, presumably at some
- point I will become a good person. That’s how it works, right? I so
- want to be a good person.</p>
-
- <p>In summary, do these things if you want to <em>appear to be</em> nice, and
- also if you want to <em>actually be</em> an effective open source software
- maintainer:</p>
-
- <ul>
- <li><a href="#respond-quickly">Respond quickly</a></li>
- <li><a href="#give-thanks">Give thanks</a></li>
- <li><a href="#pay-a-compliment">Pay a compliment</a></li>
- <li><a href="#say-yes">Say “yes”</a></li>
- <li><a href="#be-clear-about-what-you-expect">Be clear about what you expect</a></li>
- <li><a href="#admit-your-mistakes">Admit your mistakes</a></li>
- <li><a href="#be-effusive">Be effusive</a></li>
- </ul>
-
- <p>By consistently exhibiting a few simple behaviors, one can at least
- look like a kind and decent person. Maybe someday we all actually will
- be.</p>
-
- <p><em>With respects to Dale Carnegie’s <a href="https://en.wikipedia.org/wiki/How_to_Win_Friends_and_Influence_People">How to Win Friends and Influence
- People</a>. Read that.</em></p>
- </article>
- </section>
-
-
- <nav id="jumpto">
- <p>
- <a href="/david/blog/">Accueil du blog</a> |
- <a href="https://brson.github.io/2017/04/05/minimally-nice-maintainer">Source originale</a> |
- <a href="/david/stream/2019/">Accueil du flux</a>
- </p>
- </nav>
-
- <footer>
- <div>
- <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
- <p>
- Bonjour/Hi!
- Je suis <a href="/david/" title="Profil public">David Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
- Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
- </p>
- <p>
- Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
- </p>
-
- <p>
- Voici quelques articles choisis :
- <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
- <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
- <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
- <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
- <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
- <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
- <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
- <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
- <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
- <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
- <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
- <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
- <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
- <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
- <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
- et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
- </p>
- <p>
- On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
- </p>
- <p>
- Je ne traque pas ta navigation mais mon
- <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
- conserve des logs d’accès.
- </p>
- </div>
- </footer>
- <script type="text/javascript">
- ;(_ => {
- const jumper = document.getElementById('jumper')
- jumper.addEventListener('click', e => {
- e.preventDefault()
- const anchor = e.target.getAttribute('href')
- const targetEl = document.getElementById(anchor.substring(1))
- targetEl.scrollIntoView({behavior: 'smooth'})
- })
- })()
- </script>
|