A place to cache linked articles (think custom and personal wayback machine)
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.html 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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>Why Senior Engineers Hate Coding Interviews (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_2021-01-20.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>
  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://medium.com/swlh/why-senior-engineers-hate-coding-interviews-d583d2855757">
  55. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Why Senior Engineers Hate Coding Interviews</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  63. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  64. </svg> Accueil</a> •
  65. <a href="https://medium.com/swlh/why-senior-engineers-hate-coding-interviews-d583d2855757" title="Lien vers le contenu original">Source originale</a>
  66. </p>
  67. </nav>
  68. <hr>
  69. <h2>And what you should use instead</h2>
  70. <p>Imagine that you’re a principal at a small K-8 school who’s looking to hire a new teacher. As you have less than 20 teachers, you have to ensure that each person you hire can teach any of the grades. Adding to the complications, you’ve recently lost one of your best teachers, someone with 15 years of experience, and a mentor to many of the more junior teachers. How can you replace her?</p>
  71. <p>After some thought, you craft what you think is a creative approach to interviewing. When the candidates show up, you will ask them to teach a lesson drawn from the K-8 curriculum. As you want to ensure that the candidate is well-rounded, you’ll hold off telling them about which lesson you want taught until the beginning of the interview. If they nail this, you infer that they’ll be able to easily teach anything, as they’ve clearly performed well under pressure, on a randomly selected topic.</p>
  72. <p>You put notice out that you’re hiring, and some truly remarkable candidates apply. For the first test of this new approach, however, you plan to try it out on a referral, a teacher that one of your staff has worked with in the past and claims was the star of the school. You marvel at your luck that she even applied, and think that she’ll be the perfect test for your new interview process. You reach out to her to arrange an interview date, and tell her about this new technique you’re using, to allow her some chance to prepare.</p>
  73. <p>Then the interview day arrives, and your candidate shows up at the school. You can sense that she’s a bit nervous, which is strange because she’s an experienced candidate with an impeccable resume. You decide not to dwell on that, and instead usher her into one of your classrooms to begin the interview. “I’d like you to teach me a lesson on Number Theory”. At that point her face sinks, because unbeknownst to you, she hasn’t taught 8th grade in more than 10 years. But always the professional, she goes to the board and starts the lesson. She talks about factors of numbers, and how to determine if a given number is divisible by 2, 5 and 10, but she’s struggling. When you ask about GCF and LCM, she needs clarification about the acronyms, which you interpret as a bad sign. You explain that you’re referring to “greatest common factor” and “least common multiple”, but at this point you can tell that her confidence is shot, and you pick a tinge of annoyance in her voice.</p>
  74. <p>At the end of the hour she’s stumbled through the highlights of Number Theory, but hasn’t at all filled you with a sense of confidence that she could nail this lesson in front of a group of misbehaving 8th graders. She performs very well on several other behaviour-based interviews, but you can’t shake this feeling that maybe she’s not the best in-room teacher. After some deliberation, you decide to pass on her, and hire a much less experienced teacher who excelled on the “lesson test”.</p>
  75. <p>While this may seem like a completely contrived example, and a strange way to interview a teaching applicant, it is precisely the method used to interview software engineers. While I’m not here to argue that coding interviews are entirely broken (<a href="https://www.researchgate.net/publication/334448588_Hiring_is_Broken_What_Do_Developers_Say_About_Technical_Interviews">though others have</a>), I strongly believe that they have no place when interviewing senior engineers.</p>
  76. <p>Why? Simply put, senior engineers are different, and the typical coding interview puts them at a disadvantage for a number of reasons:</p>
  77. <ul>
  78. <li>
  79. <p><strong>They take a ton of prep time to nail</strong> — As coding interviews draw from the entire domain of software development, they’re very difficult to prepare for exhaustively. This problem is amplified for senior engineers in a couple of ways. First of all, by definition, they’re further removed from their schooling, which may be the last time they encountered some of the more esoteric aspects of software development (dynamic programming, red-black trees, or even recursion). Refreshing their memory on a wide array of algorithms and data structure can take a significant amount of prep time. Add to this, the fact that senior engineers are more pressed for time (they have demanding jobs, and often have significant personal responsibilities) and this becomes a perfect storm. I know of several cases where senior engineers have inquired about the interview process at a given employer, and on hearing that there was a coding interview, have declined to interview.</p>
  80. </li>
  81. <li>
  82. <p><strong>They push senior engineers to work differently</strong> — Senior engineers are far removed from the bare-bones development environments that are used in coding interviews. They typically have highly tuned environments, refined over many years, and designed to free them from the unnecessary burdens of coding. To take that away from them, at a time where artificial time constraints are imposed no less, puts them at a significant disadvantage. Furthermore, they may have spent the last few years working with the proprietary libraries (memory management, error checking, tracing) of their existing employer. A coding interview abruptly pulls them out of their comfort zone, back into the world of standard libraries and simple text editors.</p>
  83. </li>
  84. <li>
  85. <p><strong>They don’t really test what you’ll want them to do once hired</strong> — Perhaps the most egregious aspect of using coding interviews with senior engineers is that they only test a small aspect what you’re hiring them to do. Senior engineers typically make 3–5x (or more) than new grads. Expecting them to produce 3–5x more code than a new grad is obviously not reasonable — there just aren’t enough hours in the day. Instead, you’re looking for them to enable teams of junior engineers, mentor those people, identify systemic problems, debug the most complex of issues, and when coding, understand complex systems and the intricate work required to code within them. None of these aspects are tested in a coding interview, and it’s one of the main reasons why senior engineers hate them.</p>
  86. </li>
  87. <li>
  88. <p><strong>They send a bad message</strong> — Just as you know that you’re not principally hiring a senior engineer to code, they know it too. But when you stress coding interviews in your hiring process, you make senior engineers second guess the role for which you’re hiring. “Are they just going to want me to be a code monkey?” “Will I be wasting my talents here?” “Is this a step forwards, or a step backwards?” The last thing you want is for a talented engineer to have doubts about the role, or your company, in the interview process. Asking them coding interview questions does just that.</p>
  89. </li>
  90. </ul>
  91. <p>Sum all of these factors up, and it’s no surprise that senior engineers hate coding interviews. If you’re looking to attract the best senior engineers and reduce the interview friction in this especially tight labour market, I’d suggest you stop asking them coding interview questions.</p>
  92. <p>But, you may be thinking, how will I know if they can code? If you’re leery about hiring a senior engineer without any sense for their coding abilities, I’d suggest you provide a very short take-home assignment (which takes no more than an hour or two to complete). Most senior engineers should be able to find a small amount of time to complete such an assignment, especially since doing so eliminates the prep work required with a coding interview, and can be broken up into smaller time slices that better fit into their busy schedules. A take-home assignment also allows them to work in their native IDE (if they so choose) and spend any time necessary to reacquaint themselves with standard libraries.</p>
  93. <p>As an added benefit, the fact that the applicant can devote as little or as much time as they want to this exercise, allows you to gain insight into what makes them tick. Are they thoughtful with comments? Do think comprehensively about testing? Have they structured their code in a reasonable and understandable way? Do they care deeply about the quality of the work they’re submitting? Put another way, you’ll know not only if they can code, but if they can code well, and in a more realistic setting.</p>
  94. <p>Senior engineers are the lifeblood of any software organization. They are the most desired, most expensive, and most difficult to attract. And especially in an historically tight labour market, your hiring process needs to be tailored to their specific needs, as you need them much more than they need you.</p>
  95. <p>Senior engineers hate coding interviews, and if you’re looking to attract the best, you should hate them too.</p>
  96. </article>
  97. <hr>
  98. <footer>
  99. <p>
  100. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  101. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  102. </svg> Accueil</a> •
  103. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  104. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
  105. </svg> RSS</a> •
  106. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  107. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
  108. </svg> Pro</a> •
  109. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  110. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
  111. </svg> Email</a> •
  112. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  113. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
  114. </svg> Légal</abbr>
  115. </p>
  116. <template id="theme-selector">
  117. <form>
  118. <fieldset>
  119. <legend><svg class="icon icon-brightness-contrast">
  120. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
  121. </svg> Thème</legend>
  122. <label>
  123. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  124. </label>
  125. <label>
  126. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  127. </label>
  128. <label>
  129. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  130. </label>
  131. </fieldset>
  132. </form>
  133. </template>
  134. </footer>
  135. <script>
  136. function loadThemeForm(templateName) {
  137. const themeSelectorTemplate = document.querySelector(templateName)
  138. const form = themeSelectorTemplate.content.firstElementChild
  139. themeSelectorTemplate.replaceWith(form)
  140. form.addEventListener('change', (e) => {
  141. const chosenColorScheme = e.target.value
  142. localStorage.setItem('theme', chosenColorScheme)
  143. toggleTheme(chosenColorScheme)
  144. })
  145. const selectedTheme = localStorage.getItem('theme')
  146. if (selectedTheme && selectedTheme !== 'undefined') {
  147. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  148. }
  149. }
  150. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  151. window.addEventListener('load', () => {
  152. let hasDarkRules = false
  153. for (const styleSheet of Array.from(document.styleSheets)) {
  154. let mediaRules = []
  155. for (const cssRule of styleSheet.cssRules) {
  156. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  157. continue
  158. }
  159. // WARNING: Safari does not have/supports `conditionText`.
  160. if (cssRule.conditionText) {
  161. if (cssRule.conditionText !== prefersColorSchemeDark) {
  162. continue
  163. }
  164. } else {
  165. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  166. continue
  167. }
  168. }
  169. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  170. }
  171. // WARNING: do not try to insert a Rule to a styleSheet you are
  172. // currently iterating on, otherwise the browser will be stuck
  173. // in a infinite loop…
  174. for (const mediaRule of mediaRules) {
  175. styleSheet.insertRule(mediaRule.cssText)
  176. hasDarkRules = true
  177. }
  178. }
  179. if (hasDarkRules) {
  180. loadThemeForm('#theme-selector')
  181. }
  182. })
  183. </script>
  184. </body>
  185. </html>