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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=fr>
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset=utf-8>
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>The Webflow Tech Lead Guide (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://github.com/webflow/leadership/blob/master/tech_lead.md">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. The Webflow Tech Lead Guide (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://github.com/webflow/leadership/blob/master/tech_lead.md">Source originale du contenu</a></h3>
  445. <h2>Welcome</h2>
  446. <p>Hello! :wave: Welcome to this document. Happy to have you.</p>
  447. <p>If you've accepted a Tech Lead role, congratulations, you've demonstrated
  448. exceptional technical skills and a knack for leadership — rare qualities,
  449. indeed! Or, if you're curious about what the Tech Lead role offers and want to
  450. decide if it's right for you, you've come to the right place.</p>
  451. <p>Assuming the responsibilities of a Tech Lead is a staggering leap from the
  452. average engineer's daily routine. This guide is here to quickly help you
  453. understand the</p>
  454. <ol>
  455. <li>Definition of a successful Tech Lead</li>
  456. <li>Expectations when moving from a purely technical role to one that is a blend
  457. of management and technical expertise, and how to manage those expectations</li>
  458. <li>Strategies to mitigate common challenges</li>
  459. <li>Stance Webflow takes on "management" <em>(hint: it's about service, not
  460. dictatorship)</em></li>
  461. </ol>
  462. <h2>What's a Tech Lead, anyway?</h2>
  463. <p>By its most basic definition, a Tech Lead is "solely accountable for a project's
  464. success, spending 30% of their time writing code, and the other 70% managing a
  465. project". The <em>Lead</em> is no misnomer — your purpose is to navigate a team of
  466. talented engineers through choppy waters, direct them, steer them away from
  467. hazards, clear obstacles, and to keep them well fed with meaningful work.</p>
  468. <p>This is easier said than done.</p>
  469. <p>There are myriad skills a Tech Lead must possess and cultivate, but the most
  470. important are <em>sincere empathy</em>, <em>crystal clear communication</em>, and <em>technical
  471. excellence</em>. These skills are equally weighted. The Tech Lead is a "hybrid" role
  472. with one foot in management and the other in engineering, and acts as a liaison
  473. between project expectations and development tasks. A project's success is on
  474. the Tech Lead's shoulders, and it is on Webflow's shoulders to ensure they are
  475. excessively supplied with the support required to succeed.</p>
  476. <h4>Why management is different at Webflow.</h4>
  477. <p>Management has gotten a bad rap at most companies. It is often associated with
  478. treating employees as "cogs" and it conjures images of dictators with
  479. sun-eclipsing egos. This is not how Webflow operates. We view each team member
  480. as a <em>human being</em> first, and a talented contributor second. Humans need
  481. relationships built on compassion and cooperation. It is the Tech Lead's job to
  482. foster such an environment, and such environments are engendered through an
  483. attitude of <em>service</em>.</p>
  484. <p>The Tech Lead's job is <em>not</em> to micromanage, but to be a service leader, which
  485. is to say they are there to <em>support</em> their team, to <em>serve</em> them as though they
  486. worked <em>for</em> them (not the other way around). They might be accountable for a
  487. project's success, but it is the collaborative effort <em>with</em> their team that
  488. brings a project to fruition.</p>
  489. <p>Here are some hints to help approaching how best to serve a team:</p>
  490. <ol>
  491. <li>Be direct with project needs. Do not fear to challenge your team as long as
  492. you care deeply about their welfare.</li>
  493. <li>When successes occur, lavish your team with praise and give them credit for
  494. everything — without them success is impossible.</li>
  495. </ol>
  496. <h2>Why might I want to be a Tech Lead?</h2>
  497. <p>You may <em>not</em> want to be a Tech Lead, and that's just fine. Webflow seeks to
  498. provide many different opportunities for engineers to advance their career,
  499. including Individual Contributor tracks that offer similar significance to
  500. advanced management roles. The Tech Lead is under more pressure than the average
  501. engineer, and it is challenging to balance the demands of managing a team and
  502. contributing code, especially when first entering the Lead role (this is
  503. completely normal, by the way).</p>
  504. <p>That said, management life can be extraordinarily rewarding. You will have input
  505. into decisions much higher up on the food chain. Your impact on Webflow's
  506. user base multiplies. You will develop clout that will reflect in your
  507. performance reviews, and subsequently, provide more opportunities for career
  508. growth. The role is often seen as a stepping stone to the title of "Senior" Engineer, as well as a prerequisite for an Engineering Manager position. You will
  509. mentor and help other engineers grow. Some find these added challenges exciting
  510. and help push <em>them</em> to new limits.</p>
  511. <h2>How can I become a tech lead?</h2>
  512. <p>Just ask! Yes, it's that easy. In your one-on-ones, express to your manager that
  513. you are interested in becoming a Tech Lead. It's your manager's duty to design a
  514. path to new roles, and, depending on your current experience, might include
  515. assigning you as a Tech Lead on your next project — and if not, then to provide
  516. you opportunities to develop the skills needed to become a Tech Lead.</p>
  517. <h2>What's expected of me when managing a team?</h2>
  518. <p>The Tech Lead's job consists of these responsibilities (in no particular order):</p>
  519. <ol>
  520. <li>To work closely with a Product Manager to set reasonable expectations around
  521. deadlines, and to be <em>clear</em> when projects are going <em>off-track</em> (See: <a href="#help-we-are-behind-schedule">Help! We are behind schedule!</a>)</li>
  522. <li>To break up projects into digestible tasks, to tie those tasks to iterative
  523. deliverables, and to keep track of those deliverables</li>
  524. <li>To provide ample uninterrupted work time for their team so they may
  525. frequently enter the flow state, and to act as their team's guardian against
  526. any potential blockers and distractions</li>
  527. <li>To ensure your team is sufficiently supplied with work at all times so that
  528. no one "spins their wheels"</li>
  529. <li>To perform diligent code reviews, first-pass QA, and to contribute code where possible</li>
  530. <li>To be <em>available</em> to team members as they execute their tasks. (Windows of
  531. blocked time for heads down work is expected, but windows of team
  532. availability are expected, too)</li>
  533. <li>To occasionally work with other departments</li>
  534. </ol>
  535. <h4>Working with Other Departments</h4>
  536. <p>Product Management aligns user expectations with product features. Marketing
  537. makes those features known to the world. Support ensures Webflow makes good on those promised features. Each is critical to Webflow's continued success and growth. Engineering is at the crux of these departments and the Tech Lead acts as the liaison between them.</p>
  538. <p>The Tech Lead is responsible for communicating their project's status to other departments in two forms:</p>
  539. <ol>
  540. <li>A weekly status meeting with their team in which a dedicated Product Manager or Support Liaison* may also participate. (See: <a href="#meetings">Meetings</a>) This meeting is mandatory regardless of Product Manager or Support Liaison participation.</li>
  541. <li>A weekly "All Hands" report for the entire company to see. (See: <a href="#how-do-i-provide-status-reports-to-all-hands-and-lattice">How do I provide status reports to All Hands and Lattice?</a>)</li>
  542. </ol>
  543. <p>Some projects might not warrant a Product Manager or Support Liaison, and in these cases, the Tech Lead will express their team's status and needs to their Engineering Manager. On occasion, Marketing may also ask the Tech Lead when they should begin campaigning for a feature.</p>
  544. <p><em>* The Stabilization Team (See: <a href="#what-are-the-different-types-of-teams-a-tech-lead-can-manage">What are the different types of teams a Tech Lead can manage?</a>) will work closely with a Support Liaison to focus on fixing bugs with the greatest user impact.</em></p>
  545. <h4>Tracking Tasks</h4>
  546. <p>A great Tech Lead knows how to break a project into meaningful and easily
  547. digestible tasks (digestible means about three days scope). This gives their team members a holistic view of a project as
  548. well as a finish line, and allows the Tech Lead to assign tasks to team members
  549. each week. Breaking a project down into small tasks is a time-consuming process,
  550. and is often an ongoing effort, but is critical in providing team
  551. members with a sense of progress. It also allows the Tech Lead to create
  552. waypoints toward unknowns, and to keep those unknowns contained to small time
  553. windows (See: <a href="#task-toward-unknowns">Task toward unknowns</a>)</p>
  554. <h5>Master Tracking Issue (MTI)</h5>
  555. <p>At the onset of a project, or at the onset of a project's continuing milestones,
  556. the Tech Lead must take time to thoroughly review the project's specifications
  557. and do their best to break down the specification into trackable tasks with a scope of <strong>1-5 days</strong> of work (outside Code Review / QA), and an optimal timeline of <strong>3 days</strong>. These tasks should then be grouped into Milestones. Each Milestone is a <em>deliverable</em> with a deadline date. (See: <a href="#milestones-aka-deliverables">Milestones</a>)</p>
  558. <blockquote>
  559. <p><strong>Pro Tip</strong>: Consider enlisting your team to help you break down Milestones into tasks. This is sometimes the <em>only</em> option if you've got a team member with domain knowledge you don't possess. Delegate where it makes sense, but be sure to <em>review</em> all tasks and to <em>validate</em> their scope and/or assumptions.</p>
  560. </blockquote>
  561. <p>Webflow's current practice is to create GitHub issues for every task that are then tracked in a "Master Tracking Issue". The MTI should receive a <code>[Master Tracking Issue]</code> label in the issue's title as well as in GitHub's label section.</p>
  562. <p>The MTI is a centralized and clearly outlined view of GitHub issues that lists Milestones, their projected delivery date (See: <a href="#milestones-aka-deliverables">Milestones</a>), and their related tasks in a list that</p>
  563. <ol>
  564. <li>Can be easily assigned to your team members who will then be responsible for opening a PR to close the issue</li>
  565. <li>Displays the task's GitHub issue number <em>and</em> the PR that will close the
  566. issue, as well as a title for the issue. This is usually best accomplished in a tabular format.</li>
  567. <li>Provides the estimated finish date for each milestone, and the status of each
  568. issue toward those milestones (See: <a href="#displaying-progress-in-the-mti">Displaying Progress in the MTI</a>)</li>
  569. </ol>
  570. <h6>Tasks</h6>
  571. <p>Each issue (or <strong>1-5 day</strong> task) must clearly point to the portion of the specification the
  572. issue addresses <em>and</em> to the concerned areas of Webflow's codebase (if they
  573. exist). We've found it is best for each task to</p>
  574. <ol>
  575. <li>Clearly point to the original specification the issue addresses, with any
  576. <em>visual</em> content that will help an engineer complete the task, including
  577. screenshots/screencasts from the specification or from Webflow itself</li>
  578. <li>List a best guess of TODOs to help the engineer build a mental model around
  579. the problems they must solve</li>
  580. </ol>
  581. <p>Below is a task template. This should be located in a GitHub issue and should receive the same title that is tracked in the MTI.</p>
  582. <blockquote>
  583. <p>Master Tracking Issue: #00000 (Place the Github link here)</p>
  584. <h3>Objective</h3>
  585. <p>List the goal of the tasks here. It does not need to be long, and can take the form of a user story, e.g. "As a user, I would like to X, so that I can X", or "As a user, I would like to be able to right-click and delete an item, so that I don't have to move my mouse all the way up to the top of the screen."</p>
  586. <h3>Tech Spec</h3>
  587. <p><Insert screenshots/wireframe/visual content of finished feature></p>
  588. <p><em>Clearly</em> outline the expectations for the tasks here. Place them in the form of TODOs. For example:</p>
  589. <ul>
  590. <li>[ ] Include a "Delete" option in the right-click menu for item</li>
  591. <li>[ ] Wire the "Delete" option to the DELETE_TEM system event</li>
  592. <li>[ ] Write unit test for delete operation</li>
  593. <li>[ ] User may <em>not</em> delete item if multiple items are selected</li>
  594. </ul>
  595. <p>Also add condition material, if needed:</p>
  596. <ul>
  597. <li>[ ] When the user is logged into a free account, disallow deletion</li>
  598. </ul>
  599. <h3>Design Artifacts</h3>
  600. <p>Provide a list of design artifacts on which the above tech spec is based. This could be an external link to an artifact the Design or UX team provided. Include authors names so that the task owner can reach out.</p>
  601. <h3>Notes</h3>
  602. <p>Any clarifying content unrelated to the above items (Or, just a word of encouragement, like "You're doing great!")</p>
  603. </blockquote>
  604. <h6>This is tough</h6>
  605. <p>Creating the Master Tracking Issue will feel like it's taking too much time and
  606. will make you question whether or not you are performing the most effective
  607. work. Trust us: it <em>is</em> critical, and the clearer the MTI, the higher likelihood
  608. of a project's success. Depending on the size of the project, it could take
  609. upwards of a week or more :scream:. It's fine. Plan for it. Make it happen. Your
  610. team will thank you. It is crucial to helping your team feel a sense of
  611. meaningful progress (See: <a href="#how-do-i-keep-my-team-motivated">How do I keep my team motivated?</a>).</p>
  612. <blockquote>
  613. <p><strong>Pro Tip:</strong> It can be helpful to keep a document open beside the spec and to
  614. write down a list of tasks before beginning the MTI. When you've got a solid
  615. brain dump of tasks, open an issue, write a basic description and highlight
  616. the specification area, and <em>then</em> go into the codebase to find where to point
  617. the issue to.</p>
  618. </blockquote>
  619. <h5>Displaying Progress in the MTI</h5>
  620. <p>You can think of the MTI as a dashboard that displays the progress of every issue associated with a milestone. This, in turn, shows the status of <em>entire</em> milestones, and subsequently, the <em>entire</em> deliverable. For instance, here's an example of how an MTI might progress:</p>
  621. <blockquote>
  622. <h3>Legend</h3>
  623. <p>⬜️ - Hasn't started<br/>
  624. 📝 - In Progress<br/>
  625. 🔄 - Code Review / QA<br/>
  626. 🚫 - Blocked<br/>
  627. ✅ - Complete (merged into <code>dev</code>)<br/></p>
  628. <h3>Milestones</h3>
  629. <p>🏁 - BETA :: September 15, 2017<br/>
  630. 🚀 - LAUNCH :: November 1, 2017<br/></p>
  631. <p>| Milestone | Issue | PR | Description | Progress |
  632. | :-------: | :----: | :----: | :--------------------------------------- | :------: |
  633. | 🏁 | #12650 | #12666 | Empty Interactions Panel UI Refactor | ✅ |
  634. | 🏁 | #12675 | #12685 | AnimationList Component | 🔄 |
  635. | 🏁 | #12655 | #12746 | Convert ActionListConfig to InteractionStep | 📝 |
  636. | 🚀 | #12653 | #12784 | Create InteractionConfiguration Component | 🚫 |
  637. | 🚀 | #12686 | ??? | Create all Timed InteractionConfiguration items: Mouse Tap, Mouse Hover, Scroll Into View, Page Load, Page Scrolled | ⬜️ |</p>
  638. </blockquote>
  639. <p>The above gives a PM (or, anyone concerned) a quick way to gauge the progress of a project. For instance, one can see the BETA milestone is about 75% complete, and since tasks are broken into roughly <strong>1-5 day</strong> increments, it is easy to tell if a milestone is going <code>off-track</code> (See: <a href="#help-we-are-behind-schedule">Help! We are behind schedule!</a>).</p>
  640. <p>It is up to the Tech Lead to maintain the status of the above MTI, though they may wish to delegate updating the status of each line item to the team member responsible for completing that issue. The important elements to display for each task are</p>
  641. <ul>
  642. <li>Its Milestone and date</li>
  643. <li>Its Issue</li>
  644. <li>Its Pull Request</li>
  645. <li>A short description</li>
  646. <li>Its Progress</li>
  647. <li>Hasn't Started</li>
  648. <li>In Progress</li>
  649. <li>Code Review</li>
  650. <li>Blocked</li>
  651. <li>Complete (merged in <code>dev</code>)</li>
  652. </ul>
  653. <blockquote>
  654. <p><strong>Pro Tip:</strong> If a single MTI grows too long and too unwieldy, it's fine to split them into separate MTIs.</p>
  655. </blockquote>
  656. <h5>Milestones (a.k.a. Deliverables)</h5>
  657. <p>The Tech Lead must keep their Product Manager (or Engineering Manager if no Product Manager is assigned) updated on how well they are tracking against Milestones, as well as provide weekly All Hands updates (See: <a href="#how-do-i-provide-status-reports-to-all-hands-and-lattice">How do I provide status reports to All Hands and Lattice?</a>). These Milestones and their respective tasks are determined by the Tech Lead and confirmed by a Product Manager, Engineering Manager, or otherwise.</p>
  658. <p>A "Milestone" is</p>
  659. <ul>
  660. <li>A <em>major</em> deliverable, usually with a six-week timeline (See: <a href="#how-long-should-projects-take">How long should projects take?</a>)</li>
  661. <li>Responsible for driving a series of tasks/issues, and is complete when <em>all</em> tasks/issues have been pushed to production</li>
  662. <li>Named according to the type of deliverable, e.g. Phase, Launch, Version (See: <a href="#types-of-milestones">Types of Milestones</a>)</li>
  663. <li>Assigned a deadline date</li>
  664. </ul>
  665. <p>The planning structure for a large project should only ever consist of two levels: Milestone -&gt; Tasks. The Milestones themselves will be under the purview of a Feature, such as Rich Content Editor or Interactions 2.0, which may take months (or years) to complete. Milestones are "chunks" of continuously delivered work, and are usually accomplished sequentially. It is rare to have a team work on Milestones in parallel unless they are highly interrelated, though some overlap is expected when moving from one Milestone to another.</p>
  666. <blockquote>
  667. <p><strong>Pro Tip:</strong> Be incredibly wary of scope increases. Scope creep is real.
  668. <em>Always</em> use a Milestone's date as the affected factor when scope changes, and
  669. clearly communicate the new scope's impact.</p>
  670. </blockquote>
  671. <p>For more info on Milestone timing, See: <a href="#how-long-should-projects-take">How long should projects take?</a></p>
  672. <h5>Types of Milestones</h5>
  673. <p>Milestones are <em>major</em> deliverables and are <em>functionally</em> the same to each other, though they can be <em>semantically</em> separated into Phases, Launches, and Versions. It's important not to dwell too much on these differences, but it can be helpful to name them accordingly for Product Managers and Marketing.</p>
  674. <p>| Term | Definition |
  675. | ------- | ---------------------------------------- |
  676. | Phase | Anything Marketing doesn't need to let users know about. These are nuts and bolts type milestones that don't introduce any major experiential changes to users. Phases take on the name of their goal, e.g. "IX2 Flux Integration", or "Storybook Components for Interactions 2.0". |
  677. | Launch | Anything Marketing <em>needs</em> to know about so they can drum up the eyeballs. This includes alphas, betas, and official launches, and will require many weeks of lead time to prep marketing materials. |
  678. | Version | This is another version of a launch for a feature <em>that has already launched</em>. So, for IX2, after the initial launch, we labeled the subsequent launches IX2.0.1, and so on. |</p>
  679. <h5>Task toward unknowns</h5>
  680. <p>Milestones deadlines are hard to estimate, but Webflow asks that the Tech
  681. Lead do their best to place a <em>realistic</em> date on them. This constraint might
  682. seem limiting at first, but we treat deadlines more as focal points (with
  683. mitigation strategies) than immovable <em>dead</em>-lines (See: <a href="#help-we-are-behind-schedule">Help! We are behind schedule!</a>).</p>
  684. <p>Rather than rely on a Milestone's hazy, fog-covered finish line, it's much better to "task toward unknowns". Our features tend to forge new industry
  685. territory, the likes of which the JavaScript world has never seen, so it's often
  686. impossible to have a crystal ball view of upcoming work. Some of it will be
  687. clear, sure, but there will invariably be a portion of a specification that
  688. causes the best Tech Lead to scratch her head and say "Um, I have no idea how
  689. long this will take." Clear the haze. Shorten the forecast by breaking down the unknown into small tasks designed to uncover the unknown as soon as possible.</p>
  690. <p>Be adamant when prioritizing your tasks. Pivot when more information arises. Let your PM know on which of these tasks your team is currently working. Stacking these unknowns is how <em>actual</em> Milestone deadlines are discovered.</p>
  691. <blockquote>
  692. <p><strong>Pro Tip:</strong> Sometimes new tasks arise from uncovering unknowns that weren't outlined in the original MTI. It's fine to include new tasks if they are absolutely necessary to complete the Milestone. Be sure to inform your Manager if they alter the Milestone's deadline.</p>
  693. </blockquote>
  694. <h4>Meetings</h4>
  695. <p>The Tech Lead should organize one ~30-minute project meeting per week,
  696. preferably at the week's start and early in the day, whose agenda looks like the
  697. following:</p>
  698. <ol>
  699. <li>Perform a Mini-retrospective that asks:</li>
  700. <li>What went well last week?</li>
  701. <li>What didn't go so well last week?</li>
  702. <li>How can we improve what didn't go well?</li>
  703. <li>Ask each team member:</li>
  704. <li>What's the current status of your task?</li>
  705. <li>Are you blocked?</li>
  706. <li>How can I help unblock you? [<strong>Tech Lead</strong>]</li>
  707. <li>Assign new tasks to each team member</li>
  708. <li>Communicate the project's status to the Product Manager</li>
  709. <li>Answer any questions and engage in light and witty banter</li>
  710. </ol>
  711. <p>Limit team-wide meetings to this one weekly event. Hopping on a Slack call or a
  712. code pairing session should not be considered a "meeting" and should be employed
  713. liberally where needed.</p>
  714. <h4>Weekly Status</h4>
  715. <p>Every engineer is asked to report their <code>on-track</code> / <code>off-track</code> status each day
  716. to #status-frontend or #status-backend accordingly, and it is on the Tech Lead to confirm those daily (a Slack "reaction" :thumbsup: is always nice). This holds each engineer accountable to their weekly tasks and it allows the Tech Lead to step in if a task goes wildly <code>off-track</code> or beyond 5 days.</p>
  717. <blockquote>
  718. <p><strong>Pro Tip:</strong> Help your team members to focus on <em>one to three</em> concurrent tasks at a time. Any more than that is difficult to track, so offer to help reduce or combine their tasks and figure out what's causing the fragmentation.</p>
  719. </blockquote>
  720. <h4>Agile? Project Managers?</h4>
  721. <p>You may be wondering, "Where's the methodology behind this way of managing
  722. projects?". It might resemble Agile, with its two-week forecasts and weekly
  723. "Scrum"-like meetings, but it lacks burn-down charts and Scrum Masters. While we
  724. love the agile philosophy, aim to move quickly, and pivot where possible,
  725. Webflow does not subscribe to a specific methodology. This is what works for us
  726. right now, and we are always open to reevaluating it as we go. :thumbsup:</p>
  727. <h2>What are the different types of teams a Tech Lead can manage?</h2>
  728. <p>Webflow arranges its talented engineers into <em>Action</em> and <em>Permanent</em> teams for
  729. which a single Tech Lead will be responsible.</p>
  730. <p>| Team | Description |
  731. | :-------- | ---------------------------------------- |
  732. | Action | Assemble around a feature (or prototype) and disband on its completion. |
  733. | Permanent | Assemble around a domain problem and continually work on it without ever disbanding, e.g. the Performance and Stabilization teams. Tech Leads and Team Members can rotate through these teams. |</p>
  734. <h4>What size team should I expect?</h4>
  735. <p>Team sizes vary (they can even be a league of one), but the general rule is a
  736. team will include <em>three</em> members, including the Tech Lead. It is relatively
  737. easy to manage relationships with two individuals engaged in solving the same
  738. problems, but once someone is asked to manage a third, or fourth, or fifth
  739. relationship, the permutations of communication potentials grow drastically.
  740. This isn't isolated to the Tech Lead's relationship, but also to how the members
  741. of the team communicate with each other. Larger teams <em>can</em> work, but the rule
  742. of three seems to be a good starting point.</p>
  743. <p>This isn't to say a <em>team</em> must have only <em>three</em> members. An Action Team might
  744. contain seven members, including a Tech Lead who can divide the team into two
  745. groups (of three) and focus each group on parallel tasks <em>within</em> the feature's
  746. overall scope. It is then up to the Tech Lead to create a single Team Lead for
  747. each group and hold them accountable for their group's work. Bear in mind that
  748. each group should be focused on <em>feature</em> efficiency and collaborate on solving
  749. problems <em>with</em> each other so as to reduce the blocking latency commonly
  750. encountered when parallelizing individual resources.</p>
  751. <p>The aforementioned team structures can be comprised of Back-End <em>and</em> Front-End
  752. engineers. Webflow wants to blur the lines between these engineering
  753. disciplines, as well as non-engineering disciplines, e.g. designers. Forming
  754. cross-discipline teams is the end-game for feature efficiency; whether or not
  755. you pursue it is up to you and the demands of your project.</p>
  756. <h4>Team Efficiency and Organization</h4>
  757. <p>There are two ways of designing a team. One of "Feature" efficiency, which
  758. favors groups that collaborate on solving closely related problems <em>together</em>,
  759. and another of "Resource" efficiency, which favors individuals working on wholly
  760. unrelated tasks that run in parallel. Both have their strengths, but we ask that
  761. the Tech Lead optimize for <em>feature</em> efficiency where possible. See
  762. <a href="https://www.jrothman.com/mpd/agile/2015/09/resource-efficiency-vs-flow-efficiency-part-1-seeing-your-system/">Flow vs. Resource Efficiency</a>
  763. for more information. [We've replaced "Flow" with "Feature" in this article as
  764. it's easy to conflate Flow with the "Flow State"]</p>
  765. <blockquote>
  766. <p><strong>Pro Tip:</strong> Parallelization requires well-defined scope. If you are leading a
  767. project that is iterating on design specs <em>while</em> iterative development
  768. occurs, it is best to only optimize for <em>feature</em> efficiency.</p>
  769. </blockquote>
  770. <h2>Help! We are behind schedule!</h2>
  771. <p>It's cool. Really. Go grab some coffee, or get some sun, and return to your desk
  772. when your inner self reflects the same glossy sheen as a calm pond (See: <a href="#how-can-i-stay-centered">How can I stay "centered"?</a>).</p>
  773. <p>Pretty much every project encounters some unknown that threatens its delivery
  774. date. Instead of desperately trying to avoid this, try to <em>expect</em> this. You
  775. need to build it into your estimates (See: <a href="#how-can-i-make-better-estimates">How can I make better estimates?</a>).
  776. Recognize this as absolutely normal, and take comfort in the solidarity that all
  777. Tech Leads experience it. This is what separates the <em>good</em> from the <em>great</em>.</p>
  778. <p>We equate missing deadlines with heart wrenching guilt. This is a morale
  779. killer. Morale is your team's most precious resource. Instead, it's best to
  780. think of "delays" as "deferred progress", and to pitch it as such. Webflow
  781. understands Software Development is tough, so we've got some tricks up our
  782. sleeves to help you frame missing a deadline as <em>progress</em>.</p>
  783. <h4>A Word on Project Management</h4>
  784. <p>Before we dive into our <em>Rework / Defer / Abandon</em> deadline model, there are two
  785. key project management concepts that will help you understand <em>why</em> we follow
  786. it.</p>
  787. <p>First, it is important to emphasize the need to <em>tie deliverables to fixed
  788. dates</em>. Progress is hard to measure without a visible target. We must measure
  789. progress toward something, even if that something is just a guess. Progress is
  790. the lifeblood of motivation.</p>
  791. <p>Second, there are four levers you can pull to help get a project back
  792. <code>on-track</code>. They are as follows</p>
  793. <p>| Lever | Description |
  794. | --------- | ---------------------------------------- |
  795. | Time | When the deliverable is launched |
  796. | Quality | The craftsmanship put into the deliverable |
  797. | Resources | The number of participants contributing to the deliverable |
  798. | Scope | The breadth of what the deliverable is and does |</p>
  799. <p>These four levers can change as a project evolves. They are the tools
  800. effective Project Managers reason with. That said, Webflow produces the highest
  801. possible quality product and will not sacrifice Quality for Time, Resources, or
  802. Scope, so we only have those three levers available to us, which we will
  803. expand on in the next section.</p>
  804. <blockquote>
  805. <p><strong>Pro Tip:</strong> The Tech Lead role is often an engineer's first foray into trying
  806. to meet the bottom-line needs of a business. Their decisions must be framed in
  807. the question: "How does this keep the company healthy?" If you've little or no
  808. business acumen, have a look at
  809. <a href="https://www.amazon.com/Personal-MBA-Master-Art-Business/dp/1591845572/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878441&amp;sr=1-1&amp;keywords=The+Personal+MBA">Josh Kaufman's The Personal MBA</a>.
  810. It's a fantastic crash-course in modern business practices and will help you
  811. make better decisions when considering Webflow's needs and the needs of your
  812. team.</p>
  813. </blockquote>
  814. <h4>Rework / Defer / Abandon (Mitigation Strategies for Deferred Progress)</h4>
  815. <p>You have three options when confronted with a threatened deadline that should be
  816. discussed with your Product Manager. Here they are in sorted by order of
  817. consideration:</p>
  818. <ul>
  819. <li><strong>Rework</strong> the deliverable</li>
  820. <li><strong>Defer</strong> the deadline</li>
  821. <li><strong>Abandon</strong> the project</li>
  822. </ul>
  823. <h5>Rework</h5>
  824. <p>Rework consists of asking two questions:</p>
  825. <ol>
  826. <li>Can we add resources to the project to meet the deadline?</li>
  827. <li>Can we change the scope of the deliverable to meet the deadline?</li>
  828. </ol>
  829. <p>Questioning your resources and scope should be the first tool when evaluating
  830. how to mitigate a missed deadline. Ask first if more resources can help the
  831. situation, though this is usually <strong><em>not the case</em></strong> unless the project was
  832. initially understaffed to begin with. Adding late-stage resources can
  833. <a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month">even push the deadline out farther</a>!
  834. So, your next tool is to reduce scope.</p>
  835. <blockquote>
  836. <p><strong>Pro Tip:</strong> Reducing scope is often the #1 choice when trying to hit a deadline
  837. while still providing business value. The likelihood a project requires more
  838. resources to hit a deadline is probably in the 10% range. Reduce scope 90% of
  839. the time.</p>
  840. </blockquote>
  841. <p>Reducing scope is usually feasible. As passionate software developers, we tend
  842. to bite off more than we can chew. This is your opportunity to use a fork and
  843. knife to slice up the deliverable into bite-sized pieces with more realistic
  844. expectations, and for you to communicate those expectations to other key
  845. stakeholders.</p>
  846. <h5>Defer</h5>
  847. <p>If scope cannot be reduced, and adding resources isn't an option, the next
  848. <em>best</em> option is to <em>push the deadline out</em>. Yes, you heard it right. It's to
  849. <em>move</em> the deadline. "What's the point in deadlines, then, if they can just be
  850. moved all willy-nilly?" Well, we do our best to avoid moving deadlines, but
  851. sometimes it happens, and that's totally okay. Too much is at stake when we
  852. attempt to hit an unrealistic deadline, and among them are team burnout, poor
  853. product quality, reduced morale, and more.</p>
  854. <p>The important idea here is <em>not to lose sight of a delivery date</em>. That's all
  855. that matters. Projects will fall into limbo when a missed deadline stays (ahem)
  856. dead and the project careens toward the unknown. This is <em>worse</em> than moving
  857. the deadline, so move it!</p>
  858. <h5>Abandon</h5>
  859. <p>The final and rarest option is to abandon the project altogether.
  860. Consider this if you (or another stakeholder) discover the deliverable will
  861. negatively impact the company. Scrap it! Focus on <em>efficient</em> work, not
  862. <em>productive</em> work.</p>
  863. <h5><em>An optional fourth strategy:</em> Watch it closely</h5>
  864. <p>There is a fourth option, too, when the threat of a missed deadline is no more
  865. than a subtle twang in your gut, and that is to <strong><em>watch it closely</em></strong>. Pay
  866. special attention when your intuition whispers something's off. It's important
  867. to get ahead of the problem, and this should be the moment where you
  868. preemptively strike. Make your manager aware of it.</p>
  869. <blockquote>
  870. <p><strong>Pro Tip:</strong> The key to making your and everyone else's life easier is to
  871. master the art of <em>managing expectations</em>. It is wise to under-promise and
  872. over-deliver as long as you remain candid and honest. Always state what is
  873. true. Announce worries about missing deadlines or losing a key resource.
  874. Announce wins about finishing work earlier than expected. Be as truthful as
  875. you are skeptical about unknowns.</p>
  876. </blockquote>
  877. <h2>How can I make better estimates?</h2>
  878. <p>At the time of this writing, no person has discovered a magic eight-ball
  879. estimation method for predicting software development timelines. Some might try
  880. to sell you snake-oil and tell you otherwise, and some might say it's downright
  881. impossible. It's best to accept that software estimation is rarely accurate and
  882. work from there. This is at the core of the Agile Philosophy: iterate and
  883. discover, then deliver and improve. It's an art of discovery, not an art of
  884. delivery. Webflow follows an iterative process (See: <a href="#whats-expected-of-me-when-managing-a-team">What's expected of me when managing a team?</a>) as outlined in other sections, so estimation is important, but
  885. not as important as uncovering unknowns. That said, here are some tactics to
  886. help estimate tasks:</p>
  887. <h4>Pad estimates for the unexpected</h4>
  888. <p>Development rarely unfolds as planned. Instead of <em>precise</em> estimates, give your
  889. best guesstimate for a given task and multiply it times <strong><em>four</em></strong>, <em>especially</em>
  890. if that task involves uncovering an unknown. That might sound crazy — and
  891. sometimes it is; experience helps Tech Leads refine that equation — but it's a
  892. good starting point that leaves room for dastardly unknowns.</p>
  893. <h4>Add up tasks toward unknowns</h4>
  894. <p>Once you've created your Master Tracking Issue (See: <a href="#whats-expected-of-me-when-managing-a-team">What's expected of me when managing a team?</a>), you can get a sense of how long the project might take. Be
  895. sure to identify which tasks are associated with <em>discovery</em> (finding unknowns),
  896. and which have more concrete definitions. Once you've completed all the
  897. discovery tasks, you will have a <em>much</em> better sense of the deadline's
  898. accuracy.</p>
  899. <h4>The 80/20 Rule</h4>
  900. <p>It is easy to overlook time-consuming nuances that slow the final 20% of a
  901. project. When you view your project holistically, break it up using the 80/20
  902. rule, and consider that the final 20% of a project might account for <em>another</em>
  903. 80% of the overall timeline. There are a number of reasons for this, but the
  904. final 20% is often filled with polishing the deliverable, and complex features
  905. require polish for <em>every</em> feature and edge case, which compounds near the
  906. project's end.</p>
  907. <p>What does this mean for you? Just treat the 80% point in your project as the
  908. halfway marker. That will align expectations against the added effort nuance
  909. prescribes.</p>
  910. <h4>Never forget QA</h4>
  911. <p>When you estimate deadlines, set a date for <em>code completion</em> so that QA can
  912. have time to discover any bugs or UX issues. Your estimates must consider this
  913. extra phase, and to consider QA's current workload.</p>
  914. <h4>Cooldown: Bug fixes after delivery</h4>
  915. <p>On delivery, plan to leave some time to fix any immediate bugs before starting new milestones. The amount of time can vary based on the deliverable's complexity, and a week is usually a good window. This is an opportunity to give your team some downtime before leaping into the next set of tasks, and it gives you a chance to tighten up the next milestone's MTI.</p>
  916. <h2>How long should projects take?</h2>
  917. <p>While the scope of a feature might require months and months of work, its
  918. versioned <em>milestones</em> should aim for six-week timelines, including QA, so each
  919. milestone is <em>code complete</em> around four weeks. This allows Marketing to
  920. evaluate a <em>proven</em> set of features and put them in their pocket, so to speak,
  921. and queue them for announcement based on market trends. Breaking a large feature
  922. into six-week timelines can appear challenging at first, but we ask this for a
  923. few important reasons:</p>
  924. <ol>
  925. <li>It is much easier to reason about smaller scope and timelines</li>
  926. <li>It allows projects to pivot if its business value somehow proves meager</li>
  927. <li>It allows groups of three to move faster</li>
  928. </ol>
  929. <p>A six-month project's <em>major</em> Milestones may then look like this:</p>
  930. <ol>
  931. <li>Alpha Launch (6 weeks)</li>
  932. <li>Beta Launch (6 weeks)</li>
  933. <li>Feature Launch v1.0 (6 weeks)</li>
  934. <li>Feature Launch v1.0.1 (6 weeks) :checkered_flag:</li>
  935. </ol>
  936. <h2>Should I branch off of feature branches or not?</h2>
  937. <p>Not.*</p>
  938. <p>Do not branch off of <code>feature-branches</code>. Tech Leads should aim to have their team commit their <code>feature-branches</code> directly to <code>dev</code> rather than to another <code>feature-branch</code> that is kept up-to-date with <code>dev</code>. Long-lived <code>feature-branches</code> often introduce code dependencies and other programming
  939. patterns that require cherry-picking and other <em>hard-to-keep-in-sync-with-other-branches</em> issues. Instead, the Tech Lead should place their project behind a <em>Feature Flag</em> and continually merge it with <code>dev</code>.</p>
  940. <p>To summarize, Webflow has two <em>main</em> branches:</p>
  941. <ol>
  942. <li><code>dev</code></li>
  943. <li><code>master</code></li>
  944. </ol>
  945. <p>And a <code>feature-branch</code></p>
  946. <ol>
  947. <li>May branch from: <code>dev</code></li>
  948. <li>Must merge back into: <code>dev</code></li>
  949. </ol>
  950. <h5>Feature flags</h5>
  951. <p>We encourage all of our engineers to push code every day (if possible), and to
  952. prevent a new feature from stepping on the toes of our users, we suggest Tech
  953. Leads place those new features behind a "Feature Flag" that can be toggled with
  954. the
  955. ShortcutHelper.</p>
  956. <blockquote>
  957. <p>*Okay, there <em>might</em> be a case for a long-lived branch to which other branches commit. And by "might", we mean maybe 1% of the time where we must refactor a critical, widely-used portion of our infrastructure. So, basically never. :smile: Should the need for such a branch arise, please inform the <em>entire</em> team, your product manager, and your engineering manager of your intent. You may be surprised about how the work could be organized into smaller, continually merged branches.</p>
  958. </blockquote>
  959. <h2>How can I stay "centered"?</h2>
  960. <p>Staying "centered" means you take care of yourself first and foremost and find a
  961. "happy" place from which to approach solving problems. Life is about performing
  962. as much meaningful work as it is about performing meaningful <em>human activities</em>.
  963. This means you will need to take a break from your daily tasks and engage in
  964. activities that keep you fresh and focused. Does reading a book help you? Does
  965. binge-watching some Netflix? Does exercise? Fresh air? Find a routine that keeps
  966. you on point in work <em>and</em> in life, and don't be afraid to express those needs
  967. to your manager, and never fear to make time for them, even if it feels like it's
  968. cutting into your productivity.</p>
  969. <p>If you aren't centered, your team won't be centered. Lead by example.</p>
  970. <h2>How do I stay organized?</h2>
  971. <p>New Tech Leads feel overwhelmed, and if they don't, then they probably aren't
  972. performing some part of their job. :sweat_smile: (Okay, fine, some of us may be
  973. able to take the role in stride, but it's uncomfortable for most). The key
  974. to mitigating the dreaded stress of <em>too much</em>, is to learn the art of time
  975. management. This can take shape in many ways, and it boils down to your own
  976. preferences. If you've never picked up a book on time management, we recommend
  977. starting with
  978. <a href="ttps://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0143126563/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878379&amp;sr=1-1&amp;keywords=Getting+Things+Done">David Allen's Getting Things Done</a>.
  979. It's a great first step to learning how to transfer the cacophony of noise in
  980. your head elsewhere. If his method doesn't work for you, seek to find another
  981. and share it when you do.</p>
  982. <h2>How much should I expect to code?</h2>
  983. <p>This depends on the project, but a good estimate is that you will code 30% of
  984. the time (if not fewer), <em>review</em> code 30% of the time (if not more), and serve
  985. your team with your remaining time.</p>
  986. <h4>Code Reviews</h4>
  987. <p>Since you are ultimately responsible for the quality of the deliverable, you
  988. will want to review and sign off on every PR. This can be incredibly time
  989. consuming on larger teams, so it's good to encourage your team to review <em>each
  990. other's</em> code. That said, expect to perform <em>a lot</em> of code reviews, and look at
  991. them as an opportunity to mentor junior team members, and with senior team
  992. members, to keep you on top of your skills.</p>
  993. <h2>How do I provide status reports to All Hands and Lattice?</h2>
  994. <p>Every Thursday at 11am PST (as of this writing), Webflow holds an "All Hands" meeting where
  995. the management team relays the status of all of Webflow's ongoing projects as well as large company goals and initiatives. It is the Tech Lead's responsibility to provide a progress update for their
  996. project to the Webflow Project Tracker Google document <em>prior</em> to this
  997. meeting. This document is shared in the #all-hands channel in Slack. A template for the updates is located at the end of the Google document. Please follow it accordingly. The items in the template are</p>
  998. <ol>
  999. <li>TDLR, or a brief blurb on the project's state of affairs.</li>
  1000. <li>MILESTONE ON-TRACK/OFF-TRACK, where you provide the track updates for each active milestone, their percent progess, and the percent change from the previous week (these are guesstimates). Also list out the next two weeks of tasks the team will work on and their expected delivery dates.</li>
  1001. <li>KEY DECISIONS, where you mention any big key decisions that lead to timeline changes, scope changes, and anything that relates to support/marketing, or change in resources.</li>
  1002. <li>RISKS, UNKNOWNS, AND BLOCKERS, where you mention any risks, unknowns, or blockers that appeared since the last week.</li>
  1003. </ol>
  1004. <h4>Lattice</h4>
  1005. <p>Webflow uses Lattice to help track higher level company goals. In addition to your weekly All Hands updates, we will ask that you also update any Lattice goals that are assigned to you. If you do not have an account, reach out to your Engineering Manager for help.</p>
  1006. <h2>How do I keep my team motivated?</h2>
  1007. <p>Engendering a sense of progress, and giving sufficient room for creative problem
  1008. solving without dictating <em>how</em>, motivates humans more than money, or any carrot
  1009. and stick. We are intrinsically motivated creatures with simple heuristics: If
  1010. you place realistic goals in front of us, the tools to do it, and a sense of
  1011. purpose for why we should, we will move mountains.</p>
  1012. <p>Science has given us some key insights into what motivates humans. Many of the
  1013. concepts in this document are built on top of those insights, so you've already
  1014. been employing tactics to keep your team motivated! That said, here are some of
  1015. the underlying mechanics of our process.</p>
  1016. <h4>Autonomy, Mastery, and Purpose</h4>
  1017. <p>Daniel Pink, in his book
  1018. <a href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878328&amp;sr=1-1&amp;keywords=drive+daniel+pink">Drive</a>,
  1019. dispelled the myth that humans are extrinsically motivated, or that is to say
  1020. motivated by <em>external</em> factors such as money or nicer offices, job titles, etc.
  1021. Instead, he found that we are motivated by <em>internal</em> (or intrinsic)
  1022. factors, such as a being given a sense of belonging, opportunities to grow
  1023. skills, and to do so on our own terms. These three intrinsic factors can be
  1024. boiled down to Autonomy, Mastery, and Purpose, and are excellent starting points
  1025. for dissecting the basics of motivation.</p>
  1026. <p>Part of providing these key motivators falls on Webflow's shoulders, but a
  1027. clever Tech Lead can use them to great effect, too. So, every week ask yourself
  1028. these questions:</p>
  1029. <ol>
  1030. <li>Am I giving my team enough room to solve problems on their own terms? Am I
  1031. dishing out commands when I should be providing direction and intent?
  1032. [<strong>Autonomy</strong>]</li>
  1033. <li>Am I placing my team members on the right tasks that can help them grow?
  1034. [<strong>Mastery</strong>]</li>
  1035. <li>Am I aligning <em>why</em> we are building this feature with <em>how</em> Webflow wants to
  1036. help the world? [<strong>Purpose</strong>]</li>
  1037. </ol>
  1038. <h4>Provide Feedback</h4>
  1039. <p>Kim Scott, a Harvard grad that served as an executive at Google and Apple, sums
  1040. up how to best manage the relationships and expectations with each individual on
  1041. your team in her book
  1042. <a href="https://www.amazon.com/Radical-Candor-Kick-Ass-Without-Humanity/dp/1250103509/ref=sr_1_1?ie=UTF8&amp;qid=1513952244&amp;sr=8-1&amp;keywords=radical+candor">Radical Candor</a>.
  1043. It turns out we <em>shouldn't</em> water down how we feel and what we say to each
  1044. other, but instead we should frame tough discussions in a personal and caring
  1045. way. The basic premise of this axiom is to "Care personally, Challenge
  1046. Directly", which means you must <em>empathize</em> with your team and demonstrate to
  1047. them that you care about their welfare, but still provide them critical feedback
  1048. (that might hurt).</p>
  1049. <p>By providing critical feedback early and often, <em>and</em> by demonstrating how much
  1050. you care for people, you will sidestep catastrophic challenges later down the
  1051. road. Also, this doesn't just apply to <em>negative</em> feedback, but also <em>positive</em>
  1052. feedback, too. Both are crucial. Consider picking up her book for more
  1053. information.</p>
  1054. <blockquote>
  1055. <p><strong>Pro Tip:</strong> The way in which we <em>frame</em> feedback can make all the difference to how well it is received. Instead of attacking personal flaws, highlight the <em>behavior</em> that lead to the feedback. Consider using the Situation, Behavior, Impact model for such framing. It works like this: Bring up the situation where the behavior occurred, highlight the behavior, then mention the impact, e.g. "During today's meeting, you interrupted Brian multiple times, and made Brian feel like he couldn't speak up until the meeting's end where he presented the winning idea. This made the meeting longer than it needed to be.". Here's a <a href="https://www.mindtools.com/pages/article/situation-behavior-impact-feedback.htm">great guide</a> if you'd like to learn more.</p>
  1056. </blockquote>
  1057. <h4>Flow</h4>
  1058. <p>It's important to stress the need for each of your team members to have ample
  1059. opportunity to enter Flow. This, in and of itself, is enough to keep most people
  1060. happy at work <em>and</em> in life. It's such a critical factor in motivation and in
  1061. work <em>efficiency</em> that we've listed it here as a reminder.</p>
  1062. <h2>I have an under-performing member on my team. What do I do?</h2>
  1063. <p>Have you heard the old adage, "There are no bad employees, only bad managers?"
  1064. Well, it's mostly true. Webflow hires talented engineers, so before you
  1065. jump to any conclusions about what's wrong with an under performer, make sure
  1066. you are servicing your team 100% (See: <a href="#how-do-i-keep-my-team-motivated">How do I keep my team motivated?</a>).</p>
  1067. <p>Each team member must be sufficiently motivated through ample opportunity for
  1068. producing meaningful progress, autonomously, with room for mastery, and with a
  1069. sense of purpose. Providing continual feedback is also an essential ingredient.</p>
  1070. <p>You also must consider a team member's <em>inner work life.</em> It's okay to ask, "How
  1071. are things? Everything all right outside of work?" You <em>should</em> ask these
  1072. questions often, but remember not to pry. Give your team members room to discuss
  1073. personal issues while remembering they are <em>personal</em>.</p>
  1074. <p>If you've done your best to foster the right environment for your team member
  1075. to do their best work, and they <em>still</em> aren't meeting your expectations, have a
  1076. chat with your manager about what to do next.</p>
  1077. <h2>How can I avoid burning my team out?</h2>
  1078. <p>If a team can't meet a deadline, it's a <em>management</em> problem, and not the team's
  1079. problem. This means that, somewhere along the way, the project didn't go as
  1080. planned and a course wasn't corrected. So, <strong><em>Rule Number 1</em></strong> to avoid burnout
  1081. is "Manage the project and expectations well" (See: <a href="#help-we-are-behind-schedule">Help! We are behind schedule!</a>).</p>
  1082. <p><strong><em>Rule number 2</em></strong>: Never ask more of your team than you would ask of yourself
  1083. (and you mustn't ask yourself to work nights and weekends). Other organizations
  1084. might ask their teams to pull longer hours when the going gets rough. This is a
  1085. laser-focused bullet train to attrition and long-term inefficiencies. Webflow
  1086. cares deeply about its team, not only professionally, but personally, so we must
  1087. do our best to <em>manage our time well</em>.</p>
  1088. <h4>Crunch Time</h4>
  1089. <p>Oh, crunch time, you've haunted the best teams, and you are oh so hard to avoid.</p>
  1090. <p>As a Tech Lead, you will invariably run up against a deadline that's <em>just</em>
  1091. within reach and may require slightly more effort to push it out in the last
  1092. stretch. By <em>slightly</em>, we mean your team might need to put in a few more hours
  1093. over their 40-hour work week. Yes, that's right. Our version of "crunch" isn't
  1094. crazy hours that bleed into the evening or weekend. It's just a <em>few</em>. When
  1095. people operate at their peak performance, where they engage in the flow state
  1096. 2-4 hours a day, <em>they are incapable</em> of more work without drastic consequences.
  1097. They should already be operating at peak efficiency, and asking more of them has
  1098. severe diminishing returns and a detrimental impact to them personally, <em>and</em> to
  1099. Webflow as a company.</p>
  1100. <p>Crunch time is real. Crunch time can be a symptom of poor management. We must do
  1101. our best to limit these hyperactive periods to one or two times a year.</p>
  1102. <h2>Recommended Books</h2>
  1103. <p><a href="https://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202/ref=sr_1_1?ie=UTF8&amp;qid=1513878317&amp;sr=8-1&amp;keywords=flow">Flow</a></p>
  1104. <p><a href="https://www.amazon.com/Deep-Work-Focused-Success-Distracted/dp/1455586692/ref=sr_1_1?ie=UTF8&amp;qid=1515804941&amp;sr=8-1&amp;keywords=deep+work">Deep Work</a></p>
  1105. <p><a href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878328&amp;sr=1-1&amp;keywords=drive+daniel+pink">Drive</a></p>
  1106. <p><a href="https://www.amazon.com/Leaders-Eat-Last-Together-Others/dp/1591848016/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878339&amp;sr=1-1&amp;keywords=Leaders+Eat+Last">Leaders Eat Last</a></p>
  1107. <p><a href="https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878350&amp;sr=1-1&amp;keywords=The+Manager%27s+Path">The Manager's Path</a></p>
  1108. <p><a href="https://www.amazon.com/Progress-Principle-Ignite-Engagement-Creativity/dp/142219857X/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878365&amp;sr=1-1&amp;keywords=The+Progress+Principle">The Progress Principle</a></p>
  1109. <p><a href="https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0143126563/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878379&amp;sr=1-1&amp;keywords=Getting+Things+Done">Getting Things Done</a></p>
  1110. <p><a href="https://www.amazon.com/Getting-Yes-Negotiating-Agreement-Without/dp/0143118757/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878391&amp;sr=1-1&amp;keywords=Getting+To+Yes">Getting To Yes</a></p>
  1111. <p><a href="https://www.amazon.com/Radical-Candor-Kick-Ass-Without-Humanity/dp/1250103509/ref=sr_1_1?ie=UTF8&amp;qid=1513952244&amp;sr=8-1&amp;keywords=radical+candor">Radical Candor</a></p>
  1112. <p><a href="https://www.amazon.com/Search-Inside-Yourself-Unexpected-Achieving-ebook/dp/B0070XF474/ref=sr_1_1?s=digital-text&amp;ie=UTF8&amp;qid=1513878403&amp;sr=1-1&amp;keywords=Search+Inside+Yourself">Search Inside Yourself</a></p>
  1113. <p><a href="https://www.amazon.com/Discover-Your-Strengths-Marcus-Buckingham/dp/0743201140/ref=sr_1_1?ie=UTF8&amp;qid=1513878430&amp;sr=8-1&amp;keywords=Now+Discover+Your+Strengths">Now Discover Your Strengths</a></p>
  1114. <p><a href="https://www.amazon.com/Personal-MBA-Master-Art-Business/dp/1591845572/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1513878441&amp;sr=1-1&amp;keywords=The+Personal+MBA">The Personal MBA</a></p>
  1115. </article>
  1116. </section>
  1117. <nav id="jumpto">
  1118. <p>
  1119. <a href="/david/blog/">Accueil du blog</a> |
  1120. <a href="https://github.com/webflow/leadership/blob/master/tech_lead.md">Source originale</a> |
  1121. <a href="/david/stream/2019/">Accueil du flux</a>
  1122. </p>
  1123. </nav>
  1124. <footer>
  1125. <div>
  1126. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  1127. <p>
  1128. Bonjour/Hi!
  1129. 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>
  1130. 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>).
  1131. </p>
  1132. <p>
  1133. 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>.
  1134. </p>
  1135. <p>
  1136. Voici quelques articles choisis :
  1137. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  1138. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  1139. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  1140. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  1141. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  1142. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  1143. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  1144. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  1145. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  1146. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  1147. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  1148. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  1149. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  1150. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  1151. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  1152. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  1153. </p>
  1154. <p>
  1155. 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>.
  1156. </p>
  1157. <p>
  1158. Je ne traque pas ta navigation mais mon
  1159. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  1160. conserve des logs d’accès.
  1161. </p>
  1162. </div>
  1163. </footer>
  1164. <script type="text/javascript">
  1165. ;(_ => {
  1166. const jumper = document.getElementById('jumper')
  1167. jumper.addEventListener('click', e => {
  1168. e.preventDefault()
  1169. const anchor = e.target.getAttribute('href')
  1170. const targetEl = document.getElementById(anchor.substring(1))
  1171. targetEl.scrollIntoView({behavior: 'smooth'})
  1172. })
  1173. })()
  1174. </script>