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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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>Company Announcement | Pydantic (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://pydantic.dev/announcement/">
  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>Company Announcement | Pydantic</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-2021-12.svg#icon-home"></use>
  65. </svg> Accueil</a> •
  66. <a href="https://pydantic.dev/announcement/" title="Lien vers le contenu original">Source originale</a>
  67. </p>
  68. </nav>
  69. <hr>
  70. <p>I've decided to start a company based on the principles that I believe have led to Pydantic's success.</p>
  71. <p>I have closed a seed investment round led by <a href="https://www.sequoiacap.com">Sequoia</a>, with participation from
  72. <a href="https://partechpartners.com/">Partech</a>, <a href="https://irregex.vc">Irregular Expressions</a> and some amazing angel investors
  73. including <a href="https://www.linkedin.com/in/bryanhelmig/">Bryan Helmig</a> (co-founder and CTO of Zapier),
  74. <a href="https://www.linkedin.com/in/tristanhandy/">Tristan Handy</a> (founder and CEO of Dbt Labs) and
  75. <a href="https://www.linkedin.com/in/dmcramer/">David Cramer </a>(co-founder and CTO of Sentry).</p>
  76. <h2 id="2-why">Why?</h2>
  77. <p>I've watched with fascination as Pydantic has grown to become the most widely used Python data validation library, with over 40m downloads a month. </p>
  78. <p class="plot-title">Pydantic Downloads from PyPI vs. Django</p>
  79. <p><img src="https://pydantic.dev/imgs/pydantic-vs-django-downloads.fdc147d.png" alt="Pydantic Downloads from PyPI vs. Django"></p>
  80. <p>By my rough estimate, Pydantic is used by 12% of professional web developers! <a href="#3-quot12-of-professional-web-developersquot-claim">†</a></p>
  81. <p>But Pydantic wasn't the first (or last) such library. Why has it been so successful?</p>
  82. <p>I believe it comes down to two things:</p>
  83. <ol>
  84. <li>We've always made developer experience the first priority.</li>
  85. <li>We've leveraged technologies which developers already understand — most notably, Python type annotations.</li>
  86. </ol>
  87. <p>In short, we've made Pydantic easy to get started with, and easy to do powerful things with.</p>
  88. <p>I believe the time is right to apply those principles to other, bigger challenges.</p>
  89. <p>"The Cloud" is still relatively new (think about what cars or tractors looked like 15 years after their conception), and
  90. while it has already transformed our lives, it has massive shortcomings. I think we're uniquely positioned to address
  91. some of these shortcomings.</p>
  92. <p>We'll start by transforming the way those 12% of web developers who already know and trust Pydantic use cloud services
  93. to build and deploy web applications. Then, we'll move on to help the other 88%!</p>
  94. <h3 id="3-cloud-services-suck-at-least-for-us-developers">Cloud services suck (at least for us developers)</h3>
  95. <p>Picture the driving position of a 1950s tractor — steel seat, no cab, knobs sticking out of the engine compartment near
  96. the component they control, hot surfaces just waiting for you to lean on them. Conceptually, this isn't surprising — the
  97. tractor was a tool to speed up farming; its driver was an afterthought, and as long as they could manage to operate it
  98. there was no value in making the experience pleasant or comfortable.</p>
  99. <p><img src="https://pydantic.dev/imgs/tractor.8345002.svg" alt="1950s tractor"></p>
  100. <p>Today's cloud services have the look and feel of that tractor. They're conceived by infrastructure people who care about
  101. efficient computation, fast networking, and cheap storage. The comfort and convenience of the developers who need to
  102. drive these services to build end-user facing applications has been an afterthought.</p>
  103. <p>Both the tractor and the cloud service of the past made sense: The majority of people who made the purchasing decisions
  104. didn't operate them, and those who did had little influence. Why bother making them nice to operate?</p>
  105. <blockquote>
  106. <p><em>"At least it's not a <del>cart horse</del> Windows box in the corner — quit complaining!"</em></p>
  107. </blockquote>
  108. <p>Just as the experience of driving tractors transformed as their drivers' pay and influence increased, so cloud services
  109. are going through a transformation as their operators' pay and influence increases significantly. </p>
  110. <p>There are many examples now of services and tools that are winning against incumbents because of great developer
  111. experience:</p>
  112. <ul>
  113. <li><a href="https://stripe.com">Stripe</a> is winning in payments despite massive ecosystem of incumbents</li>
  114. <li><a href="https://sentry.io/welcome/">Sentry</a> is winning in application monitoring, even though you can send, store, and view the same data in CloudWatch et al. more cheaply</li>
  115. <li><a href="https://vercel.com/">Vercel</a> is winning in application hosting by focusing on one framework — Next.js</li>
  116. <li><a href="https://www.tiobe.com/tiobe-index/">Python</a> is winning against other programming languages, even though it's not backed by a massive corporation</li>
  117. <li><a href="https://docs.pydantic.dev/">Pydantic</a> is winning in data validation for Python, even though it's far from the first such library</li>
  118. </ul>
  119. <p>In each case the developer experience is markedly better than what came before, and developers have driven adoption.</p>
  120. <p>There is a massive opportunity to create cloud services with great developer experience at their heart.
  121. I think we're well positioned to be part of it.</p>
  122. <h3 id="3-developers-are-still-drowning-under-the-weight-of-duplication">Developers are still drowning under the weight of duplication</h3>
  123. <p>The story of the cloud has been about reducing duplication, abstracting away infrastructure and boilerplate:
  124. co-location facilities with servers, cages and wires gave way to VMs. VMs gave way to PaaS offerings where you
  125. just provide your application code. Serverless is challenging PaaS by offering to remove scaling worries.</p>
  126. <p>At each step, cloud providers took work off engineers which was common to many customers.</p>
  127. <p>But this hasn't gone far enough. Think about the last web application you worked on —
  128. how many of the views or components were unique to your app?</p>
  129. <p>Sure, you fitted them together in a unique way, but many (20%, 50%, maybe even 80%?) will exist hundreds or thousands of
  130. times in other code bases. Couldn't many of those components, views, and utilities be shared with other apps without
  131. affecting the value of your application? Again, reducing duplication, and reducing the time and cost of building an
  132. application.</p>
  133. <p>At the same time, serverless, despite being the trendiest way to deploy applications for the last few years, has made
  134. much of this worse — complete web frameworks have often been switched out for bare-bones entry points which lack
  135. even the most basic functionality of a web framework like routing, error handling, or database integration.</p>
  136. <p>What if we could build a platform with the best of all worlds? Taking the final step in reducing the boilerplate
  137. and busy-work of building web applications — allowing developers to write nothing more than the core logic which
  138. makes their application unique and valuable?</p>
  139. <p>And all with a developer experience to die for.</p>
  140. <h2 id="2-what-specifically-are-we-building">What, specifically, are we building?</h2>
  141. <p>I'm not sharing details yet :).</p>
  142. <p>The immediate plan is to hire the brightest developers I can find and work with them to refine our vision and exactly
  143. what we're building while we finish and release Pydantic V2.</p>
  144. <p>While I have some blueprints in my head of the libraries and services we want to build, we have a lot of options
  145. for exactly where to go; we won't constrain what we can design by making any commitments now.</p>
  146. <p><strong>If you're interested in what we're doing, hit subscribe on
  147. <a href="https://github.com/pydantic/pydantic/issues/5063">this GitHub issue</a>.
  148. We'll comment there when we have
  149. more concrete information.</strong></p>
  150. <h2 id="2-the-plan">The plan</h2>
  151. <p>The plan, in short, is this:</p>
  152. <ol>
  153. <li>Hire the best developers from around the world (see <a href="#2-were-hiring">"We're Hiring"</a> below)</li>
  154. <li>Finish and release Pydantic V2, and continue to maintain, support and develop Pydantic over the years</li>
  155. <li>Build cloud services and developer tools that developers love</li>
  156. </ol>
  157. <p>Pydantic, the open source project, will be a cornerstone of the company. It'll be a key technical component
  158. in what we're building and an important asset to help convince developers that the commercial tools and services
  159. we build will be worth adopting. It will remain open source and MIT licenced, and support and development will
  160. accelerate.</p>
  161. <p>I'm currently working full time on Pydantic V2 (learn more from the <a href="https://docs.pydantic.dev/blog/pydantic-v2/">previous blog post</a>).
  162. It should be released later this year, hopefully in Q1. V2 is a massive advance for Pydantic — the core has been
  163. re-written in Rust, making Pydantic V2 around 17x faster than V1. But there are lots of other goodies: strict mode,
  164. composable validators, validation context, and more. I can't wait to get Pydantic V2 released and see how the community
  165. uses it.</p>
  166. <p>We'll keep working closely with <a href="https://github.com/topics/pydantic">other open source libraries</a> that use and depend
  167. on Pydantic as we have up to this point, making sure the whole Pydantic ecosystem continues to thrive.</p>
  168. <p><em>On a side note: Now that I'm paid to work on Pydantic, I'll be sharing all future open source sponsorship among
  169. other open source projects we rely on.</em></p>
  170. <h2 id="2-were-hiring">We're hiring</h2>
  171. <p>If you're a senior Python or full stack developer and think the ideas above are exciting, we'd love to hear from you.
  172. Please email <a href="/cdn-cgi/l/email-protection#254644574040575665555c41444b514c460b414053"><span class="__cf_email__" data-cfemail="aecdcfdccbcbdcddeeded7cacfc0dac7cd80cacbd8">[email protected]</span></a> with a brief summary of your skills and experience,
  173. including links to your GitHub profile and your CV.</p>
  174. <h2 id="2-appendix">Appendix</h2>
  175. <h3 id="3-quot12-of-professional-web-developersquot-claim">"12% of professional web developers" claim</h3>
  176. <p>At first glance this seems like a fairly incredible number, where does it come from?</p>
  177. <p>According to the
  178. <a href="https://survey.stackoverflow.co/2022/#section-most-popular-technologies-web-frameworks-and-technologies">StackOverflow developer survey 2022</a>,
  179. FastAPI is used by 6.01% of professional developers.</p>
  180. <p>According to my survey of Pydantic users, Pydantic's usage is split roughly into:</p>
  181. <ul>
  182. <li>25% FastAPI</li>
  183. <li>25% other web development</li>
  184. <li>50% everything else</li>
  185. </ul>
  186. <p>That matches the numbers from PyPI downloads, which shows that (as of 2023-01-31)
  187. <a href="https://pepy.tech/project/pydantic">Pydantic has 46m</a> downloads in the last 30 days, while
  188. <a href="https://pepy.tech/project/fastapi">FastAPI has 10.7m</a> — roughly 25%.</p>
  189. <p>Based on these numbers, I estimate Pydantic is used for web development by about twice the number who use it through
  190. FastAPI — roughly 12%.</p>
  191. </article>
  192. <hr>
  193. <footer>
  194. <p>
  195. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  196. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  197. </svg> Accueil</a> •
  198. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  199. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  200. </svg> Suivre</a> •
  201. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  202. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  203. </svg> Pro</a> •
  204. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  205. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  206. </svg> Email</a> •
  207. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  208. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  209. </svg> Légal</abbr>
  210. </p>
  211. <template id="theme-selector">
  212. <form>
  213. <fieldset>
  214. <legend><svg class="icon icon-brightness-contrast">
  215. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  216. </svg> Thème</legend>
  217. <label>
  218. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  219. </label>
  220. <label>
  221. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  222. </label>
  223. <label>
  224. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  225. </label>
  226. </fieldset>
  227. </form>
  228. </template>
  229. </footer>
  230. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  231. <script>
  232. function loadThemeForm(templateName) {
  233. const themeSelectorTemplate = document.querySelector(templateName)
  234. const form = themeSelectorTemplate.content.firstElementChild
  235. themeSelectorTemplate.replaceWith(form)
  236. form.addEventListener('change', (e) => {
  237. const chosenColorScheme = e.target.value
  238. localStorage.setItem('theme', chosenColorScheme)
  239. toggleTheme(chosenColorScheme)
  240. })
  241. const selectedTheme = localStorage.getItem('theme')
  242. if (selectedTheme && selectedTheme !== 'undefined') {
  243. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  244. }
  245. }
  246. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  247. window.addEventListener('load', () => {
  248. let hasDarkRules = false
  249. for (const styleSheet of Array.from(document.styleSheets)) {
  250. let mediaRules = []
  251. for (const cssRule of styleSheet.cssRules) {
  252. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  253. continue
  254. }
  255. // WARNING: Safari does not have/supports `conditionText`.
  256. if (cssRule.conditionText) {
  257. if (cssRule.conditionText !== prefersColorSchemeDark) {
  258. continue
  259. }
  260. } else {
  261. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  262. continue
  263. }
  264. }
  265. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  266. }
  267. // WARNING: do not try to insert a Rule to a styleSheet you are
  268. // currently iterating on, otherwise the browser will be stuck
  269. // in a infinite loop…
  270. for (const mediaRule of mediaRules) {
  271. styleSheet.insertRule(mediaRule.cssText)
  272. hasDarkRules = true
  273. }
  274. }
  275. if (hasDarkRules) {
  276. loadThemeForm('#theme-selector')
  277. }
  278. })
  279. </script>
  280. </body>
  281. </html>