1,147 karma · joined October 26, 2015
> It’s common in the software industry to blame the users. It’s the user’s fault. They don’t know how to use it. They’re using it wrong. They need to do this or do that. But the reality is that tools encourage specific behaviors. A product is a series of design decisions with a specific outcome in mind. Yes, you can use tools as they weren’t intended, but most people follow the patterns suggested by the design. And so in the end, if people are exhausted and feeling unable to keep up, it’s the tool’s fault, not the user’s fault. If the design leads to stress, it’s a bad design.
https://m.signalvnoise.com/is-group-chat-making-you-sweat-74...
- Anyone can be interrupted at any time (to say nothing of @everyone), so it's essentially just an all-day meeting. At least emails could be responded to at relative leisure.
- There are only three notification states: "nothing" (normal icon) "something happened in a non-muted channel" (red dot), and "you were mentioned specifically". There's no way to gauge importance without disrupting your flow. Some pointless cat GIF (why are these being posted on work chat?) is ranked the same as "what should we do next?". Similarly, "@everyone there are donuts in the kitchen, OMG" is ranked the same as "@someone THE SERVER IS ON FIRE".
- Channels are never-ending, so it's relatively impossible to tell where one topic began and another ended. Additionally, multiple conversations can be held at the same time, and it's difficult to tell who's replying to who.
However, I quite like Slack's group private chats. I'd like to see a group-chat solution that promoted those and completely got rid of static channels. Everything's just a private group chat, with all of the people that are needed. When the discussion's done, archive it - it's searchable, of course, but if you need to continue the discussion, make a new one! Maybe everyone in the chat even gets a summary emailed to them that they can search in their email client as well (thus solving the "wait, where did we discuss that" problem).
There are a few other changes I would make - for example, the return key should be newline by default to prevent people from writing
like
this
and instead
putting their thoughts into well-composed
messages
It's interesting because for a very long time Apple said "maximizing is usually a waste of space" with the zoom button's behavior.
No! The opposite of that. Lots of little µframeworks, defining composable and generic types, is much better than a giant monolith.
The Swift Package Manager is taking this approach, and I think it's great: https://github.com/apple/swift-package-manager#modules
The caret character doesn't appear anywhere in the semver spec, so whatever that does, it's non-standard: http://semver.org/
If your modules are small and well-defined, they probably won't need many versions anyways - they might just stay on 1.0.x forever. If you want to do something different, it might make more sense to just write another module.
func someFunction<T>(initial: T, next: T -> T?) -> T
{
var current = initial
while true
{
switch next(current)
{
case .Some(let value):
current = value
case .None:
return current
}
}
}
Now you can express that idea generally, e.g.: extension UIView
{
var rootView: UIView
{
return someFunction(self, next: { view in view.superview })
}
}
I also didn't test it, so it might not work.Of course, it would be more Swifty to create a "Parentable" protocol and write that as an extension of it!
https://fortunedotcom.files.wordpress.com/2016/03/zap03-15_b...
Compared to, say the Basecamp offices, which look open, airy, and peaceful:
T?.flatMap(T -> R?) -> R?
[T].flatMap(T -> [R]) -> [R]
However, you cannot write a protocol for "things that can be flatMapped", because you cannot refer to a Self<T> specialized with a different type (Self<R>). With HKTs, you can do that, which would let you write something like this: protocol FlatMappable
{
typealias Value
func flatMap<R>(Value -> Self<where Value == R>) -> Self<where Value == R>
}
That's not useful on its own, but it means that you can now write functions and extensions that reason about the general concept of anything FlatMappable (this is most of the way to what is known as monads, FWIW).- Higher-kinded types
- Strictly-typed "throw"
I'm not sure about dropping "Type" from protocols because it's pretty commonly used to separate the protocol definition (which is extended to provide most of the implementation) from the concrete base implementation, e.g. RAC's SignalProducerType/SignalProducer.
In Swift you can just Cmd+Click to do this (assuming SourceKit hasn't crashed) and it's very useful for that kind of exploration.
Oh, and gay people exist. Get with the times.
I assume that the options are intended for people that are bad at math.