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

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
W
WeLiveSecurity
C
Check Point Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
A
Arctic Wolf
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
The Register - Security
The Register - Security
M
MIT News - Artificial intelligence
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tenable Blog
G
GRAHAM CLULEY
O
OpenAI News
S
Schneier on Security
Google Online Security Blog
Google Online Security Blog
Vercel News
Vercel News
宝玉的分享
宝玉的分享
Attack and Defense Labs
Attack and Defense Labs
T
The Blog of Author Tim Ferriss
量子位
aimingoo的专栏
aimingoo的专栏
The Cloudflare Blog
P
Privacy & Cybersecurity Law Blog
S
SegmentFault 最新的问题
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 热门话题
博客园_首页
F
Full Disclosure
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Docker
U
Unit 42
A
About on SuperTechFans
博客园 - 司徒正美
Hacker News - Newest:
Hacker News - Newest: "LLM"
人人都是产品经理
人人都是产品经理
Application and Cybersecurity Blog
Application and Cybersecurity Blog
G
Google Developers Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Scott Helme
Scott Helme
TaoSecurity Blog
TaoSecurity Blog

Secret Weblog

Becoming More Xee: A Modern XPath and XSLT Engine in Rust Looking for new challenges! Repeat Yourself, A Bit The Curious Case of Quentell The Humble For Loop in Rust The Humble For Loop in JavaScript Don Question Best Practices I Was a 1980s Teenage Programmer Part 5: Achieving Assembly I Was a 1980s Teenage Programmer Part 4: The Call of Assembly I Was a 1980s Teenage Programmer Part 3: MSX-2 JavaScript: when you need two ways to do it! Empowering Programming Languages Bloat and Retrofuturism Refreshing my Blog Again Random Rust Impressions Apilar: An Alife System I Was a 1980s Teenage Programmer Part 2: Olivetti M24 I Was a 1980s Teenage Programmer: the Alphatronic SolidJS fits my brain Is premature optimization the root of all evil? Framework Patterns: JavaScript edition Roll Your Own Frameworks Framework Patterns Secret Weblog Highlights Refactoring to Multiple Exit Points mstform: a form library for mobx-state-tree Seven Years: A Very Personal History of the Web Morepath 0.16 released! Is Morepath Fast Yet? Introducing Bob Strongpinion Punctuated Equilibrium in Software Morepath 0.15 released! Impressions of React Europe 2016 Morepath 0.14 released! Morepath 0.13 now with Dectate Dectate: advanced configuration for Python code JavaScript Dependencies Revisited: An Example Project The Incredible Drifting Cyber A Brief History of Reselect The Emerging GraphQL Python stack Thoughts about React Europe Build a better batching UI with Morepath and Jinja2 GraphQL and REST Server Templating in Morepath 0.10 10 reasons to check out the Morepath web framework in 2015 A Review of the Web and how Morepath fits in Morepath 0.9 released! Better REST with Morepath 0.8 Morepath 0.7: new inter-app linking They say something I don Life at the Boundaries: Conversion and Validation BowerStatic 0.4 released! Morepath 0.6 released! Morepath 0.5(.1) and friends released! New HTTP 1.1 RFCs versus WSGI Against On Naming In Open Source My visit to EuroPython 2014 Morepath 0.4.1 released (with Python 3 fixes) Morepath 0.4 and breaking changes Announcing BowerStatic Morepath 0.3 released! Morepath 0.2 Morepath Python 3 support The Call of Python 2.8 Morepath 0.1 released! WebOb and Werkzeug compared Morepath: from Werkzeug to WebOb Racing the Morepath: SQLAlchemy Integration The Centre Cannot Hold Breaking Morepath Changes Morepath Update How to do REST with Morepath Morepath Security the Gravity of Python 2 #python2.8 discussion channel on freenode Alex Gaynor on Python 3 Morepath Documentation Starting to Take Shape Back to the Center Morepath App Reuse Implementing Grok Grok: the Idea Why Linux Works for Me On the Morepath Reg, Now With More Generic! The New Zope as a Web Framework Jim Fulton, Zope Architect Renewing Zope Object Publishing The Weirdness of Zope The Rise of Zope My Exit from Zope Reg: Component Architecture Reimagined JSConf EU 2013 impressions Obviel 1.0! JS Dependency Tools Redux Obviel 1.0rc1 released! Succinct data structures
The Tooling Shift
Martijn Faassen · 2024-05-30 · via Secret Weblog

I'm not a power user

Even though I know a lot of computer stuff, I still wouldn't call myself a power user. I use Linux. I've been using Linux for a very long time, so over the years I have picked up a lot of things. But while I know enough of bash, Make, git, etc to do what I need, I don't know them in depth, even though I'm confident I could learn. I have the impression that some other developers know the ins and outs of various tools.

I used Emacs for a long time; over 15 years. I never became a power user of Emacs either. I used python-mode which provided syntax highlighting and a bit of indentation support. I occasionally used a linter, rarely a debugger, and I wrote once a tool to find unused imports in Python code. I used meld, a tool for visual diffing. But I'd use these tools on the CLI, not integrated in the editor. I recall at one point near the end of my Emacs era I tried to integrate more of such tools into Emacs, but, perhaps due to my lack of skill, Emacs became unstable.

I have dabbled with devops tooling a little when I needed to, but the whole area doesn't interest me all that much. Meanwhile others are slinging docker containers left and right.

Am I overestimating others in being power users, underestimating myself? It's quite possible. But I don't mind knowing only basics of some tools.

It's different for programming languages. When it comes to languages I enjoy and have used a lot, I want to know a lot more.

The IDE Divide

This brings me to The IDE Divide. This is a blog post from 2004 by Oliver Steele. My own blog, pretty ancient, started in 2005. I don't recall when I first read this article, but probably around that time. It's still insightful and it's definitely worth a read.

It portrays the developer world as divided into two camps: language mavens and tool mavens. Whereas a language maven focuses on features of the programming language, and feels empowered by languages that let them do higher-level programming. Tool mavens instead focus on using powerful development tools - the IDE, for instance. They are the power users of such tools.

Oliver describes the various forces that make developers specialize as either a tool maven or a language maven. It's hard to be both.

I was a language maven for a very long time. I used tooling in a minimal fashion. Editors didn't offer much in the first place. When they did offer a feature, I wasn't a power user enough to use it. Dynamically typed languages like Python let me mold the clay and got out of the way.

Interestingly enough, I was an early adopter of language-based package management. This was close enough to the language domain for me to invest in learning the tooling.

But something has shifted over the course of the last 10 years. For myself, I can date a major transition exactly, as I tweeted about it at the time. I've since left Twitter for mastodon, so I'll quote my tweet here. This is from January 27, 2017:

I used atom ide, prettier, mobx, pony orm for the first time for a project today. Feels great. Never even played with pony & prettier before

Now Mobx and Pony ORM are both libraries, so they don't matter in this discussion. But prettier is the first code autoformatter I ever used, for autoformatting JavaScript, and Atom is the first modern programmer's editor I used. I used Atom because I wanted an easier and more reliable way to install extensions. I now use VS Code, which is very similar.

Gone were the Emacs keybindings I knew and I started using ctrl-c, ctrl-v keybindings everywhere. I actually became more of an editor power-user; I learned how to move lines and code blocks, and how to use multiple cursors.

And in the years after that, I found myself using more and more tooling. Editor integrated linters. Static type checking. Autocomplete. Inline documentation. LLM autocomplete (copilot).

I believe I'm not the only one who has experienced this shift.

Why the shift?

What has changed? Is the tooling better or have I changed? I believe that using these tools I can write higher quality code more efficiently, though I can't prove that.

Did I lose something along the way? The core of how I develop hasn't changed dramatically, I think. I build up tests when I write code. When there is a bug, I sprinkle print statements around and think, rather than go for the debugger. I try to be bold about refactoring early and often.

I think I'm more of a tool user because the tooling is better today, and more accessible. It's a lot easier to install an extension into VS Code than it was to install an Emacs extension. Now I know Emacs has an extension package manager, and I even used one for a little while, but for me, then, the barrier to entry was too high.

People expect a lot more from tooling now. A big force in that shift has been the Language Server Protocol, which helped create an ecosystem for tooling. It's easier to create and distribute tools today.

Steele argues in "The IDE Divide" that it's very difficult to be a language maven and tool maven at the same time, because there aren't enough hours in the day to learn both. My modern observation is that if the barrier to access tools becomes a lot lower, it's possible to learn a lot more tooling.

The tooling shift is affecting older languages that did without much tooling for a long time. There has been a big push to add static types to both JavaScript and Python in recent years. One of the main reasons to do so is to improve development tooling, but it does increase the complexity of both languages. And getting all the development tools installed is still a frustrating process of making choices and configuration.

Rust, a relatively new language that came to prominence when the tooling shift was underway, took tooling very seriously early in its existence, and it shows: quality tools are instantly available when you install the language.

So is tooling affecting the design of languages, or is the design of languages affecting the tooling? There's a feedback cycle in both directions.

Another point made in "The IDE Divide" is that tooling requirements make it harder for new languages that don't have much tooling yet to gain a foothold. Now even language mavens like me are becoming more reliant on tools.

The LSP makes tackling the tooling story for a language easier, but it's still an extra hurdle. LLM based autocomplete like copilot adds an additional barrier, as a new language won't have a lot of code to train an LLM against yet either.

On the other hand I believe new language development is in fact flourishing. It's too early to say how the adoption curve of really new languages is affected by the tooling shift.

Conclusion

I think there has been a major shift in how developers use development tools in recent years. People expect a lot more of them. I think having such tools available helps developers. The tooling shift affects the design pressures on both older and newer languages.

Comments

You can use your Mastodon account to reply to this post. Learn how this is implemented here.

Reply to this post

With an account on the Fediverse or Mastodon, you can respond to this post. Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.

Copy and paste this URL into the search field of your favorite Fediverse app or the web interface of your Mastodon server.

Copied! Copy code to clipboard