Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=en>
  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>Senior developer — 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. <!-- Canonical URL for SEO purposes -->
  28. <link rel="canonical" href="https://larlet.fr/david/blog/2016/senior-developer/">
  29. <!-- SEO/Semantic metadata -->
  30. <meta name="description" content="That is the moment you realize you are more valuable than the code you produce." />
  31. <meta name="twitter:description" property="og:description" itemprop="description" content="That is the moment you realize you are more valuable than the code you produce." />
  32. <meta name="twitter:title" property="og:title" itemprop="name" content="Senior developer" />
  33. <meta name="twitter:card" content="summary" />
  34. <meta name="twitter:creator" content="@davidbgk" />
  35. <meta name="twitter:url" property="og:url" content="https://larlet.fr/david/blog/2016/senior-developer/" />
  36. <meta property="og:type" content="article" />
  37. <meta property="og:site_name" content="David Larlet (@davidbgk)" />
  38. <meta name="twitter:image" property="og:image" itemprop="image" content="https://larlet.fr/static/david/blog/2016/senior-developer.jpg" />
  39. <style>
  40. /* http://meyerweb.com/eric/tools/css/reset/ */
  41. html, body, div, span,
  42. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  43. a, abbr, address, big, cite, code,
  44. del, dfn, em, img, ins,
  45. small, strike, strong, tt, var,
  46. dl, dt, dd, ol, ul, li,
  47. fieldset, form, label, legend,
  48. table, caption, tbody, tfoot, thead, tr, th, td,
  49. article, aside, canvas, details, embed,
  50. figure, figcaption, footer, header, hgroup,
  51. menu, nav, output, ruby, section, summary,
  52. time, mark, audio, video {
  53. margin: 0;
  54. padding: 0;
  55. border: 0;
  56. font-size: 100%;
  57. font: inherit;
  58. vertical-align: baseline;
  59. }
  60. /* HTML5 display-role reset for older browsers */
  61. article, aside, details, figcaption, figure,
  62. footer, header, hgroup, menu, nav, section { display: block; }
  63. body { line-height: 1; }
  64. blockquote, q { quotes: none; }
  65. blockquote:before, blockquote:after,
  66. q:before, q:after {
  67. content: '';
  68. content: none;
  69. }
  70. table {
  71. border-collapse: collapse;
  72. border-spacing: 0;
  73. }
  74. /* http://practicaltypography.com/equity.html */
  75. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  76. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: normal;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  89. font-weight: 300;
  90. font-style: italic;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'EquityTextB';
  95. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  96. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  97. font-weight: 700;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. @font-face {
  102. font-family: 'ConcourseT3';
  103. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  104. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  105. font-weight: 300;
  106. font-style: normal;
  107. font-display: swap;
  108. }
  109. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  110. body {
  111. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  112. font-family: "EquityTextB", Palatino, serif;
  113. background-color: #f0f0ea;
  114. color: #07486c;
  115. font-kerning: normal;
  116. -moz-osx-font-smoothing: grayscale;
  117. -webkit-font-smoothing: subpixel-antialiased;
  118. text-rendering: optimizeLegibility;
  119. font-variant-ligatures: common-ligatures contextual;
  120. font-feature-settings: "kern", "liga", "clig", "calt";
  121. }
  122. pre, code, kbd, samp, var, tt {
  123. font-family: 'TriplicateT4c', monospace;
  124. }
  125. em {
  126. font-style: italic;
  127. color: #323a45;
  128. }
  129. strong {
  130. font-weight: bold;
  131. color: black;
  132. }
  133. nav {
  134. background-color: #323a45;
  135. color: #f0f0ea;
  136. display: flex;
  137. justify-content: space-around;
  138. padding: 1rem .5rem;
  139. }
  140. nav:last-child {
  141. border-bottom: 1vh solid #2d7474;
  142. }
  143. nav a {
  144. color: #f0f0ea;
  145. }
  146. nav abbr {
  147. border-bottom: 1px dotted white;
  148. }
  149. h1 {
  150. border-top: 1vh solid #2d7474;
  151. border-bottom: .2vh dotted #2d7474;
  152. background-color: #e3e1e1;
  153. color: #323a45;
  154. text-align: center;
  155. padding: 5rem 0 4rem 0;
  156. width: 100%;
  157. font-family: 'ConcourseT3';
  158. display: flex;
  159. flex-direction: column;
  160. }
  161. h1.single {
  162. padding-bottom: 10rem;
  163. }
  164. h1 span {
  165. position: absolute;
  166. top: 1vh;
  167. left: 20%;
  168. line-height: 0;
  169. }
  170. h1 span a {
  171. line-height: 1.7;
  172. padding: 1rem 1.2rem .6rem 1.2rem;
  173. border-radius: 0 0 6% 6%;
  174. background: #2d7474;
  175. font-size: 1.3rem;
  176. color: white;
  177. text-decoration: none;
  178. }
  179. h2 {
  180. margin: 4rem 0 1rem;
  181. border-top: .2vh solid #2d7474;
  182. padding-top: 1vh;
  183. }
  184. h3 {
  185. text-align: center;
  186. margin: 3rem 0 .75em;
  187. }
  188. hr {
  189. height: .4rem;
  190. width: .4rem;
  191. border-radius: .4rem;
  192. background: #07486c;
  193. margin: 2.5rem auto;
  194. }
  195. time {
  196. display: bloc;
  197. margin-left: 0 !important;
  198. }
  199. ul, ol {
  200. margin: 2rem;
  201. }
  202. ul {
  203. list-style-type: square;
  204. }
  205. a {
  206. text-decoration-skip-ink: auto;
  207. text-decoration-thickness: 0.05em;
  208. text-underline-offset: 0.09em;
  209. }
  210. article {
  211. max-width: 50rem;
  212. display: flex;
  213. flex-direction: column;
  214. margin: 2rem auto;
  215. }
  216. article.single {
  217. border-top: .2vh dotted #2d7474;
  218. margin: -6rem auto 1rem auto;
  219. background: #f0f0ea;
  220. padding: 2rem;
  221. }
  222. article p:last-child {
  223. margin-bottom: 1rem;
  224. }
  225. p {
  226. padding: 0 .5rem;
  227. margin-left: 3rem;
  228. }
  229. p + p,
  230. figure + p {
  231. margin-top: 2rem;
  232. }
  233. blockquote {
  234. background-color: #e3e1e1;
  235. border-left: .5vw solid #2d7474;
  236. display: flex;
  237. flex-direction: column;
  238. align-items: center;
  239. padding: 1rem;
  240. margin: 1.5rem;
  241. }
  242. blockquote cite {
  243. font-style: italic;
  244. }
  245. blockquote p {
  246. margin-left: 0;
  247. }
  248. figure {
  249. border-top: .2vh solid #2d7474;
  250. background-color: #e3e1e1;
  251. text-align: center;
  252. padding: 1.5rem 0;
  253. margin: 1rem 0 0;
  254. font-size: 1.5rem;
  255. width: 100%;
  256. }
  257. figure img {
  258. max-width: 250px;
  259. max-height: 250px;
  260. border: .5vw solid #323a45;
  261. padding: 1px;
  262. }
  263. figcaption {
  264. padding: 1rem;
  265. line-height: 1.4;
  266. }
  267. aside {
  268. display: flex;
  269. flex-direction: column;
  270. background-color: #e3e1e1;
  271. padding: 1rem 0;
  272. border-bottom: .2vh solid #07486c;
  273. }
  274. aside p {
  275. max-width: 50rem;
  276. margin: 0 auto;
  277. }
  278. /* https://fvsch.com/code/css-locks/ */
  279. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  280. font-size: 1rem;
  281. line-height: calc( 1.5em + 0.2 * 1rem );
  282. }
  283. h1 {
  284. font-size: 1.9rem;
  285. line-height: calc( 1.2em + 0.2 * 1rem );
  286. }
  287. h2 {
  288. font-size: 1.6rem;
  289. line-height: calc( 1.3em + 0.2 * 1rem );
  290. }
  291. h3 {
  292. font-size: 1.35rem;
  293. line-height: calc( 1.4em + 0.2 * 1rem );
  294. }
  295. @media (min-width: 20em) {
  296. /* The (100vw - 20rem) / (50 - 20) part
  297. resolves to 0-1rem, depending on the
  298. viewport width (between 20em and 50em). */
  299. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  300. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  301. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  302. margin-left: 0;
  303. }
  304. h1 {
  305. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. h2 {
  309. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  310. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  311. }
  312. h3 {
  313. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  314. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  315. }
  316. }
  317. @media (min-width: 50em) {
  318. /* The right part of the addition *must* be a
  319. rem value. In this example we *could* change
  320. the whole declaration to font-size:2.5rem,
  321. but if our baseline value was not expressed
  322. in rem we would have to use calc. */
  323. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  324. font-size: calc( 1rem + .6 * 1rem );
  325. line-height: 1.5em;
  326. }
  327. p, li, pre, details {
  328. margin-left: 3rem;
  329. }
  330. h1 {
  331. font-size: calc( 1.9rem + 1.5 * 1rem );
  332. line-height: 1.2em;
  333. }
  334. h2 {
  335. font-size: calc( 1.5rem + 1.5 * 1rem );
  336. line-height: 1.3em;
  337. }
  338. h3 {
  339. font-size: calc( 1.35rem + 1.5 * 1rem );
  340. line-height: 1.4em;
  341. }
  342. figure img {
  343. max-width: 500px;
  344. max-height: 500px;
  345. }
  346. }
  347. figure.unsquared {
  348. margin-bottom: 1.5rem;
  349. }
  350. figure.unsquared img {
  351. height: inherit;
  352. }
  353. @media print {
  354. body { font-size: 100%; }
  355. a:after { content: " (" attr(href) ")"; }
  356. a, a:link, a:visited, a:after {
  357. text-decoration: underline;
  358. text-shadow: none !important;
  359. background-image: none !important;
  360. background: white;
  361. color: black;
  362. }
  363. abbr[title] { border-bottom: 0; }
  364. abbr[title]:after { content: " (" attr(title) ")"; }
  365. img { page-break-inside: avoid; }
  366. @page { margin: 2cm .5cm; }
  367. h1, h2, h3 { page-break-after: avoid; }
  368. p3 { orphans: 3; widows: 3; }
  369. img {
  370. max-width: 250px !important;
  371. max-height: 250px !important;
  372. }
  373. nav, aside { display: none; }
  374. }
  375. ul.with_columns {
  376. column-count: 1;
  377. }
  378. @media (min-width: 20em) {
  379. ul.with_columns {
  380. column-count: 2;
  381. }
  382. }
  383. @media (min-width: 50em) {
  384. ul.with_columns {
  385. column-count: 3;
  386. }
  387. }
  388. ul.with_two_columns {
  389. column-count: 1;
  390. }
  391. @media (min-width: 20em) {
  392. ul.with_two_columns {
  393. column-count: 1;
  394. }
  395. }
  396. @media (min-width: 50em) {
  397. ul.with_two_columns {
  398. column-count: 2;
  399. }
  400. }
  401. .gallery {
  402. display: flex;
  403. flex-wrap: wrap;
  404. justify-content: space-around;
  405. }
  406. .gallery figure img {
  407. margin-left: 1rem;
  408. margin-right: 1rem;
  409. }
  410. .gallery figure figcaption {
  411. font-family: 'ConcourseT3'
  412. }
  413. footer {
  414. font-family: 'ConcourseT3';
  415. display: flex;
  416. flex-direction: column;
  417. border-top: 3px solid white;
  418. padding: 4rem 0;
  419. background-color: #07486c;
  420. color: white;
  421. }
  422. footer > * {
  423. max-width: 50rem;
  424. margin: 0 auto;
  425. }
  426. footer a {
  427. color: #f1c40f;
  428. }
  429. footer .avatar {
  430. width: 200px;
  431. height: 200px;
  432. border-radius: 50%;
  433. float: left;
  434. -webkit-shape-outside: circle();
  435. shape-outside: circle();
  436. margin-right: 2rem;
  437. padding: 2px 5px 5px 2px;
  438. background: white;
  439. border-left: 1px solid #f1c40f;
  440. border-top: 1px solid #f1c40f;
  441. border-right: 5px solid #f1c40f;
  442. border-bottom: 5px solid #f1c40f;
  443. }
  444. </style>
  445. <h1 class="single">
  446. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  447. Senior developer
  448. <time>Publié le 17 octobre 2016</time>
  449. </h1>
  450. <article class="single">
  451. <blockquote>
  452. <p>Defining “senior” is an ongoing and surprisingly difficult process, but we do it because it’s business-critical for us. Without a clear definition of “senior developer", we have no clear path for our own employees to get there. We have no concrete way to evaluate people joining the team, no way to hold ourselves accountable, and no way of improving the process.</p>
  453. <p><cite><em><a href="http://frontside.io/blog/2016/07/07/the-conjoined-triangles-of-senior-level-development.html">The Conjoined Triangles of Senior-Level Development</a></em> (<a href="/david/cache/92a3e2c0f21667733b20899daaad75af/">cache</a>)</cite></p>
  454. </blockquote>
  455. <p>There is a moment in your developer career when you wonder if you’re senior enough to depict yourself as a <em>senior developer</em>. This is not at all a matter of <a href="https://www.tbray.org/ongoing/When/201x/2016/09/14/Old-Geek">how old you are</a> (<a href="/david/cache/e3f5dfb37e7a8852e79d5484cc319df0/">cache</a>), neither how much you’re being paid. This is more related to how many and diverse experiments you made, how many different peers you helped onboarding a project, how easy it becomes to transmit your knowledge, how much confidence you accumulated and how fast you can admit you’re totally wrong. Actually, this is all about the fluidity you can have with a team within an evolving complex context. <strong>That is the moment you realize you are more valuable than the code you produce.</strong></p>
  456. <p>You’re here to speed up the learning process but not too much, otherwise your fellow companions are totally missing the potential failures and are pursuing without accumulating knowledge. Going fast is useful only if everybody within the boat is aware of what has been tried before and what was wrong (and right!) for that particular journey. It can only be achieved with a ton of communication.</p>
  457. <p>When you’re lucky enough to be part of a team of highly skilled developers, you know that everybody will still progress technically because it’s part of the team’s DNA. Besides some long-running trolls, you know that the hard part will not be about technical capabilities anymore, the team is confident enough on that side to learn quickly if necessary. The hard part will be to consider the team — present and future — as a whole. It requires a tremendous amount of empathy to make the right <em>social</em> decisions.</p>
  458. <blockquote>
  459. <p>Senior team members should be expected to spend half their time mentoring and helping others on the team get better. Their job isn’t just to be the code hero bottleneck.</p>
  460. <p><cite><em><a href="https://medium.com/@ednapiranha/want-to-be-an-engineering-manager-74fb6c69d932">Want to be an Engineering Manager?</a></em> (<a href="/david/cache/a464a3fb90e9449322137762b3e967ad/">cache</a>)</cite></p>
  461. </blockquote>
  462. <p>Here the important word is <em>bottleneck</em> and I think that better than trying to reach the <em>senior</em> label individually, it has to be gained as a team. It’s way more challenging to be part of something bigger than yourself. <strong>You can mesure how “senior” a team is by how good it is at reducing bottlenecks and sharing responsibilities.</strong></p>
  463. <blockquote>
  464. <p>Finally, it also creates social problems as well. Bugs that span multiple services and require many changes can languish as multiple teams need to coordinate and synchronize their efforts on fixing things. It can also breed a situation where people don’t feel responsible, and will push as many of the issues onto other teams as possible. When engineers work together in the same codebase, their knowledge of each other and the system itself grows in kind. They’re more willing and capable when working together to tackle problems, as opposed to being the kings and queens of isolated little fiefdoms.</p>
  465. <p><cite><em><a href="http://basho.com/posts/technical/microservices-please-dont/">Microservices - Please, don’t</a></em> (<a href="/david/cache/e88f83094723927904e0c89f802a68fc/">cache</a>)</cite></p>
  466. </blockquote>
  467. <p>Choosing carefully which trends you’re following is key. Some are particularly destructive for the social interactions. I already <a href="/david/blog/2016/specifications-apis/">talked about GraphQL</a>, I think that microservices are <a href="https://twitter.com/colettecello/status/749052871719591937">even worse</a>. This is a particular case when there is so much tensions within the team that you need to separate people and their products to still be able to deliver some value. A senior developer has to be inclusive in his productions and reactions, sometimes at the expense of speed or relevance.</p>
  468. <blockquote>
  469. <p>The last step is to write about it. This could be a blog post, a book, or a conference talk. When I write about a topic, I explore the edges of what I know, the edges outside of what I needed to initially implement the idea. </p>
  470. <p><cite><em><a href="https://snook.ca/archives/other/how-do-i-learn">How do I learn?</a></em> (<a href="/david/cache/11244da948ea7db85f66f53764ac43f5/">cache</a>)</cite></p>
  471. </blockquote>
  472. <p>One part of becoming a senior developer is to be able to go just a bit deeper than the average developer and be able to share it. That’s a tiny advantage that makes all the difference. Sharing can take many forms, from blogging to giving a presentation or pushing some code on a repository. The end-result is not the most important (except for ego maybe). The moment you dig into the concrete issue and spend some time on it, the process of acquiring that knowledge and being capable of transmitting it. That’s the key point.</p>
  473. <blockquote>
  474. <p>We are knowledgeable and productive, yes, but we also understand that we may actually know fewer (useful) things than we did at a prior point in our career. A non-trivial amount of our knowledge has decayed, and we may not have had the time to accumulate enough new knowledge to compensate.</p>
  475. <p>[…]</p>
  476. <p>We realize that it’ll require real effort to just maintain our level proficiency - and without that effort, we could be <em>worse</em> at our jobs in 5 years than we are today.</p>
  477. <p><cite><em><a href="http://www.bennorthrop.com/Essays/2016/reflections-of-an-old-programmer.php">Reflections of an "Old" Programmer</a></em> (<a href="/david/cache/8ea7d7bdb326b34d9181731f2daf4fd0/">cache</a>)</cite></p>
  478. </blockquote>
  479. <p>The combination of our <em>knowledge decay</em> being extremely fast and our <em>knowledge accumulation rate</em> being quite slow leads to burnouts and endless questioning. Both being quite destructive on the long term. <strong>Senior developers are survivors.</strong> The ones finding a steady pace in their learning and a clear balance between theory and practice on a day-to-day basis. The ones taking the time to transmit their experience and to be <a href="https://www.briangilham.com/blog/2016/10/10/be-kind">kind enough</a> (<a href="/david/cache/fca374e14f300b3edf77196437c76f52/">cache</a>) to reduce the pain for newcomers. The ones avoiding depression and dead-ends like management and entrepreneurship. The ones escaping the craftsmanship and perfection rabbit holes. The ones considering themselves not senior enough to push the limits of its definitions. What is <em>your</em> one?</p>
  480. </article>
  481. <figure class="image" property="schema:image">
  482. <img src="/static/david/blog/2016/senior-developer.jpg" alt="" />
  483. </figure>
  484. <nav id="jumpto">
  485. <p>
  486. <a rel=prev href="/david/blog/2016/slow-data/">← Slow Data</a> | <a href="/david/blog/" title="Retour à la liste des expériences">↑</a> | <a rel=next href="/david/blog/2016/si-cest-gratuit/">Si c’est gratuit… →</a>
  487. </p>
  488. </nav>
  489. <footer>
  490. <div>
  491. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  492. <p>
  493. Bonjour/Hi!
  494. 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>
  495. 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>).
  496. </p>
  497. <p>
  498. 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>.
  499. </p>
  500. <p>
  501. Les dernières publications hebdomadaires sont :
  502. </p>
  503. <ul class="with_columns">
  504. <li>
  505. <a href="/david/stream/2019/12/31/">Merci</a>
  506. </li>
  507. <li>
  508. <a href="/david/stream/2019/12/27/">Intemporels</a>
  509. </li>
  510. <li>
  511. <a href="/david/stream/2019/12/24/">Outils</a>
  512. </li>
  513. <li>
  514. <a href="/david/stream/2019/12/17/">Origines</a>
  515. </li>
  516. <li>
  517. <a href="/david/stream/2019/12/10/">Publier</a>
  518. </li>
  519. <li>
  520. <a href="/david/stream/2019/12/03/">En forêt</a>
  521. </li>
  522. <li>
  523. <a href="/david/stream/2019/11/26/">Ecocentric</a>
  524. </li>
  525. <li>
  526. <a href="/david/stream/2019/11/19/">Se livrer</a>
  527. </li>
  528. <li>
  529. <a href="/david/stream/2019/11/12/">Dépendances</a>
  530. </li>
  531. <li>
  532. <a href="/david/stream/2019/11/05/">Positif</a>
  533. </li>
  534. <li>
  535. <a href="/david/stream/2019/10/29/">Dettes</a>
  536. </li>
  537. <li>
  538. <a href="/david/stream/2019/10/22/">Privilèges</a>
  539. </li>
  540. <li>
  541. <a href="/david/stream/2019/10/15/">Discrétion</a>
  542. </li>
  543. <li>
  544. <a href="/david/stream/2019/10/08/">Désespérance</a>
  545. </li>
  546. <li>
  547. <a href="/david/stream/2019/10/01/">Présent</a>
  548. </li>
  549. <li>
  550. <a href="/david/stream/2019/09/24/">Manifester</a>
  551. </li>
  552. <li>
  553. <a href="/david/stream/2019/09/17/">Arpenter</a>
  554. </li>
  555. <li>
  556. <a href="/david/stream/2019/09/10/">Nostalgie</a>
  557. </li>
  558. <li>
  559. <a href="/david/stream/2019/09/03/">Déconstruire</a>
  560. </li>
  561. <li>
  562. <a href="/david/stream/2019/08/27/">Documenter</a>
  563. </li>
  564. <li>
  565. <a href="/david/stream/2019/08/20/">Frustration</a>
  566. </li>
  567. <li>
  568. <a href="/david/stream/2019/08/13/">Holisme</a>
  569. </li>
  570. <li>
  571. <a href="/david/stream/2019/08/06/">1%</a>
  572. </li>
  573. <li>
  574. <a href="/david/stream/2019/07/30/">Exemplarité</a>
  575. </li>
  576. <li>
  577. <a href="/david/stream/2019/07/23/">Timelines</a>
  578. </li>
  579. <li>
  580. <a href="/david/stream/2019/07/16/">Écoute</a>
  581. </li>
  582. <li>
  583. <a href="/david/stream/2019/07/02/">Anxiété</a>
  584. </li>
  585. <li>
  586. <a href="/david/stream/2019/06/21/">À lier</a>
  587. </li>
  588. <li>
  589. <a href="/david/stream/2019/06/14/">Pauvreté</a>
  590. </li>
  591. <li>
  592. <a href="/david/stream/2019/06/07/">Amateur</a>
  593. </li>
  594. <li>
  595. <a href="/david/stream/2019/05/31/">Pollution</a>
  596. </li>
  597. <li>
  598. <a href="/david/stream/2019/05/24/">Apaisement</a>
  599. </li>
  600. <li>
  601. <a href="/david/stream/2019/05/10/">Folie</a>
  602. </li>
  603. <li>
  604. <a href="/david/stream/2019/05/03/">Sympathie</a>
  605. </li>
  606. <li>
  607. <a href="/david/stream/2019/04/12/">Péremption</a>
  608. </li>
  609. <li>
  610. <a href="/david/stream/2019/04/05/">Définitions</a>
  611. </li>
  612. <li>
  613. <a href="/david/stream/2019/03/29/">Acceptation</a>
  614. </li>
  615. <li>
  616. <a href="/david/stream/2019/03/22/">Dissonance</a>
  617. </li>
  618. <li>
  619. <a href="/david/stream/2019/03/15/">Reconnaissance</a>
  620. </li>
  621. <li>
  622. <a href="/david/stream/2019/03/08/">Lecture</a>
  623. </li>
  624. <li>
  625. <a href="/david/stream/2019/03/01/">Journaux</a>
  626. </li>
  627. <li>
  628. <a href="/david/stream/2019/02/22/">Écriture</a>
  629. </li>
  630. <li>
  631. <a href="/david/stream/2019/02/15/">Kyriarchie</a>
  632. </li>
  633. <li>
  634. <a href="/david/stream/2019/02/08/">Mots-serrures</a>
  635. </li>
  636. <li>
  637. <a href="/david/stream/2019/02/01/">Sans voie</a>
  638. </li>
  639. <li>
  640. <a href="/david/stream/2019/01/25/">Auto-diagnostic</a>
  641. </li>
  642. <li>
  643. <a href="/david/stream/2019/01/18/">Agilité</a>
  644. </li>
  645. <li>
  646. <a href="/david/stream/2019/01/11/">Métaphores</a>
  647. </li>
  648. <li>
  649. <a href="/david/stream/2019/01/04/">Balbutiements</a>
  650. </li>
  651. </ul>
  652. <p>
  653. Voici quelques articles choisis :
  654. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  655. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  656. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  657. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  658. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  659. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  660. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  661. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  662. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  663. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  664. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  665. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  666. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  667. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  668. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  669. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  670. </p>
  671. <p>
  672. 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>.
  673. </p>
  674. <p>
  675. Je ne traque pas ta navigation mais mon
  676. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  677. conserve des logs d’accès.
  678. </p>
  679. </div>
  680. </footer>
  681. <script type="text/javascript">
  682. ;(_ => {
  683. const jumper = document.getElementById('jumper')
  684. jumper.addEventListener('click', e => {
  685. e.preventDefault()
  686. const anchor = e.target.getAttribute('href')
  687. const targetEl = document.getElementById(anchor.substring(1))
  688. targetEl.scrollIntoView({behavior: 'smooth'})
  689. })
  690. })()
  691. </script>
  692. <script>
  693. /* Service workers */
  694. if (navigator.serviceWorker) {
  695. window.addEventListener('load', function () {
  696. var selector = 'a[href^="/david/cache/"], a[rel=prev], a[rel=next]'
  697. function sendLinks (selector) {
  698. var links = [].slice.call(document.querySelectorAll(selector)).map(function (link) {
  699. return link.getAttribute('href')
  700. })
  701. links.push(location.pathname) // Put the current page in cache too.
  702. navigator.serviceWorker.controller.postMessage({ links: links })
  703. }
  704. navigator.serviceWorker.getRegistration()
  705. .then(function (registration) {
  706. if (!registration || !navigator.serviceWorker.controller) {
  707. return navigator.serviceWorker.register('/serviceworker.js')
  708. .then(navigator.serviceWorker.ready)
  709. .then(function () {
  710. console.log('[ServiceWorker] Ready to go!')
  711. })
  712. .catch(console.error.bind(console))
  713. } else {
  714. console.log('[ServiceWorker] Send links via registration')
  715. sendLinks(selector)
  716. }
  717. })
  718. navigator.serviceWorker.addEventListener('controllerchange', function () {
  719. console.log('[ServiceWorker] Send links via controller change')
  720. sendLinks(selector)
  721. })
  722. navigator.serviceWorker.addEventListener('message', function (event) {
  723. var link = document.querySelector('a[href="' + event.data.link + '"]')
  724. if (event.data.status && link) {
  725. link.style.backgroundColor = '#2d7474'
  726. link.style.color = '#f0f0ea'
  727. link.setAttribute('title', 'En cache pour consultation sans connexion')
  728. }
  729. })
  730. })
  731. } else {
  732. console.warn('[ServiceWorker] No cache for old browsers.')
  733. }
  734. </script>