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.

3 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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` element
  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>Why nobody hires junior developers anymore (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="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Documented, feel free to shoot an email. -->
  28. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  29. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  30. <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>
  31. <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>
  32. <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>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  36. <script>
  37. function toggleTheme(themeName) {
  38. document.documentElement.classList.toggle(
  39. 'forced-dark',
  40. themeName === 'dark'
  41. )
  42. document.documentElement.classList.toggle(
  43. 'forced-light',
  44. themeName === 'light'
  45. )
  46. }
  47. const selectedTheme = localStorage.getItem('theme')
  48. if (selectedTheme !== 'undefined') {
  49. toggleTheme(selectedTheme)
  50. }
  51. </script>
  52. <meta name="robots" content="noindex, nofollow">
  53. <meta content="origin-when-cross-origin" name="referrer">
  54. <!-- Canonical URL for SEO purposes -->
  55. <link rel="canonical" href="https://www.notonlycode.org/nobody-hires-juniors/">
  56. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  57. <article>
  58. <header>
  59. <h1>Why nobody hires junior developers anymore</h1>
  60. </header>
  61. <nav>
  62. <p class="center">
  63. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  64. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  65. </svg> Accueil</a> •
  66. <a href="https://www.notonlycode.org/nobody-hires-juniors/" title="Lien vers le contenu original">Source originale</a>
  67. </p>
  68. </nav>
  69. <hr>
  70. <p>While the number of job opportunities for software developer skyrockets together with salaries all around the world, fresh grads and junior developers struggle to even get invited for the interviews. Why does it happen and can we do anything about it?</p>
  71. <p>Tech industry has still relatively low barrier of entry, especially when compared to other well-paying jobs (think 5+ years of school for lawyers and doctors). However looking at the number of entry-level job offers on LinkedIn or other job portals, it seems that the golden days for bootcamp graduates and self-taught devs are over. Finding job as a junior has already been challenging in the last 2 years, but 2021 seems like a real bad time to be searching for the first job in tech.</p>
  72. <p>In the last few years I've been heavily involved in hiring, I've worked with a number of recruiters, and I spent some collaborating with coding bootcamps. Based on my discussions and observations, I believe there are 2 main reasons behind the current situation: tragedy of the commons and COVID-19. The first one has been a problem for years, the second one has amplified the issue.</p>
  73. <h2 id="short-term-gains-long-term-loss">Short-term gains, long-term loss</h2>
  74. <p>Imagine a following situation: a group of fishermen have access to a lake with fish. The lake does not belong to any particular person, and all fishermen go there daily and catch a few fish to feed their families and sell to fellow townmen. That situation lasts for years and remains stable. Then one day one of the fishermen figures out that he can catch more fish and sell them also in other towns.</p>
  75. <p>Soon other fishermen copy that model and everyone happily catches a lot of fish and makes more money. Until one day the fishermen notice that it takes them more and more time to catch fish, until one day they come home empty handed. The fishermen never considered that they need to maintain the population of fish in the lake, and because of their greed they caught all fish and left the lake empty.</p>
  76. <p>This kind of situation has a name - <a href="https://en.wikipedia.org/wiki/Tragedy_of_the_commons">the tragedy of the commons</a> - and you can think about it as a <a href="https://cs.stanford.edu/people/eroberts/courses/soco/projects/1998-99/game-theory/npd.html">multiplayer prisoner's dilemma</a>. The dilemma is simple - you can choose to cooperate with others (limit number of fish you catch with sustainability in mind) or betray them (catch more fish for higher short-term gains). However if enough people betrays others, eventually they deplete the resource they use and everyone loses. </p>
  77. <p>Tragedy of the commons is not just a thought experiment. It happens in real life, too. A fairly recent case comes from Thailand and its famous Maya bay,  featured movie "The Beach" with Leonardo di Caprio. Maya bay is a gorgeous spot located at one of the Phi Phi islands that every day used to draw thousands of tourists. Unfortunately the trip organizers were too greedy and the fragile ecosystem of the bay could not handle the number of boats and people, and the amount of trash left there. In 2018 the government of Thailand decided to close the island for recovery, and as of September 2021 it remains unavailable for tourists.</p>
  78. <figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.notonlycode.org/content/images/2021/09/IMG_3892.JPG" class="kg-image" alt loading="lazy" srcset="https://www.notonlycode.org/content/images/size/w600/2021/09/IMG_3892.JPG 600w, https://www.notonlycode.org/content/images/size/w1000/2021/09/IMG_3892.JPG 1000w, https://www.notonlycode.org/content/images/size/w1600/2021/09/IMG_3892.JPG 1600w, https://www.notonlycode.org/content/images/size/w2400/2021/09/IMG_3892.JPG 2400w" sizes="(min-width: 720px) 720px"><figcaption>A photo I took in Maya bay back in 2017, while it was still open (though the damage was already very visible)</figcaption></figure>
  79. <h2 id="too-many-betrayals-among-tech-companies">Too many betrayals among tech companies</h2>
  80. <p>What does all this have to do with hiring in tech? We're dealing with a similar kind of a problem:</p>
  81. <ul><li>everyone wants to have senior developers, because they provide value</li><li>in order to have a senior developer, we need a junior dev + a lot of time + proper training</li><li>in order to train junior developers, company needs to invest: senior developers spend less time on product (sacrifice immediate profit) so that they can support others (with long-term gain in mind)</li></ul>
  82. <p>Here's the twist - a company might invest in a developer, but not profit from them, because once that developer gains enough experience and skills to provide value, they'll start getting other job offers, and as we know changing jobs brings higher raise than staying.</p>
  83. <p>Knowing all that, companies can take different strategy depending on their circumstances:</p>
  84. <ul><li>top companies (big tech, high growth startups) figure out that they don't really need to hire a lot of junior developers, they'll just hire the best seniors from other companies by offering them way higher compensation</li><li>above average companies (other highly profitable enterprises) figure out they don't need to hire that many junior developers either, they'll just hire senior or mid-level devs who can't get a job at top companies</li><li>the remaining companies know they are at the bottom of the food chain - they train developers that later find better paying options. These companies still hire juniors, because they don't have much choice, but their hiring becomes limited because there are not enough experienced devs for mentoring</li><li>software houses are a bit of a special case - since they charge per person per day, even less experienced developers quickly become profitable for the company. It's tough to convince customers to add junior dev to the team, but often software houses just promote people very quickly</li></ul>
  85. <figure class="kg-card kg-image-card"><img src="https://www.notonlycode.org/content/images/2021/09/Shared-resource-1-.png" class="kg-image" alt loading="lazy" srcset="https://www.notonlycode.org/content/images/size/w600/2021/09/Shared-resource-1-.png 600w, https://www.notonlycode.org/content/images/2021/09/Shared-resource-1-.png 800w" sizes="(min-width: 720px) 720px"></figure>
  86. <p>We end up in a situation where the demand for senior developers far outweighs the capacity and willingness of the companies to train juniors. Up until recently it wasn't that bad though, we were in kind of an stable situation - the number of developers needed was growing steadily, the attrition was stable, companies were offering some internships and entry-level positions, universities and bootcamps provided streams of candidates. It wasn't very easy to get the first job in the industry, but with enough effort and determination it was possible even for someone who has just started programming.</p>
  87. <p>And then came the pandemic.</p>
  88. <h2 id="nobody-hires-juniors-anymore">Nobody hires juniors anymore</h2>
  89. <p>After the initial shock of the pandemic, all the hiring freezes and layoffs, companies figured out where they stand and started hiring again. The bounce was strengthened by sudden spike in demand for digital services (retailers moving to on-line, booming businesses like virtual events and all kinds of deliveries), influx of cash from investors, and the need to catch-up after the hiring freeze.</p>
  90. <p>Together with a lot of burnout cases and people taking longer leaves, it created a spike in need for experienced engineers, and made almost no impact (or maybe even a negative impact) on a number of entry-level roles. With all the pandemic-related challenges and opportunities, investing in junior developers is not an urgent matter.</p>
  91. <h3 id="remote-work">Remote work</h3>
  92. <p>Working from home comes with a lot of benefits, but also plenty of challenges - how to keep the communication effective? How to ensure people keep the healthy balance between work and time off? How do we make remote teams work effectively? How do we balance between seeing each others faces while avoiding the fatigue related to constantly being on the camera?</p>
  93. <p>We all still struggle with that, but  then comes another problem - how do we onboard new people? We need to deliver them the equipment, make sure they have all their need for their home office, but more importantly, we need to figure out how to share the knowledge and feel people excited about joining the company. There's no onboarding day anymore, we can't gather all new joiners in one room anymore to let them meet each other and to have a big welcome breakfast.</p>
  94. <p>And then comes another complication - what if these people are fresh grads? How can we hire people for their first job while we struggle with onboarding in general? The answer is - let's put that on hold and figure it out later. Junior roles are traditionally the easiest to fill, so we can just stop for a few months and hire them later, when we are ready.</p>
  95. <figure class="kg-card kg-image-card"><img src="https://www.notonlycode.org/content/images/2021/09/pandemic-junior-reasons.png" class="kg-image" alt loading="lazy" srcset="https://www.notonlycode.org/content/images/size/w600/2021/09/pandemic-junior-reasons.png 600w, https://www.notonlycode.org/content/images/size/w1000/2021/09/pandemic-junior-reasons.png 1000w, https://www.notonlycode.org/content/images/size/w1600/2021/09/pandemic-junior-reasons.png 1600w, https://www.notonlycode.org/content/images/2021/09/pandemic-junior-reasons.png 2240w" sizes="(min-width: 720px) 720px"></figure>
  96. <h3 id="everyones-understaffed">Everyone's understaffed</h3>
  97. <p>The 2nd effect of the pandemic is that everyone urgently needs senior developers. Gergely Orosz wrote a <a href="https://blog.pragmaticengineer.com/advice-for-tech-workers-to-navigate-a-heated-job-market/">great blog post about it</a>, where he explains in detail why there's a shortage of senior developers:</p>
  98. <ul><li>sudden demand for digital products and services means companies need to scale and, in order to remain competitive, keep innovating, so they need experienced devs</li><li>demand for developers (and limited supply) means companies have to pay more and offer more benefits</li><li>that means it's a good time to change jobs - new job usually means a nice raise, but this time instead of 20% it can be even 50-70%</li><li>that creates a lot of movement in the market, on one hand companies lose people, on the other bring a lot of new devs, so they need to spend a lot of time onboarding (which also puts pressure on remaining employees!)</li><li>on the other hand people are exhausted because of the pandemic and want to take longer break; with the huge demand for developers they feel more comfortable taking a few months off (so supply is even smaller)</li></ul>
  99. <p>Once again, this affects junior developers in a negative way. Since everyone desperately needs senior devs, nobody wants to put even more pressure on their devs to help onboard and train junior devs.</p>
  100. <p>And because a lot of tech companies have been playing defectors for the last few years and didn't invest enough in junior developers when they could, now everyone struggles.</p>
  101. <h2 id="the-way-forward">The way forward</h2>
  102. <p>The question remains - what now? Sooner or later the situation will become more stable, but is there anything we can do to help each other? None of us alone will make a big difference, but we still can help to bring a little bit of balance in the industry, and everyone can contribute.</p>
  103. <h3 id="why-should-you-care">Why should you care?</h3>
  104. <p>One thing that you might be asking yourself is "why do I care?". If you're a senior developer, you technically benefit from the current situation - you can easily jump jobs and get a significant raise every time. But even then, lack of junior developers has a negative impact on your career - when there are no junior developers, there are no people to teach, so you can't improve as a mentor. There are no people who can take easier tasks, so you have to do them. Finally, the teams can't grow as fast as they could, so even if you could get promoted to lead your own team, your company only hires senior devs, and it's hard to find them.</p>
  105. <p>And if you're a lead dev or a manager, you should care about building a stable situation where more experienced developers can make a bigger impact by supporting junior devs and focusing on tasks that only they can do. Without junior developers, that balance is gone.</p>
  106. <h3 id="if-youre-a-junior-dev-looking-for-work">If you're a junior dev looking for work</h3>
  107. <p>If you're currently looking for your first job in the tech industry, there are 2 things that you should do: expand your search and make it sustainable.</p>
  108. <p>Expand: reach out to companies directly. Smaller companies could offer you a position even if they are not actively looking for junior candidates. Attend events - there are a lot of virtual, free meetups where you can chat with people. Go beyond the stack that you know, if you know React check also positions for Vue or  Angular developers.</p>
  109. <p>Make it sustainable: it may take you even 12 months to find a job. Pace yourself, make a list of companies you want to write to and make it a habit to send a few applications a day. Take some days off, remember to relax, you are in it for the long term.</p>
  110. <figure class="kg-card kg-embed-card">
  111. </figure>
  112. <p>A year ago I made 2 videos where I talked exactly about this topic. Check them out, each of them is 5-10 minutes:</p>
  113. <figure class="kg-card kg-embed-card"><iframe src="https://www.youtube.com/embed/kzG3SeKmGP0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>VIDEO</iframe></figure>
  114. <figure class="kg-card kg-embed-card"><iframe src="https://www.youtube.com/embed/w-4P7nz0Fa8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>VIDEO</iframe></figure>
  115. <h3 id="if-youre-an-employed-developer">If you're an employed developer</h3>
  116. <p>If your company doesn't hire junior developers at all, understand why, see whether it's a rule or just nobody thought of opening junior roles. Suggest to your managert that it would help to have someone less experienced, so that you can teach them but also delegate simpler tasks that don't need someone with your experience. If not junior devs - maybe interns? In my first job I started an internship program that provided a lot of benefits over the years. If you work for a small company, it should be much easier than in a corporation!</p>
  117. <p>If you are willing to help others in your free time, you can become a mentor or a coach - there are organizations out there who help people break into the industry. In the past I had a pleasure of working with a free, volunteer-based bootcamp. I helped someone to change their career, and while doing this I became a much better mentor than I used to be. It's a hard, but very rewarding work.</p>
  118. <h3 id="if-youre-a-manager">If you're a manager</h3>
  119. <p>If you're an engineering manager, you have an impact on hiring - use it! If your team is doing well, ask your manager for additional headcount and make sure it's an entry-level position. Talk to your peer and discuss with them how you can benefit from having more junior devs (I'll write about the benefits another time, stay tuned!). It's not an easy thing to do, especially if your company has practiced the parasite "only seniors here" model until now, but you can always try.</p>
  120. <h3 id="if-youre-an-executive">If you're an executive</h3>
  121. <p>If you're a VP of Engineering or CTO you are probably responsible for (or at least can influence) the hiring plans and strategy. Take junior positions into account - find a ratio that will work in your teams (1 junior in a team of 4 or 5, for example) and ensure that your company provides an inclusive, welcoming environment for people who have just started their career in software development.</p>
  122. <h2 id="back-to-where-we-started">Back to where we started?</h2>
  123. <p>The current tech boom won't last forever. Eventually things will become more stable. The world will keep innovating, the demand for developers will remain, but it won't be that urgent. In a couple of months the bounce caused by the pandemic will weaken and we'll go back to where we were before - a system where juniors don't have it easy, but where it's possible for them to get interviews, and eventually start their career in software development. </p>
  124. </article>
  125. <hr>
  126. <footer>
  127. <p>
  128. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  129. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  130. </svg> Accueil</a> •
  131. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  132. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
  133. </svg> Suivre</a> •
  134. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  135. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
  136. </svg> Pro</a> •
  137. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  138. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
  139. </svg> Email</a> •
  140. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  141. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
  142. </svg> Légal</abbr>
  143. </p>
  144. <template id="theme-selector">
  145. <form>
  146. <fieldset>
  147. <legend><svg class="icon icon-brightness-contrast">
  148. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
  149. </svg> Thème</legend>
  150. <label>
  151. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  152. </label>
  153. <label>
  154. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  155. </label>
  156. <label>
  157. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  158. </label>
  159. </fieldset>
  160. </form>
  161. </template>
  162. </footer>
  163. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  164. <script>
  165. function loadThemeForm(templateName) {
  166. const themeSelectorTemplate = document.querySelector(templateName)
  167. const form = themeSelectorTemplate.content.firstElementChild
  168. themeSelectorTemplate.replaceWith(form)
  169. form.addEventListener('change', (e) => {
  170. const chosenColorScheme = e.target.value
  171. localStorage.setItem('theme', chosenColorScheme)
  172. toggleTheme(chosenColorScheme)
  173. })
  174. const selectedTheme = localStorage.getItem('theme')
  175. if (selectedTheme && selectedTheme !== 'undefined') {
  176. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  177. }
  178. }
  179. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  180. window.addEventListener('load', () => {
  181. let hasDarkRules = false
  182. for (const styleSheet of Array.from(document.styleSheets)) {
  183. let mediaRules = []
  184. for (const cssRule of styleSheet.cssRules) {
  185. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  186. continue
  187. }
  188. // WARNING: Safari does not have/supports `conditionText`.
  189. if (cssRule.conditionText) {
  190. if (cssRule.conditionText !== prefersColorSchemeDark) {
  191. continue
  192. }
  193. } else {
  194. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  195. continue
  196. }
  197. }
  198. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  199. }
  200. // WARNING: do not try to insert a Rule to a styleSheet you are
  201. // currently iterating on, otherwise the browser will be stuck
  202. // in a infinite loop…
  203. for (const mediaRule of mediaRules) {
  204. styleSheet.insertRule(mediaRule.cssText)
  205. hasDarkRules = true
  206. }
  207. }
  208. if (hasDarkRules) {
  209. loadThemeForm('#theme-selector')
  210. }
  211. })
  212. </script>
  213. </body>
  214. </html>