The best designers I’ve worked with not only understand their own domain but the possibilities and limitations of how it will be executed, because they are also developers.
That said, HTML & CSS is just how the world currently is. It doesn't mean that it is the best possible way to do it. CSS could've been very different if not for many fortuitous events in history: https://eager.io/blog/the-languages-which-almost-were-css/
The best possible way to represent user interfaces is to represent them visually. Having to learn code to build UI is just today's limitation. While many have tried and failed to do better, this is still an open question.
Today maybe a designer must understand HTML & CSS to fully embrace the medium. But that means they have to get out of their visual thinking mode, and look at letters on a screen and interpret them in their mind's eye. As programmers we're used to it, but it doesn't mean it is the best nor the only way to do it.
So I'm all for articles like this that questions the status quo instead of accepting defeat and asking people to just get on with the program.
Uh huh. And how many years did it take to actually get Flexbox and CSS Grid? I mean...They're both still "Candidate Recommendations" in 2019. That's not even the penultimate level of recommendation. You definitely can't use Grid if you want broad compatibility; it was only first implemented in 2017. "People should update their software to the latest versions! And they should switch browsers to use one that supports my nonstandard features!" Oh, yes? Well they don't. And let's not even talk about Grid Level 2 which is implemented nowhere. We've gone through generations of faking markup with javascript because the dogma behind CSS has always been a terrible mess. "No tables for layout!" Ok, what else are you supposed to use to arrange things in grids? "Uhhh....give us a couple decades to get back to you on that."
When people say that CSS is terrible, they mean the actual standard parts, and they mean for the past 22 years.
How about Cassowary, with size classes?
I spend half my programming time working on Mac software and half on web software, and I find element layout in the former is infinitely more pleasant. No need to put elements in a specific place in the document structure to lay them out the way I want. No need to change how I'm working for vertical versus horizontal layout. Just pick the dimension/coordinate you want to set, pick the other dimension/coordinate you want it to maintain its proportion to, and you're done.
Apple's implementation got a bad rap, I believe, because the first version of Xcode didn't support it well, the first version of the API was a terrible fit for Swift (which came a couple years after it), and pre-Sierra macOS had a lot of bugs in the implementation. Today, there's no layout system I'd rather use.
CSS was not fit for purpose until relatively recently, and is still pretty limited and broken. It’s telling that you mention features of CSS which were only recently usable.
Problems with CSS - lack of a proper grid till recently, lack of variables, byzantine box model rules, a profusion of units (px,em,en,%), lack of simple computed widths etc.
All these are fixable/being fixed but I would not be sorry if the whole mess was thrown out and a more considered styling language introduced.
What version of CSS do people complain about? By chance are you talking about bleeding edge unaccepted CSS proposals?
In any case, the list of CSS improvements is long. Off the top of my head:
* Remove min-height, max-height, vertical-align, text-align, etc. in favor of unified Flex model.
* Rename color to font-color.
* Default to box-sizing (or remove content-sizing)
* Make <fieldset> stylable by CSS.
* Make inline styles work with pseudo-selectors, or remove inline styles altogether
* Reduce the number of units
CSS does a lot of things really well, but makes some common tasks way more difficult than they need to be.
Short answer: layout and styling in one DSL with one syntax/grammar and not you know, two. But the problem isn't "how do I make something that's better" but "how do I make something that's better and supported on my target platforms."
If browser engine support isn't a design concern there are plenty of alternatives, many of which are arguably superior to HTML + CSS.
How do mac devs do this? Mac apps are some of the best around and both designers and developers appear to really like designing and developing mac apps.
Easy, something like Winforms or one of its successors like whatever they make Win10 apps in. Even the new Unity3D UI stuff is better.
They're just going to make more work for the real developers who have to constantly fill in the lack of understanding about how the back-end works.
It isn't a limitation. It's a prerequisite. You wouldn't want a bus driver who's never driven a car before.
And if design systems ever evolve to the point where you can just click/drag some buttons to design a UI then that's the day the value of that profession should rightfully drop to zero. Lowering the bar that low only leads to vulnerabilities by blurring the lines between amateur and professional. Honestly the design crowd gets too much credit as it is.
Look at manual machinists. They have legitimate skills that only come with experience. They demand righteous salaries for those skills. BUT CNC machines have all but destroyed the need to employ manual machinists so instead you spend more on your machine up-front but you save forever because you can literally teach anybody with a pulse how to run it. The result is you have countless experienced and skilled machinists who are unemployable in today's market and a bunch of cheap amateurs churning out barely conforming products for $10/hour.
I can comment on this from my experience. I studied Computer Science, and my passion for UI development led me to switch to product design after being coding for more than 10 years. I design with code too, and I did many prototypes using different UI frameworks.
But, there are different design activities, and sadly not a single tool is adequate for all.
If you are making decisions about UI layout, visuals, or UI motion working with code may slow you down. Even if you use CSS grids and flex, there is a penalty caused by the lack of direct manipulation and the freedom to try multiple ideas quickly.
To me, the author just wants better refactoring and maintenance tools over the existing visual design tools. It's a little bit disappointing that design tools evolved in many areas, but did a regression in others. For example, more or less in 2008, Microsoft did a tool called Expression Blend. The tool, based on ideas from Bill Buxton, had the goal to maintain a continuity between mocks and the final implementation. You were able to import PSD layers and later convert them to components, or to sketch the UI flow in the tool. I never used it for anything more than simple experiments, but the idea had potential. Even Adobe did a similar project that never saw the light (it was called Adobe Thermo, then Catalyst and it died with Flex).
That’s the interesting thing about being a coder who designs, the tooling on both sides always lets you down at least a little. Having that wider context is worth the disappointment, I think.
One of the fundamentals of art school is learning how to work with the characteristics of your medium.
The best coders I've ever worked with understood the hardware
The hardware engineers I've ever worked with understood the physics
The physicists I've ever worked for understood the math...
At some point you just gotta say "I need better tools"
In general a broad perspective is beneficial to a designer because they deal with the holistic reality and need to apply it to a somewhat fuzzy solution.
To compete with others thats more than enough and tools have very little to do with it.
Nothing in this article conflicts with the idea that a UX designer knowing how to implement their designs in code would be a benefit.
I don't see a problem with the author (and others like myself) wanting the tools to be more capable.
Have you developed a design system? Do you understand the context of this domain? I don't ask this to be rude, but the issues that the author mention are some of the key problems with the state of being able to maintain design systems.
It's more about the ability to efficiently generate and document the design intent and iterate on the design. This then needs communicated to the full team, whether that's stakeholders or the team implementing the design.
I think the authors suggestions are very good and valid.
I've noticed this as well. The best designer I ever worked with was obviously great at design, but also great at css, she rocked! I've seen this more than once, but would estimate less than 10% of designers I've worked with actually took the time to learn css.
I think more designers should learn css, and more engineers should learn at least some basics of design. Then everyone could communicate better and get more done faster.
However, in my 12 years of experience in game development, many people who are world-class designers and artists don't have the same mental model as developers. There are a lot of "technical art" issues that in the end, you'd rather handle on a developer's side. I just don't think that a person who spends his time thinking about character's emotion, colour balance, human anatomy and other art-related issues is in the same mind space to think about technical issues like which UI containers should be scaled on what rules (full-screen or safe area? hugging the screen outside or inside?) for different screen sizes, how things should be composed from layers and animated, how assets can be converted from a static image to a resizable one, how a giant image can be cut into a 9-slice (or in a more complicated way) to save texture budget, how can we reuse already existing assets without importing another image that is very, very similar, how different kind of gradients behave with not-pixel-perfect scaling and crunch compression (and I didn't even go into 3d!). I tried empowering designers and artists so they would make these decisions, but they hated it and were miserable - so in the end I'd rather get a static, single-sized PSD and do all that work myself.
All of this, of course, are just my 2 cents from a specific industry and with a very specific kind of people in mind - I'm not trying to impose these views on any designers and artists who want to get into the technical art side and would be thrilled to see more and more individuals who can be productive and happy in this kind of hybrid role. But as a matter of fact, these people are very, very rare and we shouldn't expect most artists to be like that.
So modern tools like sketch work for grids, mobile responsive, yada yada which is much better than using photoshop as the design sits closer to the canvas it will be rendered on. As a developer, yay that works great for me! And also it's a huge middle finger to those designers who just built stupid impossible pointless UIs in the 90s and 2000s.
But it's also very constraining for the designer, especially given how far standards have come, and it's almost a given that someone is going to come along and Bauhaus the shit out of UI.
I really enjoyed the challenge of implementing a truly creative design on the web, but there has been a general convergence towards a convenient middle point where the designs are constrained by development requirements, at least in the way the tools are geared.
That's not to say a great artist can't create something amazing but if we have to teach all our creatives that they must conform to this particular way of thinking, then we're cutting the industry short in a bad way I think.
I guess the next thing will be a sass or js library called bauhaus.js. Or is that just DOM + CSS?
I nearly fell out of my chair of laughter when I read that.
Out of curiosity, do you mean this in a positive or a negative way?
That separation of responsibilities is always a tough line to define in reality, and I do agree that the tools used by whomever is assuming that role should become more like developer tools.
The web is my medium and how can I effectively design for the entire experience (not just how it looks) if I don't understand how the web fundamentally works?
I try to put as much power in the hands of the UI artist; if they have full control and an accurate preview (or better yet, WYSIWYG) then they can iterate on the screens without my involvement, and turn in something beautiful that I just need to connect to the actions / data sources.
> a person who spends his time thinking about character's emotion, colour balance, human anatomy and other art-related issues Non Sequitur. Those are character artist concerns, not UI/UX artist concerns.
We will soon add the feature to expose your design system as an NPM package so that developers can install the system into their project and the component creation can be the domain of the designer with the application structure/creation being the domain of the developer.
This is a problem that can be solved but it can’t be half-baked solutions. It has to allow designers to fully create all states of a component and even work on components with live data flowing through.
We are in closed beta but you can view videos of how Shift works here: https://www.youtube.com/playlist?list=PLl4_DbGKML_Jb2Wq5pEGW...
Sure, things could be improved, but I love that we have Sketch and Figma now.
We're no longer in the dark ages of waiting 5+ years for Adobe to implement some basic feature (like being able to round corners on a rectangle). Well, I guess if you're for some reason using xD you're still waiting a comically long amount of time between significant releases, but that's your own fault.
Maybe it isn't even more features, but rather a completely different tool. This could be a market opportunity.
> Design libraries are also limited in the type of things they share: just components or symbols. This works great if all your design work is just clicking together new screens with the same components, but anything new will see designers clicking into components and copying over things like colors, font variants and checking spacing just to copy that over into new components. When you copy over things, you’ll invariably make mistakes (we’re just human after all).
Ideally, a component system means you’re black boxing some function.
Unfortunately every component system I’ve ever seen has a hard boundary at some “material” transition:
A UI drawing that can be used inside a design program
A React component is bounded at the DOM and can’t handle server side concerns
A CSS component is bounded at styles and can’t handle HTML concerns
A middleware component that handles authentication, but can't reach outside the routing phase.
etc
Inevitably then, you end up having two or more tightly coupled components:
A front end component + the server API that it knows how to talk to
A little HTML widget + a microservice that it feeds with it’s own persistence
A container for wrapped content + a little middleware meant to be added to the app that serves the content
A button + a delayed job + an email template to get sent when it's done
etc
In order to do this, instead of just having one module with a tight set of concerns inside it, you have to implement some of your concerns in two places, and you also have to map data into the component interface, and then back out again. In some cases this can be 4x the complexity ("code" vs. "code + write to component interface + decode component interface + variant of code on other side of interface").
If the component could span both domains, it could just move the data exactly where it needed to go, as efficiently as possible, since the data is all internal to the component.
The conclusion I’ve come to is something like "components want to be free."
I.e. components want to have concerns that can span the entire stack, and implement procedures in arbitrarily disparate kinds of source locations.
This of course precludes ALL of the component systems which are confined to a specific material domain. It means the boundary of a component has to look something like arbitrary source code. Component interfaces can’t conform to a single template.
That raises the question “what is a component at all?” If the boundary of my component is just a set of function calls, it’s just a module. How is it a component?
And maybe it’s not. Maybe components are a local maximum in code cleanup, and I’m advocating people move past them and just write really excellent single-concern modules instead.
I don’t know. This is as far as I’ve thought it through.
(I do maintain an NPM module called browser-bridge that lets me build arbitrary client/server components, along an event sourcing library called a-wild-universe-appeared for doing persistence in an isomorohic way, and then something called bridge-module for getting dependencies in the browser... All of which let me experiment with what I'm describing, but those are all in a pre-1.0 mostly beta state. The basic interfaces are all stable though.)
Not quite the same thing as you describe, but it's exploring a similar part of the design space:
Does anyone have suggestions for cross-platform UI's? (Not Electron)
This is exactly what still gets me going after nearly 10 years working on design tools (I co-founded UXPin back in 2010). I'm so glad that more people in the industry notice it!
Majority of the popular design tools (Sketch, Figma, InVision Studio, XD...) work in a 30 year old paradigm of image based–design tooling (originally created for early vector and raster "creative" tools that were never meant to be used to design software interfaces!). In this paradigm the output of a design tool is an illustration of the final product that has no relation to the reality of code. The rendering is different, the interactions are just slide-based simulations, the ability to describe states is nonexistent. To get more down to earth - those tools can't even render a simple text field or a checkbox!
And yes – they're getting better and better, but ultimately getting around the limitations of their paradigm is impossible. At the end of the day those tools are perfect for drawing icons and illustrations, but really bad at creating, for example, a working prototype of a form field with validation.
That's why a bunch of design tooling rebels (UXPin, Framer X, Modulz, Interplay, Shift...) started to work on code–based design tools. In this paradigm the output of a design tool is rendered from html/css/js code, but designers don't necessarily need to know how to code. Majority of UXPin users don't even know that they're prototyping interfaces with advanced JavaScript :).
Within code–based paradigm the limitations of image–based tools do not exists.
In reference to the article here are some features present in UXPin (and some others just to illustrate my point): - states of elements (every element can have multiple states and variants, originally we've built it in 2013. The new version was launched last year). - conditional interactions - javascript expression (from advanced math, regular expressions to operations on strings - in UXPin designers can build really advanced prototypes) - context awareness (prototype can be aware of the os/browser that is used for previewing or e.g. the size of the screen and conditionally render the right state of elements) - accessibility linters - import and synchronization of production React.js code (in beta, we're calling it UXPin Merge) - access to external APIs (you can, for example, build prototypes that can interact with smart devices)
None of that is possible in the old paradigm! Of course the giants of the design industry don't want you to know it, so they invest tens of millions of dollars into flashy marketing:)
Some things that Kilian mentioned are still missing, but we (and others!) are working on them.
Hope this is providing some context to the state of the design tooling industry.
Ps. Fun fact - Figma branded themselves as the first design tool with real time collaboration. We have it since 2011 and... it was also called multiplayer design :)