不要自称是手工艺型程序员。
Don't call yourself an artisanal programmer

原始链接: https://purplesyringa.moe/blog/dont-call-yourself-an-artisanal-programmer/

作者批评了软件开发中术语定义的变化:那些亲手写代码、重视可靠性和深厚技术理解的人,现在被贴上了“工匠式编程(artisanal coders)”的标签;而那些依赖大语言模型(LLM)的人(即“氛围编程,vibecoding”)却自诩为“软件工程师”。 作者认为,这种重新定义是一种反智主义,它贬低了真正的工程学所必需的严谨性、精确性和教育背景。通过将使用大语言模型定位为行业中唯一“理智”的标准,这种话语体系将一丝不苟、脱离人工智能的开发方式边缘化,使其被视为一种休闲爱好,而非专业的学科。 为了反击这种趋势,作者呼吁改变话语逻辑。他们提议摒弃“工匠式”等词汇,转而使用“人工智能辅助编程”与“无人工智能的软件工程”进行区分。此举旨在重新定义工程学,强调人类在软件开发中投入的心力与设计价值,并挑战那种认为人工智能生成的代码必然优越或不可避免的假设。最终,作者敦促开发者在公共讨论中弘扬以人为本的工艺和技术深度,确保深思熟虑的手工工程实践能够被认可为一种至关重要的专业范式。

Hacker News 上关于《别称自己为“手工匠人程序员”》一文的讨论,引发了关于职业认同感与软件工艺的争论。 参与者对该术语给出了截然不同的定义: * **工艺与工程的对立:** 一些用户认为,“匠人”是那些优先考虑质量和耐用性的人,而“工程师”则专注于生产力和可扩展性。另一些人则认为,将可靠、高质量的工作贴上“手工”的标签是有问题的,因为它将标准的工程要求简化成了个人品味或审美偏好的问题。 * **软件的本质:** 讨论者将编程与木工等行业进行比较,指出“美”的软件既可以指代码本身优雅的结构,也可以指最终产品实际的有效性。 * **范围与策略:** 讨论还涉及了“跳出细节”的重要性。一些开发者发现,在系统架构层面进行工作比单纯关注细枝末节的代码质量能带来更多的成就感与效率。 最终,这种共识反映了软件开发在“严谨的工程学科”与“需要审美判断的工艺”这两者之间存在的张力。
相关文章

原文

So I’ve been meaning to write about something, but got sucked into this rabbit hole, and now I’m kinda scared if I’ve been a subject of propaganda that worked on me.

A common theme in software development AI discourse is that there are “serious” engineers who value the end result the most, and “artisanal” coders who value the experience of coding over the final product. This dichotomy doesn’t correctly describe me and likely many others, but let’s play along with it for now.

I want my programs to be reliable. Patience and care are two important ingredients for this. When designing programs from ground up and taking my time, I just know that they’re correct, and that any mistake is due to a typo. Unit tests, LLM reviews, and provers can guarantee the code is 99% right, but not that it’s 100% right: optimal, maintainable, readable, and that it doesn’t rely or break due to undocumented incompliant behaviors. I want that 100%. I can only begin to achieve this with deep connection to code, so I refuse to use LLMs, since they isolate me from the low-level details that matter and cannot guarantee correctness by construction.

Contrast

Which is where the dichotomy falls apart in my eyes. By the book, I’m an artisanal coder, since I don’t use LLMs. But if the industry calls the opposite of “artisanal programmer” a “software engineer”, isn’t there a subtext that I’m not an engineer? This may seem like a minor point, but it matters on a subconcious level. Care, attention, and precision are the defining characteristic of engineering – so why is this term appropriated by people who are becoming closer and closer to managers?

Back in my day (ahem), developers hated management that wouldn’t allocate time to dealing with tech debt, and the “move fast and break things” attitude was considered childish. Nowadays, common knowledge among developers says that vibecoding (I’m using the term loosely) is the norm, and wasting time on reliability work is unserious. Who is in the right?

Redefining terms

To me the answer seems obvious: you can’t earn the title of Software Engineer by building stuff blindly. An engineer should know what they’re doing. But let’s ask someone more knowledgeable about this topic.

In 2021, Hillel Wayne ran the crossover project, where he interviewed multiple people moving to software engineering from other engineering fields. His goal was to answer the question: do people with actual experience in both fields consider our job engineering? The answer was “yes”, but here’s the part that interests me more:

That said, many of the crossovers also added an additional qualification: software engineering is real engineering, but a lot of people who write software aren’t doing software engineering. This is not a problem with them, rather a problem with our field: we don’t have a rich enough vocabulary to talk about what these developers do. Not everybody who works with electricity is going to be an electrical engineer; many will be electricians. And this is okay. […] But we use things like “programmer”, “software engineer”, and “software developer” interchangeably. What is the difference between a software engineer and a software developer? Some people propose the word “software craftsman”.

What jumps out to me is that the titles Wayne uses are completely opposite to the ones popular nowadays. He calls the people who care, and who today we call artisanal coders, “engineers”, and on the opposite side, he calls those who we label vibecoders “craftsmen”. At least to me, this is more intuitive naming! There is arguably more art in prompt engineering than writing code by hand.

“Artisanal” made sense as the antonym of “vibecoded” historically, but claiming this term freed up “engineer” and effectively gave up the debate on whether vibecoding is a form of engineering. Vibecoding became the obvious default, and artisanal coding the outlier. How did we get here?

Talking points

If you look for this change in “common sense”, you’ll find it everywhere. The “only” “correct” approach changed radically. Why did we use to consider PVS-Studio posts promotional material, but now we worship automated review tools? How did we jump from strong type systems to free-form specifications so quickly?

Nothing like this has happened before in the programming community. Sure, there were arguments about which type system or web framework is better, and the common opinion changed over time, but this is different. A devoted believer in strong type systems would consider a PHP developer an idiot, but still a developer. Even a caricature Rust zealot was still a Rust programmer. And the arguments were based on whether one option is more reliable, easier to use or learn than the other, not whether you should worry about reliability or misuse at all.

This is different – vibecoding is portrayed not as a better solution, but as the only sane solution, spitting in the face of past experience. Someone who doesn’t use LLMs is not a software engineer, they’re an artisanal coder. It’s an attack on an identity.

History

Redefining terms and portraying yourself as the sane side and others as beings not worthy of consideration is a new tactic in the software world. I’ve seen it before, though: it’s very much part of the fascist playbook.

I remember the time when we were all joking “the antonym of vibecoder is software engineer”, and then like a month passed and suddenly everyone was comfortable calling themselves artisanal programmers and leaving “software engineer” to “responsible” AI users. The term propagated with the speed of memes, seemingly without any natural reason.

I don’t believe this is a psyop, but I do think we should be more mindful about what we call ourselves, because words have power. Real composers call themselves composers, not artisan composers; AI writers have to call themselves AI writers; but the term “programmer” has not been debated, and this has real-world consequences.

Many gamers who defend artists and hate AI with a passion turn 180 once you mention software: suddenly LLM code is acceptable, and obviously everyone uses LLMs anyway, and AI disclaimers for code are unnecessary. They are not experts, so rhetoric matters more than facts. And most of us suck at rhetorics!

Why us?

We should’ve learned this lesson earlier, and I think I know at least one factor that caused us to lose this battle first among all professions. Before I wrote this post, I wondered why “artisanal” programming that requires education, hard work, and complex thinking to perform is considered a game, while spewing ideas into a textarea using methods spread by word of mouth is considered the real thing.

Now I’m thinking it’s due to rampant anti-intellectualism in software communities.

Before Rust was popular and everyone knew it has its uses, what was the most common counterargument against it? That it’s like raw math and unusable for practical purposes. The same thing is still said about Haskell, especially about monads, which Rust demonstrated can be easily understood (Result, Option, and Future are monads!). Hell, even pointers are considered complicated, because, oh no, you have to learn something before using them! We yearn for easy solutions, but what we actually mean by that is that we refuse to read and just want to copy-paste code from StackOverflow, oh, wait, wrong decade, Claude. We look at professions that have to study in college to work and say “actually, we’re better than them and deserve to dictate how the world runs”. If that’s not anti-intellectualism, I don’t know what is.

So of course we negate the benefits of education, and hard work, and thinking, and taking our time – those things are woke and we’re better than that. /s

Now what?

We need to put up a better fight. The goal is not to flip the script and say avoiding AI is the only correct way to write software, because that won’t work; the goal is to make sure AI-free coding keeps its place in public discussions and is not equated to recreational programming.

Terminology-wise, I’ll use “AI-assisted coding” whenever AI is used and “AI-free software engineering” when doing stuff by hand. It keeps the AI usage notice, but flips the programming vs engineering half and drops the word “artisanal” that can be interpreted as a form of play. I think it’s a good start, but ideas are welcome.

More generally, we need to challenge the assumption that AI-assisted programming is the only sane way to write code. The public understands that using AI-generated art for any purpose is icky; we need to convince it the same principle applies to AI-generated code. If a person witnessing AI “art” can feel lied to without knowing how to draw, there is no reason why this won’t work for programs.

We need to talk about the care we put into software development, how we design code, the problems we’re facing, and how beautiful the way we collaborate is. We should highlight that glitchful speedrunning is entertaining because we can see the glitches arise from understandable human mistakes, and how cool computer art is, and how heart-warming it is when a developer polishes their app to improve user experience. We need to, and I understand this is not our forte, talk about our humanity.

Keep safe in these trying times.

联系我们 contact @ memedata.com