<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Elad Ben-Israel</title>
    <description>The latest articles on Forem by Elad Ben-Israel (@eladb).</description>
    <link>https://forem.com/eladb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F442051%2Ff4cc02bf-5a8f-43f3-8f02-8753fac5ec40.jpeg</url>
      <title>Forem: Elad Ben-Israel</title>
      <link>https://forem.com/eladb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/eladb"/>
    <language>en</language>
    <item>
      <title>Local simulation of serverless function concurrency</title>
      <dc:creator>Elad Ben-Israel</dc:creator>
      <pubDate>Wed, 01 May 2024 18:09:20 +0000</pubDate>
      <link>https://forem.com/winglang/inflight-magazine-no-9-4fdh</link>
      <guid>https://forem.com/winglang/inflight-magazine-no-9-4fdh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The 9th issue of the Wing Inflight Magazine.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;I am pleased to share another issue of the &lt;em&gt;Wing Inflight Magazine&lt;/em&gt; with recent updates and news&lt;br&gt;
from the &lt;a href="https://winglang.io"&gt;Winglang&lt;/a&gt; project.&lt;/p&gt;
&lt;h3&gt;
  
  
  So what is Wing again?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://wingla.ng/github"&gt;Wing&lt;/a&gt; is a new programming environment for the cloud. It makes it easy for developers to build and test distributed systems that leverage a variety of powerful cloud primitives such as queues, topics, API endpoints, buckets, websites, topics, and a growing ecosystem of &lt;a href="https://github.com/winglang/winglibs"&gt;winglibs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wing comes with a &lt;em&gt;&lt;a href="https://wingla.ng/playground"&gt;visual cloud simulator&lt;/a&gt;&lt;/em&gt; which can be used to interact and test complete cloud applications on your local machine, with fast hot reloading and without having to deploy a single&lt;br&gt;
resource to the cloud.&lt;/p&gt;

&lt;p&gt;One of the unique capabilities of Wing is that it supports what we call &lt;strong&gt;pluggable platform&lt;br&gt;
providers&lt;/strong&gt;. This means that applications can be &lt;em&gt;cloud- and provisioning-engine agnostic&lt;/em&gt;, so they can be deployed to multiple cloud providers using multiple provisioning engines.&lt;/p&gt;

&lt;p&gt;There is already support for Terraform/OpenTofu, CloudFormation, AWS, GCP, and Azure, and discussions about &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/winglang/wing/issues/4298"&gt;Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/winglang/wing/issues/6268"&gt;Crossplane&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/winglang/wing/issues/6272"&gt;Pulumi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/winglang/wing/issues/6273"&gt;OpenShift&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/winglang/wing/issues/6271"&gt;Azure Bicep&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the compatibility matrix, add your 👍 to the relevant issue, and share your use case to help us prioritize!&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://www.winglang.io/docs/standard-library/compatibility-matrix"&gt;compatibility&lt;br&gt;
matrix&lt;/a&gt;, add your 👍 to the&lt;br&gt;
relevant issue, and share your use case to help us prioritize!&lt;/p&gt;

&lt;p&gt;Platform teams can also create their own custom platforms using CDK constructs. This offers central&lt;br&gt;
control over best practices, compliance policies, security, deployment strategies, and any other&lt;br&gt;
aspect of how Wing applications are implemented in an organization's cloud environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wing is still in active development&lt;/strong&gt;, but we are starting to see some really cool stuff being&lt;br&gt;
built with it. If you are up for a really fun (yet possibly bumpy) ride, we encourage you to &lt;a href="https://www.winglang.io/docs"&gt;take&lt;br&gt;
Wing for a spin on your local machine&lt;/a&gt; or in the &lt;a href="https://www.winglang.io/play/"&gt;Wing&lt;br&gt;
Playground&lt;/a&gt; and &lt;a href="https://t.winglang.io/slack"&gt;let us know&lt;/a&gt; what you&lt;br&gt;
think.&lt;/p&gt;

&lt;p&gt;We are designing Wing to be &lt;strong&gt;familiar and friendly&lt;/strong&gt; for developers who come from modern&lt;br&gt;
object-oriented background such as TypeScript, Swift, C#, and Java, so it will take you &lt;a href="https://github.com/winglang/workshop-react/blob/main/cheatsheet.md"&gt;5&lt;br&gt;
minutes&lt;/a&gt; to learn.&lt;/p&gt;
&lt;h3&gt;
  
  
  In today's issue
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Debugging with breakpoints
&lt;/li&gt;
&lt;li&gt;📊 Local simulation of serverless function concurrency
&lt;/li&gt;
&lt;li&gt;💁 A new project template for React with Vite
&lt;/li&gt;
&lt;li&gt;🔘 Adding UI to Wing classes through &lt;code&gt;bring ui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🪝 Exposing cloud endpoints for webhook development
&lt;/li&gt;
&lt;li&gt;🏋️‍♀️ Explicit lifting of preflight objects
&lt;/li&gt;
&lt;li&gt;🤞 Changes to default object identifiers
&lt;/li&gt;
&lt;li&gt;💼 Implicitly loaded platform extensions
&lt;/li&gt;
&lt;li&gt;🕑 Standardize cron expressions
&lt;/li&gt;
&lt;li&gt;🎥 Goodies from the Wingly Update
&lt;/li&gt;
&lt;li&gt;🦁 Wing in the Wild
&lt;/li&gt;
&lt;li&gt;👯‍♂️ Community Events
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Debugging with breakpoints
&lt;/h3&gt;

&lt;p&gt;It is now possible to set breakpoints and fully debug your Wing applications!&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://marketplace.visualstudio.com/items?itemName=Monada.vscode-wing"&gt;Wing VS Code extension&lt;/a&gt;, breakpoints can be added to &lt;code&gt;.w&lt;/code&gt; files, both for preflight and inflight&lt;br&gt;
code and simply hit F5 to debug. The built-in debugger can now be used to inspect and step through&lt;br&gt;
the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ggi24gexx2gmtmgfot4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ggi24gexx2gmtmgfot4.png" alt="Debugging" width="733" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5981"&gt;See PR by Mark&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Local simulation of serverless function concurrency
&lt;/h3&gt;

&lt;p&gt;We've made improvements to how &lt;code&gt;cloud.Function&lt;/code&gt;s are executed in the Wing Simulator so they&lt;br&gt;
functionally behave like FaaS providers. We are now running each function within an isolated child&lt;br&gt;
process and manage its concurrency limits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowlyrmd0oozwdw2du5jd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowlyrmd0oozwdw2du5jd.png" alt="Local Simulation" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;concurrency&lt;/code&gt; option that can be passed to &lt;code&gt;cloud.Function&lt;/code&gt; or any resource that takes an&lt;br&gt;
inflight closure can be used to control these limits.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;util&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inflight &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;only one at a time: {x}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setConsumer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;//                         ^^^^^^^^^^^^^^&lt;/span&gt;

&lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;push 10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{i}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;approxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When running this with &lt;code&gt;concurrency: 1&lt;/code&gt;, the code finishes after ~1.5s&lt;/li&gt;
&lt;li&gt;When running with &lt;code&gt;concurrency: 10&lt;/code&gt;, the code finishes after 0.5s&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5867"&gt;See PR by Chris&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  A new project template for React with Vite
&lt;/h3&gt;

&lt;p&gt;We are continuing to add new project templates for various types of projects, and we've recently&lt;br&gt;
created one for the infamous combination of &lt;a href="https://react.dev/"&gt;React&lt;/a&gt; with&lt;br&gt;
&lt;a href="https://vitejs.dev/"&gt;Vite&lt;/a&gt; tooling.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://www.winglang.io/docs/guides/react-vite-websockets"&gt;this guide&lt;/a&gt;&lt;br&gt;
for a detailed tutorial or just get started with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-project
wing new react-vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding UI to Wing classes through &lt;code&gt;bring ui&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;It is now possible to associate simple user interface elements with Wing preflight classes through&lt;br&gt;
the &lt;code&gt;ui&lt;/code&gt; module. These elements can dynamically interact with your system via simple implementations&lt;br&gt;
of inflight closures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyResource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cool Button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;inflight &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Counter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;inflight &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{this.counter.peek()}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, when a &lt;code&gt;MyResource&lt;/code&gt; node is selected in the Wing Console, you'll see this in the inspector&lt;br&gt;
pane:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r6ui4qfv87dx7ifvegf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r6ui4qfv87dx7ifvegf.png" alt="Bring UI" width="415" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are adding more UI elements and can't wait to see what people will build with this!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5841"&gt;See PR by Cristian&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Exposing cloud endpoints for webhook development
&lt;/h3&gt;

&lt;p&gt;When developing applications that react to requests from other services via webhooks such as bots&lt;br&gt;
and extensions, it is often very valuable to be able to accept requests from these external systems&lt;br&gt;
during development.&lt;/p&gt;

&lt;p&gt;So now, every &lt;code&gt;cloud.Endpoint&lt;/code&gt; in your application (either explicitly or implicitly defined via a&lt;br&gt;
&lt;code&gt;cloud.Api&lt;/code&gt;, &lt;code&gt;cloud.Website&lt;/code&gt;, etc) can be exposed and requests will be tunneled into the local&lt;br&gt;
simulator:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdb6dcckvgamd3zvzapd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdb6dcckvgamd3zvzapd.png" alt="Endpoints" width="502" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is an experimental feature and still needs some ironing out, and we would love to hear what&lt;br&gt;
You think about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5792"&gt;See PR by Elad&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Explicit lifting of preflight objects
&lt;/h3&gt;

&lt;p&gt;When inflight code is referencing a preflight object, the object is &lt;em&gt;lifted&lt;/em&gt; and the operation&lt;br&gt;
performed on the object is &lt;em&gt;qualified&lt;/em&gt; in order to be able to determine things like IAM permissions.&lt;/p&gt;

&lt;p&gt;In many cases, the Wing compiler can automatically qualify the lift. For example, in the code below,&lt;br&gt;
it is clear that the inflight closure performs a &lt;code&gt;push&lt;/code&gt; operation on the lifted queue object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;inflight &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;myQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But since the Wing compiler currently does not perform symbolic execution, there are cases where&lt;br&gt;
it's currently impossible for the compiler to qualify the lift. For example, if I assign &lt;code&gt;myQueue&lt;/code&gt;&lt;br&gt;
to a new variable called (&lt;code&gt;yourQueue&lt;/code&gt;), we will get the following error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;inflight &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;yourQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myQueue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;yourQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;//^^^^^^^^^ Expression of type "Queue" references an unknown preflight object, can't qualify its capabilities.&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To overcome this limitation, a new builtin &lt;code&gt;lift()&lt;/code&gt; can be used to explicitly qualify the lifts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;inflight &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;lift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;push&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;yourQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myQueue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;yourQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New builtin &lt;code&gt;lift&lt;/code&gt; function allows you to lift preflight objects for the current inflight closure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This syntax is still under discussion, but we wanted to make sure this is not blocking users.&lt;br&gt;
Check out the &lt;a href="https://github.com/winglang/wing/pull/5951"&gt;RFC&lt;/a&gt; and join the conversation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5935"&gt;See PR by Yoav&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Changes to default object identifiers
&lt;/h3&gt;

&lt;p&gt;When creating &lt;a href="https://www.winglang.io/docs/language-reference#33-preflight-classes"&gt;preflight&lt;br&gt;
objects&lt;/a&gt; in Wing, each object&lt;br&gt;
gets an identifier which is unique to its scope of definition. These identifiers are essential for&lt;br&gt;
producing deterministic unique addresses for cloud resources when they are provisioned.&lt;/p&gt;

&lt;p&gt;The default identifier for objects in Wing is the name of the class. In the following example, the&lt;br&gt;
identifier of the bucket is simply &lt;code&gt;"Bucket"&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Previously, the default identifier included the namespace of the class, so in the above example the&lt;br&gt;
identifier was &lt;code&gt;"cloud.Bucket"&lt;/code&gt;, but since namespaces can now be aliased (&lt;code&gt;bring cloud as&lt;br&gt;
my_cloud&lt;/code&gt;), this resulted in unstable defaults, which can have dire implications on infrastructure.&lt;/p&gt;

&lt;p&gt;By the way, Wing also has dedicated syntax (&lt;code&gt;as ID&lt;/code&gt;) to determine the identity of an object in case&lt;br&gt;
there are multiple instances of the same type or you want to be more explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my_bucket&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;We are discussing potentially &lt;a href="https://github.com/winglang/wing/issues/4604"&gt;changing this&lt;br&gt;
syntax&lt;/a&gt;, so let us know what you think.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5658"&gt;See PR by Elad&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implicitly loaded platform extensions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.winglang.io/docs/concepts/platforms"&gt;Platform extensions&lt;/a&gt; are one of the most powerful&lt;br&gt;
capabilities of Wing. They can determine how cloud resources are implemented in your cloud&lt;br&gt;
environment, validate that your application adheres to an organizational policy or inject best&lt;br&gt;
practices and common patterns "under the hood".&lt;/p&gt;

&lt;p&gt;So far, it was possible to configure Wing to use a platform provider using an explicit &lt;code&gt;--platform&lt;/code&gt;&lt;br&gt;
switch passed to the Wing CLI, but we've seen a need for modules or libraries to be able to provide&lt;br&gt;
platform extensions without having to require explicit configuration.&lt;/p&gt;

&lt;p&gt;To that end, as Wing compiles your code, any &lt;code&gt;wplatform.js&lt;/code&gt; files found will be loaded automatically&lt;br&gt;
as a platform. This occurs after explicit ones like &lt;code&gt;-t tf-aws&lt;/code&gt; and also applies to any winglibs&lt;br&gt;
used by your applications.&lt;/p&gt;

&lt;p&gt;One of the currently explored use cases is the ability for libraries to expose their own platform&lt;br&gt;
parameters.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://github.com/winglang/winglibs/tree/main/eventbridge"&gt;&lt;code&gt;eventbridge&lt;/code&gt;&lt;/a&gt; winglib&lt;br&gt;
exposes a platform parameter called &lt;code&gt;eventBridgeName&lt;/code&gt; to allow developers to connect to an existing&lt;br&gt;
EventBridge bus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wing compile &lt;span class="nt"&gt;-t&lt;/span&gt; @winglang/platform-awscdk &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;eventBridgeName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"my-bus"&lt;/span&gt; main.w
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's a sneak peak on how this platform extension is implemented:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="err"&gt;{
  &lt;/span&gt;&lt;span class="nc"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;eventBridgeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5886"&gt;See PR by Hasan&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Standardize cron expressions
&lt;/h3&gt;

&lt;p&gt;A cron expression like &lt;code&gt;* * * * *&lt;/code&gt; is valid in a unix-based crontab, but not in AWS. On the other&lt;br&gt;
hand, &lt;code&gt;* * * * ?&lt;/code&gt; is valid in AWS, but not elsewhere.&lt;/p&gt;

&lt;p&gt;Now, Wing will expect cron expression to match the standard syntax, and will automatically convert&lt;br&gt;
it to the AWS syntax when deploying to AWS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bring&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;* * * * *&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/winglang/wing/pull/5956"&gt;See PR by Marcio&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Goodies from the Wingly Update
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.twitch.tv/winglangio"&gt;The Wingly Update&lt;/a&gt; is our corky bi-weekly stream where we share&lt;br&gt;
the latest developments of the project, chat with folks from the cloud industry, geek out and&lt;br&gt;
celebrate the beauty of the cloud.&lt;/p&gt;

&lt;p&gt;If you haven't been able to catch our show, you can find the complete stack of &lt;a href="https://youtube.com/playlist?list=PL-P8v-FRassZBWsNoSafL_ReO0JO0xJVm&amp;amp;si=trffVrtGGMUZ-SKb"&gt;all our episodes&lt;br&gt;
here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Here are a few goodies we curated from recent shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The recent &lt;a href="https://www.youtube.com/watch?v=jfUiAdcjlO4"&gt;CHANGELOG&lt;/a&gt; with &lt;a href="https://github.com/MarkMcCulloh"&gt;@MarkMcCulloh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;An overview of where we are in our journey towards &lt;a href="https://www.youtube.com/watch?v=eorc-Z25jGM"&gt;Wing for TypeScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://www.youtube.com/watch?v=bi67oqJBNU0"&gt;chat with Allen Helton&lt;/a&gt; about Texas, life, conferences, cowboys and his love for serverless.&lt;/li&gt;
&lt;li&gt;A fun &lt;a href="https://www.youtube.com/watch?v=G_8n5AIzmFA"&gt;chat with Michael Antonio&lt;/a&gt; from AWS about his journey at Microsoft and Amazon, IAC, CDK and computing nostalgia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wing in the Wild
&lt;/h3&gt;

&lt;p&gt;This is a new section in our magazine where we curate content about Wing from the world wide and&lt;br&gt;
wonderful web:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An awesome &lt;a href="https://www.youtube.com/watch?v=aNGM_RF66_U"&gt;overview video of Wing&lt;/a&gt; by Amichai
Mantinband.&lt;/li&gt;
&lt;li&gt;Ayush Thakur
&lt;a href="https://www.linkedin.com/posts/ayush2390_nextjs-wing-activity-7176582275357184001-sIUe?utm_source=share&amp;amp;utm_medium=member_desktop"&gt;wrote&lt;/a&gt;
about his experience building a NextS app with a Wing backend.&lt;/li&gt;
&lt;li&gt;Asher Sterkin's explored an implementation of &lt;a href="https://itnext.io/implementing-production-grade-crud-rest-api-in-winglang-7b8f6917efc2"&gt;production-grade REST
APIs&lt;/a&gt; in
Wing as well as used Wing to manage multiple AWS environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Events
&lt;/h3&gt;

&lt;p&gt;You can find details for all our events in the &lt;a href="https://calendar.google.com/calendar/u/0?cid=Y18wZTljMGRkZjRiM2IyNzdmMmFlZTMzZjI2NDljYzNlMDAzMGE2OTI1NmRiNjQyNTk0YTc3YmFkZDhjNjc4YzQ4QGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20"&gt;Wingnuts&lt;br&gt;
Calendar&lt;/a&gt;,&lt;br&gt;
amongst them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://calendar.google.com/calendar/event?action=TEMPLATE&amp;amp;tmeid=NDN1dWpoNTQ4dGhhNDNvNzUwcW9yYW12dDBfMjAyNDAzMTJUMTQzMDAwWiBjXzBlOWMwZGRmNGIzYjI3N2YyYWVlMzNmMjY0OWNjM2UwMDMwYTY5MjU2ZGI2NDI1OTRhNzdiYWRkOGM2NzhjNDhAZw&amp;amp;tmsrc=c_0e9c0ddf4b3b277f2aee33f2649cc3e0030a69256db642594a77badd8c678c48%40group.calendar.google.com&amp;amp;scp=ALL"&gt;Winglang Community
Meeting&lt;/a&gt;
is our bi-weekly gathering where members of our community showcase cool apps, demos, and other
projects.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://calendar.google.com/calendar/event?action=TEMPLATE&amp;amp;tmeid=ZnFtM3NrbHM0NGZqdTNjZGdyMDg2bHVidXBfMjAyMzEyMThUMTIwMDAwWiBjXzBlOWMwZGRmNGIzYjI3N2YyYWVlMzNmMjY0OWNjM2UwMDMwYTY5MjU2ZGI2NDI1OTRhNzdiYWRkOGM2NzhjNDhAZw&amp;amp;tmsrc=c_0e9c0ddf4b3b277f2aee33f2649cc3e0030a69256db642594a77badd8c678c48%40group.calendar.google.com&amp;amp;scp=ALL"&gt;Monday Office
Hours&lt;/a&gt;
is our bi-weekly opportunity for you to share your feedback, thoughts, and concerns, or simply drop by
to say hi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;That's it for this edition!&lt;/p&gt;

&lt;p&gt;You are invited to join the &lt;a href="https://t.winglang.io/slack"&gt;Wing Slack&lt;/a&gt;! Come say hello and hang out&lt;br&gt;
with fellow Wingnuts! Give &lt;a href="https://winglang.io"&gt;winglang.io&lt;/a&gt; a visit and take Wing out for a spin.&lt;br&gt;
If you're not already, stay updated on the latest changes in our&lt;br&gt;
&lt;a href="https://github.com/winglang/wing"&gt;repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking forward to entertaining you in your next flight!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- The Wing Team&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cloud, why so difficult? 🤷‍♀️</title>
      <dc:creator>Elad Ben-Israel</dc:creator>
      <pubDate>Wed, 24 Jan 2024 17:07:13 +0000</pubDate>
      <link>https://forem.com/winglang/cloud-why-so-difficult-3j33</link>
      <guid>https://forem.com/winglang/cloud-why-so-difficult-3j33</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A manifesto for cloud-oriented programming.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't get me wrong, I love the cloud! It has empowered me to build amazing things, and completely changed the way I use software to innovate and solve problems.&lt;/p&gt;

&lt;p&gt;It's the "&lt;em&gt;new computer&lt;/em&gt;", the ultimate computer, the "&lt;em&gt;computerless computer&lt;/em&gt;". It can elastically scale, it's always up, it exists everywhere, it can do anything. It's boundless. It's definitely here to stay.&lt;/p&gt;

&lt;p&gt;But holy crap, there is no way this is how we are going to be building applications for the cloud in the next decade. As the cloud evolved from "I don't want servers under my desk" to "my app needs 30 different managed services to perform its tasks", we kind of lost track of what a great developer experience looks like.&lt;/p&gt;

&lt;p&gt;Building applications for the cloud sometimes feels like spilling my kids' bag of unused Lego blocks all over the living room floor and trying to build a castle. After going through torn up play cards, scary Barbie-doll heads, and leaking dead batteries, you read the instructions the millionth time, only to realize you ended up building basically the same thing you've built last time.&lt;/p&gt;

&lt;p&gt;Sorting Lego blocks is fun! It passes the time with the kiddos. It even feeds my OCD… But hell, this is not how I want to build professional software!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let me try to describe what I and my developer friends are struggling with.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  I want to focus on creating value for my users
&lt;/h3&gt;

&lt;p&gt;When I build professional software, I want most of my time to be spent within the &lt;em&gt;functional&lt;/em&gt; domain of my application, instead of &lt;em&gt;non-functional&lt;/em&gt; mechanics of the platform I use.&lt;/p&gt;

&lt;p&gt;It doesn't make sense that every time I want to execute code inside an AWS Lambda function, I have to understand that it needs to be bundled with tree-shaken dependencies, uploaded as a zip file to S3 and deployed through Terraform. Or that in order to be able to publish a message to SNS, my IAM policy must have a statement that allows the &lt;code&gt;sns:Publish&lt;/code&gt; action on the topic's ARN. &lt;em&gt;And does every developer need to understand what ARNs are at all?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All that stuff doesn't have anything to do with the value I am trying to create for my users. It's pure mechanics. &lt;strong&gt;Can we get rid of it?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  I want to be independent
&lt;/h3&gt;

&lt;p&gt;One of the most frustrating and flow killing situations for me as a developer is when I have to stop and wait for someone or something in order to continue.&lt;/p&gt;

&lt;p&gt;It's like gliding happily in the air, enjoying the view, beautiful music in the background, and suddenly, &lt;em&gt;BAM!&lt;/em&gt; A concrete wall.&lt;/p&gt;

&lt;p&gt;This concrete wall takes many shapes and sizes when you build applications for the cloud. It's the DevOps person with an endless ticket queue; it's the IAM policy that needs to be updated; it's the deployment failure that only the external part-time consultant knows how to debug; It's the endless backlog of missing knobs and APIs in the internal platform that we hoped will change everything.&lt;/p&gt;

&lt;p&gt;These barriers are frustrating because they force me to switch context, to apply "temporary" security policies and to invent ugly hacks that I don't want to talk about. It's a broken world.&lt;/p&gt;

&lt;p&gt;I want to be independent. I want to be able to get things done, to stay in the flow. I want to improve the world one commit at a time, and move on to the next thing &lt;em&gt;after&lt;/em&gt; I am finished. I want that dopamine rush of completing a task, not the shameful feeling of yet another unfinished thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  I want instant feedback
&lt;/h3&gt;

&lt;p&gt;I said I want independence, but don't mistake that for a belief that I write perfect code. Which is why I want to write code with a pencil, not with a pen.&lt;/p&gt;

&lt;p&gt;Some developers can spend a full day coding without even invoking their compiler, and at the end of the day, they compile and deploy, and it just works.&lt;/p&gt;

&lt;p&gt;I admire them, but I am not that type of developer. No sir. For me it's about iterations, iterations, iterations. I start small, sketch with a light pencil, take a look, erase a bunch of stuff, draw a thicker line, take a step back, squint, draw more and erase more, and take another look, &lt;em&gt;rinse and repeat&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is why, for me, the single most important thing is iteration speed. The sooner I can run my application and test it, the faster I can go back and iterate. This is where my flow is.&lt;/p&gt;

&lt;p&gt;When I started programming, I used Borland C++. It used to take about 100ms to compile and run a program on an IBM PC AT machine (TURBO ON). &lt;strong&gt;An average iteration cycle in the cloud takes minutes. Minutes! Sometimes dozens of minutes!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's how an iteration looks like in the cloud today: I make a change to my code; then I need to compile it; deploy it to my test account; find my way around the management console to actually trigger it; wait for it to run and go search for the &lt;br&gt;
logs on another service. Then I realize there is an error response that tells me that I'm stupid, because how come I didn't know that I have to pass in Accept-Content: application/json, because otherwise I get some weird result called "XML" that I have no idea what to do with (just kidding, XML is great, no really). Now all over again...&lt;/p&gt;

&lt;p&gt;So "write unit tests", you say, in a patronizing attempt to justify the current reality. "Great developers write unit tests". OK! So now I need to take my code, which makes about 20 external API calls, and somehow mock out the API responses by copying and pasting them from outdated documentation, only to figure out that my requests are rejected because I am missing some implicit action in my IAM security statement. We've all been there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To be honest, give me the developer experience of the 90s&lt;/strong&gt;. I want to make a change, and I want to be able to test this change either interactively or through a unit test within milliseconds, and I want to do this while sitting in an airplane with no WiFi, okay? (we didn't have WiFi in the 90s).&lt;/p&gt;
&lt;h3&gt;
  
  
  So this is just a rant?
&lt;/h3&gt;

&lt;p&gt;Hell no! I am a programmer. I sometimes feel like I've been writing software since birth. I've been doing it in socially perilous times, when being a computer geek was not cool.&lt;/p&gt;

&lt;p&gt;What I have always loved about being a developer is that if I was not happy with my tools, I could make my own. Building tools is in our DNA, after all - humans have been building tools for over a million years.&lt;/p&gt;

&lt;p&gt;And I am not happy with my tools.&lt;/p&gt;

&lt;p&gt;In April 2022, I joined forces with &lt;a href="https://www.linkedin.com/in/shai-ber-245b1226/"&gt;Shai Ber&lt;/a&gt;, a good friend and a former Microsoft colleague, and we founded [Wing] with the mission to &lt;strong&gt;&lt;em&gt;unlock the cloud for developers&lt;/em&gt;&lt;/strong&gt;. We've assembled an incredible crew of beautiful geeks who share our passion for developer experience and open-source and started our journey to empower developers (i.e. ourselves) to solve these fundamental problems.&lt;/p&gt;
&lt;h3&gt;
  
  
  Compilers to the rescue
&lt;/h3&gt;

&lt;p&gt;So how are we going to solve all of these problems at once?&lt;br&gt;
&lt;strong&gt;We are building a programming language for the cloud.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;A programming language!?&lt;/em&gt;," you ask. "&lt;em&gt;Doesn't the world have enough programming languages?&lt;/em&gt;," "&lt;em&gt;Isn't it really hard to write a compiler?&lt;/em&gt;," "&lt;em&gt;What are the chances that developers will want to learn a whole new language?&lt;/em&gt;," "&lt;em&gt;Why can't you hack into an existing language toolchain, squint your eyes tight enough and call it a day?&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;I am not one to build programming languages on a whim. In fact, I've spent the last five years building the &lt;a href="https://aws.amazon.com/cdk/"&gt;AWS CDK&lt;/a&gt;, which is a &lt;em&gt;multi-language library&lt;/em&gt; that addresses some of the challenges I am talking about by allowing developers to define cloud infrastructure using their favorite programming language.&lt;/p&gt;

&lt;p&gt;To "meet developers where they are" is a beautiful tenet of AWS, and of the CDK, and inspired us to create awesome technology such as &lt;a href="https://github.com/aws/jsii"&gt;JSII&lt;/a&gt; and &lt;a href="https://github.com/aws/constructs"&gt;constructs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;But sometimes, "where they are" is not a good enough model for creating the desired experience.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Defining infrastructure with code does enable us to create a higher-level of abstraction, but as long as my application code needs to interact with this infrastructure, the abstraction becomes too &lt;a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/"&gt;leaky&lt;/a&gt;. I'm yanked back down to having to understand more than I need to, and I have to be an expert in things like IAM, VPC, ALB, EBS and basically more TLAs than I would ever want to keep in my head.&lt;/p&gt;

&lt;p&gt;The languages we use today are all designed around the idea that &lt;em&gt;the computer is a single machine&lt;/em&gt;. They've reached the point in which they are able to offer us solid abstractions over these machines. They abstract away the CPU, memory, file system, process management and networking. As a developer, I don't have to care how a file is laid out on disk, or even how much memory I need for my hash map. I simply write &lt;code&gt;readFile()&lt;/code&gt; or &lt;code&gt;new Dictionary()&lt;/code&gt; and go about my day. Yes, it's not a bad idea for me to have some sense of what's happening under the hood, but I am not forced to.&lt;/p&gt;

&lt;p&gt;Most of these languages also offer me type-safety. When I call a function with the wrong number of arguments, I get yelled at by my compiler. I don't have to wait until my application is running only to realize I forget an argument, or passed in the wrong type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the cloud, I'm on my own&lt;/strong&gt;. Every time my code needs to interact with a cloud resource or a service - and that's happening more and more as the industry evolves - I have to leave the comfort and safety of my programming language. I must jump outside the boundaries of the machine and into the wild wild west of the internet, and my compiler is none the wiser.&lt;/p&gt;

&lt;p&gt;And suddenly, it's almost painfully obvious where all the pain came from. Cloud applications today are simply a patchwork of disconnected pieces. I have a compiler for my infrastructure, another for my functions, another for my containers, another for my &lt;a href="https://dagger.io/"&gt;CI/CD pipelines&lt;/a&gt;. Each one takes its job super seriously, and keeps me safe and happy inside each of these machines, but my application is not running on a single machine anymore, my application is running on the cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The cloud is the computer.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Wing, a cloud-oriented programming language
&lt;/h3&gt;

&lt;p&gt;When new programming paradigms emerge, it takes languages time to catch up. I used to love building object-oriented code in C, but it was a leaky abstraction. I had to understand how objects are laid out in memory, how &lt;a href="https://en.wikipedia.org/wiki/Virtual_method_table"&gt;V-tables&lt;/a&gt; work, and remember to pass the object as the first argument for each function. When programming languages started to support object-oriented concepts as first-class citizens, this paradigm was democratized, and today most developers don't even know what V-tables are, and the world keeps spinning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wing&lt;/strong&gt;, or &lt;strong&gt;&lt;em&gt;winglang&lt;/em&gt;&lt;/strong&gt; if you want to be cute about it, has all the good stuff you would expect from a modern, object oriented, strongly-typed and general-purpose language, but it also includes a few additional primitives designed to support the distributed and service-based nature of the cloud as first-class citizens.&lt;/p&gt;
&lt;h3&gt;
  
  
  Check it out
&lt;/h3&gt;

&lt;p&gt;We have been working on Wing for almost a year now, and I am excited to invite you to check it out and let me know what you think. While still in Alpha and not yet ready for production use, it's already possible to build some &lt;a href="https://github.com/winglang/research/tree/main/dogfooding"&gt;real applications&lt;/a&gt; with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/winglang/wing" class="ltag_cta ltag_cta--branded"&gt;Please star ⭐ Winglang&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
