A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>🚨 How Basecamp blew up (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script>
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://www.platformer.news/p/-how-basecamp-blew-up">
  55. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>🚨 How Basecamp blew up</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  63. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  64. </svg> Accueil</a> •
  65. <a href="https://www.platformer.news/p/-how-basecamp-blew-up" title="Lien vers le contenu original">Source originale</a>
  66. </p>
  67. </nav>
  68. <hr>
  69. <figure><a class="image-link image2 image2-974-1456" target="_blank" href="https://cdn.substack.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fe80c61-caa9-42bb-bcf8-bdc766cf11d2_5864x3922.jpeg"><img src="https://cdn.substack.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fe80c61-caa9-42bb-bcf8-bdc766cf11d2_5864x3922.jpeg" data-attrs='{"src":"https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7fe80c61-caa9-42bb-bcf8-bdc766cf11d2_5864x3922.jpeg","height":974,"width":1456,"resizeWidth":null,"bytes":1402908,"alt":"Photo of a half-opened laptop with the screen showing a rainbow-colored explosion. Joshua Woroniecki / Unsplash","title":null,"type":"image/jpeg","href":null}' alt="Photo of a half-opened laptop with the screen showing a rainbow-colored explosion. Joshua Woroniecki / Unsplash"></a><figcaption class="image-caption">Joshua Woroniecki / Unsplash</figcaption></figure>
  70. <p><strong>I.</strong></p>
  71. <p>At 8AM PT on Friday, a bleary-eyed Basecamp CEO Jason Fried gathered his remote workforce together on Zoom to apologize. Four days earlier, he had thrown the company into turmoil by announcing that “societal and political discussions” <a href="https://world.hey.com/jason/changes-at-basecamp-7f32afc5">would no longer be allowed on the company’s internal chat forums</a>. In his blog post, Fried said the decision stemmed from the fact that “today's social and political waters are especially choppy,” and that internal discussions of those issues was “not healthy” and “hasn’t served us well.” The public reaction had been furious, and Fried said he was sorry for the way the new policies had been rolled out — but not for the policies themselves. </p>
  72. <p>Behind the scenes, Fried had been dealing with <a href="https://www.theverge.com/2021/4/27/22406673/basecamp-political-speech-policy-controversy">an employee reckoning over a long-standing company practice of maintaining a list of “funny” customer names</a>, some of which were of Asian and African origin. The internal discussion over that list had been oriented primarily around making Basecamp feel more inclusive to its employees and customers. But Fried and his co-founder, David Heinemeier Hansson, had been taken aback by an employee post which argued that mocking customer names laid the foundation for racially-motivated violence, and closed the thread. They also disbanded an internal committee of employees who had volunteered to work on issues related to diversity, equity, and inclusion.  </p>
  73. <p>On Friday, employees had their chance to address these issues directly with Fried and his co-founder. What followed was a wrenching discussion that left several employees I spoke with in tears. Thirty minutes after the meeting ended, Fried announced that Basecamp’s longtime head of strategy, Ryan Singer, had been suspended and placed under investigation after he questioned the existence of white supremacy at the company. Over the weekend, Singer — who worked for the company for nearly 18 years, and authored a book about product management for Basecamp called <em>Shape Up: Stop Running in Circles and Ship Work that Matters</em> — resigned.</p>
  74. <p>Within a few hours of the meeting, at least 20 people — more than one-third of Basecamp’s 57 employees — had announced their intention to accept buyouts from the company. And while many of them had been leaning toward resigning in the aftermath of Fried’s original post, the meeting itself pushed several to accelerate their decisions, employees said. The response overwhelmed the founders, who extended the deadline to accept buyouts indefinitely amid an unexpected surge of interest.</p>
  75. <p>This account is based on interviews with six Basecamp employees who were present at the meeting, along with a partial transcript created by employees. Collectively, they describe a company whose attempt to tamp down on difficult conversations blew up in its face as employees rejected the notion that discussions of power and justice should remain off limits in the workplace. And they suggest that efforts to eliminate disruptions in the workplace by regulating internal speech may cause even more turmoil for a company in the long run. </p>
  76. <p>“My honest sense of why everybody is leaving because they're tired of Jason and David's behavior — the suppression of voices, of any dissent,” one employee told me. “They really don’t care what employees have to say. If they don't think it's an issue, it's not an issue. If they don't experience it, then it's not real. And this was the final straw for a lot of employees.”</p>
  77. <p><strong>II.</strong></p>
  78. <p>While Friday’s meeting would eventually grow heated, it began on a conciliatory note. Fried, who employees described as looking tired, began the meeting by apologizing for announcing the policy changes by a public blog post rather than first telling all employees. Hansson tuned into the meeting from bed, where he reported that he was feeling ill, and after making introductory remarks turned off his camera for the duration of the meeting.</p>
  79. <p>Fried opened the floor for comments and questions. For the next two and a half hours, employees pressed the founders on the policy changes, the events leading up to them, and the state of the company. The first part of the meeting was devoted to discussing the events that had unfolded in the company’s internal Basecamp chat last month, in which an employee had cited the Anti-Defamation League’s “<a href="https://www.adl.org/sites/default/files/documents/pyramid-of-hate.pdf">pyramid of hate</a>” to argue that documents like the “funny” names list laid a foundation that contributes to racist violence and even genocide.</p>
  80. <p>Roughly 90 minutes into the meeting, Singer raised his hand and spoke. One of Basecamp’s most senior executives, he had joined the company in 2003, when it was known as 37Signals and consisted of just four people. From his original role designing interfaces, Singer had risen to become head of strategy — essentially, Basecamp’s chief product officer.</p>
  81. <p>Along the way, he had also alienated some of his coworkers by promoting conservative views. In 2016, three employees said, he praised right-wing website Breitbart’s coverage of the presidential election in an internal forum. (About a week before rolling out the policy changes, the founders deleted nearly two decades of internal conversations from previous instances of Basecamp and its other collaboration products. Among other things, this made it more difficult for employees I spoke with to accurately describe past interactions with Singer in the forums.)</p>
  82. <p>In the April discussion about the list of customer names, Singer posted to say that attempting to link the list to genocide was “absurd.” On the Friday call, he went further.</p>
  83. <p>“I strongly disagree we live in a white supremacist culture,” Singer said. “I don't believe in a lot of the framing around implicit bias. I think a lot of this is actually racist.”</p>
  84. <p>He continued: “Very often, if you express a dissenting view, you get called a Nazi. … I have not felt this is open territory for discussion. If we were to try to get into it as a group discussion it would be very painful and divisive.”</p>
  85. <p>Singer concluded his remarks. Fried responded, “Thank you, Ryan.” </p>
  86. <p>A handful of other speakers followed. Then a Black employee asked if the company could revisit Singer’s remarks. (I’m withholding the employee’s name and other identifying details out of colleagues’ fears that they could be targeted for harassment for speaking out.)</p>
  87. <p>“The fact that you can be a white male, and come to this meeting and call people racist and say ‘white supremacy doesn't exist’ when it's blatant at this company is white privilege,” the employee said. “The fact that he wasn’t corrected and was in fact thanked — it makes me sick.”</p>
  88. <p>Fried went to move on, but other employees pressed for more of a response from him and Hansson. At that point, employees said, Singer spoke up again.</p>
  89. <p>“I can gladly respond,” he said. “I stand by what I said. Saying white people have something in common is racist. I stand by it … I am very sure I don’t treat people in a racist way.”</p>
  90. <p>(Singer remembers one of these quotes differently: “I said that claiming anybody <em>must</em> have a certain viewpoint because of the color of their skin is racist,” he said today.) The Black employee said they did not want to hear from Singer, but after some cross-talk he finished his statement.</p>
  91. <p>“The difficulty of this conversation is exactly why I raised it,” he said. </p>
  92. <p>The Black employee responded: “You said, ‘white supremacy doesn't exist.’ That's a factual lie. It's not true.”</p>
  93. <p>To which Singer responded: “I said we have different ways of framing … If you want to debate whether it exists anywhere, then yeah. But not here at this company, not with the people I associate with.” </p>
  94. <p>“It exists right now,” another employee said. “This is fucking bullshit. You are being ridiculous.” </p>
  95. <p>“I don’t accept that framing,” Singer responded. “It’s not productive to argue further. I don’t want to argue. This difference in views, it is what makes a political discussion so difficult.” </p>
  96. <p>Employees once again pressed Fried and Hansson for a response.</p>
  97. <p>“I don’t like hearing that someone doesn’t feel valued,” Fried said. “I don’t know what to say … I can understand why [the employee] feels uncomfortable right now. I feel terrible about it. I don’t know how else to respond.” </p>
  98. <p>The employee called for the founders to denounce white supremacy. “That would be the bare minimum for me,” they said. </p>
  99. <p>“I’m not here to share my personal views on anything,” Fried said. “I’m horrified when one group dominates another.” Fried, who is Jewish, added that he had lost relatives during the Holocaust. “I think it’s absolutely the most disgusting thing in the world … I can’t say that’s happening here.” </p>
  100. <p>Fried added that he didn’t “know what to say about specific terms. I don’t know how to satisfy that right now.” </p>
  101. <p>Hansson remained on mute. </p>
  102. <p>It was in that exchange that several employees decided to quit Basecamp, I’m told. Two employees told me that they had found themselves crying and screaming at the screen.</p>
  103. <p>“This was the test, as far as I’m concerned,” one told me later. “Do you protect this extremely senior employee that you’ve protected for many years? And [the answer] was yes.”</p>
  104. <p>Over the next hour, employees continued to come forward to discuss Basecamp’s new policies and what would be like going forward. But before the meeting ended, one employee spoke up to address Singer’s remarks directly in a way that Fried and Hansson did not.</p>
  105. <p>“Racism [and] white supremacy are not things that are so convenient that they only happen when full intention is present, or true malice is present,” the employee said. “Evil is not required. We’re not so lucky as for this to come down to good and evil. It’s as simple as creating a space where people do not feel welcome.”</p>
  106. <p>The employee continued: “The silence in the background is what racism and white supremacy does. It creates that atmosphere that feels suffocating to people. It doesn't require active malice. It's not that convenient.”</p>
  107. <p>The meeting broke up after no more employees had questions.</p>
  108. <p><strong>III.</strong></p>
  109. <p>A half hour after the meeting ended, Fried posted an internal note saying that Singer has been suspended pending an investigation. He added that the company was bringing in unspecified outside “help” to address the situation. </p>
  110. <p>On Monday morning, in an interview, Fried told me that Singer had resigned. </p>
  111. <p>I asked Fried to clarify his remarks during the Friday meeting, which had clearly caught him off guard.</p>
  112. <p>“I denounce white supremacy unconditionally,” he told me. </p>
  113. <p>Fried declined to answer my other questions on the record.</p>
  114. <p>I also asked Singer about his remarks. Here is what he said, over email, in full:</p>
  115. <blockquote><p>“I objected to an employee’s statement that we live in a white supremacist culture. White supremacism exists, and America’s history of racism still presents terrible problems, but I don’t agree that we should label our entire culture with this ideology.</p><p>On the call, the view I gave was we all want a future where everyone is treated fairly.  And yet there can be disagreement on whether defining our culture as ‘white supremacist’ helps us to get there. The subject is so charged that discussing such disagreements at work quickly leads to misunderstanding, heated accusations, and loss of faith.</p><p>Unfortunately, painful misunderstanding did result. Tensions were so high after the call that I decided it won’t be tenable to stay on the team. I gave my resignation over the weekend.”</p></blockquote>
  116. <p><strong>IV. </strong></p>
  117. <p>This week was to have been Basecamp’s (virtual) biannual meetup, in which employees come together to bond over social activities while talking about the future of the company. </p>
  118. <p>Those discussions will still take place, but amidst a backdrop in which some of the company’s most senior leadership has abruptly departed. More employees are likely to follow in the coming weeks as they find new jobs and make other arrangements, I’m told. In the meantime, no changes to the policies that Fried laid out last week are planned.</p>
  119. <p>Fried and Hansson’s moves last week, and the discussion around them, revealed clear fault lines between executives and workers that go far beyond Basecamp. Founders at Coinbase, Basecamp, and other companies have sought to quash internal dissent that, in their view, distracts workers from the company mission and makes everyone miserable. To a manager, the exchange that led to Singer’s departure could lend credence to the idea that addressing social injustices on company Zoom calls is bound to be disastrous. </p>
  120. <p>Meanwhile, employees at those companies have recoiled at what appear to be transparent efforts to prevent their workplaces from becoming more diverse, equitable, and inclusive. </p>
  121. <p>No one I interviewed offered a confident prediction about how the past week’s events would affect Basecamp over the long term. On one hand, it’s clear that the five books Fried and Hansson wrote <a href="https://basecamp.com/books">lecturing other people about good management</a> made them a lot of enemies, at least on Twitter, where they have been criticized relentlessly. On the other hand, as one employee told me, it’s not clear that average Basecamp customers know or care much about Basecamp the company, and no one predicts a mass revolt of the user base.  </p>
  122. <p>But as much as the conversation about Basecamp’s moves has been framed as “politics,” it seems important to remember that the entire affair began when a third of the company — not all of whom are among the 20 who have departed so far, by the way — volunteered to help the company become more diverse and equitable. It was only when their committee dug a skeleton out of the company closet — that list of names — that Fried and Hansson moved to shut the whole thing down. </p>
  123. <p>“It was actually a positive thing we were doing,” one employee told me, marveling at the chaos that had followed. “We had identified the problem, how it happened, and vowed not to do it again. It was a company doing exactly what it should do. The founders refused to lead, and so the company was doing it itself.”</p>
  124. <p>Another employee said they had been thrown by the fact that the founders, after years of telling employees that they were part of an elite chosen few who were good enough to work at Basecamp, would get rid of them so easily.</p>
  125. <p>“They just want to build cool shit all day,” the employee said. “They don't want to deal with people, which is something you have to do as a manager … Jason and David just threw us away.”</p>
  126. </article>
  127. <hr>
  128. <footer>
  129. <p>
  130. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  131. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  132. </svg> Accueil</a> •
  133. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  134. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
  135. </svg> RSS</a> •
  136. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  137. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
  138. </svg> Pro</a> •
  139. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  140. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
  141. </svg> Email</a> •
  142. <abbr class="nowrap" title="HĂŠbergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  143. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
  144. </svg> LĂŠgal</abbr>
  145. </p>
  146. <template id="theme-selector">
  147. <form>
  148. <fieldset>
  149. <legend><svg class="icon icon-brightness-contrast">
  150. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
  151. </svg> Thème</legend>
  152. <label>
  153. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  154. </label>
  155. <label>
  156. <input type="radio" value="dark" name="chosen-color-scheme"> FoncĂŠ
  157. </label>
  158. <label>
  159. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  160. </label>
  161. </fieldset>
  162. </form>
  163. </template>
  164. </footer>
  165. <script>
  166. function loadThemeForm(templateName) {
  167. const themeSelectorTemplate = document.querySelector(templateName)
  168. const form = themeSelectorTemplate.content.firstElementChild
  169. themeSelectorTemplate.replaceWith(form)
  170. form.addEventListener('change', (e) => {
  171. const chosenColorScheme = e.target.value
  172. localStorage.setItem('theme', chosenColorScheme)
  173. toggleTheme(chosenColorScheme)
  174. })
  175. const selectedTheme = localStorage.getItem('theme')
  176. if (selectedTheme && selectedTheme !== 'undefined') {
  177. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  178. }
  179. }
  180. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  181. window.addEventListener('load', () => {
  182. let hasDarkRules = false
  183. for (const styleSheet of Array.from(document.styleSheets)) {
  184. let mediaRules = []
  185. for (const cssRule of styleSheet.cssRules) {
  186. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  187. continue
  188. }
  189. // WARNING: Safari does not have/supports `conditionText`.
  190. if (cssRule.conditionText) {
  191. if (cssRule.conditionText !== prefersColorSchemeDark) {
  192. continue
  193. }
  194. } else {
  195. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  196. continue
  197. }
  198. }
  199. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  200. }
  201. // WARNING: do not try to insert a Rule to a styleSheet you are
  202. // currently iterating on, otherwise the browser will be stuck
  203. // in a infinite loop…
  204. for (const mediaRule of mediaRules) {
  205. styleSheet.insertRule(mediaRule.cssText)
  206. hasDarkRules = true
  207. }
  208. }
  209. if (hasDarkRules) {
  210. loadThemeForm('#theme-selector')
  211. }
  212. })
  213. </script>
  214. </body>
  215. </html>