1,553 karma · joined February 23, 2014
- https://github.com/jez
- https://jez.io
[ my public key: https://keybase.io/jez_; my proof: https://keybase.io/jez_/sigs/0_xFhL3XpIGNtgxHEDkbNAY2rFNex6gbfwBxWPF82aw ]
1. Both TypeScript and Flow are gradual type systems. They both explicitly allow escaping the safety and coverage of a type system, either to allow easier interop with existing JavaScript packages or to allow existing JavaScript codebases to incrementally adopt types. So there are always holes in which errors are reported, regardless of whether they had to silence some explicitly or not. By measuring the extent, they have a yardstick against which they can drive further type adoption.
2. Repeatability is the only way to do large code migrations. Write the steps in a script, run it, find the bugs in the script, fix the script, and repeat. With 300k lines of code no doubt they have dozens or hundreds of people committing daily. So a script is the only way to sneak in during off-hours, get something in that doesn’t race to conflict with someone else, and land the change. A long running, manually crafter branch here would not work—it would effectively operate as a fork of the codebase for the entire duration of the migration, with all the downsides that a fork entails.
Kudos to the team; this is a very impressive feat!
This hasn't been the case in my experience. I joined a new team about a year ago, and the predominant mode of discussion was Slack + IRL discussions.
Over time, I started writing docs (in Dropbox Paper, but if you want to use Google Docs feel free) and shepherding conversations to happen in those docs. @mention people into a thread to ask for their thoughts. Remind people that you have an ongoing doc to take a look at during standup.
Over time, it's possible to change team norms. But it's a slow process, and it's important to remain receptive to the experience other teammates are having too.
IM lets me take a second to understand someone's question, maybe run some command or look up some docs, and then get back. When answering IRL, there's always the pressure to definitively answer the question, because they went through all the effort to actually take up time together. It's hard to say, "I don't know; I'll have to dig in deeper."
And turn around time on email for questions like "Why doesn't this thing work" sounds like an easy way to get blocked for half a day.
But after more than a handful of rounds of this, it breaks down. Long email threads are impossible, especially ones that I wasn't originally participating in, but then got cc'd into. There's no easy way to skim and get a summary of the current state and where the heated bits of the proposal are.
That's why I like Dropbox Paper instead of email for these kinds of discussions. Threads spin off of a highlighted snippet, so there's always context to the discussion. Discussion in threads gets resolved, and the doc gets updated to reflect the decision—this means the doc is always canonical when someone new first reads it.
Email will never die because it’s so universally versatile. But specifically for intra-team discussions and decision-making, I'm convinced we can find (and already have found) better solutions.
Want prefix await? Go for it!
res <- await $ foo bar
Want postfix? You can have that too! res <- foo bar & await
Being “just a function” means it composes with everything else in the language, something the Rust languages designers have held in high regard when designing this.(But I also fully appreciate the design constraints that prevent Rust from using “just a method” or ”just a macro”)
One of the reasons why Sorbet does both runtime checking[1] more than just static checking is so that we can know that signatures are accurate, even when a typed method is called from untyped code.
If the signatures are accurate, a future project could take advantage of method's signatures to make decisions about how the code should actually be run. If the signatures lie, then any runtime optimization made using the types would only be overhead, because the runtime would have to abort the optimization and fall back to just running the interpreter.
https://sorbet.run/talks/RubyKaigi2019/#/14
But we'd like to catch more than just errors related to constants, like those related to missing methods, or calling a method with the wrong arguments. Errors like these are only reported in files marked `typed: true`:
https://sorbet.run/talks/RubyKaigi2019/#/19
Sorbet doesn't need to have method signatures to know whether a method exists at all, or what arity that method has.
But more than that, Sorbet ships with type definitions for the standard library. So you don't even need to start annotating your methods to type check the body of your methods, because most of the body of your methods are calling standard library things (arrays, hashes, map, each, etc.).
The statistics in those slides are sharing "out of the box, what's the highest strictness level that could be added to a file without introducing errors?" So ideally an entire project be made `typed: true`, but Sorbet can be adopted gradually, so a project can exist in a partial state of typedness. We wanted to see how painful it would be to adopt Sorbet in a handful of large, open source rails projects, and it turned out to be not that bad.
[1]: https://sorbet.org/docs/static#file-level-granularity-strict...
The Last Lecture by Randy Pausch
How to win friends and influence people by Dale Carnegie
Thanks for the interest in Sorbet!
[1] https://pvp.haskell.org [2] https://pvp.haskell.org/faq/#semver
https://data.worldbank.org/indicator/NY.GDP.PCAP.CD?location...
^ I find it really interesting to see how volatile some of these charts are, while the US GDP per capita seems relatively stable.
That would mostly work, but the problem in Pittsburgh at least is the bus bunching happens between related but not quite identical routes. For example, the 61A, 61B, 61C, and 61D all run down Forbes Ave, and frequently get bunched there. But then later in their routes, they fork: two go one direction, and two go the other direction. For many passengers, it doesn't matter which one they take. But for other passengers, it has to be a 61A etc.
But I found the first motivating example (refactoring is hard) to be a poor argument in favor of cohesion. When making a breaking public API change, types and the ensuing type errors are going to be a way more powerful guiding force for identifying affected usage sites than cohesion. Of course, his examples were in Python, so maybe the author doesn’t have such luxury.
https://temochka.com/blog/posts/2017/06/28/the-language-of-p...
w3m -dump <url>
which dumps the website’s text content to stdout.That being said, all the choices you list (Elm, Haskell, F#, OCaml, PureScript) are solid languages with good communities. The core languages are similar enough that if you start learning one, the things you learn will transfer decently enough to all the others.
[1]: Haskell Programming from First Principles (http://haskellbook.com/)
In fact, Reason generates the `>=` comparison, and it knows it can do this because it know that a value greater than 2 can never happen.
The post should be updated to reflect this in a second!
It has always seemed like data science and machine learning tasks have always been most popular in dynamic languages like Python, Julia, and R. I really hope this can be a bridge over to typed machine learning APIs!
(Of course, I’m also interested to hear about your favorite typed machine learning library if you have some that you already use)
The author does a good job at building up the abstractions from first principles in this post: https://ren.zone/articles/safe-money
Let your main point breathe.
Also: use a professional typeface. Recruiters look at Times New Roman, Arial, and Computer Modern all day. Try Avenir, Garamond, or San Francisco. Maybe even pay for a font license.
> And finally, font choice. The fastest, easiest, and most visible improvement you can make to your typography is to ignore the fonts that came free with your computer (known as system fonts) and buy a professional font (like my fonts equity and concourse, or others found in font recommendations). A professional font gives you the benefit of a professional designer’s skills without having to hire one.
— https://practicaltypography.com/typography-in-ten-minutes.ht...
If I remember correctly, they noticed they could dust costs significantly in storage compared to S3 because the vast majority of files in your Dropbox folder just sit there and hardly need to be read or written again (photos, etc.).
If they’re not using AWS for compute, it’d be interesting to see what sort of similar reasoning they have for why the costs are cheaper in house.
So if you're looking for multiple viewpoints, this is a ~frictionless way to start reading multiple perspectives.