Should a Programmer Learn to Design?
medium.com
medium.com
It's short and to the point, so it won't take long to read, yet it covers all the basics of design to just the right level for the average developer.
"Design for Hackers" by David Kadavy is also quite popular, but IMO it just takes longer to say the same things.
Amazon links for the lazy:
https://www.amazon.co.uk/Non-Designers-Design-Book-Robin-Wil...
https://www.amazon.com/Non-Designers-Design-Book-4th/dp/0133...
Edit: Since several of the latest comments seem to be saying similar things about programmers not "getting" design, I think one thing that may come as a bit of a revelation is that design starts with a hierarchy of information and there are certain rules for how that information should be presented. There is an artistic aspect to compelling design, but when it comes to things like wireframes and UX modelling, your average programmer probably has more design skills than they realise.
This is probably one of the reasons that Twitter Bootstrap has done so well for people like me.
You ask me to worry about visual recognition, spacing, minimizing number of steps, 80% interfaces, etc and I'll have no issues.
You ask me to come up with a color scheme, tones, gradients, proper fonts, line spacing, negative space, etc and I'll curl up in the fetal position.
It's not about being a master in PS, Sketch or Illustrator. It's more about understanding basic principles of design, colors and composition.
With everybody I mean literally everybody. The CFO who makes his spreadsheet better, properly arranged, using sufficient white space, complementary colors, etc. The CEO who can do proper presentations himself without calling a freelance designer. The CTO who can quickly sketch a neat flow diagram for his backend code.
You don't have to be Jony Ive but some design skills help everyone in communicating better.
All too often, it appears that programmers see design as a lipstick-on-a-pig kind of process, i. e. a replaceable skin that possibly improves the color scheme.
My favorite example is the guy who bragged that he saved xxx kb of page weight by replacing the fonts on nodejs.com (or rubygems? one of these repositories) with Arial, because "all sans-serif fonts are the same anyway".
I'd also point to the frequent complaints about medium.com. It doesn't even matter if that design is any good – it clearly succeeds at what it's supposed to do.
The most obvious path to a better appreciation of the meaning and methods of good design is probably Edward Tufte's books[0], which is one of the "crossover" works that appeal to both designers and the more scientific-minded crowd.
[0] https://www.amazon.com/Visual-Display-Quantitative-Informati...
As a 10+ year UI developer I have found that my work is often judged by its design as much as the quality of the code, and that I will not be successful unless good design is a part of the work, and I cannot always depend on having a solid dedicated designer contributing to the project.
[1] Not implying that interaction and appearance aren't also design, but rather that code and SCSS rules are designed too.
A developer thinks "I need another 5 values from a user, so I'll put another 5 text boxes on end of the form. Done! Wait, this looks like shit, I must not be a good designer."
No! It's shit because you didn't do any design work! It's not that you didn't finish a bad design, it's that you haven't even started any design.
To anyone learning to acquire a new skill, especially one that is very different from the ones you already know, don't get discouraged. The beginning is hard and long. The breadth of the field will feel overwhelming, until you learn the lay of the land. Don't compare yourself against established individuals. Don't ask "why is it so easy for him/her and so hard for me?" Just focus on improvement, only on improvement. Skills are learned, not something innate like "height". That means you can learn them if you are willing to pay the price in humility, effort, and time.
So the answer is yes, we could all use more empathy.
Those same arguments could be used to persuade anyone to learn anything.
For my undergrad degree in engineering (and, to a lesser extent, in grad school) we had to learn to work the user experience process -- interviewing users, figuring out what drives them, how they interact with products, what their needs are, how to run product tests with users, etc. Why? Because we might actually have to do it some day. Not so much with visual design. Visual design courses were offered, but not compulsory.
While learning visual design (or UX, or product design, or whatever) might make you more useful in the workplace, and able to wear more hats, I'm still not convinced it will make you a better _programmer_.
- Entrepreneurship: Design is a lot of understanding human psychology. This helps you communicate in talking, documents, better pitch decks, recruiting effectively
- Senior IC/Techical Leader: You can write more clearly, make great presentations that effectively train others, get buy-in more efficiently from management, be blocked less often by designers.
- Engineering Management: So much people work here. Empathizing, creating effective feedback loops with your reports and peers (design teaches you a ton about the value of feedback loops and how to create them), presentations, effective writing.
- Individual Hyperproductive Programming: You learn to understand yourself as a user better. I found that after becoming a designer, I optimized my editor to create the best possible user experience for me, wrote better tests, etc. Most good programmers implicitly do this, but having the vocabulary for how to think of yourself as a user, collect feedback, understand the visual elements that drive your interaction with your tools is massively helpful.
- Product Management: Docs, slides and the usual. Importantly, leading teams of designers and engineers is much easier if you understand their craft well.
The code skills training as a designer made me much better at was feedback loops, understanding human psychology, visual and auditory cues to trigger certain reactions, hierarchy and organization, and many more. It's totally possible you learn these from different experiences in life, but there's lots of value in these skills for most goals programmers have.
I can create apps that have perfect cohesion between design and logic without specs. I can skip the PSD entirely and develop my layouts and styles iteratively as I code. Whenever there are gaps in design decisions or stylesheet errors, I can smooth them out as I'm building the feature for the first time.
Between the UX and the database models, I know how it should work and how it must work.
If you're solving problems, you're already designing solutions. Now at the moment, (for the programmers among us) when you're solving a problem you may only be considering some subset of the relevant concerns.
Therefore, the very specific question of should you learn visual design can be reduced to: do you want your solutions to consider a larger subset of relevant concerns and be a better approximation of the best possible solution (product, pitch, voodoo doll, etc).
All in all it's been incredibly useful to, at the very least, be able to speak design language when interfacing with the team.
This is quite intuitive if you take it to the logical extreme. If someone wrote a program that jammed all of the characters together into one long continuous block of text, you would immediately get negative feelings about the work, even without reading a single character.
The same holds true even when some care went into the visual design of the code. A codebase that does not present a good visual design will feel difficult to work on, even if it is well written from a technical standpoint.
[0] https://en.wikipedia.org/wiki/No_such_thing_as_a_stupid_ques...
edit: And since both are highly creative activities, it seems reasonable to me that they would reinforce each other somewhat in terms of total mental ability to think deeply about the problem at hand!
In essence, it should be deduced from the end result, for example "the user wants to do X, so what does he need to do it, and what's the most efficient way to present it", similar to how you'd think about designing an API that other developers will use.
For example, learning that web fonts render differently in each browser (so, even if the desktop font looks great in Photoshop, it might not be readable enough in the real application), or the concept of fallback fonts, could be an eye opener for more traditional designers that only deal with static mockups.