<3 Deno
matklad.github.io
matklad.github.io
Personally, I find direct Typescript interpretation to be one of the best features. Typescript is not necessarily a simple type system, but it is an expressive one:
- It has great type inference avoiding Java style codespam
- It has gradual typing, enabling "risky" type casts
- It has fully functional types, enabling the productivity and readability improvements from functions as data
- It is 10 seconds away from having dependent types
Typescript took most of the best programming language research from the past 20 years and popularized it in a way that actually makes js hackers more productive without getting too much in the way.
The only hard thing has been that js interpreters don't understand typescript, requiring an awkward transpilation step with weird symlinks and other hidden complexity that works 99% of the time, but wastes a lot of time when it doesn't work just right.
If Deno could just solve that, it would be a great improvement. If it's also faster (as claimed) that's even better. This article shows a lot of other ways in which small, simple improvements add up to a much better product.
Can't wait until it's production ready.
I have the impression that many of us programmers have a hard time really accepting that different applications of programming require vastly different skillsets, so we often underestimate how hard things can be.
For example, a software developer of 15 years probably doesn't have almost any of the necessary skills to make a new database server.
I feel like one of the skills that levels you up from junior to senior engineer is learning never to utter the words “it will be easy”
If you don’t need systems language type performance, and don’t need true parallelism, it’s a pretty terrific choice. Starts out productive/simple in the early days of a project, stays productive/simple as it grows. Plus, if you’re doing “mobile apps + web app + RESTful services”, pretty nice that you can do it all in one language (assuming React Native on mobile), and that there’s no JSON related boilerplate.
They are the most natural way to encode structural information, especially across language/system boundaries.
- Clojure’s multimethods (multiple dispatch)
- Clojure spec’s “or”
- JSON schema’s “anyOf”
There’s likely more features and tools that are not strictly/statically discriminated/tagged unions, but in practice they help you to code that way.
In TS this is IMO the best feature. In a sense it just adds tooling support on top of a coding style that is very close to dynamic typing.
My favourite use-case for discriminated unions is to represent all possible client events as a DU, as well as the entirety of the application state. This allows you to efficiently communicate with a backend over websockets via a very thin transport layer that only needs to handle one message type.
A lot less would be a lot more, because as of now Typescript lures otherwise entirely competent programmers into writing complex 'type system puzzles' which are entirely obscure to everybody except the person who wrote that code, and it takes a lot of discipline and experience to reist the lure and keep things simple.
I'd gladly take Hindley-Milner typing and typeclasses (or better yet, module typeclasses) over the current TS situation.
Excessive typing is very costly and should be left to popular libraries that solve generic problems. This is where you get best bang for buck.
It should not be present in your business code, high level business logic is rarely prone to type errors anyway.
Static typing was always a means to an end, but unfortunately it was recently sold as a virtue and many people have bought it.
I want a type system that embraces the correct way to to do things instead of allowing anything you want no matter how bad it actually is. I want my type system to inform me that my code is really bad for performance and should be redone.
Instead, I constantly deal with people who think their code is fine just because the TS checker doesn't complain.
> Additionally Invo supports USD, EUR, JPY and GDP currencies.
Did you mean `GBP` here?
One usability issue - the currency selector is hidden behind a gear icon on the last Total line, whereas you see the currency in previous lines without the ability to change it. I would move it somewhere much more obvious.
But a lot of people think that multiple implementations and specs are good things (I personally don't know which way I go on this one). And thinking about it, I kind of don't buy the argument. There are specs for JavaScript and TypeScript, and multiple standalone JS and TS engines: node, QuickJS, duckjs, Bun, etc.
I also don't buy the "minimal, practical" take on dependency management. It sounds like they just built a package manager into Deno itself and put versions in the URL, which feels like the opposite of minimal and more like "batteries included". Again not saying this is bad--the Python ecosystem suffers pretty badly from not having their dependency story totally mapped out--just quibbling over the characterization.
On the other hand, I do buy the security thing. AFAIK this is the first scripting runtime to essentially integrate pledge [0], which is real interesting.
In the case of dependency management, they use a pattern which would also work for client code shipped to a web browser (in that case the client would assemble the code - like if you had a reference to load mathjax or google analytics or whatever, or you could alternatively vendor and ship them yourself).
To me Deno is basically modern web standards + very nice tooling for use as a scripting or serverside language (typescript interpretter, format, compile, vendor, test, lockfiles/import maps, ability to explicitly include/exclude capabilties from runtime, etc).
Just for the record, Deno does allow finer grained control than that:
> --allow-net=<allow-net> Allow network access. You can specify an optional, comma-separated list of IP addresses or hostnames (optionally with ports) to provide an allow-list of allowed network addresses.
First class capabilities are a much better approach, a real solution to supply chain attacks.
Though most people will likely just --allow-all because it is easy.
Ooft. Although TypeScript does have a bit of a learning curve, and a lot of gotchas, I still have to say it's my favorite language to use. If you combine the delicious syntax-sugar of ES6 (and beyond) with a sprinkling of tasteful types, the language leaves you full and energized without feeling bloated.
I’m not that into class-based languages and prefer a language to have macros (more for DSLs they enable them for application code). However, even if those preferences were off the table, I’d still rather have something like Kotlin on the server than TS. It’s simpler and isn’t weighed down by 30 years of cruft.
It's a language that supports both function and OO paradigms.
Also, if macros/DSLs are what you're after, then you'd probably be interested in typescript's decorators. (you can use the old experimental decorators based on the old standard from ages past, and the new *standard* decorators introduced in typescript 5 which are based on the current stage-3 ecmascript proposal).
The only things typescript as a language is really lacking are:
1. Pattern matching (minor issue)
- +90% of pattern matching is really just a more concise switch/case syntax
- the remaining -10% can be done by hand with mapping or just basic if statements
2. Immutable data-structures (minor issue)
- The `as const` suffix handles most of the use cases.
- There is a Records/Tuples proposal which would give some better syntactic sugar and some run-time performance improvements too.
3. Trait system (minor issue)
- Typescript compiles down to Javascript which at the lowest level is actually a prototype-based language. Traits can be approximated using run-time mixins which alter the prototypes to essentially perform the same functions as traits.
- But, it would be nice to have compile-time rather than run-time support for traits.
- I think most languages are still only coming to terms with the fact that traits are often better than "traditional OOP classes".
4. Effects system (investigate)
- It's too early to tell, but having an effects system (à la OCAML 5) will probably lead to entirely new programming paradigms. I'm not sure where it will lead, but having native algebraic effects to replace try/catch/throw would be very nice.
Edit: Formatting
I disagree that "pattern matching is "really just a more concise switch/case syntax" and use it regularly in function heads and in parsing nested data structures.
More importantly, I reject the premise that the four items you mentioned are the only things really lacking or even that the problem with TS was a lack of features as opposed to its bad features, superfluous features and poor design decisions. For example, I'm not a fan of any of the following:
- loose typing
- multiple ways to declare variables, with different scoping rules
- multiple ways to declare functions, with different treatment of "this"
- the ability of code in any module anywhere in the system to affect code in the module you're looking at without leaving any evidence of this in the module you're looking at
- the ability of functions to alter parameters they're called with
- the sort function in the standard library being destructive by using the above
- etc...
That said, JS/TS really is missing some important things that didn't make your list:
- a good concurrency model
- macros
- compile time guarantees about references
- list comprehensions (actually minor)
- a sufficient standard library
- etc...
But for things like testing blocks, configuration, HTML/CSS generation, etc, it's generally enough to use the language by itself.
Of course not everyone wants a Rails-inspired MVC framework experience, but why do you figure even those who did couldn’t achieve the same level of syntactic sugar?
(I know Ruby doesn’t have macros either, but it does have enough expressiveness in a few other ways to do some things Python and even JS can’t)
Rather, I think the truth is that server-side Javascript tends to be used in a different way to Ruby - generally Node projects that I've worked on are much smaller (and often coupled with other similarly-sized services), and are often just minimal APIs designed to act as a middleman between a database and a front-end application. It's not an issue with missing expressivity, but rather a tendency not to need (or at least, not to want) the full-featured powerhouse that is RoR.
# DSLs
I'm not familiar with a Phoenix development workflow, but judging by what you've written already, it seems that DSLs are the main sticking point for you.
If I understand correctly, you want to use them to minimise the amount of code you need to write to and/or to guide the project to follow a specific pattern.
I already see this being used in the js/ts sphere:
- NestJS uses decorators for routing and to make the MVC pattern more terse: https://stackblitz.com/edit/nestjs-typescript-starter-pcysqn... - AdonisJS uses decorators for its ORM: https://docs.adonisjs.com/reference/orm/decorators#column
---------------------
# Pattern matching
Can you give an example of what you mean by "use it regularly in function heads and in parsing nested data structures" in regards to pattern matching?
I'm under the impression that it's just a shorthand switch/case that uses filters as conditions.
The current ecmascript proposal for pattern matching (which would end up in js and ts if passed) seems to be inspired in part by Elixir/Erlang.
---------------------
# Features that you're not a fan of
One of the things that makes TS so interesting is that it's a broad language. It doesn't impose a way of development for you.
You can start a project based on how you know how to develop.
- If you already know about functions and typing systems then you can start programming right away.
- If you only understand 90's style OOP then you can start programming right away
Developers should have the option to define the programming styles of the project that they create.
But to go through your list:
> loose typing
I don't see this as a negative.
Those that want strict typing use strict typing, those that want loose typing use loose typing.
> multiple ways to declare variables, with different scoping rules
The `var` keyword is only there for backwards compatibility.
But, if you do try to use it in a new project, you'll be alerted immediately by eslint and you can change it to `let` or `const` depending on your intention.
> multiple ways to declare functions, with different treatment of "this"
All this comes down to is if you want to do OOP (function keyword), or functional (arrow functions).
Use the one that suits you best.
>the ability of code in any module anywhere in the system to affect code in the module you're looking at without leaving any evidence of this in the module you're looking at
What do you mean by this? It sounds like you're describing side effects in general, and nothing to do with modules.
> the ability of functions to alter parameters they're called with
What do you mean by this?
When you pass by reference, you get the same reference. When you pass by value, you get a copy of the value.
If you want to alter the original source of something directly, you pass by reference.
If you want a temporary copy of a value, you just pass the primitive value and you'll get your own copy of it scoped to a function. Now you can make whatever changes you want to it, and when you're happy you can return the final value. This has the added benefit of the outer value not being stuck in a half-changed state if the function throws in the middle of its execution before the changes to the value were finished.
> the sort function in the standard library being destructive by using the above
I'm not sure what you mean by this. This is just pass-by-reference vs pass-by-value again.
---------------------
# Features that you think are missing from JS/TS
> a good concurrency model
JS/TS already has an event loop, async/await functions, pull-style generators, and threads.
One of the things I suggested in my previous comment (but marked as needing further investigation) was an effects system. They can be used to make so-called "colorblind" functions which can be valuable for some async workflows.
> macros
I don't see how these are different from decorators. Unless maybe you're talking about compile-time macros, in which case that's more in line with metaprogramming and things like extending the language with your own (re)compilers like babel.
> compile time guarantees about references
Isn't this what `readonyl`, `as const` and the `satisfies` operator already achieve in TS?
> list comprehensions (actually minor)
Yeah, this is minor. Just syntactic sugar, nothing more to say here.
> a sufficient standard library
Yeah, a lot of early weirdness was caused by not having a standard library. But now we have things like lodash and deno's std.
Typescript has decorators?!!
Damn, i wish I'd know about this 3 months ago.
Typescript supported a much older (and different) decorators proposal under an experimental compiler flag, but my momma always taught me never to use flags marked "experimental" in Production.
> To enable experimental support for decorators, you must enable the experimentalDecorators compiler option either on the command line or in your tsconfig.json
https://www.typescriptlang.org/docs/handbook/decorators.html
> ..the current decorators proposal, which is a work in progress
https://github.com/tc39/proposal-decorators
Oh, but I see that the proposal is now at Stage 3, which means the specs and syntax are stable ("completely described") and ready for browsers to implement.
On further digging, it seems decorators will be a standard feature included in TypeScript 5.0 planned for release on March 14th.
TypeScript 5.0 Iteration Plan - https://github.com/microsoft/TypeScript/issues/51362
I'm hoping the proposal for match syntax finally lands. Something like Swift's protocols would be nice.
TS inherits some unfixable mistakes from JS but overall I find it a pretty comfortable and productive language.
I'm surprised Typescript has not tried to add this major missing feature from Javascript.
I know you can hack this using an Object, but for me Named Parameters are so useful for code readability and intent - especially for calling functions to make it obvious what's happening and to so that different order of arguments doesn't cause bugs.
Otherwise I have to agree, Typescript is a pretty damned good compromise.
When people say typescript is hard to learn, do they know javascript, or are they starting from scratch?
Python's type hints and Ruby's Sorbet (or their weird RBS thing), I can understand.
But TypeScript? Besides a few things that are not obvious at first (like callable interfaces), I don't think you really need to think about most stuff.
I don't think you need to use most of these types until you start getting into stuff like needing union types. You can get away with reading and writing most typescript without getting too crazy.
I think the most compelling thing I read about type hinting is that it's like salt - A little and the dish doesn't taste the same without it but too much and you've ruined the thing
We have a hub [2], centered around deno, that serves as our library of integration. An integration for us, is just a script that uses the right dependency to do an atomic action like fetching data or doing a POST.
We are betting big on deno, and are hoping with windmill to be the framework to make it enterprise-ready for other things than webservers (which most of the deno framework currently focus on).
[1]: https://github.com/windmill-labs/windmill [2]: https://hub.windmill.dev
Also, starting with an empty workspace and importing examples from the hub manually might be less confusing. With public workspace having all these examples, "Home" is cluttered and it's not obvious that new scripts also end up there.
Overall it's very impressive, thanks for open sourcing!
Jest and Mocha both do not support ESM very well out of the box and there is an expectation that you are using babel to transpile to CommonJS for everything to work nicely. (See Jest's _experimental_ support for ESM mocking!). Node.js is only starting to build out a testing framework, and it has a way to go yet until it has any level of feature parity with the established libraries.
Then you have the naive assumption that any package written in JS works with TS. Which is true, they do work, but the missing types will always lead you to look for a TS-first alternative. A good example of this is Joi vs Zod for validation, with the latter performing type inference based on your validation parameters, which is great. But it really does feel like you have a subset of a package ecoystem lurking on NPM.
I am not that confident Deno is the answer, but I would say those are my biggest frustration writing production grade JS/TS code today.
tsx is a CLI command (alternative to node) for seamlessly running TypeScript & ESM, in both commonjs & module package types.
It's powered by esbuild so it's insanely fast.
I also suggest using its alias: esno
The Node testing ecosystem has its obvious advantages in terms of how much it’s been buttressed by third-party efforts (which makes it incredibly flexible), but just being able to write a TypeScript test file, run `deno test` and just have it work is really a breath of fresh air.
For pure JS projects it’s quite nice though.
- It uses the v8 engine so you've got the same APIs you know and love for the browser like fetch() - Something that nodejs is just catching up to now
- It's not nodejs, the whole name means 'destroy node'. You can get a lot done without being buried in dependencies. Well-maintained core libraries.
- Server-Side WASM is a really interesting idea for encapsulating and integrating stuff written in, say, C++
The cons:
- Some of the third party ecosystem seems to be suffering from a lack of recent maintenance
- Server-side WASM is limited to 32-bit until they figure that out, which also limits whatever you do with it to a 4GB memory ceiling
Other than all that though it's probably not a bad choice for anyone not bothered by those limitations and just wants everyone who speaks typescript on the frontend to be able to grasp what's on the server side end of things too.
I think it could probably thrive with more usage traction.
Server-side WASM is the future for FaaS imo, sandboxing built in and an effective object-capability approach to dependency safety is amazing.
A classic "true fact" that's false: Hey did you ever hear that people in england used to brick up their windows due to a window tax? (true) Thís is the origin of the phrase "daylight robbery" (false)
Deno doesn't mean 'destroy node', it's just node reordered.
The limitations that stick out most to me personally are that there's still no ARM support, and that, while the Node compat is getting a lot better, it's still hard to get a clear sense of where it is for individual packages -- what runs natively/is isomorphic, vs what'll run under a compat layer, vs what just won't run at all.
(That said I can't really speak to macOS here, as I really only use Macs when workplaces require me to, which also doesn't necessarily translate to having sudo access.)
How's the performance vs ffi version? I'm about to use deno with sqlite and have to decide which one to use. The lack of WAL in WASM version gives me a pause though.
Can't say because I haven't compared them. This is a small personal project that will have less than 10 users, so I'm not that worried.
Usually when I do anything in the node/npm world I have to steel myself. But Deno & Deno deploy are actually fun.
In my experience, however, as soon as my tasks section got large enough that a separate file was needed, it became long-running enough that I wanted a generic file dependency-aware builds which required a make-like solution. What should large projects do that need to build assets or perform long-running work as part of a build process without dipping into another clunky tool?
I have similar issues with threading development-only import maps that reference local modules in a polyrepo during development and sharing common Deno configs. Customization doesn't scale well to task one-liners even though I want it to. Do folks know of open-source polyrepo reference that serve as a paradigm for patterns that scale?
While this is certainly nice, should third-party code be actually committed in your version control system? I always treated it like a bad idea. Adding node_modules to gitignore is second nature now.
["10","10","10"].map(parseInt)
?You have to do `['10', '10', '10'].map((val) => parseInt(val, 10));` to get the "expected" output. In addition, you should always provide `base` to `parseInt` otherwise it has it's own interpretation infered by the value you give it.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
['10', '10', '10'].map(val => parseInt(val))
Leading zeroes can often be considered invalid input, and you may be able to safely assume that it has been dealt with already.Also the parens around a single argument of an arrow function are a superstitious thing suggested by some well-known react developer a while back, I think.
The extra parentheses is just habit from Prettier formatting :)
['07', '08', '09'].map(val => parseInt(val)) // => [7, 0, 0]
['07', '08', '09'].map(val => parseInt(val)) // => [7, 8, 9]
Another question that I like is asking to find out issues in one fragment of code. This fragment is crafted to contain style issues, some bugs and architecture issues. This allows to understand the level of candidate: which issues can he spot. Not ideal, but I think it works good enough.
You can try ["10","10","10"].map(console.log) for more info... the third argument is the source array:
> 10 0 ['10', '10', '10']
> 10 1 ['10', '10', '10']
> 10 2 ['10', '10', '10']Click the 'Run' button:
https://www.typescriptlang.org/play?#code/MYewdgziA2CmB00QHM...
`Array.map` function API was badly designed. I'd like to know who I should to blame for that design.
But yeah it is just a case of the map providing 3 args to the function (element, index, array) and parseInt using 2 value s (string, radix) so we have element->string (yay!) and index->radix (oof!) and array->ignored (meh!)
The good old Unix philosophy of designing simple tools that are doing only one thing right has proven extremely useful in the context of using the Shell as a scripting interface.
Composability is paramount to be able to glue small cogs together to quickly build a larger machine for ones needs.
But this way of thinking should not apply to everything, especially not when the tool itself is designed to be used a direct interface with the user (like a Shell).
Deno sounds well thought out, but the article realistically presented no compelling reason to try it.
And realistically, it presented many reasons not to. Javascript is a horrendous language. Not because of the syntax, not because of the library support, but simply because even self-dubbed javascript 'experts' are often confuddled by its standardized behavior. We could probably count on several fingers the number of people who can accurately describe javascript's semantics. As the rest of the computing world moves towards sane languages, this seems like backwards 'progress'.
One of the good points about deno raised in the article is that deno removes that problem by having first-party solutions to things that developers usually need built-in.
Also while JS has plenty of footguns, Deno being built around TS and deno ts developers using eslint as a standard practice eliminates those footguns.
The biggest thing holding back TypeScript is the awkward transpilation dance, a weak standard library in Node and relatively poor performance - none of which are the fault of the language.
Break free TypeScript, you gotta move out of your parents' place eventually
But it goes into a slightly different direction from what you want (the main motivation was a "stripped down TS for WASM", not a "stripped down TS with go routines"). It will be interesting to see how they'll tackle multithreading (now that WASM threading is out in the wild).
[ 10, NaN, 2 ]
what... the... fuck...
I have seen the WAT video but forgot about this example.
My two main quibbles about Deno are:
1. The rather pointless security model that seems about as relevant as it did for PowerShell.
2. It's quite young, there's still some pointy edges.
The present: Use an enormous, complex, sometimes closed source, omnibus program containing a Javascript engine to remotely source and run Javascript files, i.e., other peoples' programs, listed in webpages (sometimes cascades of them as dependencies) in a way that is non-transparent to the user, allowing selected access to certain features of the the user's computer, all mediated and controlled by Big Tech with its dependence on advertising and associated data collection and surveilllance and conflict of interest with respect to users.
The future: Use a standalone Javascript engine to remotely source and run other peoples' Javascript programs in a way that is transparent to the end-user, with all access to the user's computer, if any, under the full control of the user, with no dependence on advertising and no need for data collection and surveillance.
"Javascript" might be replaced with some other language. Typescript, WASM, whatever. In the earlier days of the web before Javascript, people tried to use "Java applets". Back in those days when an applet was encountered the browser would ask the user for permission to run it. As I remember it, this was about as annoying as cookie permission popups, another idea that was implemented in the earlier web then disappeared, but has now been re-implemented due to emrging privacy laws.
["10", "10", "10"].map(parseInt)
is the sanest. Taken in isolation, the parameters of both Array.prototype.map and parseInt makes sense, and a typed language wouldn't help there too much. All hope is on ESLint rules to not let you do shortcuts which could burn you.
That would be impossible in a typed language. The argument of map() is supposed to be a function with signature (T, Integer, T[]) -> R and parseInt() has signature (String, Integer) -> Integer.
I would really appreciate if deno-task-shell could be used in a shebang for writing scripts that expands on several lines in dedicated files.
I laughed a little when I saw the author hinting at TS creating complex structures. A reason I never adopted it. A great use of TS would be to type the external interfaces though!
However, the security issues are valid but not necessarily an issue solved by the framework. Ultimately some kind of package manager that had a manual review step before packages could go out would be a nice step, and would work at scale as well.
Manually listing permissions for an application works for security until people get tired, or are just so used to saying yes. Its also very bold of deno to assume their sandbox is impossible to escape. It’s much more likely that no one cares to really try.
What is injection-proof template literal? Any link about that? Thanks :)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe... for specific implementation in JS. Compare with f-strings in Python, which are superficially similar, but can’t be used to, eg, construct SQL or HTML not prone to injection attacks.
https://github.com/denoland/deno/issues/14244
You have to use a third-party Docker container if you want to use Docker locally and develop on an M1 Mac (I use Docker to separate my different dev environments). And the issue was just ignored and became stale.
I'm assuming you've never run into node-gyp issues then?
- sass - imagemin-gifsicle - imagemin-jpegtran - imagemin-optipng - imagemin-svgo
Deno does support native plugins, so we could see the same thing happen there.
You still see this frequently in a number of ecosystems (eg https://stackoverflow.com/questions/70061068/could-not-find-...)
Regardless, my experience on the platforms it works on has been very positive.
On the contrary. Ryan Dahl, the person who created node, came up with deno, specifically to address a number of problems (or regrets) he had with node: see https://youtu.be/M3BM9TB-8yA.
For example, what is the problem with calling the TypeScript compiler? I have a build setup anyway, so why does it need to be integrated? That's an example of a solution where I don't see the problem.
I disagree. There were and still are good competing package managers and registries. Perhaps, in an alternate universe, yarn might have won. Or in yet another universe, node would have package management built-in, as deno does now. In any case, node would be fine.
> what is the problem with calling the TypeScript compiler? I have a build setup anyway
Just because your project has a build setup, doesn't mean all other projects must have one, too...
Anyway, my real problem is to be able to easily create modules that I can use everywhere, on the backend, and in the browser. I don't think Deno makes that easier than Node, because for the web, I still need to add a build step using esbuild. So for me, Deno is pretty pointless. But that's just my opinion.
https://deno.land/manual@v1.30.3/advanced/publishing
The point seems to be that it doesn't need anything special, you just import files, and Deno takes care of the rest.
Want a private repository? Stand up an apache server. Or an S3 bucket. CDN in front? Sure, why not
Want to casually host and not deal with a repository? Import directly from github
Namespacing? Domain names. And they already have ownership controls/auth that your ecosystem doesn't then have to reinvent
Combine that with import-mapping (being able to tell the runtime to load X when it sees Y), and I don't see any reason to do it any other way
- Need a fallback plan if original hosting died ?
- Need to specify immutable version/hash for the url ?
And Deno supports lockfiles for the second: https://deno.land/manual@v1.30.3/basics/modules/integrity_ch...
It also has a vendoring mechanism, if you prefer that approach: https://deno.land/manual@v1.30.3/tools/vendor
OTOH, it’s not clear if fancy constraints solve more problems than they create.
Notably, if the only constraint is `^x.y.z`, than the gready, expressible-via-urls algorithm of always selecting the latest semver-compatible version yields the minimal solution.
Ryan Dahl was there as well as a junior engineer (L4).
L4 typically are engineers who graduated for 1-2 years.
Meanwhile Ryan has built a programming engine that has been used worldwide and widely popular on the same scale of Ruby, Java, Python... But he was slotted as an L4.
What I will say is that from what I hear this sort of under-leveling is pretty normal and just how it is. Maybe it’s better now, I don’t know.
I was offered a position with G after I left a previous employer. I also felt that I was underleveled and expressed this, then declined the offer.
This earned me a call from the SVP I would have been reporting to. The general philosophy they related to me was that G likes to see people perform _at Google_ and that leveling up is very easy, so if you're good, being underleveled isn't a problem because it will correct itself.
"If it's so easy and you're impressed with my track record and believe it qualifies me for the role, as you said before, you should be convinced I'm at the level you mentioned." They hemmed and hawed and bit and said they would see what they could do. Eight (!) months later, long after I'd already accepted another role and told them about it, they got back to me with the higher level.
As an SVP, why would you take time out of your day to try and convince a candidate to join the company only to low ball them? Makes no sense.
The whole "we'll level you up quickly if you perform" is almost always bullshit. It usually takes at least 1yr no matter what.
If you were downleveled and they promised you staff+ then they are probably going to be more stringent and there are also more factors out of your control (E.g. your team, org, manager, etc) so good luck getting "quickly" promoted.
In a normal case, you wouldn't be promoted because there wouldn't be big enough project for the next level.
Here's some context on that from Ryan: https://tinyclouds.org/residency
It does not sound like a typical Google software engineer position or one where leveling is particularly significant.
As an extreme example, a best brain surgeon or businessman in the world would completely fail Google's software interview and be rejected.
A new grad joining Google for 2 years would likely reach L4.
Also I think this whole granular access thing is weird. I never wanted it, container isolation is more than enough. Hopefully it does not add much drag to deno progress.
I think the win with Deno is the JS ecosystem and the situations where JSs dynamicity is an advantage. Sometimes (often times, in my own estimates) that's worth double the memory usage and 20% the raw CPU performance.