designers love to hate on raw, unfinished things.
redesigning the whole ios/watchos/macos/... ui after a decade is a brutal challenge for any design team!
almost impossible to satisfy the expectation.
most haters around here have never designed in a large organization like apple and are not aware of challenges such as politcs, opiniated stakeholder, impossible deadlines, the list goes on...
i empathise with the ui designers in apple.
yes!
os26 and liquid glass feels rough at the moment!
so did the ios7 at launch. it evolved.
this will too.
i appreciate the brave direction apple has taken with this liquid glass ui.
yes it comes with challenges including readability, compatibility and more...
let's stop b*tching about it and contribute to solutionise these challenges.
Ever wonder why #SwiftUI uses the "some" keyword instead of the "any" keyword?
The answer is performance. SwiftUI works by comparing two trees when @State changes. Comparing trees is incredibly expensive, except for when trees have the same structure. "some" enforces structure.
The way Datadog calculates percentiles at scale is very innovative 🔥
Usually, calculating the percentiles of large datasets is very expensive.
To know the 99th percentile of a stream of values, you need to:
- keep all the values
- sort them
- return the value whose rank matches the percentile (e.g 99th item)
Datadog cannot afford to do this with the many millions of data points that come in every second - the space and CPU requirements are not practical for a company with thousands of customers. 🐾
Naturally, they opted for sketch algorithms - those should provide them with a good-enough probabilistic result while being vastly more efficient to compute.
Unfortunately - they couldn’t get satisfactory results.
The algorithms would produce results that were too inaccurate. ❌
Why?
Many percentile sketches had guarantees in terms of *rank error*.
A rank-error guarantee of 2% means that the p95 value returned by the sketch is somewhere between the p93-p97 value.
But system latencies exhibit very fat tails - the difference between the p97 and p99 values can be 2-10x!
So what did the dogs do? 🐶
They invented a new sketch algorithm - DDSketch.
Instead of rank error guarantees, they designed it for *relative error* guarantees.
If the p99 is 60s, a 2% error means the sketch would return 58.8-61.2s.
The algorithm is surprisingly pretty simple:
• They create buckets covering ranges of the desired error rate. (+- 2% in this case) 🪣
• Each bucket keeps a counter of the amount of data points within that range. 💯
• When processing an item (latency metric data point), increment the counter of the appropriate bucket. ➕
• To count the desired percentile, you sum up the bucket’s values until you get to the desired percentile. Whatever bucket that percentile is in - that’s your value. 🏆
In this example, the 50th percentile is 1033ms. (4th value out of our total of 8)
Going by count, the 4th value is in the second bucket (b-1) and the algorithm would produce a result of 1021-1061ms.
To cover the range from 1 millisecond to 1 minute, you only need 275 buckets.
With 64-bit counters, that's just ~2kB of memory, regardless of the amount of input data.
This is why we call sketch algorithms sublinear in space growth - memory requirements do NOT grow linearly with input.
The exponential nature of the bucket distribution makes it cheap to cover an even wider range: 1 nanosecond to 1 day takes just 3x more buckets:
• 802 buckets at ~6kB.
As you can probably tell, this is pretty easy to parallelize.
You can divide this bucket-building exercise into many parallel lightweight substreams, and then merge the results freely. 🕊
The merge operation is a simple sum of the buckets & their counters, which ensures that the accuracy is kept in the same range.
It is a very scalable and performant sketch algorithm.
Kudos to Datadog for inventing it.
Good boy! 🫳🐕🦺
Today at WWDC we introduced a new static linker. It is a ground-up rewrite that’s up to 5x faster than ld64. The new linker is written with multicore in mind, and it’s the first production ready parallel linker officially supported for iOS development. (1/n)
Learn how to enable inspection of web content in your apps using the new inspectable API and Web Inspector in Safari on the WebKit blog.
https://t.co/zMom9t5bIa
AFNetworking is now officially deprecated. Direct integration, forking, or transitioning to Alamofire is recommended moving forward. Thanks for your support over the last decade!
UX Research Templates (PDF, Miro) (https://t.co/hut44NDDKn), a helpful set of templates for UX research and delivery, from priority matrix and SWOT analysis to research canvas and competitor analysis. The Research canvas below is created by @sniffles.
#ux#research
The largest iOS apps all have a common problem
Localization files account for
23% (74 MB) of @Uber
23% (30 MB) of @WhatsApp
17% (53 MB) of @MicrosoftTeams
17% (50 MB) of Nike Run Club
🧵 Here's how Airbnb reduced the size of localizations by 82% with the help of Emerge
Spent some time reverse engineering a Sony app to figure out how the A7II sends photos over Wi-Fi.
Why? Because I shouldn't have to use an app that forces sign up and tracking just to access my own photos.
Wow, that’s impressive! The Wix team has edited 7643 error messages to design clear, helpful, respectful and inclusive messaging and error handling. https://t.co/IjlxetDnJg #ux#design
As one of the people laid off from @sketch today, I'll be actively looking for new opportunities, be they employment or contracting, some time soon.
Feel free to point me in the direction of people who are hiring or need temporary help, and please share this tweet. Thanks 🙌
As imaxes que chegan de Compostela son desoladoras. A capital do país está a ser destruida e convertida nun parque temático.
Os picheleiros fuxen da súa propia cidade. Onde antes había comercio agora hai souvenirs.
SEGUE 🧵👇