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

11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Vieux développeur, pas manager (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2020-06-19.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script type="text/javascript">
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://n.survol.fr/n/vieux-developpeur-pas-manager">
  55. <body class="remarkdown h1-underline h2-underline h3-underline hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Vieux développeur, pas manager</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  63. <a href="https://n.survol.fr/n/vieux-developpeur-pas-manager" title="Lien vers le contenu original">Source originale</a>
  64. </p>
  65. </nav>
  66. <hr>
  67. <main>
  68. <p>J’en­tends trop souvent des déve­lop­peurs se plaindre d’être forcés de passer dans le mana­ge­ment pour progres­ser en salaire. </p>
  69. <p>Déjà ça ne reflète pas la réalité. On est dans un métier où le salaire peut doubler avec l’an­cien­neté. Je doute que ce soit vrai pour tant de métiers que ça dans le privé, pas sans chan­ger tota­le­ment de rôle voire de métier.</p>
  70. <p><hr class="wp-block-separator"/><p>L’enjeu est cepen­dant que, effec­ti­ve­ment, la produc­ti­vité indi­vi­duelle n’est pas propor­tion­nelle avec l’an­cien­neté. On progresse souvent bien plus les premières années que les suivantes. </p></p>
  71. <p>À péri­mètre iden­tique, on voit plus faci­le­ment la diffé­rence entre deux déve­lop­peurs avec 2 et 5 ans d’ex­pé­rience qu’entre deux déve­lop­peurs avec 10 et 13 ans d’ex­pé­rience. </p>
  72. <p>Rien d’anor­mal, donc, que la progres­sion sala­riale le reflète.</p>
  73. <p>Ce n’est pas « la France qui est en retard sur ces ques­tions », c’est juste l’ap­pli­ca­tion du système de marché. Le salaire dépend de ce que vous appor­tez, pas de votre ancien­neté.</p>
  74. <p><hr class="wp-block-separator"/><p>L’avan­tage c’est qu’a­vec l’ex­pé­rience, norma­le­ment, vous pouvez appor­ter plus que votre code. Le péri­mètre n’a aucune raison d’être iden­tique avec les années.</p></p>
  75. <p>Vous pouvez former les plus jeunes et les faire progres­ser. Vous pouvez commu­niquer avec le busi­ness, avec la commu­ni­ca­tion, avec le légal, faire l’in­ter­face, comprendre les enjeux de chacun et propo­ser des solu­tions. Vous pouvez parler coût, main­te­nance et stra­té­gie. Vous pouvez iden­ti­fier les problèmes et les solu­tions, amélio­rer l’or­ga­ni­sa­tion de l’équipe. Etc. </p>
  76. <p>L’idée c’est de lever la tête de son code et commen­cer à embras­ser un péri­mètre plus large. Vous avez de la chance : Contrai­re­ment à beau­coup d’autres domaines, vous pouvez faire ça sans chan­ger de métier (et sans forcé­ment deve­nir mana­ger).</p>
  77. <p>Pour ma part j’uti­lise ces termes : </p>
  78. <ul><li>Senior : Il va guider, orga­ni­ser, former, servir de mentor ou de sage. Ce n’est pas forcé­ment le plus expert, ni même celui qui a le plus d’an­cien­neté, mais c’est lui qui va faire progres­ser tout le monde ou s’as­su­rer qu’on ne parte pas n’im­porte où. Il est souvent mana­ger mais pas forcé­ment, par contre il y a toujours un aspect de mentor et donc donc pas très loin de l’en­ca­dre­ment.</li><li>Expert : C’est lui le plus pointu mais pas forcé­ment le plus expé­ri­menté. Parfois il est même rela­ti­ve­ment jeune par rapport aux autres. Il n’y a pas forcé­ment besoin d’ex­pert dans toutes les équipes donc ce n’est pas forcé­ment un débou­ché facile. </li><li>Lead : Souvent avec du bagage tech­nique signi­fi­ca­tif mais pas forcé­ment un expert. Souvent assez expé­ri­menté mais pas forcé­ment <em>le</em> senior non plus. Souvent avec une dose d’en­ca­dre­ment mais pas forcé­ment non plus. J’at­tends de lui qu’il dirige l’équipe, l’or­ga­nise, donne l’im­pul­sion, comprenne et appré­hende les enjeux, y compris les équi­libres busi­ness, plan­ning, main­te­nance, etc. C’est souvent lui qui s’en­gage et prend les respon­sa­bi­li­tés, et qui sait parler avec tout le monde et a tendance a être suivi par tout le monde.</li></ul>
  79. <p>Les étiquettes sont forcé­ment limi­ta­tives. Ce ne sont pas les seules façons de voir les choses mais ça permet de mettre des nom sur des rôles et des attentes.</p>
  80. <p>Un déve­lop­peur avec beau­coup d’an­cien­neté est juste un déve­lop­peur avec beau­coup d’an­cien­neté. S’il n’agit pas comme tel, son ancien­neté ne le trans­forme pas de fait en senior, en expert ou en lead. </p>
  81. <p>Se conten­ter de ne se préoc­cu­per que de son code person­nel tout en ayant 5 ou 10 ans d’ex­pé­rience est tout à fait respec­table, mais si on ne progresse que peu le salaire en fera autant.</p>
  82. <p><hr class="wp-block-separator"/><p>Ce qui précède est démul­ti­plié par un effet de levier.</p></p>
  83. <p>Si vous impac­tez plusieurs personnes, vous pouvez géné­rer une valeur supé­rieure à ce que vous pour­riez obte­nir isolé­ment. Amélio­rez les condi­tions de travail d’une équipe, les dix personnes concer­nées n’aug­men­te­ront peut-être leur produc­ti­vité que 5 % chacun, mais cumulé c’est aussi perti­nent qu’aug­men­ter votre effi­ca­cité person­nelle de 50 %… et bien plus facile.</p>
  84. <p>Quand l’amé­lio­ra­tion de produc­ti­vité indi­vi­duelle baisse, agir sur le collec­tif a un meilleur retour sur inves­tis­se­ment. Dans mes rôles plus haut, c’est ce que font le senior et le lead. </p>
  85. <p>L’ex­pert, non seule­ment plus rare, est aussi un rôle plus diffi­cile parce que son effet de levier est beau­coup plus complexe à obte­nir (et à quan­ti­fier). Or, quand les déve­lop­peurs parlent d’une progres­sion de carrière « sans mana­ge­ment », ils ont tendance à imagi­ner un expert.</p>
  86. <p>Je pense que le mythe du « il faut faire mana­ger » vient en partie de là. Un déve­lop­peur avec beau­coup d’ex­pé­rience qui ne perçoit pas son rôle collec­tif a besoin de faire une sacré diffé­rence de produc­tion indi­vi­duelle par rapport aux plus jeunes pour justi­fier son salaire. Au bout d’un moment ça n’est plus viable et le salaire stagne. Le problème n’est pas de faire du mana­ge­ment ou pas, mais de lever un peu la tête pour voir ce qu’on peut appor­ter, où et comment.</p>
  87. <p><hr class="wp-block-separator"/><p>Post-scrip­tum : On vous intro­ni­sera parfois expli­ci­te­ment comme lead alors que vous ne l’étiez pas aupa­ra­vant, plus rare­ment comme expert. Ça n’ar­ri­vera quasi­ment jamais comme senior. De mon expé­rience dire à quelqu’un « désor­mais tu es senior » n’a jamais fonc­tionné. C’est quand on l’est et qu’on agit comme tel qu’on peut ensuite s’y faire recon­naître.</p></p>
  88. </main>
  89. </article>
  90. <hr>
  91. <footer>
  92. <p>
  93. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  94. <a href="/david/log/" title="Accès au flux RSS">🤖</a> •
  95. <a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
  96. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
  97. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
  98. </p>
  99. <template id="theme-selector">
  100. <form>
  101. <fieldset>
  102. <legend>Thème</legend>
  103. <label>
  104. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  105. </label>
  106. <label>
  107. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  108. </label>
  109. <label>
  110. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  111. </label>
  112. </fieldset>
  113. </form>
  114. </template>
  115. </footer>
  116. <script type="text/javascript">
  117. function loadThemeForm(templateName) {
  118. const themeSelectorTemplate = document.querySelector(templateName)
  119. const form = themeSelectorTemplate.content.firstElementChild
  120. themeSelectorTemplate.replaceWith(form)
  121. form.addEventListener('change', (e) => {
  122. const chosenColorScheme = e.target.value
  123. localStorage.setItem('theme', chosenColorScheme)
  124. toggleTheme(chosenColorScheme)
  125. })
  126. const selectedTheme = localStorage.getItem('theme')
  127. if (selectedTheme && selectedTheme !== 'undefined') {
  128. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  129. }
  130. }
  131. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  132. window.addEventListener('load', () => {
  133. let hasDarkRules = false
  134. for (const styleSheet of Array.from(document.styleSheets)) {
  135. let mediaRules = []
  136. for (const cssRule of styleSheet.cssRules) {
  137. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  138. continue
  139. }
  140. // WARNING: Safari does not have/supports `conditionText`.
  141. if (cssRule.conditionText) {
  142. if (cssRule.conditionText !== prefersColorSchemeDark) {
  143. continue
  144. }
  145. } else {
  146. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  147. continue
  148. }
  149. }
  150. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  151. }
  152. // WARNING: do not try to insert a Rule to a styleSheet you are
  153. // currently iterating on, otherwise the browser will be stuck
  154. // in a infinite loop…
  155. for (const mediaRule of mediaRules) {
  156. styleSheet.insertRule(mediaRule.cssText)
  157. hasDarkRules = true
  158. }
  159. }
  160. if (hasDarkRules) {
  161. loadThemeForm('#theme-selector')
  162. }
  163. })
  164. </script>
  165. </body>
  166. </html>