A place to cache linked articles (think custom and personal wayback machine)
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.html 49KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=fr>
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset=utf-8>
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>The Minimally-nice Open Source Software Maintainer (archive) — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="https://brson.github.io/2017/04/05/minimally-nice-maintainer">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. The Minimally-nice Open Source Software Maintainer (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="https://brson.github.io/2017/04/05/minimally-nice-maintainer">Source originale du contenu</a></h3>
  445. <p>Being involved in open source software is rewarding, yeah? You start
  446. off contributing to your favorite project, and it feels so
  447. heartwarming when that project’s maintainers recognize your
  448. effort. Then a few years later you somehow end up responsible for that
  449. project, and maybe some satellite projects, and people are clamoring
  450. for your attention, and your inbox is never empty, and it’s exhausting
  451. and terrifying, and the skills necessary to cope with all the
  452. personalities involved are entirely different from the skills you used
  453. to get your foot in the door in the first place.</p>
  454. <p>I love creating cool things, and releasing cool things, and receiving
  455. praise for cool things. To create ever cooler things though one needs
  456. to multiply their manpower, get help from others - to <em>collaborate</em>.
  457. Ugh. For me communicating with others is frightening, stressful,
  458. unpleasant, demoralizing, depressing. As the maintainer of a number of
  459. projects related to the <a href="https://www.rust-lang.org">Rust programming language</a>, I want to see
  460. my software grow and thrive, so must continually redouble my efforts
  461. to productively engage with their users and contributors.</p>
  462. <p>Any day where I am actively maintaining my software I might respond to
  463. dozens of messages online. It’s so much effort. But amidst all that
  464. work, it actually only takes a small amount of consistent effort to
  465. nurture a cooperative environment, one that makes participants feel
  466. appreciated, builds support from your userbase, encourages
  467. contributions, and reinforces a positive culture. Still, even though
  468. it’s quite simple to treat others right, it’s not simple to do it
  469. consistently: it requires discipline to build good habits. For me it’s
  470. a struggle.</p>
  471. <p>Here I’m going to describe a few guidelines on how to respond to
  472. people on bug reports, pull requests, and other forums. I don’t
  473. consider myself to be good at this; I definitely don’t follow my own
  474. advice consistently. But what I’ve scribbled down here reflects my
  475. basic gameplan for dealing with people, and having a clear gameplan
  476. makes it easier to rip through your responses to both the pleasant and
  477. the horrifying, quickly and correctly. My understanding of this
  478. subject is always evolving, but this is what’s near the top of my
  479. mind as of mid-2017.</p>
  480. <p>This simple advice might sound patronizing. And you might have
  481. different opinions about what it means to be nice to people. That’s
  482. fine. Perhaps consider whether you are following your own gameplan
  483. consistently, and how you might improve it.</p>
  484. <p>This is divided into two sections:</p>
  485. <ul>
  486. <li><a href="#a-case-study">A case study</a>. My lamentations at being a heartless
  487. jerkwad.</li>
  488. <li><a href="#the-techniques">The techniques</a>. Common techniques for dealing
  489. with people, as applied to open source software.</li>
  490. </ul>
  491. <p>If you just want a TL;DR for seven techniques of the minimally-nice
  492. open source software maintainer, then <a href="#summary">jump straight to the
  493. summary</a>.</p>
  494. <p><a name="a-case-study"/></p>
  495. <h1 id="a-case-study">A case study</h1>
  496. <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
  497. Rust RFC. As usual, this was one of many threads I responded to that
  498. day. And as happens with some alarming frequency, I spent a large
  499. portion of the night regretting some of the things I said, and
  500. thinking about what I should have said differently. I’ll reproduce it
  501. here so you don’t need to click the link:</p>
  502. <blockquote>
  503. <p>I like the direction of this RFC generally.</p>
  504. </blockquote>
  505. <blockquote>
  506. <p><code class="highlighter-rouge">--explain</code> is a stable compiler interface. How can we change it? I
  507. agree that <code class="highlighter-rouge">--explain</code> is a sweet name for this functionality, but I
  508. think we need to use a different one.</p>
  509. </blockquote>
  510. <blockquote>
  511. <p>It’s not clear to me what the fate of error codes is here. My
  512. impression is that you are proposing to remove them, but your images
  513. contain the current –explain E0002. Can you make this more clear,
  514. and if you are removing error codes can you remove them from the
  515. graphics?</p>
  516. </blockquote>
  517. <blockquote>
  518. <blockquote>
  519. <p>“Famous programmers like John Carmack have praised the Elm error
  520. format.”</p>
  521. </blockquote>
  522. </blockquote>
  523. <blockquote>
  524. <p>John Carmack’s fame doesn’t really have any bearing on the validity
  525. of the proposal.</p>
  526. </blockquote>
  527. <blockquote>
  528. <p><em>Also, I don’t think RFCs should be giving props to other
  529. contributors in the summary. When creating the RFC process we made
  530. an explicit decision not to include author information, to avoid
  531. making RFC authorship itself an incentive (I think). If authorship
  532. is something that should be included in RFCs then the process itself
  533. should be modified to include that metadata, including crediting the
  534. actual author, not just their collaborators. If giving credit in the
  535. RFC text is something we want to encourage, then I don’t know that
  536. the summary is the place for it. The summary is for summarizing the
  537. content of the RFC.</em></p>
  538. </blockquote>
  539. <p>I’ve emphasized the part that haunted me most.</p>
  540. <p>I wrote this at the end of the day, in a hurry, between meetings. This
  541. was a proposal that I had opinions about, and I wanted to make sure
  542. they were heard. But it has to be done in the right way.</p>
  543. <p>Really, this comment wasn’t horrible. You’ve seen much worse I
  544. hope. But it bothered me. A lot. I didn’t follow my gameplan. I knew I
  545. had made a mistake when the author of the RFC messaged me privately,
  546. saying, more-or-less:</p>
  547. <blockquote>
  548. <p>jonathandturner: :( why don’t you want to credit people for their
  549. work?</p>
  550. </blockquote>
  551. <p>My comment on the thread sounded like I wanted to deny the
  552. contributors credit for the RFC. Is that really what I wanted? Well,
  553. honestly I am an overflowing flagon of resentment and spite, so
  554. perhaps this comment in the moment was a true reflection of my
  555. blackened heart, but after some back and forth with @jonathandturner,
  556. and some further reflection, I understood this was a dumb position to
  557. hold - being extremely generous with credit is one of the easiest and
  558. most powerful techniques for building community. Outright suggesting
  559. we deny credit looks petty and hostile.</p>
  560. <p>Let me go through my comment line by line and excoriate it.</p>
  561. <blockquote>
  562. <p>I like the direction of this RFC generally.</p>
  563. </blockquote>
  564. <p>I’m relieved that I started the comment this way, considering how
  565. negative the comment ended. This isn’t a fantastic opener, but at
  566. least it’s positive. Showing others appreciation is one of the simplest
  567. techniques for dealing with people. What I wrote here is just about
  568. the minimum appreciation I can express. It’s saying I like what they
  569. are thinking. It’s obviously setting the stage for less positive
  570. feedback later, but we don’t need to worry too much about that - even
  571. the slightest effort at showing appreciation tends to help soften
  572. interactions, though there is a risk of being seen as patronizing,
  573. particularly if all your praise is as curt as this.</p>
  574. <p>So this could have been better in an obvious way, just by expanding on
  575. what I liked about it. There were a lot of great facets to this RFC:
  576. the beauty and clarity of the proposed error messages; showing images
  577. of the proposed errors, etc. It’s a good RFC - I could dig out lots of
  578. little things to say positively about it. But doing so takes time and
  579. effort. I was in a hurry here to say the things I wanted to say, and
  580. didn’t take the time, but perhaps I should have. The more negative
  581. your main points are, the more worthwhile it is to soften them with
  582. positivity. And it’s prudent to show that positivity sometimes to
  583. avoid being a complete jerk.</p>
  584. <p>Another simple thing I could have done is thanked him for his
  585. work. When you work hard on something and then finally unveil it, it’s
  586. super satisfying when somebody thanks you, recognizing that work. We
  587. all long to feel appreciated. I might instead have opened with</p>
  588. <blockquote>
  589. <p>Thanks @jonathandturner! I’m glad to see some movement in this
  590. area. This is a super important proposal, the design looks well
  591. thought out, and I love how well composed it is. It’s obvious you’ve
  592. put a lot of effort into it.</p>
  593. </blockquote>
  594. <blockquote>
  595. <p>I like the direction of this RFC generally. The error messages are a
  596. huge improvement over what we have today. The way you are using
  597. colors to emphasize the different focal points of the errors makes
  598. things a lot more readable. And good idea including the images of
  599. your proposed messages in the RFC - that makes it simple to
  600. evaluate.</p>
  601. </blockquote>
  602. <p>OK, that’s really loading up the praise. And it’s all true. The above
  603. took me a few minutes to come up with, which is a fair bit of work
  604. just to grease the wheels. One might do more or less depending on the
  605. situation. Now that we’ve pumped him up we’re ready to crush his hopes -
  606. er, offer gentle, constructive criticism.</p>
  607. <p>So back in reality, I didn’t actually write all that - I wrote the
  608. impulsive thing, then tossed and turned all night regretting it. To
  609. 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
  610. here:</p>
  611. <blockquote>
  612. <p>@jonathandturner my comments could have been more constructive. Let
  613. me respond to myself.</p>
  614. </blockquote>
  615. <blockquote>
  616. <blockquote>
  617. <blockquote>
  618. <p>“Famous programmers like John Carmack have praised the Elm error
  619. format.”</p>
  620. </blockquote>
  621. </blockquote>
  622. </blockquote>
  623. <blockquote>
  624. <blockquote>
  625. <p>John Carmack’s fame doesn’t really have any bearing on the
  626. validity of the proposal.</p>
  627. </blockquote>
  628. </blockquote>
  629. <blockquote>
  630. <p>Maybe just change ‘fame’ to something more relevant, like
  631. ‘well-respected’, something that better indicates why his opinion is
  632. important.</p>
  633. </blockquote>
  634. <blockquote>
  635. <blockquote>
  636. <p>Also, I don’t think RFCs should be giving props to other
  637. contributors in the summary. When creating the RFC process we made
  638. an explicit decision not to include author information, to avoid
  639. making RFC authorship itself an incentive (I think). If authorship
  640. is something that should be included in RFCs then the process
  641. itself should be modified to include that metadata, including
  642. crediting the actual author, not just their collaborators. If
  643. giving credit in the RFC text is something we want to encourage,
  644. then I don’t know that the summary is the place for it. The
  645. summary is for summarizing the content of the RFC.</p>
  646. </blockquote>
  647. </blockquote>
  648. <blockquote>
  649. <p>I phrased this too strongly. I just had a sudden observation that
  650. we’ve developed ad-hoc ways to credit people that doesn’t fit into
  651. the process as implemented. I should have phrased this more like
  652. ‘maybe we should reconsider how to give credit in RFCs’. RFC process
  653. is organic so it may be perfectly fine to do it like this (author
  654. credit in the commit log, additional credits in the summary), but it
  655. is awkward. And I do believe we made an intentional decision not to
  656. credit people, and if that is changing it is important to
  657. acknowledge it.</p>
  658. </blockquote>
  659. <p>That was … ok, I’m still not particularly happy with it. It still
  660. appears a bit defensive of my dumb position. I wish I could do it
  661. again. I’ll never be happy. I’ll never, ever be happy.</p>
  662. <p>But the point is that it’s best to admit your mistakes, to yourself
  663. and others: Dale Carnegie recommends that “if you’re wrong, admit it
  664. quickly and emphatically”. People love to be right, so if you can
  665. admit that you are wrong and they are right, that can inspire great
  666. cooperation. And it usually doesn’t require any sacrifice at all to
  667. admit you are wrong besides getting over your own pride.</p>
  668. <p><a name="the-techniques"/></p>
  669. <h1 id="the-techniques">The techniques</h1>
  670. <p>So this relatively minor episode caused me to reevaluate how I
  671. communicate online. It’s not like I don’t know how to be nice. I
  672. believe that I do, but sometimes I forget momentarily. So here, to
  673. reinforce my own good behavior, and hopefully for your benefit, I’ve
  674. traced through my basic gameplan for responding to people online.
  675. When I stick to this plan things mostly go well, the people I
  676. encounter feel good about Rust and their association with it, and I
  677. feel relatively ok-ish about myself.</p>
  678. <p>The techniques here apply to any open source venues, like pull
  679. requests, issue trackers, mailing lists and forums.</p>
  680. <p><a name="respond-quickly"/></p>
  681. <h2 id="respond-quickly">Respond quickly</h2>
  682. <p>Immediately after users and contributors reach out to you is when they
  683. are most motivated to help you. Simply getting a quick response can
  684. make a frustrated user’s day. As a maintainer I’ve frequently seen
  685. expectant users express their appreciation: ‘thanks for the quick
  686. response!’. We know that other people’s time is valuable because our
  687. own time is valuable. By responding to an inquiry quickly we
  688. demonstrate that we respect the time they put into e.g. filing a bug
  689. report, and that we are sacrificing our time to help them. Even if I
  690. can’t think about a particular issue right now, and particularly if I
  691. <em>know</em> I’m not going to get to it any time soon, I will sometimes post
  692. a quick acknowledgement and validation of their concerns, like “thanks
  693. for the report. This does look troubling. I’m afraid I won’t be able
  694. to look into this soon, but help is appreciated”, etc.</p>
  695. <p>The longer you wait to respond to a contributor the less likely they
  696. are to stay engaged: only the most hearty contributors will return to
  697. the table after being ignored for a year. Sadly, it’s all too common
  698. that I come across an issue where the most recent comment is from
  699. someone seeking advice, long, long ago. Those contributors are lost
  700. forever, and their potential contributions with them.</p>
  701. <p>For me this is one of the hardest habits to maintain. The neverending
  702. crush of issues and threads in Rust is entirely overwhelming. I’d much
  703. rather I didn’t have to face other people’s problems constantly - I
  704. have so many of my own. It’s impossible to follow everything going on
  705. in Rust, so in practice I tend to restrict the threads I follow to
  706. specific areas, and to those people who are pinging me directly. There
  707. are long stretches where I just can’t face the endless tide of other
  708. people needing assistance, where I will just willfully ignore my
  709. inbox. I don’t recommend that. Better to be responsive.</p>
  710. <p>How quick is quick enough? 3 days. How scientific is this number? It’s
  711. not. You should respond as quick as you can, but reasonable people
  712. will give you a weekend without getting bent about it.</p>
  713. <p><a name="give-thanks"/></p>
  714. <h2 id="give-thanks">Give thanks</h2>
  715. <p>People like to feel appreciated. It’s a universal desire. And
  716. appreciation is something it costs us little to give, to spread about
  717. like parade candy. If you put just a moment’s thought to it, I know
  718. you can see something good in every person and every situation.</p>
  719. <p>The mere act of submitting a patch is awe-inspiring: another person
  720. cares enough about our project that they took the time to understand
  721. how it works, fix our problem, package it up, and submit their work
  722. for public criticism. That’s amazing. Do you remember the first patch
  723. you ever submitted upstream? I bet you were apprehensive. It’s a
  724. crucial moment that can determine the future relationship between the
  725. contributor and the project.</p>
  726. <p>So the first thing to do before mounting a response is to dig deep
  727. into your reserves of universal love, kindness, and compassion, and
  728. seek something to be thankful for. The more specific you can be the
  729. more it shows you care. Did they provide a reproducible test case in
  730. the issue report? Damn, that took some effort! Did they write tests
  731. for their patch? Noway! Usually I have to ask for those! If you keep
  732. thinking about it you’ll discover there’s a great deal to say thanks
  733. for: “Thanks @AHumanWithFeelings! I’ve been wanting to fix this
  734. issue for so long. I’m glad somebody finally stepped up to write a
  735. patch. This looks lovely!”</p>
  736. <p>Of course, not every encounter demands laying it on thick, but do say
  737. “thanks”. Even trivial patches that can merge without any feedback
  738. deserve some comment: just hit the merge button and write, “thanks!”,
  739. and they’ll feel good about the small part they played in your
  740. project’s ongoing success.</p>
  741. <p><a name="pay-a-compliment"/></p>
  742. <h2 id="pay-a-compliment">Pay a compliment</h2>
  743. <p>One of the primary duties of a software maintainer is to review
  744. others’ work. Every day, burning down the endless patch queue. And the
  745. bigger the project the more gruelling the work. Review is where
  746. everything comes together; it is the make-or-break point for
  747. contributors, their work, and their motivation to keep coming back.</p>
  748. <p>Under the exhausting crush of review responsibilities it’s easy to get
  749. tunnel vision; to bee-line for the shortest route to the end, zeroing
  750. in on the problems to be fixed, and moving on to the next patch.</p>
  751. <p>When you do this though you risk discouraging your contributor. The
  752. more work a patch needs the more the critiques pile up, and it can
  753. easily, and unintentionally, result in an avalanche of
  754. negativity. This is particularly likely to affect new contributors,
  755. who are least likely to understand project norms, and most likely to
  756. need guidance.</p>
  757. <p>A well-known technique to soften the weight of criticism is to pair it
  758. with praise. You’ve probably heard of the “compliment sandwich”:
  759. surrounding the criticism - the meat of your response - with a soft
  760. and squishy bun of praise. The compliment sandwich is considered so
  761. delectable because it is simple and effective. Before you launch into
  762. <em>what you really want to say</em>, try to look for something positive to
  763. point out first.</p>
  764. <p>When I review a patch I usually do it in two passes: first I skim
  765. through it with an open mind, with no preconceptions of what I expect
  766. to see. I’m trying to get in their head and see the solution from
  767. their point of view; and in particular trying to find things to like
  768. about their solution. Does the patch display good intuition even while
  769. getting the details wrong? That’s a good starting point. Did they do
  770. something clever that you hadn’t considered? Does their work
  771. demonstrate they’ve read the project’s contribution guidelines in a
  772. way most contributors don’t? You probably have a host of things you
  773. look for to indicate quality, as specific to your project. Make note
  774. of them as you read the patch, <em>and say them first thing in your
  775. response</em>. Myself, I always appreciate when a contributor writes <em>any
  776. tests at all</em>, and I adore contributors who write excellent tests. And
  777. I say so. To take this technique to the next level, be on the lookout
  778. for indicators of the contributor’s own values, and compliment them on
  779. things they are likely to take special pride in.</p>
  780. <p>By reading the whole text once I additionally reduce the chance of
  781. coming to mistaken conclusions, or leaving comments based on
  782. incomplete information. Often I’ve not considered a work as a whole
  783. and left a comment, then moments later realized that comment was
  784. mistaken and had to correct myself. Likewise, I find it frustrating
  785. when reading inline comments about my own work based on incorrect
  786. assumptions, and which I felt I had made clear if the respondent had
  787. only read further.</p>
  788. <p>So after I’ve done the first pass in a spirit of expansive generosity,
  789. and begun composing my review with praise, then I go back for the
  790. second pass and do the detailed review. Even here though I try to note
  791. positive things as well as things that need to be changed, etc.</p>
  792. <p>I’ve focused on reviews here, but the same applies to all
  793. correspondence. Bug report includes a reduced test case?
  794. Awesome. Forum post is well thought out and polite? Halleluja. Always
  795. be looking out for nice things to say about your peers and their work.</p>
  796. <p><a name="say-yes"/></p>
  797. <h2 id="say-yes">Say “yes”</h2>
  798. <p>In the midst of an internet argument it’s easy to lose sight of the
  799. humanity of the individual on the other side of the computer
  800. monitor. Your pulse quickens, your temperature rises, mind races. You
  801. know you are right, technically, morally. Whatever, you are right;
  802. they are wrong. Wrong, wrong, wrong, and you are going to prove it
  803. right now.</p>
  804. <p>But before you fly off the chain, prove your undeniable superiority,
  805. and prove that <em>they are wrong</em>, let me suggest instead that you do
  806. something better, that you do the opposite: that you <em>prove they are
  807. right</em>.</p>
  808. <p>Imagine the most exciting brainstorming session you ever had: you spit
  809. out a brilliant idea - your partner loves it! They respond
  810. enthusiastically by building on your idea. The conversation spirals
  811. ever upward in joyous rapture. It’s an amazing feeling, being on the
  812. same wavelength. By the end up the night you feel thrilled and
  813. intoxicated. That’s the power of positivity.</p>
  814. <p>It’s so rare. When it happens we want to capture that moment and save
  815. its precious essence forever. That’s the kind of magic you want your
  816. contributors to feel every time they file an issue.</p>
  817. <p>The opposite though is far more common, and it’s the death of useful
  818. discourse: “you’re wrong”, “that’s a bad idea”, “I call bs”, “meh”,
  819. “false”, etc. They all amount to a big fat “no”, and they all make the
  820. recipient feel disrespected and generate ill will. Bad vibes. This is
  821. the worst way to open a productive conversation, and people do it all
  822. the time. It’s shocking how tactless smart people can be. Such direct
  823. negativity erects a brick wall fortified with turrets and kettles of
  824. boiling oil in the middle of a conversation.</p>
  825. <p>“No” is a cardinal sin of persuasive argumentation. Don’t do
  826. it. Don’t do it. Don’t do it. No, no, no!</p>
  827. <p>Instead, say “yes” as fast as you can, and in every way you
  828. can. Literally just say “yes” first thing, then figure out what useful
  829. affirmation you can follow with to support that “yes”. If “yes” is too
  830. on-the-nose for your taste then there are a billion ways to
  831. paraphrase. “Yeah” is a great casual option, and my favorite. Follow
  832. that with a comma, “yeah, it’s true that …”, but there are so many
  833. other more subtle ways to drop a huge positivity bomb at the outset of
  834. your response: “totally”, “you’re right about …”, “indeed!”. If you
  835. put your mind to it you can spend a whole paragraph just saying “yes”.</p>
  836. <p>In the end, even if the solution is much different than their original
  837. proposal, by chaining your good ideas to their good ideas, they will
  838. feel successful. Per master thinker Blaise Pascal, “people are
  839. generally better persuaded by the reasons which they have themselves
  840. discovered than by those which have come into the mind of others.”</p>
  841. <p>Affirmation: it’s the secret weapon against belligerent jerkwads.</p>
  842. <p><a name="be-clear-about-what-you-expect"/></p>
  843. <h2 id="be-clear-about-what-you-expect">Be clear about what you expect</h2>
  844. <p>For contributors to stay engaged they need to know what’s next, what
  845. is expected of them. This applies to every level of the project, from
  846. bug reports to pull requests. If you want something, say so directly!
  847. And if you don’t want something, suggest concrete and viable
  848. alternatives. For the most part, if you are in a position of
  849. authority, contributors are <em>desperate</em> for you to give them
  850. direction. Leaving your desires ambiguous is one of the easiest ways
  851. to destroy contributors’ motivation and lose their manpower.</p>
  852. <p>This applies especially in two places: on the bug tracker, and during
  853. reviews. In both cases there is frequently a critical moment when you
  854. have the opportunity to provide clear direction, and though it
  855. requires some effort, failing to do so leaves a vacuum, and thus
  856. leaves potential precious manpower on the table.</p>
  857. <p>Your issue tracker, if it’s like Rust’s, is filled with bugs and
  858. feature requests that you would love to fulfill; but you will never,
  859. ever get to them yourself, not even if you live forever. These
  860. bugs frequently persist in a state of unknowing, where the solution
  861. is unclear, for weeks, months, years, accumulating debate and
  862. discussion about how to move forward. But eventually something clicks
  863. into place, and an acceptable solution becomes known to you. For
  864. simple bugs this moment can be immediately when it is filed; for more
  865. nuanced bugs it can take a long time. But when it happens, you have
  866. the opportunity to clear the way for contributors.</p>
  867. <p>On any bug where there is an acceptable solution, make it crystal
  868. clear what that solution is, and that <em>help is wanted</em>. Contributors
  869. are sometimes just waiting for a signal indicating how they can
  870. help. The more detail you can provide the better. Bugs with clear
  871. direction have 100% better chance of drawing contributions than those
  872. without. The larger your project, and the larger your contributor
  873. base, the more important it is that you consistently provide
  874. direction, and that contributors have a way to find the bugs that have
  875. reached this inflection point.</p>
  876. <p><a name="admit-your-mistakes"/></p>
  877. <h2 id="admit-your-mistakes">Admit your mistakes</h2>
  878. <p>Like variable bindings in a great many programming languages, our
  879. reality is supremely mutable. Conditions change, facts change, and so
  880. does our perception and understanding. Being wedded to past
  881. understanding and past resolutions is dogma. On the other hand,
  882. confronting change honestly and efficiently is a common trait of
  883. successful individuals and organizations. The agility to let old
  884. opinions go and steer a new course helps organizations stay relevant
  885. in the face of shifting fortunes, and helps us navigate difficult
  886. social situations in our daily lives.</p>
  887. <p>Differences of opinion are the root of many arguments. People make up
  888. their minds, assert themselves, refuse to listen to counterpoints,
  889. become angry, develop personal animosity toward those that don’t
  890. agree, and the conversation either reaches an ugly standstill, or
  891. devolves into a passionate feud. It’s a common failure mode, and we
  892. want to prevent it from happening as early as we can.</p>
  893. <p>Just like we want to say “yes”, and acknowledge others’ great ideas,
  894. it’s beneficial to look for situations where we can let go of our own
  895. ideas, our own dogma. It’s a hard thing to do: it’s so tempting to
  896. stick to what is comfortable; to force those difficult decisions that
  897. have already been decided to stay in the past; to never let go of our
  898. pride and admit we were wrong, or made mistakes.</p>
  899. <p>But it gets easier with practice, and you might even come to find that
  900. admitting your mistakes brings relief - it feels liberating to let
  901. things go, to get that weight off your mind.</p>
  902. <p>I find that there are very few designs and opinions that, when I look
  903. closely, I am deeply wedded to, and most often when somebody is angry
  904. at something I have done or some decision I have made, it is trivially
  905. true that I’ve made a mistake. Sometimes these are technical mistakes,
  906. and I can let them go by saying “yes, I see what you mean now. That
  907. was the wrong call. Are you interested in submitting a patch to fix
  908. it?”. Sometimes it’s more of a social or political mistake, that I
  909. haven’t expressed my motivations or intentions clearly and the other
  910. person is surprised and disappointed that some outcome is not what
  911. they expected. In these situations I try to acknowledge that the
  912. result has the downsides they’ve identified, and apologize that it
  913. doesn’t suit them, and move on. Note though that it’s best to avoid
  914. the sorts of backhanded non-apologies we often see from politicians
  915. (e.g. “I’m sorry you are angry”). Everybody sees through bullshit, and
  916. it’s more useful to focus on your own thoughts and feelings instead of
  917. mindreading others’.</p>
  918. <p><a name="be-effusive"/></p>
  919. <h2 id="be-effusive">Be effusive</h2>
  920. <p>This is another trick that is super-effective! A unique technique of
  921. the internet age, I’ve only begun to acknowledge its power recently.</p>
  922. <p>Don’t hesitate to go overboard with superlatives and punctuation:
  923. exclamation marks where they shouldn’t be, over-the-top adjectives,
  924. cute emoticon and emoji. I know that it took me a long time to come
  925. around to this point of view. It’s just bad writing to throw in
  926. exclamation marks and superfluous words, right? And emoji aren’t even
  927. words…</p>
  928. <p>“Oh, wow, thank you so much! 💖”</p>
  929. <p>Truth is that on the internet this is not bad writing, at least for
  930. one-on-one communication. It is effective writing. It’s well
  931. understood that conveying tone on the internet is <em>hard</em>:</p>
  932. <p>“Thanks.”</p>
  933. <p>What does that period mean? It looks so gruff. Are they pissed at me?!
  934. Are they having a bad day? On the internet the simple period can
  935. appear sarcastic, or angry. It’s so neutral that people will project
  936. whatever emotions they want on it. One must go out of their way to not
  937. only get their meaning across but also the tone - and for our purposes
  938. the tone we want is almost always one of abundant positivity and
  939. enthusiasm.</p>
  940. <p>To help you kickstart this habit, here’s a list of some of my
  941. favorite superlatives, emoticon, and emoji, when applied to
  942. technical communication in open source software communities:</p>
  943. <ul>
  944. <li>”!” (exclamation mark)</li>
  945. <li>“super-“</li>
  946. <li>“totally”</li>
  947. <li>“amazing”</li>
  948. <li>“awesome”</li>
  949. <li>“really”</li>
  950. <li>&lt;3 (heart)</li>
  951. <li>&lt;3 &lt;3 &lt;3 (triple-heart!)</li>
  952. <li>:-D (big-ol’ grin)</li>
  953. <li>😁 (grinning face with smiling eyes)</li>
  954. <li>😍 (smiling face with heart-shaped eyes)</li>
  955. <li>💖 (sparkling heart)</li>
  956. </ul>
  957. <p>These are just the ones in my own toolbag. There are so many others,
  958. and there’s lots of room for creative expression here. The younger you
  959. are the more of these weapons you probably have in your arsenal, what
  960. with all the texting and instagramming and tweeting. Deploy them
  961. without hesitation.</p>
  962. <p>There are limits to good taste here, but you probably have to decide
  963. them for yourself. Personally, I never use more than one exclamation
  964. point; two exclamation points is the epitome of tackiness 😜. And as a
  965. child of the 90’s I’m consistently tempted to sneak in a few
  966. “radical”s and “bodacious”es, to embody my life-long wish to become a
  967. Ninja Turtle, but sadly those adjectives seem to be out of style for
  968. the present moment. The time will come though.</p>
  969. <p>Just as a big smile can brighten someone’s day in the physical world,
  970. a little bit of 😍 goes a long way in the virtual world.</p>
  971. <p><a name="summary"/></p>
  972. <h1 id="summary">Summary</h1>
  973. <p>So that’s all you need to make everybody happy, and make everybody
  974. love you! Now you know the secret and you will never fail again.</p>
  975. <p>Ha, ha, no. No, not really. Not everything goes smoothly just by being
  976. nice. Some people are deeply broken. So many messed up people (maybe
  977. I’m one of them - maybe you are too). Typical social wheel-greasing
  978. doesn’t always work with them; they are hell-bent on sowing chaos,
  979. even if they don’t know it. The guidelines here are still applicable
  980. to these cases, because at least other, more reasonable, people will
  981. see that you are doing your best, but truly dealing with them
  982. effectively is a complex and uncertain matter. For another day.</p>
  983. <p>Some of what I’ve said here may have sounded sarcastic, I know. That’s
  984. me. I’m a deeply cynical individual, but I’m working on it. Effective
  985. communication though needs to be genuine, empathetic, and respectful.
  986. Everybody sees right through bullshit. Work on your empathy, work on
  987. being genuinely nice, but until then, fake it ‘till you make it. If I
  988. practice good communication habits consistently, presumably at some
  989. point I will become a good person. That’s how it works, right? I so
  990. want to be a good person.</p>
  991. <p>In summary, do these things if you want to <em>appear to be</em> nice, and
  992. also if you want to <em>actually be</em> an effective open source software
  993. maintainer:</p>
  994. <ul>
  995. <li><a href="#respond-quickly">Respond quickly</a></li>
  996. <li><a href="#give-thanks">Give thanks</a></li>
  997. <li><a href="#pay-a-compliment">Pay a compliment</a></li>
  998. <li><a href="#say-yes">Say “yes”</a></li>
  999. <li><a href="#be-clear-about-what-you-expect">Be clear about what you expect</a></li>
  1000. <li><a href="#admit-your-mistakes">Admit your mistakes</a></li>
  1001. <li><a href="#be-effusive">Be effusive</a></li>
  1002. </ul>
  1003. <p>By consistently exhibiting a few simple behaviors, one can at least
  1004. look like a kind and decent person. Maybe someday we all actually will
  1005. be.</p>
  1006. <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
  1007. People</a>. Read that.</em></p>
  1008. </article>
  1009. </section>
  1010. <nav id="jumpto">
  1011. <p>
  1012. <a href="/david/blog/">Accueil du blog</a> |
  1013. <a href="https://brson.github.io/2017/04/05/minimally-nice-maintainer">Source originale</a> |
  1014. <a href="/david/stream/2019/">Accueil du flux</a>
  1015. </p>
  1016. </nav>
  1017. <footer>
  1018. <div>
  1019. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  1020. <p>
  1021. Bonjour/Hi!
  1022. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  1023. 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>).
  1024. </p>
  1025. <p>
  1026. 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>.
  1027. </p>
  1028. <p>
  1029. Voici quelques articles choisis :
  1030. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  1031. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  1032. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  1033. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  1034. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  1035. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  1036. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  1037. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  1038. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  1039. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  1040. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  1041. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  1042. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  1043. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  1044. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  1045. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  1046. </p>
  1047. <p>
  1048. 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>.
  1049. </p>
  1050. <p>
  1051. Je ne traque pas ta navigation mais mon
  1052. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  1053. conserve des logs d’accès.
  1054. </p>
  1055. </div>
  1056. </footer>
  1057. <script type="text/javascript">
  1058. ;(_ => {
  1059. const jumper = document.getElementById('jumper')
  1060. jumper.addEventListener('click', e => {
  1061. e.preventDefault()
  1062. const anchor = e.target.getAttribute('href')
  1063. const targetEl = document.getElementById(anchor.substring(1))
  1064. targetEl.scrollIntoView({behavior: 'smooth'})
  1065. })
  1066. })()
  1067. </script>