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

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