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 128KB

  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>Lessons from 6 software rewrite stories (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://medium.com/@herbcaudill/lessons-from-6-software-rewrite-stories-635e4c8f7c22">
  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. Lessons from 6 software rewrite stories (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://medium.com/@herbcaudill/lessons-from-6-software-rewrite-stories-635e4c8f7c22">Source originale du contenu</a></h3>
  445. <section name="127a" class="section section--body section--first"><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h2 name="68ab" id="68ab" class="graf graf--h4 graf-after--h3 graf--subtitle">A new take on the age-old question: Should you rewrite your application from scratch, or is that “the single worst strategic mistake that any software company can make”? Turns out there are more than two options for dealing with a mature codebase.</h2><div class="uiScale uiScale-ui--regular uiScale-caption--regular u-flexCenter u-marginVertical24 u-fontSize15 js-postMetaLockup"><div class="u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@herbcaudill?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="7235e9383aa6" data-action-type="hover" data-user-id="7235e9383aa6" dir="auto"><div class="u-relative u-inlineBlock u-flex0"><img src="https://cdn-images-1.medium.com/fit/c/100/100/0*L_DawN2fLPrFU4ft.jpg" class="avatar-image u-size50x50" alt="Go to the profile of Herb Caudill"><div class="avatar-halo u-absolute u-textColorGreenNormal svgIcon" style="width: calc(100% + 10px); height: calc(100% + 10px); top:-5px; left:-5px"><svg viewBox="0 0 70 70" xmlns="http://www.w3.org/2000/svg"><path d="M5.53538374,19.9430227 C11.180401,8.78497536 22.6271155,1.6 35.3571429,1.6 C48.0871702,1.6 59.5338847,8.78497536 65.178902,19.9430227 L66.2496695,19.401306 C60.4023065,7.84329843 48.5440457,0.4 35.3571429,0.4 C22.17024,0.4 10.3119792,7.84329843 4.46461626,19.401306 L5.53538374,19.9430227 Z"></path><path d="M65.178902,49.9077131 C59.5338847,61.0657604 48.0871702,68.2507358 35.3571429,68.2507358 C22.6271155,68.2507358 11.180401,61.0657604 5.53538374,49.9077131 L4.46461626,50.4494298 C10.3119792,62.0074373 22.17024,69.4507358 35.3571429,69.4507358 C48.5440457,69.4507358 60.4023065,62.0074373 66.2496695,50.4494298 L65.178902,49.9077131 Z"></path></svg></div></div></a></div><div class="u-flex1 u-paddingLeft15 u-overflowHidden"><div class="u-paddingBottom3"><a class="ds-link ds-link--styleSubtle ui-captionStrong u-inlineBlock link link--darken link--darker" href="https://medium.com/@herbcaudill" data-action="show-user-card" data-action-value="7235e9383aa6" data-action-type="hover" data-user-id="7235e9383aa6" dir="auto">Herb Caudill</a><span class="followState js-followState" data-user-id="7235e9383aa6"><button class="button button--smallest u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton u-marginLeft10 u-xs-hide" data-action="sign-up-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-redirect="https://medium.com/@herbcaudill/lessons-from-6-software-rewrite-stories-635e4c8f7c22" data-action-source="post_header_lockup"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--smallest button--dark u-noUserSelect button--withChrome u-accentColor--buttonDark button--follow js-followButton u-marginLeft10 u-xs-hide" data-action="sign-up-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/7235e9383aa6" data-action-source="post_header_lockup-7235e9383aa6-------------------------follow_byline"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span></div><div class="ui-caption u-noWrapWithEllipsis js-testPostMetaInlineSupplemental"><time datetime="2019-02-19T15:57:23.100Z">Feb 19</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="30 min read"></span></div></div></div></div>
  446. <div class="section-inner sectionLayout--fullWidth"><figure name="19fd" id="19fd" class="graf graf--figure graf--layoutFillWidth graf-after--h4"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 17.8%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*ywYwvB-aydv0Ovx7K-5P3g.jpeg" data-width="1909" data-height="339" data-is-featured="true"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*ywYwvB-aydv0Ovx7K-5P3g.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/2600/1*ywYwvB-aydv0Ovx7K-5P3g.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/2600/1*ywYwvB-aydv0Ovx7K-5P3g.jpeg"></noscript></div></div><figcaption class="imageCaption">Photo: Kevin Noble</figcaption></figure></div>
  447. <div class="section-inner sectionLayout--insetColumn"><blockquote name="b556" id="b556" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--figure">“As if source code <strong class="markup--strong markup--blockquote-strong">rusted</strong>!” — <em class="markup--em markup--blockquote-em">Joel Spolsky</em></blockquote><p name="3da1" id="3da1" class="graf graf--p graf-after--blockquote">Almost two decades ago, <a href="https://medium.com/@spolsky" data-href="https://medium.com/@spolsky" data-anchor-type="2" data-user-id="869c7e626b83" data-action-value="869c7e626b83" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Joel Spolsky</a> excoriated Netscape for rewriting their codebase in his landmark essay <a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/" data-href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Things You Should Never Do</a>.</p><p name="33f9" id="33f9" class="graf graf--p graf-after--p">He concluded that <strong class="markup--strong markup--p-strong">a functioning application should never, ever be rewritten from the ground up</strong>. His argument turned on two points:</p><ul class="postList"><li name="2f03" id="2f03" class="graf graf--li graf-after--p">The crufty-looking parts of the application’s codebase often embed hard-earned knowledge about corner cases and weird bugs.</li><li name="898b" id="898b" class="graf graf--li graf-after--li">A rewrite is a lengthy undertaking that keeps you from improving on your existing product, during which time the competition is gaining on you.</li></ul><p name="04e5" id="04e5" class="graf graf--p graf-after--li">For many, Joel’s conclusion became an article of faith; I know it had a big effect on my thinking at the time.</p><p name="61e4" id="61e4" class="graf graf--p graf-after--p">In the following years, I read a few contrarian takes arguing that, under certain circumstances, it made a lot of sense to rewrite from scratch. For example:</p><ul class="postList"><li name="3bf3" id="3bf3" class="graf graf--li graf-after--p">Sometimes the legacy codebase really <em class="markup--em markup--li-em">is </em>messed up beyond repair, such that even simple changes require a cascade of changes to other parts of the code.</li><li name="b9dc" id="b9dc" class="graf graf--li graf-after--li">The original technology choices might be preventing you from making necessary improvements.</li><li name="f451" id="f451" class="graf graf--li graf-after--li">Or, the original technology might be obsolete, making it hard (or expensive) to recruit quality developers.</li></ul><p name="c4d1" id="c4d1" class="graf graf--p graf-after--li">The correct answer, of course, is that <strong class="markup--strong markup--p-strong">it depends </strong>a lot on the circumstances. Yes, sometimes it makes more sense to gradually refactor your legacy code. And yes, sometimes it makes sense to throw it all out and start over.</p><p name="097b" id="097b" class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">But those aren’t the only choices. </strong>Let’s take a quick look at six stories, and see what lessons we can draw.</p><p name="0e8b" id="0e8b" class="graf graf--p graf-after--p graf--trailing"><em class="markup--em markup--p-em">(Bonus: ASCII art summaries of each story!)</em></p></div></div></section>
  448. <section name="b1c2" class="section section--body"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><figure name="2d23" id="2d23" class="graf graf--figure graf--leading"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 507px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 72.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*VM8ZUQpZjXwT2kv2LiMa2A.png" data-width="1024" data-height="742" data-action="zoom" data-action-value="1*VM8ZUQpZjXwT2kv2LiMa2A.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*VM8ZUQpZjXwT2kv2LiMa2A.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*VM8ZUQpZjXwT2kv2LiMa2A.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*VM8ZUQpZjXwT2kv2LiMa2A.png"></noscript></div></div></figure><h3 name="3158" id="3158" class="graf graf--h3 graf-after--figure">1. Netscape</h3><figure name="5a18" id="5a18" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 109px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 15.6%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*CcOcjs6ob6xk3Yc3BvajYQ.png" data-width="1023" data-height="160" data-action="zoom" data-action-value="1*CcOcjs6ob6xk3Yc3BvajYQ.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*CcOcjs6ob6xk3Yc3BvajYQ.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*CcOcjs6ob6xk3Yc3BvajYQ.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*CcOcjs6ob6xk3Yc3BvajYQ.png"></noscript></div></div><figcaption class="imageCaption"><strong class="markup--strong markup--figure-strong">Key:</strong> 📝= rewrite, 💀 = dead end</figcaption></figure><p name="5b08" id="5b08" class="graf graf--p graf-after--figure">Netscape’s disastrous 5.0/6.0 rewrite is the original poster child for “never rewrite”, thanks to Joel.</p><p name="48e8" id="48e8" class="graf graf--p graf-after--p">Netscape’s Navigator, first released in 1994, defined the early years of the commercial internet. Less than two years after it was released, the company’s $3-billion IPO launched the dot-com era.</p><p name="bae3" id="bae3" class="graf graf--p graf-after--p">Netscape’s first serious competition came from Microsoft’s Internet Explorer, which came out in 1996.</p><p name="9262" id="9262" class="graf graf--p graf-after--p">At the beginning of 1998, Netscape was still the leading browser, but just barely. Netscape’s retail price was $49; Microsoft was giving IE away for free and shipping it with Windows as the default browser.</p><figure name="8de5" id="8de5" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 504px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 72%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*xK0A1DvccTAfcLbpfjqKuQ.jpeg" data-width="800" data-height="576" data-action="zoom" data-action-value="1*xK0A1DvccTAfcLbpfjqKuQ.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*xK0A1DvccTAfcLbpfjqKuQ.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*xK0A1DvccTAfcLbpfjqKuQ.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*xK0A1DvccTAfcLbpfjqKuQ.jpeg"></noscript></div></div></figure><p name="7ddb" id="7ddb" class="graf graf--p graf-after--figure">After version 4.0 of Netscape was released, the company <a href="https://www.cnet.com/news/netscape-sets-source-code-free/" data-href="https://www.cnet.com/news/netscape-sets-source-code-free/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">announced</a> that version 5.0 would be given away for free, and developed by an open source community created and funded by the company, called Mozilla.</p><p name="16f6" id="16f6" class="graf graf--p graf-after--p">This was basically unprecedented at the time, and Netscape won a lot of goodwill for making a gutsy move. As it happened, though, the community didn’t really materialize. Jamie Zawinski, one of the browser’s earliest developers, <a href="https://www.jwz.org/gruntle/nomo.html" data-href="https://www.jwz.org/gruntle/nomo.html" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">explains</a>:</p><blockquote name="9839" id="9839" class="graf graf--blockquote graf-after--p">The truth is that, by virtue of the fact that the contributors to the Mozilla project included about a hundred full-time Netscape developers, and about thirty part-time outsiders, the project still belonged wholly to Netscape.</blockquote><p name="803b" id="803b" class="graf graf--p graf-after--blockquote">The team concluded that one reason outside developers weren’t interested in contributing to their open-source project was that the existing codebase was a mess:</p><blockquote name="b8d1" id="b8d1" class="graf graf--blockquote graf-after--p">The code was just too complicated and crufty and hard to modify, which is why people didn’t contribute … which is why we switched to the new layout engine. A cleaner, newly-designed code base, so the theory went, was going to be easier for people to understand and contribute.</blockquote><h4 name="446f" id="446f" class="graf graf--h4 graf-after--blockquote">Starting with a clean sheet</h4><p name="02b9" id="02b9" class="graf graf--p graf-after--h4">So after a year the group decided to scrap their work on 5.0 without releasing it, and started from scratch on version 6.0.</p><p name="3a37" id="3a37" class="graf graf--p graf-after--p">Another two years went by before Netscape 6.0 was finally released; and even after all that time it was clear that it still wasn’t ready to have been released. <a href="https://www.nytimes.com/2000/11/30/technology/state-of-the-art-netscape-6-browser-mixed-bag.html" data-href="https://www.nytimes.com/2000/11/30/technology/state-of-the-art-netscape-6-browser-mixed-bag.html" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">According to New York Times’ reviewer</a> <a href="https://medium.com/@davidpogue" data-href="https://medium.com/@davidpogue" data-anchor-type="2" data-user-id="7e6f541255c" data-action-value="7e6f541255c" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">David Pogue</a>, it took a full minute to start up (!) and hogged memory. And it lacked a number of simple usability features that previous generations of the browser had:</p><blockquote name="2b04" id="2b04" class="graf graf--blockquote graf-after--p">The print-preview feature is gone, as is the ability to drag a Web site’s address-bar icon directly into the Bookmarks menu. You can no longer copy or paste a Web address in the Address bar by right-clicking there, either. And you have to resize the browser window every time you begin surfing; Navigator doesn’t remember how you had it the last time you ran the program. The most alarming flaw, however, is that you can’t highlight the entire Address bar with a single click.</blockquote><p name="13a3" id="13a3" class="graf graf--p graf-after--blockquote">Not that it mattered. In the three years that Netscape stood still, Internet Explorer had taken all of its remaining market share:</p><figure name="53da" id="53da" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 321px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 45.9%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*2AJ0RM43DGspNNuRYSOtVA.png" data-width="800" data-height="367" data-action="zoom" data-action-value="1*2AJ0RM43DGspNNuRYSOtVA.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*2AJ0RM43DGspNNuRYSOtVA.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*2AJ0RM43DGspNNuRYSOtVA.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*2AJ0RM43DGspNNuRYSOtVA.png"></noscript></div></div><figcaption class="imageCaption">When the rewrite began, Netscape was losing ground quickly to Microsoft’s Internet Explorer. When the new browser was finally released three years later, it was buggy and slow; meanwhile Netscape’s market share had dwindled to practically nothing. (Chart adapted from <a href="https://en.wikipedia.org/wiki/Usage_share_of_web_browsers#/media/File:Usage_Share_of_browsers_%28updated_August_2018%29.png" data-href="https://en.wikipedia.org/wiki/Usage_share_of_web_browsers#/media/File:Usage_Share_of_browsers_(updated_August_2018).png" class="markup--anchor markup--figure-anchor" rel="nofollow noopener" target="_blank">Wikipedia</a>.)</figcaption></figure><p name="bccc" id="bccc" class="graf graf--p graf-after--figure">In 1999, while the rewrite was underway, AOL had acquired Netscape in a deal valued at $10 billion.</p><p name="8aca" id="8aca" class="graf graf--p graf-after--p">Just two years after Netscape 6.0 was released, the Netscape team within AOL was disbanded.</p><p name="1f1a" id="1f1a" class="graf graf--p graf-after--p">Mozilla, the open-source community that Netscape had created, would go on to release the Firefox browser in 2002 — after yet <em class="markup--em markup--p-em">another </em>ground-up rewrite. Firefox did manage to gain back some market share from Microsoft.</p><p name="c0b6" id="c0b6" class="graf graf--p graf-after--p">But Netscape as a business was dead. (In a humiliatingly ironic footnote, Microsoft would end up with the remains of Netscape’s intellectual property after a <a href="https://www.nytimes.com/2012/04/10/technology/microsoft-to-buy-aol-patents-for-more-than-1-billion.html" data-href="https://www.nytimes.com/2012/04/10/technology/microsoft-to-buy-aol-patents-for-more-than-1-billion.html" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">2012 deal with AOL</a>.)</p><p name="6180" id="6180" class="graf graf--p graf-after--p">Having won that battle, Microsoft pulled back on its investment in browser technology. Internet Explorer 6.0 was released in 2001 and didn’t get another upgrade for another <em class="markup--em markup--p-em">five years</em>, in what some see as a <a href="https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish" data-href="https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">deliberate strategy</a> to prevent the web from advancing as platform for applications.</p><h4 name="57a1" id="57a1" class="graf graf--h4 graf-after--p">Lessons</h4><p name="6565" id="6565" class="graf graf--p graf-after--h4">People have argued that the rewrite wasn’t a disaster in the long term, because the project eventually led to the Gecko engine and the Firefox browser.</p><p name="6ddc" id="6ddc" class="graf graf--p graf-after--p">But we all had to endure years of stagnation in web technology under <a href="https://www.theguardian.com/technology/2009/oct/28/upgrading-internet-explorer-6" data-href="https://www.theguardian.com/technology/2009/oct/28/upgrading-internet-explorer-6" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">IE6’s endless, suffocating monopoly</a> while we were waiting for new browser to gain traction; and what finally ended the IE6 era wasn’t Firefox but Google Chrome.</p><p name="0557" id="0557" class="graf graf--p graf-after--p">And anyway, the question at hand isn’t whether the rewrite was good for the web; it’s whether it was a good decision from the perspective of the company making the decision. Netscape’s slide into irrelevance wasn’t entirely due to the rewrite — <a href="https://en.wikipedia.org/wiki/United_States_v._Microsoft_Corp." data-href="https://en.wikipedia.org/wiki/United_States_v._Microsoft_Corp." class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">a court agreed</a> that Microsoft had deliberately abused their monopoly.</p><p name="6b36" id="6b36" class="graf graf--p graf-after--p graf--trailing">But the rewrite was certainly a contributing factor, and the end result was the destruction of a company worth billions of dollars and thousands of layoffs. So I’m going to agree with Joel that <strong class="markup--strong markup--p-strong">the net consequences of this rewrite were disastrous</strong>.</p></div></div></section>
  449. <section name="7ba5" class="section section--body"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><figure name="5df9" id="5df9" class="graf graf--figure graf--leading"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 463px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 66.2%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*lpbusnOGpf4TMdwY_hgbIA.png" data-width="1003" data-height="664" data-action="zoom" data-action-value="1*lpbusnOGpf4TMdwY_hgbIA.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*lpbusnOGpf4TMdwY_hgbIA.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*lpbusnOGpf4TMdwY_hgbIA.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*lpbusnOGpf4TMdwY_hgbIA.png"></noscript></div></div></figure><h3 name="56e4" id="56e4" class="graf graf--h3 graf-after--figure">2. Basecamp</h3><figure name="2274" id="2274" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 107px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 15.299999999999999%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*O4-zINabnPY7bWJ3ezX63Q.png" data-width="1023" data-height="157" data-action="zoom" data-action-value="1*O4-zINabnPY7bWJ3ezX63Q.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*O4-zINabnPY7bWJ3ezX63Q.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*O4-zINabnPY7bWJ3ezX63Q.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*O4-zINabnPY7bWJ3ezX63Q.png"></noscript></div></div></figure><p name="93a6" id="93a6" class="graf graf--p graf-after--figure">In the early 2000s, a Chicago web design company called <strong class="markup--strong markup--p-strong">37signals </strong>had built a following around founders <a href="https://medium.com/@jasonfried" data-href="https://medium.com/@jasonfried" data-anchor-type="2" data-user-id="c030228809f2" data-action-value="c030228809f2" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Jason Fried</a> and <a href="https://medium.com/@dhh" data-href="https://medium.com/@dhh" data-anchor-type="2" data-user-id="54bcbf647830" data-action-value="54bcbf647830" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">DHH</a>’s influential and often contrarian <a href="https://m.signalvnoise.com" data-href="https://m.signalvnoise.com" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">blog</a>.</p><p name="55f7" id="55f7" class="graf graf--p graf-after--p">They originally caught my attention when I was just starting out as a web designer, with a series of unsolicited redesigns of sites like Google and PayPal, called <a href="https://web.archive.org/web/20050206094649/http://www.37signals.com/better" data-href="https://web.archive.org/web/20050206094649/http://www.37signals.com/better" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">37better</a>.</p></div>
  450. <div class="section-inner sectionLayout--outsetRow" data-paragraph-count="2"><figure name="47cd" id="47cd" class="graf graf--figure graf--layoutOutsetRow is-partialWidth graf-after--p" style="width: 58.243%;"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 115.9%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*phyGgSr6L8JtjNimcL-cZA.png" data-width="1336" data-height="1549" data-action="zoom" data-action-value="1*phyGgSr6L8JtjNimcL-cZA.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*phyGgSr6L8JtjNimcL-cZA.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*phyGgSr6L8JtjNimcL-cZA.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*phyGgSr6L8JtjNimcL-cZA.png"></noscript></div></div></figure><figure name="a795" id="a795" class="graf graf--figure graf--layoutOutsetRowContinue is-partialWidth graf-after--figure" style="width: 41.757%;"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 161.9%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*KExCbBFnKKpQ7dU119jdNw.png" data-width="1168" data-height="1891" data-action="zoom" data-action-value="1*KExCbBFnKKpQ7dU119jdNw.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*KExCbBFnKKpQ7dU119jdNw.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*KExCbBFnKKpQ7dU119jdNw.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*KExCbBFnKKpQ7dU119jdNw.png"></noscript></div></div><figcaption class="imageCaption" style="width: 239.481%; left: -139.481%;">37signals’ <a href="https://web.archive.org/web/20050207174211/http://www.37signals.com/better/fedex/after.html" data-href="https://web.archive.org/web/20050207174211/http://www.37signals.com/better/fedex/after.html" class="markup--anchor markup--figure-anchor" rel="nofollow noopener" target="_blank">redesign of FedEx’s shipping form</a> (left) is still better than <a href="https://www.fedex.com/shipping/shipEntryAction.do?method=doEntry&amp;link=1&amp;locale=en_US&amp;urlparams=us&amp;sType=F" data-href="https://www.fedex.com/shipping/shipEntryAction.do?method=doEntry&amp;link=1&amp;locale=en_US&amp;urlparams=us&amp;sType=F" class="markup--anchor markup--figure-anchor" rel="nofollow noopener" target="_blank">the real thing</a>, nearly two decades later.</figcaption></figure></div>
  451. <div class="section-inner sectionLayout--insetColumn"><p name="ff82" id="ff82" class="graf graf--p graf-after--figure">In 2004, they took a project-management tool that <a href="https://basecamp.com/about/story" data-href="https://basecamp.com/about/story" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">they had developed for internal use</a>, and released it as a software-as-a-service product called <a href="https://signalvnoise.com/archives/000542.php" data-href="https://signalvnoise.com/archives/000542.php" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Basecamp</a>.</p><p name="01cb" id="01cb" class="graf graf--p graf-after--p">This was at a time when subscribing to software was still a novelty. Project management tools came in shrink-wrapped boxes with four-figure price tags and hefty manuals, and were all about modeling critical paths and generating complex Gantt charts.</p><p name="5c7c" id="5c7c" class="graf graf--p graf-after--p">Basecamp sold for $50 a month and was a breath of fresh air, with its super-simple interface and its focus on communication.</p><p name="efd3" id="efd3" class="graf graf--p graf-after--p">Fast forward a few years, Basecamp has half a million happy users, checks are rolling in every month, and Jason and David are starting to get restless.</p><p name="7f41" id="7f41" class="graf graf--p graf-after--p">I saw David tell this story at the <a href="http://www.businessofsoftware.org" data-href="http://www.businessofsoftware.org" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Business of Software</a> conference a few years ago. He said that not only had he been convinced by Joel Spolsky that rewriting software would kill the company, but <a href="https://businessofsoftware.org/2015/10/david-heinemeier-hansson-rewrite-basecamp-business-of-software-conference-video-dhh-bos2015/" data-href="https://businessofsoftware.org/2015/10/david-heinemeier-hansson-rewrite-basecamp-business-of-software-conference-video-dhh-bos2015/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">there was an element of self-righteousness</a> inspired by the Agile movement:</p><blockquote name="04c8" id="04c8" class="graf graf--blockquote graf-after--p">[I was] completely taken in with the idea of transcendent software. … That code is infinitely malleable. That legacy is infinitely valuable. That you can change anything, any piece of software, any piece of code can be rewritten. … If software is hard to change, it is your fault. You’re a bad programmer and you just have to learn to be better.</blockquote><p name="4c5a" id="4c5a" class="graf graf--p graf-after--blockquote">After what he calls “seven fat years”, though, they were in a bind — and it had <strong class="markup--strong markup--p-strong">nothing to do with technical debt</strong>.</p><h4 name="ddaf" id="ddaf" class="graf graf--h4 graf-after--p">Golden handcuffs</h4><p name="391e" id="391e" class="graf graf--p graf-after--h4">They started by noticing <em class="markup--em markup--p-em">in their gut </em>a lack of enthusiasm. Not only were they not motivated to work on their flagship product, but they themselves weren’t <em class="markup--em markup--p-em">using </em>the product as much.</p><p name="6ea3" id="6ea3" class="graf graf--p graf-after--p">They had lots of ideas about how to make the product fundamentally better, but with hundreds of thousands of people building their workflows around Basecamp, every change they made was disruptive to lots and lots of people. <strong class="markup--strong markup--p-strong">The obstacle to change wasn’t a crufty codebase, it was their users.</strong></p><p name="4170" id="4170" class="graf graf--p graf-after--p">Their focus on keeping their existing customer base happy was freezing the product in time, and preventing them from appealing to new customers. This wasn’t an immediate problem for the business, it posed a long-term thread. DHH used the metaphor of trying to keep a leaky bucket full:</p><blockquote name="e430" id="e430" class="graf graf--blockquote graf-after--p">You might be plugging all the holes, you might be fixing all the bugs, you might be upgrading all the features the existing customers are complaining about so that no water escapes — but some water always escapes. Customers move on from their job and they leave your software even if they [love it]. But you can kind of delude yourself that, “Hey, this bucket is more than half full still. That’s just a tiny little hole there seeping out and that’s perfectly natural.” But, if you just keep that on for long enough, the bucket is going to end up empty.</blockquote><p name="ac51" id="ac51" class="graf graf--p graf-after--blockquote">Part of the problem is that you hear all the time from your present customers, but you don’t hear from your future customers:</p><blockquote name="ce99" id="ce99" class="graf graf--blockquote graf-after--p">People who showed up at the Basecamp homepage in 2011 and chose not to buy because our ideas were no longer good enough, how often do you think we were hearing from them? Never. We were hearing from this broad base of existing customers who very much would love us to just keep plugging those little holes.</blockquote><p name="449d" id="449d" class="graf graf--p graf-after--blockquote">They started to see their profitable product as a set of golden handcuffs:</p><blockquote name="358b" id="358b" class="graf graf--blockquote graf-after--p">The number one thing is just to make sure all the users you already have are still happy. The money just keeps coming in every month, new check, new check, new check. Great. But, you have to stick your arms forward and say, “Okay, I will never change my software again.”</blockquote><figure name="73cc" id="73cc" class="graf graf--figure graf-after--blockquote"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 460px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 65.7%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*SqYBDomffzQ2ClJIsQMi7Q.jpeg" data-width="700" data-height="460"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*SqYBDomffzQ2ClJIsQMi7Q.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*SqYBDomffzQ2ClJIsQMi7Q.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*SqYBDomffzQ2ClJIsQMi7Q.jpeg"></noscript></div></div></figure>
  452. <p name="43b4" id="43b4" class="graf graf--p graf-after--figure">Spoiler alert: They rewrote Basecamp from scratch and it turned out great. It took around a year, and new signups doubled immediately following the release of Basecamp 2.</p><p name="2430" id="2430" class="graf graf--p graf-after--p">They did two interesting things that, I think, made this work.</p><p name="8b0b" id="8b0b" class="graf graf--p graf-after--p">First, <strong class="markup--strong markup--p-strong">they didn’t try to rebuild the exact product they already had </strong>— because they had new ideas about how to solve the problems they’d originally set out to solve.</p><blockquote name="e6b2" id="e6b2" class="graf graf--blockquote graf-after--p">Are we really that arrogant to think that the ideas we had in 2003 were still going to be the very best ideas in 2011? I mean, I’ve been accused of being pretty arrogant, but I ran out of steam on that one in like 2008.</blockquote><p name="2f4c" id="2f4c" class="graf graf--p graf-after--blockquote">So they presented Basecamp 2 as a completely new product, with no guarantees that it would be backwards compatible with Basecamp Classic. Lots of things were new, other things were gone, and lots of things were just totally different.</p><p name="895b" id="895b" class="graf graf--p graf-after--p">That decision gave them a degree of freedom. Freedom is motivating, and motivated human beings get more done.</p><p name="2d46" id="2d46" class="graf graf--p graf-after--p">Not having to support every one of the original product’s use cases also bought them a lot of time. For example, the original Basecamp allowed users to host documents on their own FTP server. Cutting out that feature — and others like it, that might have made business sense at one time, but didn’t any more—made it possible to bring the new product to market in a reasonable amount of time.</p><h4 name="645f" id="645f" class="graf graf--h4 graf-after--p">Sunset considered harmful</h4><p name="74b9" id="74b9" class="graf graf--p graf-after--h4">But what about all those hundreds of thousands of existing users? All those people who complain loudly when their cheese is moved?</p><p name="635e" id="635e" class="graf graf--p graf-after--p">That brings us to the second interesting thing they did, which was that <strong class="markup--strong markup--p-strong">they didn’t sunset their existing product</strong>.</p><p name="4047" id="4047" class="graf graf--p graf-after--p">David riffed for a while on the notion of “sunsetting” software:</p><blockquote name="3707" id="3707" class="graf graf--blockquote graf-after--p">Someone somewhere came up with this beautiful euphemism called the sunset. … Let’s call killing software “sunsetting”. … All the users can sit on the beach and they can watch all their data fade away. It’s going to be beautiful!</blockquote><blockquote name="3aea" id="3aea" class="graf graf--blockquote graf-after--blockquote">The only people who believe in the “sunset” are the people who call it the “sunset”. No user who’s actually ever been through a period of sunset actually comes back and says, “Oh that was beautiful.” They come back and say, “Fuck! I put in years of work in this thing! … And now you’re going to <em class="markup--em markup--blockquote-em">sunset </em>me?”</blockquote><p name="683a" id="683a" class="graf graf--p graf-after--blockquote">He points out that when you force users to pack up and move, <em class="markup--em markup--p-em">that’s </em>when you’re making “the worst strategic mistake ever”: Because you’re taking your entire recurring customer base and making them think about whether they want to keep using your software or move to something else altogether.</p><blockquote name="f9a2" id="f9a2" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“Is Basecamp even actually the thing I want anymore? If we have to move all our crap over anyway, maybe I can just move it somewhere else. If I have to pack it all up into boxes and load it on the truck, I can just send that truck across town instead. That’s not a big hassle. The big hassle is to pack up all my shit. Whether it goes to Basecamp again or it goes somewhere else, that’s not the big decision.”</blockquote><figure name="e3ee" id="e3ee" class="graf graf--figure graf--layoutOutsetLeft graf-after--blockquote"><div class="aspectRatioPlaceholder is-locked" style="max-width: 525px; max-height: 349px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 66.4%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*ldSpa13ejf7TZfXjyr5XMg.jpeg" data-width="3276" data-height="2176" data-action="zoom" data-action-value="1*ldSpa13ejf7TZfXjyr5XMg.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*ldSpa13ejf7TZfXjyr5XMg.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*ldSpa13ejf7TZfXjyr5XMg.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*ldSpa13ejf7TZfXjyr5XMg.jpeg"></noscript></div></div><figcaption class="imageCaption">David compares Basecamp Classic to a Leica M3: It hasn’t been manufactured since 1967, but Leica is still committed to supporting it and repairing it for as long as they’re in business. (Photo <a href="https://commons.wikimedia.org/w/index.php?curid=27903569" data-href="https://commons.wikimedia.org/w/index.php?curid=27903569" class="markup--anchor markup--figure-anchor" rel="noopener nofollow" target="_blank">Dnalor 01</a>)</figcaption></figure><p name="70b8" id="70b8" class="graf graf--p graf-after--figure">Instead, Basecamp committed to “<strong class="markup--strong markup--p-strong">honoring their legacy</strong>”: They made it easy for people to upgrade, but didn’t require them to leave Basecamp Classic. Not only that, but they’ve committed to continuing to host, support, and maintain Basecamp Classic indefinitely.</p><p name="0f2e" id="0f2e" class="graf graf--p graf-after--p">The kicker is that, four years later, they did it all over again: <a href="https://signalvnoise.com/posts/3968-launch-basecamp-3" data-href="https://signalvnoise.com/posts/3968-launch-basecamp-3" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Basecamp 3 was released in 2015</a>, rewritten from the ground up, with some features cut, some added, and lots of things changed. And just as before, users of older versions can easily upgrade — but if they prefer, they can continue using Basecamp Classic or Basecamp 2 “until the end of the internet”.</p><blockquote name="1aee" id="1aee" class="graf graf--blockquote graf-after--p">Basecamp 3 is not going to sunset anything. Not the current version of Basecamp, not the classic, original version of Basecamp. Either of those work well for you? Awesome! Please keep using them until the end of the internet! We’ll make sure they’re fast, secure, and always available.</blockquote><blockquote name="46d0" id="46d0" class="graf graf--blockquote graf-after--blockquote">But, but, but isn’t that expensive? Isn’t that hard? What about security? What about legacy code bases? Yes, what about it? Taking care of customers — even if they’re not interested in upgrading on our schedule — is what we do here.</blockquote><figure name="3225" id="3225" class="graf graf--figure graf-after--blockquote"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 501px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 71.6%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*Nd8kwuSdBKDB0AP3-Em-aw.jpeg" data-width="814" data-height="583" data-action="zoom" data-action-value="1*Nd8kwuSdBKDB0AP3-Em-aw.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*Nd8kwuSdBKDB0AP3-Em-aw.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*Nd8kwuSdBKDB0AP3-Em-aw.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*Nd8kwuSdBKDB0AP3-Em-aw.jpeg"></noscript></div></div></figure><h4 name="9899" id="9899" class="graf graf--h4 graf-after--figure">Lessons</h4><p name="f38d" id="f38d" class="graf graf--p graf-after--h4">Personally, I find this model really inspiring.</p><p name="637a" id="637a" class="graf graf--p graf-after--p">Each rewrite allowed Basecamp to revisit design decisions and build the product they wished they’d built the previous time.</p><p name="23f6" id="23f6" class="graf graf--p graf-after--p">For users, this is the best of both worlds: People who don’t like change don’t get their cheese moved; but people who are bumping against your product’s limitations get to work with a new and, hopefully better thought-out application.</p><p name="5d94" id="5d94" class="graf graf--p graf-after--p">Having to maintain multiple versions of product indefinitely doesn’t come without a price; but as David says:</p><blockquote name="7a89" id="7a89" class="graf graf--blockquote graf-after--p graf--trailing">It’s not free. Why would you expect it to be free? It’s valuable, so of course it’s not free. But it’s worth doing.</blockquote></div></div></section>
  453. <section name="c700" class="section section--body"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--outsetRow" data-paragraph-count="2"><figure name="4285" id="4285" class="graf graf--figure graf--layoutOutsetRow is-partialWidth graf--leading" style="width: 50.436%;"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 61.7%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*l0XU_5L7LPojxfH-HGtLHg.png" data-width="917" data-height="566" data-action="zoom" data-action-value="1*l0XU_5L7LPojxfH-HGtLHg.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*l0XU_5L7LPojxfH-HGtLHg.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*l0XU_5L7LPojxfH-HGtLHg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*l0XU_5L7LPojxfH-HGtLHg.png"></noscript></div></div></figure><figure name="af08" id="af08" class="graf graf--figure graf--layoutOutsetRowContinue is-partialWidth graf-after--figure" style="width: 49.564%;"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 62.8%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*QqzsJBhAyn_Q1zb_CPJSrw.jpeg" data-width="1000" data-height="628" data-action="zoom" data-action-value="1*QqzsJBhAyn_Q1zb_CPJSrw.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*QqzsJBhAyn_Q1zb_CPJSrw.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*QqzsJBhAyn_Q1zb_CPJSrw.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*QqzsJBhAyn_Q1zb_CPJSrw.jpeg"></noscript></div></div></figure></div>
  454. <div class="section-inner sectionLayout--insetColumn"><h3 name="b616" id="b616" class="graf graf--h3 graf-after--figure">3. Visual Studio &amp; VS Code</h3><figure name="7a5d" id="7a5d" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 94px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 13.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*eKBCiXHivYWRPtom9UqZUg.png" data-width="1023" data-height="138" data-action="zoom" data-action-value="1*eKBCiXHivYWRPtom9UqZUg.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*eKBCiXHivYWRPtom9UqZUg.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*eKBCiXHivYWRPtom9UqZUg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*eKBCiXHivYWRPtom9UqZUg.png"></noscript></div></div><figcaption class="imageCaption"><strong class="markup--strong markup--figure-strong">Key</strong>: 😎 = hipster cred</figcaption></figure><p name="20cd" id="20cd" class="graf graf--p graf-after--figure">Microsoft made VS Code in order to reach out to developers working on other platforms.</p><p name="21ed" id="21ed" class="graf graf--p graf-after--p">You have to remember that for a long time, working in Microsoft’s world was an all-or-nothing proposition. If you used Visual Studio, you worked in .NET, and vice versa. This split the software community into two big, mostly mutually exclusive camps — to everyone’s detriment.</p><h4 name="62e3" id="62e3" class="graf graf--h4 graf-after--p">Reaching out to the cool kids</h4><p name="6f02" id="6f02" class="graf graf--p graf-after--h4">That started to change even in the Steve Ballmer years— remember what a huge deal it was when <a href="https://weblogs.asp.net/scottgu/jquery-and-microsoft" data-href="https://weblogs.asp.net/scottgu/jquery-and-microsoft" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">the ASP.NET team decided not to reinvent jQuery</a>!</p><p name="03ef" id="03ef" class="graf graf--p graf-after--p">It’s become one of CEO Satya Nadella’s principal missions for Microsoft to explicitly appeal to developers outside its walled garden.</p><p name="97ae" id="97ae" class="graf graf--p graf-after--p">But as Julia Liuson, VP of Visual Studio puts it in <a href="https://changelog.com/podcast/277" data-href="https://changelog.com/podcast/277" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">this episode of The Changelog podcast</a>:</p><blockquote name="591f" id="591f" class="graf graf--blockquote graf-after--p">We didn’t have anything for this whole class of developers — modern, webby, Node-oriented developers, JavaScript — we had nothing to talk to you about. You were a developer we were never gonna be able to attract, at all.</blockquote><blockquote name="e815" id="e815" class="graf graf--blockquote graf-after--blockquote">So the motivation for VS Code was to break down that barrier and say “Actually, you know what? We do have something that you could use.”</blockquote><p name="0095" id="0095" class="graf graf--p graf-after--blockquote">Visual Studio is a heavyweight product in every sense: It can take upwards of half an hour to install. It has to support a wide variety of complex use cases relied on by enterprise customers. So it wouldn’t have made sense to use Visual Studio itself as a starting point, for Microsoft to try to appeal to other platforms by <em class="markup--em markup--p-em">adding </em>features. And presumably the idea of making Mac or Linux versions of Visual Studio was a non-starter.</p><p name="bfc8" id="bfc8" class="graf graf--p graf-after--p">So Microsoft started from scratch with no guarantees of backwards compatibility.</p><p name="f31d" id="f31d" class="graf graf--p graf-after--p">Not quite from scratch, actually: Microsoft already had some important parts lying around, such as the in-browser Monaco editor. And because VS Code is a Node.js app (written in Typescript and run in Electron), they were able to take advantage of the rich JavaScript ecosystem.</p><p name="f46d" id="f46d" class="graf graf--p graf-after--p">VS Code is open-source, lightweight, fast, and extensible; and — amazingly for a Microsoft product — it’s become the coding environment of choice for the cool kids.</p><figure name="1cbb" id="1cbb" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 405px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 57.9%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="0*7akOMsnPRwJujPUh" data-width="1702" data-height="985" data-action="zoom" data-action-value="0*7akOMsnPRwJujPUh"><img src="https://cdn-images-1.medium.com/freeze/max/60/0*7akOMsnPRwJujPUh?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/0*7akOMsnPRwJujPUh"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/0*7akOMsnPRwJujPUh"></noscript></div></div><figcaption class="imageCaption">VS Code has become the text editor of choice for JS hipsters. (Chart from <a href="https://2018.stateofjs.com/other-tools/" data-href="https://2018.stateofjs.com/other-tools/" class="markup--anchor markup--figure-anchor" rel="noopener nofollow" target="_blank">State of JavaScript Survey, 2018</a>)</figcaption></figure><p name="a46f" id="a46f" class="graf graf--p graf-after--figure">Both products are still actively developed, and there’s no indication that Microsoft intends to sunset Visual Studio.</p><h4 name="2a79" id="2a79" class="graf graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">Lessons</strong></h4><p name="fcef" id="fcef" class="graf graf--p graf-after--h4">In stark contrast to Netscape’s experience, Microsoft succeeded in building an <strong class="markup--strong markup--p-strong">active open source community </strong>around VS Code. This community has multiplied the efforts of the in-house development team.</p><figure name="c81f" id="c81f" class="graf graf--figure graf--layoutOutsetLeft graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 525px; max-height: 211px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 40.2%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*3HbgJZIIKG2ObVdS_ddjKg.png" data-width="900" data-height="362" data-action="zoom" data-action-value="1*3HbgJZIIKG2ObVdS_ddjKg.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*3HbgJZIIKG2ObVdS_ddjKg.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*3HbgJZIIKG2ObVdS_ddjKg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*3HbgJZIIKG2ObVdS_ddjKg.png"></noscript></div></div><figcaption class="imageCaption">Of all the open source projects on GitHub, Visual Studio Code is ranked thirteenth by number of stars — coincidentally, just below Linux!</figcaption></figure><p name="a129" id="a129" class="graf graf--p graf-after--figure">Of course, not everyone has a business model that will support completely open sourcing their core product.</p><p name="23b3" id="23b3" class="graf graf--p graf-after--p">But if open source is a part of your development strategy, it might be worth comparing these two case studies to find out what Microsoft did so differently that caused this community to flourish.</p><p name="1157" id="1157" class="graf graf--p graf-after--p">Another multiplier: Microsoft also equipped VS Code with a <strong class="markup--strong markup--p-strong">solid extensibility model</strong>, and as a result nearly 10,000 extensions have been written by the community.</p><p name="de94" id="de94" class="graf graf--p graf-after--p">One final takeaway from the VS Code story is that things have changed fundamentally in the last few years, in a way that makes it <strong class="markup--strong markup--p-strong">easier than ever to prototype and create software</strong>.</p><p name="2353" id="2353" class="graf graf--p graf-after--p graf--trailing">In spite all of the <a href="https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f" data-href="https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">hand-wringing about the complexity of today’s toolset</a>, the fact is that the JavaScript ecosystem has evolved over the last few years into the long-awaited promised land of reusable, modular open-source code. In that respect, this is a historically unprecedented time.</p></div></div></section>
  455. <section name="19df" class="section section--body"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><figure name="b6b9" id="b6b9" class="graf graf--figure graf--leading"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 386px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 55.2%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*HsQljVFhzHAB2dg5s1-XKw.jpeg" data-width="2863" data-height="1579" data-action="zoom" data-action-value="1*HsQljVFhzHAB2dg5s1-XKw.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*HsQljVFhzHAB2dg5s1-XKw.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*HsQljVFhzHAB2dg5s1-XKw.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*HsQljVFhzHAB2dg5s1-XKw.jpeg"></noscript></div></div></figure><h3 name="acd9" id="acd9" class="graf graf--h3 graf-after--figure">4. Gmail &amp; Inbox</h3><figure name="735b" id="735b" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 78px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 11.1%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*eRBm_cUduNQyBzu-spXhNw.png" data-width="1023" data-height="114" data-action="zoom" data-action-value="1*eRBm_cUduNQyBzu-spXhNw.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*eRBm_cUduNQyBzu-spXhNw.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*eRBm_cUduNQyBzu-spXhNw.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*eRBm_cUduNQyBzu-spXhNw.png"></noscript></div></div><figcaption class="imageCaption"><strong class="markup--strong markup--figure-strong">Key:</strong> 🌇 = sunset</figcaption></figure><p name="d49d" id="d49d" class="graf graf--p graf-after--figure">Inbox for Gmail was originally introduced as a stripped-down alternative UX for Gmail “designed to focus on what really matters”. It never approached feature parity with the original Gmail, and it introduced new features like bundles, pinned emails, and snoozed messages.</p><p name="eda6" id="eda6" class="graf graf--p graf-after--p">Some people, including me, adopted Inbox enthusiastically. I always assumed that Inbox was a preview of what Gmail would eventually become, and put up with the lack of some of Gmail’s niceties with the expectation that they’d eventually make it over to Inbox.</p><h4 name="270b" id="270b" class="graf graf--h4 graf-after--p">Two interfaces, one service</h4><p name="929f" id="929f" class="graf graf--p graf-after--h4">Both Inbox and Gmail used the same back end. They were essentially just different user interfaces for the same service, and you could switch back and forth at will. This had advantages and disadvantages: If Inbox was missing a feature (say, vacation autoresponders) you could always go back to Gmail and do what you needed there. But there was some inevitable weirdness when switching back and forth.</p><p name="51f5" id="51f5" class="graf graf--p graf-after--p">After a while, though, Inbox stopped improving, and it became clear that Google was no longer investing any resources in it. Sure enough, four years after it was launched, Google announced that it would be <a href="https://www.theverge.com/2018/9/12/17848500/google-inbox-shut-down-sunset-snooze-email-march-2019" data-href="https://www.theverge.com/2018/9/12/17848500/google-inbox-shut-down-sunset-snooze-email-march-2019" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">sunsetting Inbox</a>.</p><figure name="4fc8" id="4fc8" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 642px; max-height: 292px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 45.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*HAJTdggR4LBx2dXlBOb6Bw.png" data-width="642" data-height="292"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*HAJTdggR4LBx2dXlBOb6Bw.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*HAJTdggR4LBx2dXlBOb6Bw.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*HAJTdggR4LBx2dXlBOb6Bw.png"></noscript></div></div></figure><p name="d1fa" id="d1fa" class="graf graf--p graf-after--figure">I was initially very annoyed, but after spending a little time with the latest version of Gmail, I found that <strong class="markup--strong markup--p-strong">many of my favorite features from Inbox had been ported to the original product</strong>: Smart Reply, hover actions, and inline attachments and images. Gmail’s multiple inboxes were a good-enough stand-in for Inbox’s bundles.</p><p name="2c98" id="2c98" class="graf graf--p graf-after--p">But not everything made it over: Snoozing, for example, became a critical part of how many people dealt with email; and the demise of Inbox left them high and dry.</p><h4 name="0b26" id="0b26" class="graf graf--h4 graf-after--p">Lessons</h4><p name="4215" id="4215" class="graf graf--p graf-after--h4">Inbox gave the Gmail team a way to <strong class="markup--strong markup--p-strong">experiment with features without disrupting workflows</strong> for the vast majority of users who didn’t choose to switch over.</p><p name="2f56" id="2f56" class="graf graf--p graf-after--p">By committing to having both versions use the <strong class="markup--strong markup--p-strong">same back end</strong>, though, Gmail put <strong class="markup--strong markup--p-strong">hard limits on their own ability to innovate</strong>.</p><p name="ee38" id="ee38" class="graf graf--p graf-after--p">Google got a lot of criticism, yet again, for shutting down a popular service. Of course, Google <a href="https://www.businessinsider.com/why-people-still-love-google-glass-2016-5?IR=T" data-href="https://www.businessinsider.com/why-people-still-love-google-glass-2016-5?IR=T" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">discontinues</a> <a href="https://www.businessinsider.com/google-puts-wave-out-of-its-misery-2010-8?IR=T" data-href="https://www.businessinsider.com/google-puts-wave-out-of-its-misery-2010-8?IR=T" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">products</a> <a href="https://www.businessinsider.com/why-google-killed-google-reader-2013-6?IR=T" data-href="https://www.businessinsider.com/why-google-killed-google-reader-2013-6?IR=T" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">all</a> <a href="https://www.theverge.com/2018/12/10/18134541/google-plus-privacy-api-data-leak-developers" data-href="https://www.theverge.com/2018/12/10/18134541/google-plus-privacy-api-data-leak-developers" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">the</a> <a href="https://www.businessinsider.es/google-allo-shut-down-report-2018-12?r=US&amp;IR=T" data-href="https://www.businessinsider.es/google-allo-shut-down-report-2018-12?r=US&amp;IR=T" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">time</a>, so what did we expect.</p><p name="a76a" id="a76a" class="graf graf--p graf-after--p">In this case, Google’s original messaging around Inbox led us to believe that we were getting an early look at the future of Gmail. As DHH would say, this was not a beautiful sunset; for many people it sucked to have to go back to the old product, and lose Inbox’s innovative workflows.</p><p name="5cef" id="5cef" class="graf graf--p graf-after--p graf--trailing">I think there would have been less unhappiness if Gmail had gone all the way to feature parity with Inbox before it was shuttered.</p></div></div></section>
  456. <section name="c599" class="section section--body"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><figure name="e750" id="e750" class="graf graf--figure graf--leading"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 360px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 51.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*-Z7XkyKIXuDV-D3Sr1XJIg.png" data-width="1100" data-height="566" data-action="zoom" data-action-value="1*-Z7XkyKIXuDV-D3Sr1XJIg.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*-Z7XkyKIXuDV-D3Sr1XJIg.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*-Z7XkyKIXuDV-D3Sr1XJIg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*-Z7XkyKIXuDV-D3Sr1XJIg.png"></noscript></div></div></figure><h3 name="07b1" id="07b1" class="graf graf--h3 graf-after--figure">5. FogBugz &amp; Trello</h3><figure name="ae44" id="ae44" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 89px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 12.7%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*uH34if4XA-_ikUdjeC5s3g.png" data-width="1023" data-height="130" data-action="zoom" data-action-value="1*uH34if4XA-_ikUdjeC5s3g.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*uH34if4XA-_ikUdjeC5s3g.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*uH34if4XA-_ikUdjeC5s3g.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*uH34if4XA-_ikUdjeC5s3g.png"></noscript></div></div><figcaption class="imageCaption"><strong class="markup--strong markup--figure-strong">Key</strong>: 😟 = sad decline, 🤑 money money money</figcaption></figure><p name="3033" id="3033" class="graf graf--p graf-after--figure">FogBugz is a particularly interesting case, since it was Joel Spolsky’s product: It gives us a look at how the never-rewrite principle plays out with a real-world product.</p><p name="8554" id="8554" class="graf graf--p graf-after--p">Before there was Jira, before there was GitHub Issues, there was a web-based bug-tracking product called FogBugz. Released in 2000, it was the first product of Fog Creek Software, the firm Joel had recently founded with Michael Pryor; and it was their flagship product for more than a decade. They initially only sold it as shrink-wrapped software to be installed on your own servers, but later came out with a hosted, subscription version.</p><p name="579e" id="579e" class="graf graf--p graf-after--p">It became very popular, especially among the kind of developer who, like me, followed Joel’s blog and took his advice to heart. My company used it for many years; it was a great product for its time.</p><p name="dbb3" id="dbb3" class="graf graf--p graf-after--p">FogBugz was originally written in classic ASP, which ran on Windows servers. When ASP.NET came out, Joel explained why he was <a href="https://www.joelonsoftware.com/2002/04/11/our-net-strategy/" data-href="https://www.joelonsoftware.com/2002/04/11/our-net-strategy/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">in no hurry to upgrade</a>.</p><p name="45c3" id="45c3" class="graf graf--p graf-after--p">In order to allow people to install FogBugz on Linux servers, an intern wrote a compiler, named Thistle, to convert classic ASP to PHP. By 2006 Thistle had evolved into a private home-grown language called Wasabi that compiled to ASP, PHP, and client-side JavaScript.</p><h4 name="598a" id="598a" class="graf graf--h4 graf-after--p">The strange story of Wasabi</h4><p name="83c9" id="83c9" class="graf graf--p graf-after--h4">Now developing an in-house, proprietary programming language and compiler is — let’s just say it’s an eccentric choice. So bear with me on a brief detour.</p><p name="8d1d" id="8d1d" class="graf graf--p graf-after--p">At one point <a href="https://www.joelonsoftware.com/2006/09/01/language-wars/" data-href="https://www.joelonsoftware.com/2006/09/01/language-wars/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Joel described Wasabi in an off-hand paragraph at the end of a blog post</a>. Apparently some people thought he wasn’t serious, and he <a href="https://www.joelonsoftware.com/2006/09/01/wasabi/" data-href="https://www.joelonsoftware.com/2006/09/01/wasabi/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">clarified that he was</a>. This caused fellow blogger Jeff Atwood’s <a href="https://blog.codinghorror.com/has-joel-spolsky-jumped-the-shark/" data-href="https://blog.codinghorror.com/has-joel-spolsky-jumped-the-shark/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">head to explode</a>:</p><blockquote name="7012" id="7012" class="graf graf--blockquote graf-after--p">Writing your own language is absolutely beyond the pale. It’s a toxic decision that is so completely at odds with Joel’s previous excellent and sane advice on software development that <em class="markup--em markup--blockquote-em">people literally thought he was joking</em>.</blockquote><p name="bd9e" id="bd9e" class="graf graf--p graf-after--blockquote">Joel <a href="https://discourse.codinghorror.com/t/has-joel-spolsky-jumped-the-shark/732/48" data-href="https://discourse.codinghorror.com/t/has-joel-spolsky-jumped-the-shark/732/48" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">maintained</a> that it all made business sense: Of course you wouldn’t invent your own language if you were starting from a clean slate. But if you look at each decision along the way, considering the technological context <em class="markup--em markup--p-em">at the time</em> and the codebase they had <em class="markup--em markup--p-em">at the time</em>, you can see how you would end up there.</p><p name="0a10" id="0a10" class="graf graf--p graf-after--p">Reflecting on Wasabi in a thoughtful essay titled “<a href="https://https.www.google.com.tedunangst.com/flak/post/technical-debt-and-tacking-into-the-wind" data-href="https://https.www.google.com.tedunangst.com/flak/post/technical-debt-and-tacking-into-the-wind" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Technical Debt and Tacking Into the Wind</a>”, former Fog Creek engineer Ted Unangst compares the process to traveling without a map:</p><blockquote name="686d" id="686d" class="graf graf--blockquote graf-after--p">Imagine you’re in Savannah, Georgia and you want to go to London, England. You don’t have a map, just a vague sense of direction. … You can’t go in a straight line, at least not without building a boat, because there’s an ocean in the way. But there’s a nice beach leading northeast, which is in the direction you want to go. Off you go. Time passes. You notice you’re not heading directly to your destination, but with each step you take, you are getting closer.</blockquote><blockquote name="cded" id="cded" class="graf graf--blockquote graf-after--blockquote">Somewhere around Boston, or maybe Nova Scotia, you finally stop and think about your choices. Maybe this isn’t the way to London. From high above in the peanut gallery, you can hear the cackles. “Hahaha, look at these retards. Can’t tell the difference between England and New England. Get these fools a map.” But that’s just the thing; you didn’t have a map. Maps are made by people who, almost by definition, don’t know where they’re going.</blockquote><p name="fb19" id="fb19" class="graf graf--p graf-after--blockquote">At any rate, as Jacob Krall, another former Fog Creek developer, <a href="https://jacob.jkrall.net/killing-off-wasabi-part-1" data-href="https://jacob.jkrall.net/killing-off-wasabi-part-1" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">explains</a>, this decision traded off developer velocity today for maintainability tomorrow — the definition of technical debt — and by 2010 the bill for this debt was starting to come due.</p><blockquote name="0be7" id="0be7" class="graf graf--blockquote graf-after--p">We hadn’t open-sourced [Wasabi], so this meant any investment had to be done by us at the expense of our main revenue-generating products. … It was a huge dependency that required a full-time developer — not cheap for a company of our size. It occasionally barfed on a piece of code that was completely reasonable to humans. It was slow to compile. Visual Studio wasn’t able to easily edit or attach a debugger to FogBugz. … All new hires had an extensive period of learning Wasabi, regardless of their previous experience. … What’s more, we weren’t living in a vacuum. Programming languages were of course improving outside of Fog Creek. … Developers began to feel like their brilliant ideas were being constrained by the limitations of our little Wasabi universe.</blockquote><h4 name="8966" id="8966" class="graf graf--h4 graf-after--blockquote">An inflection point</h4><p name="9672" id="9672" class="graf graf--p graf-after--h4">At this point, a decade in, FogBugz was a mature and stable product. <a href="https://blog.codinghorror.com/introducing-stackoverflow-com/" data-href="https://blog.codinghorror.com/introducing-stackoverflow-com/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Joel had created Stack Overflow as a side project with Jeff Atwood</a> (presumably his exploded head had had time to heal by then).</p><p name="32c0" id="32c0" class="graf graf--p graf-after--p">FogBugz wasn’t setting the world on fire, and it was showing its age. While the market for bug trackers was still fragmented, Atlassian’s Jira — which had come out a couple of years after FogBugz — had become the default choice, especially for bigger enterprise users.</p><p name="9e66" id="9e66" class="graf graf--p graf-after--p">I’m a little fascinated by this particular inflection point in Fog Creek’s history. Like Basecamp, they had a profitable, mature product. It was no longer sexy, and probably not very exciting to work on. It embodied, for better and for worse, years of technological shifts and evolving ideas about how to solve a specific problem space.</p><p name="f78d" id="f78d" class="graf graf--p graf-after--p">One response, of course, would have been to do as Basecamp did: Take everything Fog Creek had learned about bug tracking, and reinvent FogBugz, starting from a clean slate.</p><p name="a58e" id="a58e" class="graf graf--p graf-after--p">I’m guessing this idea didn’t go very far— “things you should never do”, “worst strategic mistake”, etc. etc.</p><p name="c6aa" id="c6aa" class="graf graf--p graf-after--p">I recently came across an article from 2009, when Joel was writing a monthly column for <em class="markup--em markup--p-em">Inc. Magazine.</em> This column, titled “<a href="https://web.archive.org/web/20151212054843/https://www.inc.com/magazine/20091101/does-slow-growth-equal-slow-death.html" data-href="https://web.archive.org/web/20151212054843/https://www.inc.com/magazine/20091101/does-slow-growth-equal-slow-death.html" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Does Slow Growth Equal Slow Death?</a>”, has a very different tone from his usual self-assured bombast: It’s introspective, tentative, doubtful. He frets about Atlassian’s rapid growth — wondering if in the end there’s only space for one product in the bug-tracking market.</p><blockquote name="e5bb" id="e5bb" class="graf graf--blockquote graf-after--p">I had to wonder. We do have a large competitor in our market that appears to be growing a lot faster than we are. The company is closing big deals with big, enterprise customers. … Meanwhile, our product is miles better, and we’re a well-run company, but it doesn’t seem to matter. Why?</blockquote><p name="1ac3" id="1ac3" class="graf graf--p graf-after--blockquote">So he resolves to do two things. First, <strong class="markup--strong markup--p-strong">add All The Features to FogBugz</strong>:</p><blockquote name="18c9" id="18c9" class="graf graf--blockquote graf-after--p">That&#39;s the development team&#39;s mission for 2010: to eliminate any possible reason that customers might buy our competitors&#39; junk, just because there is some dinky little feature that they told themselves they absolutely couldn&#39;t live without. I don&#39;t think this is going to be very hard, frankly.</blockquote><p name="69c2" id="69c2" class="graf graf--p graf-after--blockquote">Second, <strong class="markup--strong markup--p-strong">build up an enterprise sales force</strong>. Joel confesses that this is something that he’s not good at, and finds distasteful.</p><p name="6e67" id="6e67" class="graf graf--p graf-after--p">I don’t know how either of those two plans played out. The last time Joel ever mentioned FogBugz on his blog was a perfunctory announcement of a minor release <a href="https://www.joelonsoftware.com/2010/05/18/news-128/" data-href="https://www.joelonsoftware.com/2010/05/18/news-128/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">a few months later</a>.</p><h4 name="277b" id="277b" class="graf graf--h4 graf-after--p">A new hope</h4><p name="4179" id="4179" class="graf graf--p graf-after--h4">What did happen was <a href="https://www.joelonsoftware.com/2011/09/13/announcing-trello/" data-href="https://www.joelonsoftware.com/2011/09/13/announcing-trello/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">this</a>:</p><blockquote name="173c" id="173c" class="graf graf--blockquote graf-after--p">Around the time of Fog Creek Software’s ten year anniversary, I started thinking that if we want to keep our employees excited and motivated for another ten years, we were going to need some new things to work on.</blockquote><p name="9595" id="9595" class="graf graf--p graf-after--blockquote">So they split up into teams of two, with each team working to come up with and prototype a new product idea.</p><p name="7ae1" id="7ae1" class="graf graf--p graf-after--p">The winning idea was inspired by the <a href="https://en.wikipedia.org/wiki/Kanban_board" data-href="https://en.wikipedia.org/wiki/Kanban_board" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Kanban board</a> — a physical tool, often used in software development, generally involving Post-It notes distributed across columns on a whiteboard.</p><p name="255c" id="255c" class="graf graf--p graf-after--p">Joel presented it as a tool for managing work at a higher level than FogBugz allowed:</p><blockquote name="a598" id="a598" class="graf graf--blockquote graf-after--p">Honestly, with all the fancy-schmancy “project management” software out there, I never found a way to keep track of who’s supposed to be working on what. … As the founder of two companies it was starting to get distracting to walk down the hallways seeing dozens of people getting paid to sit at computers … and I had no idea if they were doing the exact right thing, or maybe something they thought was important but which, nevertheless, was not, actually, important.</blockquote></div>
  457. <div class="section-inner sectionLayout--outsetRow" data-paragraph-count="2"><figure name="5868" id="5868" class="graf graf--figure graf--layoutOutsetRow is-partialWidth graf-after--blockquote" style="width: 43.223%;"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 75%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*dgfONO_ojuTUiC1-p8XVZg.jpeg" data-width="1024" data-height="768" data-action="zoom" data-action-value="1*dgfONO_ojuTUiC1-p8XVZg.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*dgfONO_ojuTUiC1-p8XVZg.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*dgfONO_ojuTUiC1-p8XVZg.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*dgfONO_ojuTUiC1-p8XVZg.jpeg"></noscript></div></div></figure><figure name="df53" id="df53" class="graf graf--figure graf--layoutOutsetRowContinue is-partialWidth graf-after--figure" style="width: 56.777%;"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 57.099999999999994%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*fN4ioxLuPStMewVPi8w4OA.png" data-width="1000" data-height="571" data-action="zoom" data-action-value="1*fN4ioxLuPStMewVPi8w4OA.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*fN4ioxLuPStMewVPi8w4OA.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1200/1*fN4ioxLuPStMewVPi8w4OA.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1200/1*fN4ioxLuPStMewVPi8w4OA.png"></noscript></div></div></figure></div>
  458. <div class="section-inner sectionLayout--insetColumn"><p name="2be4" id="2be4" class="graf graf--p graf-after--figure">In building Trello, Fog Creek’s developers got a chance to use contemporary technologies, for a change:</p><blockquote name="85a8" id="85a8" class="graf graf--blockquote graf-after--p">We use cutting edge technology. Often, this means we get cut fingers. Our developers bleed all over MongoDB, WebSockets, CoffeeScript and Node. But at least they’re having fun. And in today’s tight job market, great programmers have a lot of sway on what they’re going to be working on. If you can give them an exciting product … they’ll have fun and they’ll love their jobs.</blockquote><p name="0b57" id="0b57" class="graf graf--p graf-after--blockquote">Trello also multiplied their in-house development team’s efforts by enabling third-party plug-ins from the beginning:</p><blockquote name="1042" id="1042" class="graf graf--blockquote graf-after--p">The API and plug-in architectures are the highest priority. … Never build anything in-house if you can expose a basic API and get those high-value users … to build it for you. On the Trello team, any feature that can be provided by a plug-in must be provided by a plug-in.</blockquote><p name="979e" id="979e" class="graf graf--p graf-after--blockquote">Programmers, of course, saw the utility of Trello right away; but there was nothing in the tool that was specific to software development. Joel <a href="https://www.joelonsoftware.com/2012/01/06/how-trello-is-different/" data-href="https://www.joelonsoftware.com/2012/01/06/how-trello-is-different/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">described it</a> as useful for “anything where you want to maintain a <em class="markup--em markup--p-em">list of lists </em>with a group of people.” Trello was soon being used to organize everything from <a href="https://trello.com/b/E4UE6LGG/serious-eats-with-j-kenji-lópez-alt-the-food-lab" data-href="https://trello.com/b/E4UE6LGG/serious-eats-with-j-kenji-lópez-alt-the-food-lab" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">weekly meals</a> to <a href="http://totravelandbeyond.com/trello-for-wedding-planning/" data-href="http://totravelandbeyond.com/trello-for-wedding-planning/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">weddings</a> to <a href="https://trello.com/b/pyqI4Zki/apa-dog-foster-program-plea-board" data-href="https://trello.com/b/pyqI4Zki/apa-dog-foster-program-plea-board" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">animal shelters</a>.</p><p name="ee1f" id="ee1f" class="graf graf--p graf-after--p">Where FogBugz was a <strong class="markup--strong markup--p-strong">vertical</strong> product — targeted at a specific niche market — Trello was a <strong class="markup--strong markup--p-strong">horizontal </strong>product, that could be used by anyone for anything. Joel argues that “going horizontal” was the right thing to do for FogBugz at this juncture:</p><blockquote name="4d93" id="4d93" class="graf graf--blockquote graf-after--p">Making a major horizontal product that’s useful in any walk of life is almost impossible to pull off. You can’t charge very much, because you’re competing with other horizontal products that can amortize their development costs across a huge number of users. It’s high risk, high reward: not suitable for a young bootstrapped startup, but not a bad idea for a second or third product from a mature and stable company like Fog Creek.</blockquote><p name="2d8b" id="2d8b" class="graf graf--p graf-after--blockquote">In order to scale up quickly to lots and lots of users, Trello was initially offered for free. A paid “<a href="https://thenextweb.com/insider/2013/04/30/trello-unveils-new-business-class-service/#gref" data-href="https://thenextweb.com/insider/2013/04/30/trello-unveils-new-business-class-service/#gref" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">business class</a>” plan was introduced later.</p><p name="98cc" id="98cc" class="graf graf--p graf-after--p">In 2014, <a href="https://www.joelonsoftware.com/2014/07/24/trello-inc/" data-href="https://www.joelonsoftware.com/2014/07/24/trello-inc/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Trello was spun out</a> into a separate company. Three years later, with over 17 million users, <a href="http://fortune.com/2017/01/09/trello-sold-atlassian/" data-href="http://fortune.com/2017/01/09/trello-sold-atlassian/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Trello was sold for $425 million</a>. In an ironic twist, the buyer was Atlassian, Fog Creek’s old nemesis.</p><h4 name="b8c3" id="b8c3" class="graf graf--h4 graf-after--p">Meanwhile back at the ranch…</h4><p name="60fd" id="60fd" class="graf graf--p graf-after--h4">Fog Creek went on to develop yet another new product, a collaborative programming environment first called <a href="https://www.joelonsoftware.com/2016/05/31/introducing-hyperdev/" data-href="https://www.joelonsoftware.com/2016/05/31/introducing-hyperdev/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">HyperDev</a>, then <a href="https://medium.com/@anildash/introducing-gomix-aec205c421cb" data-href="https://medium.com/@anildash/introducing-gomix-aec205c421cb" class="markup--anchor markup--p-anchor" target="_blank">GoMix</a>, and finally renamed to <a href="https://medium.com/glitch/welcome-to-glitch-fe161d0fc39b" data-href="https://medium.com/glitch/welcome-to-glitch-fe161d0fc39b" class="markup--anchor markup--p-anchor" target="_blank">Glitch</a>.</p><p name="65c5" id="65c5" class="graf graf--p graf-after--p">In the meantime, FogBugz languished in obscurity. In 2017 someone decided that FogBugz was a dumb name, and engineering efforts went into re-branding the product as <a href="https://medium.com/make-better-software/introducing-manuscript-aa4aabdc0f6c" data-href="https://medium.com/make-better-software/introducing-manuscript-aa4aabdc0f6c" class="markup--anchor markup--p-anchor" target="_blank">Manuscript</a>. A year later — just a few months ago — Fog Creek sold the product to a small company called <a href="https://devfactory.com/" data-href="https://devfactory.com/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">DevFactory</a>, which <a href="https://mjtsai.com/blog/2018/08/23/manuscript-fogbugz-sold-to-devfactory/" data-href="https://mjtsai.com/blog/2018/08/23/manuscript-fogbugz-sold-to-devfactory/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">immediately changed the name back to FogBugz</a>.</p><p name="c05d" id="c05d" class="graf graf--p graf-after--p">Under CEO <a href="https://medium.com/@anildash" data-href="https://medium.com/@anildash" data-anchor-type="2" data-user-id="a75df5e8a16c" data-action-value="a75df5e8a16c" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Anil Dash</a>, Fog Creek became a single-product company and <a href="https://glitch.com/about/fog-creek-is-now-glitch/" data-href="https://glitch.com/about/fog-creek-is-now-glitch/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">changed its name to Glitch</a>.</p><h4 name="f91a" id="f91a" class="graf graf--h4 graf-after--p">Lessons</h4><p name="fe50" id="fe50" class="graf graf--p graf-after--h4">I have a lot of feelings about all of this.</p><p name="cec0" id="cec0" class="graf graf--p graf-after--p">The key to understanding this whole story is that Fog Creek was never <em class="markup--em markup--p-em">about</em> bug tracking as much as it was about a <a href="https://www.joelonsoftware.com/2009/11/01/figuring-out-what-your-company-is-all-about/" data-href="https://www.joelonsoftware.com/2009/11/01/figuring-out-what-your-company-is-all-about/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">empowering programmers</a> — starting with their own:</p><blockquote name="c941" id="c941" class="graf graf--blockquote graf-after--p">Making a nice place to work was our primary objective. We had private offices, flew first class, worked 40 hour weeks, and bought people lunch, Aeron chairs, and top of the line computers. We shared our ingenious formula with the world: <strong class="markup--strong markup--blockquote-strong">Great working conditions 🡒 Great programmers 🡒 Great software 🡒 Profit!</strong></blockquote><p name="fc1a" id="fc1a" class="graf graf--p graf-after--blockquote">With this “formula” in mind, maybe we can put together a coherent and encouraging narrative: Fog Creek built a business around developer happiness. This was reflected both in the company’s products and its internal “<a href="https://www.joelonsoftware.com/2014/07/24/trello-inc/" data-href="https://www.joelonsoftware.com/2014/07/24/trello-inc/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">operating system</a>”. Its first product, a bug tracker, provided a foundation for launching a new product that solved a similar problem in a more broadly applicable way.</p><p name="6a93" id="6a93" class="graf graf--p graf-after--p">I think it’s really telling that Trello’s origin story, the way Joel tells it, is not so much Joel looking for a new business opportunity, as it was Joel <em class="markup--em markup--p-em">looking for a way to keep Fog Creek’s developers happy and engaged</em>. Creating a product worth half a billion dollars, that was just a pleasant unintended consequence.</p><p name="f2a5" id="f2a5" class="graf graf--p graf-after--p">I can’t help but be a little sad about the way things ended up for FogBugz, though. I don’t imagine there was a lot of developer happiness going on during the product’s final days at Fog Creek.</p><p name="b306" id="b306" class="graf graf--p graf-after--p">Clearly all the people involved had bigger fish to fry: Stack Overflow, Trello, and Glitch are each individually far more useful and valuable than FogBugz could ever be; and any given person can only do so much with their time. So I can’t begrudge anyone in particular for losing interest in FogBugz, with its two-decade-old codebase and its competitive niche market. And at least its loyal users found a good home, and didn’t get the “sunset” treatment!</p><p name="fd5a" id="fd5a" class="graf graf--p graf-after--p graf--trailing">But the sentimental part of me wishes there had been a better way to “honor the legacy” of all the people who created it and used it over all those years.</p></div></div></section>
  459. <section name="f79f" class="section section--body"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><figure name="7c1d" id="7c1d" class="graf graf--figure graf--leading"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 675px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 96.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*ufzuYj4qIXXLDQMS7EqZqQ.png" data-width="848" data-height="818" data-action="zoom" data-action-value="1*ufzuYj4qIXXLDQMS7EqZqQ.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*ufzuYj4qIXXLDQMS7EqZqQ.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*ufzuYj4qIXXLDQMS7EqZqQ.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*ufzuYj4qIXXLDQMS7EqZqQ.png"></noscript></div></div></figure><h3 name="91bb" id="91bb" class="graf graf--h3 graf-after--figure">6. FreshBooks &amp; BillSpring</h3><figure name="f8d1" id="f8d1" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 93px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 13.3%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*sR8NUhzeHPwMft1fcpasww.png" data-width="1023" data-height="136" data-action="zoom" data-action-value="1*sR8NUhzeHPwMft1fcpasww.png"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*sR8NUhzeHPwMft1fcpasww.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*sR8NUhzeHPwMft1fcpasww.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*sR8NUhzeHPwMft1fcpasww.png"></noscript></div></div><figcaption class="imageCaption"><strong class="markup--strong markup--figure-strong">Key</strong>: 🕵️‍♀️ = undercover operation</figcaption></figure><p name="6642" id="6642" class="graf graf--p graf-after--figure">This has already turned into a much longer article than I ever imagined, but I can’t leave this story out. Stick with me, it has a great twist.</p><h4 name="0dfb" id="0dfb" class="graf graf--h4 graf-after--p">Stop me if you’ve heard this before</h4><p name="7e28" id="7e28" class="graf graf--p graf-after--h4">In the early 2000s, <a href="https://medium.com/@MikeMcDerment" data-href="https://medium.com/@MikeMcDerment" data-anchor-type="2" data-user-id="ab155ac24cd6" data-action-value="ab155ac24cd6" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Mike McDerment</a> owned a small design agency. He was using Word and Excel to make invoices, having decided that accounting software was too complicated for what he needed.</p><p name="a7be" id="a7be" class="graf graf--p graf-after--p">This system was good enough <a href="https://lifehacker.com/im-freshbooks-co-founder-mike-mcderment-and-this-is-ho-1825693501" data-href="https://lifehacker.com/im-freshbooks-co-founder-mike-mcderment-and-this-is-ho-1825693501" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">until it wasn’t</a>:</p><blockquote name="166e" id="166e" class="graf graf--blockquote graf-after--p">I hit my breaking point one day when I accidentally saved over an important client invoice — I just kinda snapped. I knew there had to be a better way, so I spent the next two weeks coding what would become the foundation of what is now FreshBooks.</blockquote><p name="8083" id="8083" class="graf graf--p graf-after--blockquote">Mike was a designer, not a programmer, but he and two co-founders managed to cobble together a tool good enough for a few people to pay $10 a month to use it. <a href="https://www.forbes.com/sites/boburlingham/2017/05/09/starting-over/#357508b957ce" data-href="https://www.forbes.com/sites/boburlingham/2017/05/09/starting-over/#357508b957ce" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">It took nearly four years</a> for the business to make enough for him to move out of his parents’ basement.</p><p name="4c84" id="4c84" class="graf graf--p graf-after--p">By the product’s 10-year anniversary (is this starting to sound familiar?) FreshBooks was solidly profitable, with more than 10 million users and 300 employees.</p><p name="b054" id="b054" class="graf graf--p graf-after--p">Just one problem: By the time they managed to hire “real” programmers, they had a million lines of “founder code”. An outside analyst reviewed their codebase and concluded:</p><blockquote name="77b9" id="77b9" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“The good news is that you’ve solved the hardest problem. You’ve figured out how to build a business, and you have a product that people love. <strong class="markup--strong markup--blockquote-strong">The bad news is that you guys stink at technology.</strong>”</blockquote><p name="53f7" id="53f7" class="graf graf--p graf-after--blockquote">More importantly, though, they had new ideas that the existing product wouldn’t accommodate:</p><blockquote name="37c0" id="37c0" class="graf graf--blockquote graf-after--p">We started the company more than a decade ago; the world has changed and we’ve learned a lot about building products and serving people who work for themselves. While self-employed professionals and their teams are a massive and growing part of the labor force … For FreshBooks to be able to keep pace and to serve that group well in five years’ time, we knew we needed to act.</blockquote><p name="896b" id="896b" class="graf graf--p graf-after--blockquote">McDerment had <a href="https://www.cpapracticeadvisor.com/article/12402863/undercover-operation-results-in-new-version-of-freshbooks" data-href="https://www.cpapracticeadvisor.com/article/12402863/undercover-operation-results-in-new-version-of-freshbooks" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">absorbed the conventional wisdom</a> about starting from scratch:</p><blockquote name="8720" id="8720" class="graf graf--blockquote graf-after--p">There’s no greater risk for a software company than rewriting. Chances are you won’t even finish the project. It will take longer than you think. It will cost more. When you do it, the customers could like it less. And there are no guarantees that by building a new platform it’s a better product. The number one rule in software is you don’t re-platform your software.</blockquote><p name="3fca" id="3fca" class="graf graf--p graf-after--blockquote">So they made a couple of attempts to clean up the mess without starting over; but found it impossible to “change tires on a moving vehicle”.</p><h4 name="6689" id="6689" class="graf graf--h4 graf-after--p">What happened next may surprise you</h4><p name="336d" id="336d" class="graf graf--p graf-after--h4">The idea that McDerment finally hit on was to secretly create a “competitor” to FreshBooks.</p><p name="b07b" id="b07b" class="graf graf--p graf-after--p">He incorporated a completely new company, named BillSpring, in Delaware. The new company had its own URL and its own branding and logo. Careful to keep the two companies from being linked, he had an outside lawyer draft new terms of service.</p><p name="81b0" id="81b0" class="graf graf--p graf-after--p">The development team adopted the book <a href="https://www.amazon.com/Lean-UX-Designing-Great-Products/dp/1491953608" data-href="https://www.amazon.com/Lean-UX-Designing-Great-Products/dp/1491953608" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Lean UX: Designing Great Products with Agile Teams</em></a> by <a href="https://medium.com/@jboogie" data-href="https://medium.com/@jboogie" data-anchor-type="2" data-user-id="94a2a063be85" data-action-value="94a2a063be85" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Jeff Gothelf</a> and <a href="https://medium.com/@jseiden" data-href="https://medium.com/@jseiden" data-anchor-type="2" data-user-id="7f786c230ca9" data-action-value="7f786c230ca9" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Josh Seiden</a> as their guidebook, and put in place Agile practices like scrum teams and weekly iterations with review sessions with real customers. McDerment told them to think of themselves as a startup and himself as their venture capitalist:</p><blockquote name="c3d3" id="c3d3" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“You’ve got four and a half months. If you’re in the market by then, we’ll give you more money. Otherwise, we’re out.”</blockquote><p name="09e9" id="09e9" class="graf graf--p graf-after--blockquote">The team managed to come up with an MVP a few days before the deadline. They bought Google AdWords to send traffic to the new site. They offered free accounts for the first year. Before long they had actual users, and they started iterating quickly to polish the product.</p><p name="c198" id="c198" class="graf graf--p graf-after--p">When the first year was up, they started charging BillSpring customers. At one point the new product was <a href="https://www.inc.com/leigh-buchanan/why-you-should-become-your-own-competitor.html" data-href="https://www.inc.com/leigh-buchanan/why-you-should-become-your-own-competitor.html" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">validated in an unexpected way</a>:</p><blockquote name="05a8" id="05a8" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“One person called us to cancel FreshBooks to tell us they were going to this new company,” McDerment says. “That was a good day.”</blockquote><p name="d409" id="d409" class="graf graf--p graf-after--blockquote">Shortly afterwards they lifted the veil of secrecy: They let BillSpring customers know that the product was now FreshBooks, and let existing FreshBooks customers know that a new version would soon be available.</p><p name="91c5" id="91c5" class="graf graf--p graf-after--p">Little by little, “FreshBooks Classic” customers were invited to try the new upgrade — but they didn’t have to, and they could always migrate back to the more familiar version if they wanted.</p><figure name="95b8" id="95b8" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 507px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 72.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*IujEjnPsnJLwdgaKh-jgog.jpeg" data-width="1704" data-height="1235" data-action="zoom" data-action-value="1*IujEjnPsnJLwdgaKh-jgog.jpeg"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*IujEjnPsnJLwdgaKh-jgog.jpeg?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*IujEjnPsnJLwdgaKh-jgog.jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*IujEjnPsnJLwdgaKh-jgog.jpeg"></noscript></div></div></figure><h4 name="7c8e" id="7c8e" class="graf graf--h4 graf-after--figure">Lessons</h4><p name="e664" id="e664" class="graf graf--p graf-after--h4">FreshBooks’ undercover rewrite didn’t come cheap: McDerment estimates that they spent $7 million on the project. After more than a decade of bootstrapped growth, they had just raised $30 million in venture capital; so they had the cash. Not everyone has that much money to spend.</p><p name="3e1b" id="3e1b" class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">Forbes </em><a href="https://www.forbes.com/sites/boburlingham/2017/05/09/starting-over/#357508b957ce" data-href="https://www.forbes.com/sites/boburlingham/2017/05/09/starting-over/#357508b957ce" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">estimates</a> that FreshBooks had $20 million in revenue in 2013. In 2017, after the upgrade was complete, they earned $50 million. They don’t say how much of that growth came from the new product, but starting over certainly doesn’t seem to have slowed down the company’s growth.</p><p name="4fc4" id="4fc4" class="graf graf--p graf-after--p">McDerment reports that they’re able to add features more quickly and easily now. More importantly, they’re facing the future with a product that captures their best ideas.</p><p name="f089" id="f089" class="graf graf--p graf-after--p">Beyond their stated goals, though, they’ve found that the experience has changed company culture — in a good way. Their time pretending to be a startup has left them acting more like a startup. The “lean” practices they experimented spread to the whole engineering team. Customers are closely involved in new feature development.</p><p name="7492" id="7492" class="graf graf--p graf-after--p">FreshBooks went to extraordinary lengths to insulate themselves from the potential downside of a rewrite: By innovating under a throw-away brand, developers felt free to rethink things completely, and to take bigger risks. That way, the worst that could happen was that they’d reach another dead end; at least they wouldn’t damage their existing brand in the process.</p><p name="4a84" id="4a84" class="graf graf--p graf-after--p graf--trailing">It all feels a little extreme, and perhaps it’s not necessary go to the lengths they did. But it’s a reminder of how serious the stakes are.</p></div></div></section>
  460. <section name="4e4f" class="section section--body section--last"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 name="9394" id="9394" class="graf graf--h3 graf--leading">Some thoughts for now</h3><p name="000a" id="000a" class="graf graf--p graf-after--h3"><strong class="markup--strong markup--p-strong">The conventional wisdom around rewriting software is that you should generally avoid it</strong> and make incremental improvements instead — unless that’s truly impossible for some reason.</p><p name="bfae" id="bfae" class="graf graf--p graf-after--p">I agree with this, as far as it goes.</p><p name="6672" id="6672" class="graf graf--p graf-after--p">This advice assumes, though, that the objective is to end up with the original product <em class="markup--em markup--p-em">plus </em>some set of new features<em class="markup--em markup--p-em">.</em></p><p name="bf85" id="bf85" class="graf graf--p graf-after--p">But what if you want to <em class="markup--em markup--p-em">remove </em>functionality? Or what if you want to solve some use case in a completely <em class="markup--em markup--p-em">different </em>way? What if your experience with the product has given you ideas for a fundamentally new approach?</p><p name="ef40" id="ef40" class="graf graf--p graf-after--p">My takeaway from these stories is this: Once you’ve learned enough that there’s a certain distance between the current version of your product and <strong class="markup--strong markup--p-strong">the best version of that product you can imagine</strong>, then the right approach is <em class="markup--em markup--p-em">not </em>to replace your software with a new version, but to <strong class="markup--strong markup--p-strong">build something new next to it </strong>— <strong class="markup--strong markup--p-strong">without throwing away what you have.</strong></p><p name="5493" id="5493" class="graf graf--p graf-after--p">So maybe if you’re thinking about whether you should rewrite or not, you should instead take a look at your product and ask yourself: Should I maybe create my own competitor? If my product is FogBugz, what’s my Trello? If it’s Visual Studio, what would my VS Code look like?</p><p name="a165" id="a165" class="graf graf--p graf-after--p">If you re-read <a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/" data-href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Spolsky’s post</a> on Netscape and <a href="https://signalvnoise.com/posts/3856-the-big-rewrite-revisited" data-href="https://signalvnoise.com/posts/3856-the-big-rewrite-revisited" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">DHH’s post</a> on Basecamp side by side, you’ll see that they agree on one thing: <strong class="markup--strong markup--p-strong">What you’ve already created has value.</strong></p><p name="d11c" id="d11c" class="graf graf--p graf-after--p graf--trailing">The good news is that you don’t have to throw that value away in order to innovate.</p></div></div></section>
  461. <p></div></section></p>
  462. </article>
  463. </section>
  464. <nav id="jumpto">
  465. <p>
  466. <a href="/david/blog/">Accueil du blog</a> |
  467. <a href="https://medium.com/@herbcaudill/lessons-from-6-software-rewrite-stories-635e4c8f7c22">Source originale</a> |
  468. <a href="/david/stream/2019/">Accueil du flux</a>
  469. </p>
  470. </nav>
  471. <footer>
  472. <div>
  473. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  474. <p>
  475. Bonjour/Hi!
  476. 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>
  477. 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>).
  478. </p>
  479. <p>
  480. 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>.
  481. </p>
  482. <p>
  483. Voici quelques articles choisis :
  484. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  485. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  486. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  487. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  488. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  489. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  490. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  491. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  492. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  493. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  494. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  495. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  496. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  497. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  498. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  499. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  500. </p>
  501. <p>
  502. 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>.
  503. </p>
  504. <p>
  505. Je ne traque pas ta navigation mais mon
  506. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  507. conserve des logs d’accès.
  508. </p>
  509. </div>
  510. </footer>
  511. <script type="text/javascript">
  512. ;(_ => {
  513. const jumper = document.getElementById('jumper')
  514. jumper.addEventListener('click', e => {
  515. e.preventDefault()
  516. const anchor = e.target.getAttribute('href')
  517. const targetEl = document.getElementById(anchor.substring(1))
  518. targetEl.scrollIntoView({behavior: 'smooth'})
  519. })
  520. })()
  521. </script>