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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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>“Explain a Topic At Multiple Levels…” (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://jacobian.org/2021/feb/8/interview-questions-explain-a-topic/">
  55. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>“Explain a Topic At Multiple Levels…”</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://jacobian.org/2021/feb/8/interview-questions-explain-a-topic/" title="Lien vers le contenu original">Source originale</a>
  66. </p>
  67. </nav>
  68. <hr>
  69. <p><em>Each day this week I’ll be sharing one of the questions I use when I interview for technical roles. I’ll unpack the question, when to ask it, and how to evaluate answers. <a href="https://jacobian.org/series/unpacking-interview-questions/">You can see all articles in this series here</a>.</em></p>
  70. <h2 id="background">Background</h2>
  71. <p><em>Who this is for</em>: technical roles at any level where communication with non-technical staff is important (which, for me, is all of them).</p>
  72. <p><em>What it measures</em>: ability to communicate technical topics effectively to a variety of audiences. Secondary to this, knowledge of some foundational web development topic.</p>
  73. <p>This is one of my favorite questions to ask for engineering roles; strong performance on this question correlates very highly with high job performance on my teams. This is because my teams are almost always <a href="https://jacobian.org/2021/jan/5/designing-engineering-organizations/">cross-functional teams</a>. And, being able to communicate effectively is part of being a good engineer (<a href="https://jacobian.org/2019/apr/3/iq-isnt-enough-to-get-hired/">IQ isn’t enough to get you hired</a>).</p>
  74. <p>Engineers on my teams need to be able to communicate effectively with their colleagues, who will have a wide range of software experience. An engineer who can’t talk about their work with others on the team isn’t a good team member, and isn’t someone I want to hire. This question simulates something that happens on these cross-functional teams: the need to explain technical topics and tailor the explanation for the audience’s skill level.</p>
  75. <p>A secondary benefit is that this question can look for some level of technical knowledge – someone who knows web development well should be able to make that knowledge apparent – but that’s less important here than the communication aspects.</p>
  76. <p><hr><h2 id="the-question">The question</h2><p><strong>“Pick a foundational web development concept (e.g. HTML, CSS, JavaScript, etc.) and explain it at two levels: first as you would to a colleague who’s not a software developer, like a designer or product manager; next, as you would to a peer.”</strong></p><h3 id="what-behaviors-to-look-for">What behaviors to look for</h3><ul><li>Do they communicate effectively at both levels of technical detail?</li><li>Do they demonstrate knowledge of the topic at a level that’s appropriate to the role?</li></ul><h4 id="positive-signs">Positive signs</h4><ul><li>👍 <strong>Strong explanations at both levels</strong></li><li>👍 Takes a moment at the beginning to consider and choose a good topic</li><li>👍 Tailors explanation for each skill level</li><li>👍 Effective use of metaphor or other rhetorical devices</li><li>👍 Focused, organized, succinct explanation</li><li>👍 Asks questions to guide their explanation</li></ul><h4 id="red-flags">Red flags</h4><ul><li>🚩 <strong>Unable to give a strong description at either (or both) levels</strong></li><li>🚩 At the non-technical level: excessive use of jargon or other assumed technical knowledge</li><li>🚩 Patronizing tone, especially when explaining “down”</li></ul><hr><h2 id="discussion">Discussion</h2><p>In practice, when I ask the question I often have a longer preamble and more explicit way of asking this; I’ll say something like:</p><blockquote><p>The job involves working with folks with a wide range of technical experience. We often need to discuss technical topics at a variety of different levels of detail. So, to simulate that: I’m going to ask you to pick a foundational web development concept (e.g. HTML, CSS, JavaScript, etc), and explain it to me at two levels of detail. First, I’ll ask you to explain it to me as if I were a a colleague who’s not a software developer, like a designer or product manager. Then, we’ll re-wind, and I’ll ask you to go deeper and explain it to me as if I were a peer.</p></blockquote><p>Evaluating candidates is relatively straightforward – you’re directly measuring their ability to communicate. However, <strong>there’s a high risk that unconscious bias can color your evaluation of a candidate’s answers.</strong> A few things to keep in mind to help control for unconscious bias:</p><ul><li>Since this question is all about communication, <strong>be very careful about making judgement based on accent</strong>. We’re socially conditioned to believe that certain accents – Black accents, Southern accents, strong accents from non-native-English speakers – are indicators of low intelligence. This is bullshit; don’t fall for the trap.</li><li>Be wary of judgement based on communication behavior that may be triggered by nerves. Many speakers have verbal tics that are especially bad when they’re nervous – e.g. stalling words like “um” or “like”, mumbling, long pauses, etc. Remember that job interviews make most people <em>really</em> nervous, so these behaviors will be substantially more pronounced in the interview than they’d be in real life.</li><li>The primary behavior you’re evaluating here is communication skill. So pay close attention to the way the candidate structures their explanation, the way they talk and explain, how they engage (or don’t) with you, etc. Pay less attention to the technical details (other questions will get deeper there). Remember that we’re prone to think that members of underrepresented groups are less technically talented than the majority. If you find yourself thinking, “this person doesn’t know what they’re talking about”, come back to what specifically they said or did to give you that impression. Is the judgement coming from their specific behavior, or from bias?</li></ul><h3 id="alternate-versions-of-this-question">Alternate versions of this question</h3><p>This can be adapted for nearly any domain by just changing “web development” to some other field. I’ve used versions of this question to interview data scientists, GIS analysts, security engineers, SREs, and more.</p><p>It’s probably also useful for non-engineering roles – I can imagine versions of this question being useful for designers, copywriters, etc. But I’ve not tried that myself.</p><h3 id="see-also">See also</h3><p>This is something of variation of a classic technical interview question: “in as much detail as possible, tell me what happens when you type <code>google.com</code> into your browser and hit enter.” That question also measures technical knowledge and communication ability (because they’re communicating it to you). But to fully answer that question would require <a href="https://github.com/alex/what-happens-when">an answer that is long to the point of absurdity</a>.</p><p>My version makes the scope more manageable, and adds the additional challenge of making the candidate consider different audience skill levels.</p><h2 id="questions">Questions?</h2><p>Next week, I’ll publish a series wrap-up, summarizing the series as a whole and addressing a few big-picture topics. If you have questions <a href="https://twitter.com/jacobian">tweet at me</a> (DMs are fine too). I’ll address common questions in the wrap-up.</p></p>
  77. </article>
  78. <hr>
  79. <footer>
  80. <p>
  81. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  82. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  83. </svg> Accueil</a> •
  84. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  85. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
  86. </svg> RSS</a> •
  87. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  88. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
  89. </svg> Pro</a> •
  90. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  91. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
  92. </svg> Email</a> •
  93. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  94. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
  95. </svg> Légal</abbr>
  96. </p>
  97. <template id="theme-selector">
  98. <form>
  99. <fieldset>
  100. <legend><svg class="icon icon-brightness-contrast">
  101. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
  102. </svg> 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>
  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>