Designing for agents forced us to build a better tool for everyone.
这是一个充满辩证法的结论。Agent 所需的确定性、非交互性和显式声明,恰恰符合 Unix 哲学中“易与其他程序协作”的原则。为 Agent 约束而优化的接口,消除了人类在自动化脚本编写和测试中的痛点,实现了人机体验的统一与双赢,证明了良好抽象的普适价值。
Designing for agents forced us to build a better tool for everyone.
这是一个充满辩证法的结论。Agent 所需的确定性、非交互性和显式声明,恰恰符合 Unix 哲学中“易与其他程序协作”的原则。为 Agent 约束而优化的接口,消除了人类在自动化脚本编写和测试中的痛点,实现了人机体验的统一与双赢,证明了良好抽象的普适价值。
Software, he argues, should be approached the same way. It's a new medium, and it deserves a native design language instead of hand-me-down forms from the physical world.
大多数人认为数字界面应该模仿物理世界的设计元素以提高用户熟悉度,但作者认为软件应该有自己独特的设计语言,不应简单复制物理世界的形式。这一观点挑战了 skeuomorphism(拟物化设计)的传统理念,主张数字媒介应有原生表达方式。
This motto has been very much discussed in the Perl community, and eventually extended to There’s more than one way to do it, but sometimes consistency is not a bad thing either (TIMTOWTDIBSCINABTE, pronounced Tim Toady Bicarbonate).[1] In contrast, part of the Zen of Python is, "There should be one— and preferably only one —obvious way to do it."
Instead of forcing humans to understand the complex inner workings of machines, we should construct machines in a way, so they better understand us humans!
.
Where philosophy meets tech.
This seems to be the space that I occupy on the edges of design education and practice.
Maria Selting of Unbox Your World podcast has just shared the raw audio of our conversation to get feedback before she publishes the episode, Redesigning Design: Applying UX Principles to Design a Better Future.
Victor Papanek’s book includes an introduction written by R. Buckminster Fuller, Carbondale, Illinois. (Sadly, the Thames & Hudson 2019 Third Edition does not include this introduction. Monoskop has preserved this text as a PDF file of images. I have transcribed a portion here.)
The WebSocket Protocol is designed on the principle that there should be minimal framing (the only framing that exists is to make the protocol frame-based instead of stream-based and to support a distinction between Unicode text and binary frames). It is expected that metadata would be layered on top of WebSocket by the application Fette & Melnikov Standards Track [Page 9] RFC 6455 The WebSocket Protocol December 2011 layer, in the same way that metadata is layered on top of TCP by the application layer (e.g., HTTP). Conceptually, WebSocket is really just a layer on top of TCP that does the following: o adds a web origin-based security model for browsers o adds an addressing and protocol naming mechanism to support multiple services on one port and multiple host names on one IP address o layers a framing mechanism on top of TCP to get back to the IP packet mechanism that TCP is built on, but without length limits o includes an additional closing handshake in-band that is designed to work in the presence of proxies and other intermediaries Other than that, WebSocket adds nothing. Basically it is intended to be as close to just exposing raw TCP to script as possible given the constraints of the Web. It's also designed in such a way that its servers can share a port with HTTP servers, by having its handshake be a valid HTTP Upgrade request. One could conceptually use other protocols to establish client-server messaging, but the intent of WebSockets is to provide a relatively simple protocol that can coexist with HTTP and deployed HTTP infrastructure (such as proxies) and that is as close to TCP as is safe for use with such infrastructure given security considerations, with targeted additions to simplify usage and keep simple things simple (such as the addition of message semantics).
The main difference is in the flow of how messages are ultimately sent to devices for output. The standard library Logger logic converts the log entries to strings and then sends the string to the device to be written to a stream. Lumberjack, on the other hand, sends structured data in the form of a Lumberjack::LogEntry to the device and lets the device worry about how to format it. The reason for this flip is to better support structured data logging. Devices (even ones that write to streams) can format the entire payload including non-string objects and tags however they need to.
It just reads better sometimes. Think @honda.kind_of? Car and @person.is_a? Administrator, Ruby's all about the aesthetics.
As to why both is_a? and kind_of? exist: I suppose it's part of Ruby's design philosophy. Python would say there should only be one way to do something; Ruby often has synonymous methods so you can use the one that sounds better. It's a matter of preference.
Reactabular has been designed to be extensible. Rather than implementing a lot of functionality in its core, it provides extension points. You can, for instance, customize rendering on cell level. It is possible to implement functionality, such as search, pagination, sorting, and inline editing, through composition.