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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  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,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>The Net Negative Producing Programer (archive) — 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. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="http://www.software-thoughts.com/2009/08/net-negative-producing-programer.html">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. The Net Negative Producing Programer (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="http://www.software-thoughts.com/2009/08/net-negative-producing-programer.html">Source originale du contenu</a></h3>
  445. <p>It has been well known for a long time that there is at least an <a href="http://forums.construx.com/blogs/stevemcc/archive/2008/03/27/productivity-variations-among-software-developers-and-teams-the-origin-of-quot-10x-quot.aspx" id="gq.:" title="10x Software Engineering (Steve McConnell)">order of magnitude difference</a> between the most productive developers and the least productive. But if you've been in the software industry for any period of time, you've probably met this person: the <a href="http://www.pyxisinc.com/NNPP_Article.pdf" id="wi90" title="The Net Negative Producing Programmer (G. Gorden Schulmeyer) (PDF)">net negative producing programmer</a> (NNPP). This is the person that is so bad, that they actually have a negative effect on team productivity: <i>you would be better off not having this person on your team.</i><br />
  446. <br />
  447. <br />
  448. The NNPP drains a software development team and the business in a variety of ways:<br />
  449. <ol><li>Initial hiring and training costs</li>
  450. <li>Ongoing mentoring from your top developers</li>
  451. <li>Unacceptably high defect rates</li>
  452. <li>Very low output, if any<br />
  453. </li>
  454. <li>Lowers team morale (they make roughly the same amount of money as <i>you</i>)</li>
  455. <li>Causes the business to delay or miss deadlines</li>
  456. <li>Taking up a position that could be filled by a great programmer<br />
  457. </li>
  458. </ol><br />
  459. So how do you identify and avoid the NNPP and what do you do if you are stuck with one?<br />
  460. <br />
  461. <h3><b>Identification</b></h3><br />
  462. The first step in ridding your team of the NNPP is identification. You may have an intuitive sense of who is the lowest performing member of you team, but this doesn't necessarily make them a NNPP. The NNPP will exhibit a number of the following red flags over a significant period of time:<br />
  463. <ul><li>Takes a long time to get the development environment running<br />
  464. </li>
  465. <li>Codes by copy and paste<br />
  466. </li>
  467. <li>Reinvents the wheel<br />
  468. </li>
  469. <li>Doesn't check in much code<br />
  470. </li>
  471. <li>Takes a long time between check-ins<br />
  472. </li>
  473. <li>Keeps saying the code is almost done</li>
  474. <li>Tasks always take significantly longer than estimated<br />
  475. </li>
  476. <li>Has a high defect rate and/or significant defects</li>
  477. <li>Doesn't perform basic desk checking<br />
  478. </li>
  479. <li>Avoids responsibility / passes the buck<br />
  480. </li>
  481. <li>Doesn't use/understand naming conventions<br />
  482. </li>
  483. <li>Asks questions that lack depth</li>
  484. <li>Asks too many questions (unable to do things by themselves)<br />
  485. </li>
  486. <li>Doesn't ask enough questions (works in a silo)</li>
  487. <li>Doesn't integrate with the team</li>
  488. <li>Lacks passion for software development<br />
  489. </li>
  490. <li><a href="http://www.codinghorror.com/blog/archives/001188.html" id="v0.-" title="We Are Typists First, Programmers Second (Coding Horror)">Types slowly</a></li>
  491. </ul><br />
  492. New hires, junior developers may exhibit more of these and any programmer might exhibit some of these from time-to-time. For these<br />
  493. developers, they deserve time, mentoring and training to get them on<br />
  494. the right track. But if you have a senior software engineer consistently displaying<br />
  495. a lot of these characteristics, you have at least an over-paid, under-performing developer and likely an NNPP.<br />
  496. <br />
  497. You can catch these red-flags through with a variety of techniques:
  498. <ul><li>Performing Design Reviews</li>
  499. <li>Performing Code reviews<br />
  500. </li>
  501. <li>Pair Programming</li>
  502. <li>Measuring defect rate</li>
  503. <li>Measuring estimates vs actual time<br />
  504. </li>
  505. <li>Counting defects fixed</li>
  506. <li>Counting source control commits</li>
  507. <li>Reviewing daily source control logs</li>
  508. </ul><br />
  509. For instance, here are the source control commits and defects fixed for an actual 6 person development team over about an 8 month period. Each developer has at least 10 years of experience and all have the titles of at least "Senior Software Engineer".<br />
  510. <br />
  511. <img src="http://docs.google.com/File?id=ddbsfzbp_25c3cbcjd9_b"/><br />
  512. This shows we have a big performance gap between our top and bottom<br />
  513. developers, but these two data points don't tell the whole story: programmer B is a new hire and what separates programmers A, the NNPP, and C are the other red-flags listed above: missed estimates, high defect rates, naming conventions and re-inventing the wheel.<br />
  514. <h3><br />
  515. </h3><h3><b>Remediation<br />
  516. </b></h3><br />
  517. Once you have identified a NNPP, your goal should be to get as far away from them as possible. For better or worse, the team's productivity and ability to meet deadlines and produce value for the business reflects on <i>you</i>. You should want to be part of a small, highly productive team that builds great software. You can't do that with one or more NNPPs on your team. You can:<br />
  518. <ul><li>Fire them immediately</li>
  519. <li>Give them a 30 day warning, then fire them<br />
  520. </li>
  521. <li>Find them a new role</li>
  522. <li>Change jobs</li>
  523. </ul><h4>Fire Immediately</h4>If you are able and if your organization culture supports it, this is the best solution. Your team gets an immediate productivity boost and you get the opportunity to bring in a replacement that can be a net positive instead of a net negative. This is probably not possible in many large organizations or European countries, but for at will employment consider this your first option. If you are unable, or can't bear to fire them, you'll have to look at other options.<br />
  524. <h4>30 Day Warning</h4>Similar to immediate termination, the 30 day warning gives the NNPP time to get their act in gear. If you've mis-read the situation or there are external factors that you haven't considered, this gives the NNPP a chance to prove you wrong. This also gives the NNPP a chance to start looking for another job which may solve the problem without having to resort to termination, don't count on it.<br />
  525. <h4>Find them a new role</h4>Not everybody is cut out to be a programmer. Maybe the NNPP would be better off with a different role. You've already invested in hiring and training them, so they should at least be knowledgeable about your products, practices and culture. Maybe they would be a great QA engineer, a customer advocate, a sales engineer. Look around at the open positions in your company and see if there is something that might be a better fit. A tool such as <a href="http://www.strengthsfinder.com/" id="j6.z" title="www.strengthsfinder.com">StrengthsFinder</a> might help them discover what they would be really good at instead of continuing to struggle with software.<br />
  526. <h4>Change jobs</h4>If nothing else will work, you can always change jobs, internally or externally to get away from the NNPP and move to a place where you can be part of a highly productive team. There are no guarantees that you won't be in the same situation or worse at your next position, but you should have an idea of what questions to ask to find a good team.<br />
  527. <h3><br />
  528. </h3><h3><b>Avoidance</b></h3><br />
  529. Of course, the best course of action is to avoid the NNPP in the first place.<br />
  530. <br />
  531. If you are building a team, you want to hire <a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html" id="v5uy" title="Joel Spolsky - The Guerrilla Guide to Interviewing">smart people who get things done</a>. This article isn't about interviewing, but you must identify if they can:<br />
  532. <ul><li>Write a program</li>
  533. <li>Understand code</li>
  534. <li>Debug</li>
  535. <li>Fix defects<br />
  536. </li>
  537. <li>Desk check their code</li>
  538. <li>Learn new languages and skills easily</li>
  539. </ul><br />
  540. You can require code submissions and problem solving as part of the interview process, hire people you know, subject new hires to a 30 day trial period or use a variety of other interview techniques.<br />
  541. <br />
  542. If you are coming into a new job, you probably won't know if there is an NNPP on the team already. Chances are, you won't interview with them, but you can do <a href="http://www.codecrankers.com/2009/06/top-interview-red-flags-for-programmers/" id="ffu2" title="Code Crankers - Top Interview Red Flags for Programmers">normal vetting</a> and you always have the option to change jobs later or work from within to improve the team.<br />
  543. <h3><br />
  544. </h3><h3>Conclusion</h3><br />
  545. The Net Negative Producing Programmer is bad for you and bad for the business. While not everybody is a top performing programmer, we shouldn't stand for the NNPP taking away from what we can accomplish. Do your best to avoid the NNPP as new hires and be on the looking for them on existing teams.<br />
  546. <br />
  547. <h3>References</h3><ul><li><a href="http://forums.construx.com/blogs/stevemcc/archive/2008/03/27/productivity-variations-among-software-developers-and-teams-the-origin-of-quot-10x-quot.aspx" id="fs43" title="Productivity Variations Among Software Developers and Teams: The Origin of &quot;10x&quot;">Productivity Variations Among Software Developers and Teams: The Origin of "10x"</a>, Steve McConnell</li>
  548. <li><a href="http://haacked.com/archive/2007/06/25/understanding-productivity-differences-between-developers.aspx" id="e2wr" title="10 Developers For The Price Of One">10 Developers For The Price Of One</a>, Phil Haack</li>
  549. <li><a href="http://itscommonsensestupid.blogspot.com/2008/05/why-good-developers-are-not-getting-10.html" id="t05:" title="Why Good Developers Are Not Getting 10 times the Pay?">Why Good Developers Are Not Getting 10 times the Pay?</a>, Soon Hui</li>
  550. <li><a href="http://www.pyxisinc.com/NNPP_Article.pdf" id="bx_v" title="PDF">The Net Negative Producing Programmer</a>, G. Gorden Schulmeyer</li>
  551. <li><a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html" id="nc03" title="Programming's Dirtiest Little Secret">Programming's Dirtiest Little Secret</a>, Steve Yegge</li>
  552. <li><a href="http://www.codinghorror.com/blog/archives/001188.html" id="s7k4" title="We Are Typists First, Programmers Second">We Are Typists First, Programmers Second</a>, Jeff Atwood<br />
  553. </li>
  554. <li><a href="http://blog.kriskemper.com/2008/08/07/preventing-the-net-negative-producing-programmer/" id="j.:l" title="Preventing the Net Negative Producing Programmer">Preventing the Net Negative Producing Programmer</a>, Kris Kemper</li>
  555. <li><a href="http://blog.jayfields.com/2008/08/elitist-or-optimist.html" id="lp3h" title="Elitist or Optimist">Elitist or Optimist</a>, Jay Fields</li>
  556. <li><a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html" id="koio" title="The Guerrilla Guide to Interviewing (version 3.0)">The Guerrilla Guide to Interviewing (version 3.0)</a>, Joel Spolsky</li>
  557. <li><a href="http://www.codecrankers.com/2009/06/top-interview-red-flags-for-programmers/" id="ch:5" title="Top Interview Red Flags for Programmers">Top Interview Red Flags for Programmers</a>, Code Crankers<br />
  558. </li>
  559. </ul></p>
  560. </article>
  561. </section>
  562. <nav id="jumpto">
  563. <p>
  564. <a href="/david/blog/">Accueil du blog</a> |
  565. <a href="http://www.software-thoughts.com/2009/08/net-negative-producing-programer.html">Source originale</a> |
  566. <a href="/david/stream/2019/">Accueil du flux</a>
  567. </p>
  568. </nav>
  569. <footer>
  570. <div>
  571. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  572. <p>
  573. Bonjour/Hi!
  574. 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>
  575. 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>).
  576. </p>
  577. <p>
  578. 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>.
  579. </p>
  580. <p>
  581. Voici quelques articles choisis :
  582. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  583. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  584. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  585. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  586. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  587. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  588. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  589. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  590. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  591. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  592. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  593. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  594. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  595. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  596. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  597. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  598. </p>
  599. <p>
  600. 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>.
  601. </p>
  602. <p>
  603. Je ne traque pas ta navigation mais mon
  604. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  605. conserve des logs d’accès.
  606. </p>
  607. </div>
  608. </footer>
  609. <script type="text/javascript">
  610. ;(_ => {
  611. const jumper = document.getElementById('jumper')
  612. jumper.addEventListener('click', e => {
  613. e.preventDefault()
  614. const anchor = e.target.getAttribute('href')
  615. const targetEl = document.getElementById(anchor.substring(1))
  616. targetEl.scrollIntoView({behavior: 'smooth'})
  617. })
  618. })()
  619. </script>