惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Security Latest
Security Latest
C
Cisco Blogs
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
C
Cyber Attacks, Cyber Crime and Cyber Security
NISL@THU
NISL@THU
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
D
Docker
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
G
Google Developers Blog
Schneier on Security
Schneier on Security
小众软件
小众软件
爱范儿
爱范儿
GbyAI
GbyAI
J
Java Code Geeks
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
B
Blog RSS Feed
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Y
Y Combinator Blog
S
Schneier on Security
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
F
Fortinet All Blogs
M
MIT News - Artificial intelligence
PCI Perspectives
PCI Perspectives
V
V2EX
V2EX - 技术
V2EX - 技术
O
OpenAI News
W
WeLiveSecurity

Kent C. Dodds Blog

Implementing Hybrid Semantic + Lexical Search Simplifying Containers with Cloudflare Sandboxes Migrating to Workspaces and Nx Offloading FFmpeg with Cloudflare Building Semantic Search on my Content Helping YOU ask ME questions with AI How I used Cursor to Migrate Frameworks The Dow's Start on the Covenant Path 2025 in Review The next chapter: EpicAI.pro AI is taking your job How I increased my visibility Launching Epic Web 2023 in Review Stop Being a Junior RSC with Dan Abramov and Joe Savona Live Stream Fixing a Memory Leak in a Production Node.js App 2022 in Review My Car Accident I Migrated from a Postgres Cluster to Distributed SQLite with LiteFS I'm building EpicWeb.dev A review of my time at Remix Remix: The Yang to React's Yin How I help you build better websites Why I Love Remix The State Initializer Pattern How to React ⚛️ Get a catch block error message with TypeScript Building an awesome image loading experience How Remix makes CSS clashes predictable Introducing the new kentcdodds.com How I built a modern website in 2021 How to use React Context effectively Static vs Unit vs Integration vs E2E Testing for Frontend Apps The Testing Trophy and Testing Classifications Array reduce vs chaining vs for loop Don't Solve Problems, Eliminate Them Super Simple Start to Remix Super Simple Start to ESModules in Node.js JavaScript Pass By Value Function Parameters How to write a Constrained Identity Function (CIF) in TypeScript How to optimize your context value How to write a React Component in TypeScript TypeScript Function Syntaxes Listify a JavaScript Array Build vs Buy: Component Libraries edition Using fetch with TypeScript Wrapping React.useState with TypeScript Define function overload types with TypeScript 2020 in Review Business and Engineering alignment Hi, thanks for reaching out to me 👋 useEffect vs useLayoutEffect Super simple start to Firebase functions Super simple start to Netlify functions Super Simple Start to css variables Favor Progress Over Pride in Open Source Testing Implementation Details How getting into Open Source has been awesome for me useState lazy initialization and function updates Use ternaries rather than && in JSX Application State Management with React Use react-error-boundary to handle errors in React JavaScript to Know for React How I structure Express apps What open source project should I contribute to? When I follow TDD AHA Programming 💡 How I Record Educational Videos Should I write a test or fix a bug? Stop mocking fetch Intentional Career Building Improve test error messages of your abstractions Tracing user interactions with React Eliminate an entire category of bugs with a few simple tools Common mistakes with React Testing Library Super Simple Start to React Stop using client-side route redirects The State Reducer Pattern with React Hooks Function forms Replace axios with a simple custom fetch wrapper How to test custom React hooks React Production Performance Monitoring Should I useState or useReducer? Stop using isLoading booleans Make Your Test Fail Make your own DevTools An Argument for Automation Fix the "not wrapped in act(...)" warning Super Simple Start to ESModules in the Browser Implementing a simple state machine library in JavaScript 2010s Decade in Review Why I avoid nesting closures Don't call a React function component Why your team needs TestingJavaScript.com Inversion of Control Understanding React's key prop How to Enable React Concurrent Mode How to add testing to an existing project Profile a React App for Performance
Why users care about how you write code
2019-12-23 · via Kent C. Dodds Blog

Back in October of 2011 Ryan Dahl wrote a blogpost entitled "I hate almost all software" in which he asserts:

The only thing that matters in software is the experience of the user.

I totally agree with this statement, but I believe that it has broader implications than Ryan's suggesting.

At a previous employer, I was asked to add a single checkbox and label to the contents of a popover. When asked how long this would take, I considered that the logic for that part of the app was in a Backbone view that was over 1,000 lines long and it extended another Backbone view that was over 2,000 lines long. I estimated it would take a week, and the PM was horrified. What's worse is it actually took closer to three weeks. 😱

Why did it take so long? The code was unmaintainable. I was able to add the checkbox easily enough, but getting the data from the checkbox to update the model was a nightmare. If that wasn't enough, the number of bugs I introduced with my hacky example was frightening because (of course) those files had leaky abstractions all over the place and absolutely no tests.

Now, consider if the component had been built with SOLID programming principles (DRY, SRP, etc. etc.). I probably could have finished that feature in a day or less.

So did the way the app code was written impact the end user? You betcha. Did the user care that they had to wait weeks rather than days for the new feature? Yeah, they totally cared.


So yes, it's true. The only thing that matters in software is the experience of the user. We created computers to improve our lives, and if the software we're using doesn't do that then it's failed.

The experience of the user is indirectly, but strongly coupled to how we build software

So the big question: Does it matter to the user that we're using the latest JS framework, build tool, const vs. let, semicolons, tabs, a git merging strategy, or a specific deployment service? Of course not!

Our measure of success should be how well we deliver what the user wants (and no more). Our choice of tools should be based on that fundamental goal.

At the same time, the latest tech and a good UX are not mutually exclusive. The latest and greatest technology can be a great way to accomplish this goal.

So why does this matter?

We waste time endlessly debating minutiae that has little impact — whether we should use semicolons in our JavaScript (no), or how many spaces to use for indentation (two), but we should instead focus on the tech choices that make a significant impact: solid design patterns, linting (only good rules please), testing, continuous integration, delivery, and deployment. These choices are the basis for an app that delivers a quality user experience. A great app is never truly finished. Requirements change, and our choices as developers determine how easily and quickly we are able to deliver new features, while keeping the product as polished as possible.

Optimize for change.

So yes, our users don't really care how we build our application, or what abstractions we use in doing so. Remember that we use JavaScript and the web because, with them, we can deliver an awesome experience to the user who doesn't want to download, install, and regularly update our app. If we found another solution to accomplish that better, we'd all jump ship.

User Experience includes a lot more than just base functionality. How your application is written, built, and deployed can make a big difference.

The real takeaway for you here is that you should be intentional about what you spend your time arguing about. Behind every opinion you hold firm, make sure your opinion is founded upon what's best for the people using your software. If it's not (or if that connection is tenuous), it may not be worthwhile arguing about.

I'll just add this because I have to: Delete eslint-config-react and eslint-config-airbnb and use eslint-config-react-app instead. Also... Use prettier...


Big thanks to the people who helped review and edit this post, especially Kyle Robinson for basically being the article's editor.