这是一个老程序员的自述。转载于 https://hackernoon.com/ 如果你对英语不熟悉,可以翻到末尾看站长和管理员“葫芦娃”共同撰写的中文摘要!

I don’t even recognize it anymore

Style

I began writing this in the third person as an objective description of the changes I’ve witnessed in my three decades of writing software, and I got bored just proofreading it. I’m instead writing something of a personal odyssey, my own experience, a framing that adds a little texture and leads to how bizarre and wrong I find today’s world of software development.

To Younger Developers

Many too young to have ever seen the halcyon days of software development will not understand my reminiscences of the formerly sane environment we worked in, how vital it was that we were allowed to work uninterrupted almost all the time. Just as my teenage students in Vietnam have barely heard of the Beatles and have no idea why we regard them as so important in music, you in your 20s and 30s have never seen a software office where you were not in constant communication and never able to focus on your work for very long. You cannot possibly know what it was like. You should try to find out.This is my advocacy; this is the awareness I want to bring back. I don’t care about Agile or Scrum or Extreme Programming, these are silly fads and since they interfere with concentration they cannot help. It is no exaggeration to note that Microsoft’s early greatness was the direct result of a corporate culture built around enabling unbroken concentration and the disappearance of that greatness is directly attributable to abandonment of that awareness.I have a reference to my short article just below but if you would like a scholarly explanation with the results of research you should read this:

Early Days

I started getting paid to write software in 1988. I was at Microsoft a year later and saw the last year of single-occupancy offices and minimal interruptions. It was great back then; we were treated like princes and we got more work done than anyone before or since. The company built a culture around recognition of Flow, enabling entering and maintaining that condition because that was how we did out best work.The Magnificence of FlowThe IPO had been shortly before I arrived but the real change came with the release of Windows 3.0 in May 1990. The environment changed overnight; suddenly I shared an office with a smoker with bad BO who talked loudly on the phone all day. We started having more meetings.I worked at Microsoft almost exactly half of 1989–2009 as both an FTE and a CSG and each time it was worse, culminating with the Windows Vista (Longhorn) project.The Fall From GreatnessYou’ve never seen people more exhausted or stressed, we were almost serfs. We worked 70 or more hours a week and we were lucky to get 4–6 hours of actual work done in that time; all the rest was wrestling with the checkin system, with its unfinished and barely-working quality gates as obstacles.By 2009 things were in disarray; the love of quality had completely given way to a mechanical process of checking boxes and several times I landed in hot water for being too thorough. That never would have happened in 1989; rigor was the highest virtue. My threat model for Windows Media Player DRM was 20 pages of vulnerabilities and mitigations; they wanted a page or two since every vulnerability had to be reviewed and answered.Excellence was gone, dead and buried. When my manager told me in late 2008 to write doggerel code outside my application so they could run unit tests on that (and check the “has unit tests” box for the project) I started looking for an exit; when he told me about a new thing called “Test-Driven Development” I decided to update my CV and plan to get out of there. It’s a pity I didn’t do that right away, worse was to follow. When they had me do pair programming I resigned my contract in anger the next day.

Ten Years Ago: Agile

I took a job at Real Networks in downtown Seattle; driving is a big problem in Seattle, there are a lot of people whose mission in life is keeping other drivers well under the speed limit. But since I left at 9:30, after rush hour, my commute was 30 minutes and wasn’t so bad.Then the group I was contracting in took up a new thing called “agile.” All this meant to me was that I had to attend a “morning standup,” an 8:30 meeting requiring me to get to work 90 minutes earlier. This meant I had to drive in rush hour traffic, turning my 30 minute commute to a 90 minute slog, arriving barely in time and in a weary foul mood. I asked if it could be scheduled later. No, don’t you know it’s a morning standup? (We didn’t stand up).This meeting was supremely ridiculous, going through the motions. We would go around the room, each developer intoning that he was working on the same thing he’d been working on yesterday, or, occasionally, working on something new with nothing yet to report.The PMs were worse, putting on a perky, chirpy and cheerful show of sounding “engaged,” when in reality I knew they spent most of their day playing games on Facebook. I’d heard the word “stories” a few times before I realized it wasn’t a reference to one of the games we sold. Excuse me, what do you mean by “stories?”It turned out to be a new name for what we had heretofore called user scenarios, usage cases, you know, actual descriptive terms. The more I learned about agile the more renaming and rebranding I ran into and so far I still haven’t seen much added value. More meetings, though.I protested “stories.” It felt infantilizing, like Safeway cashiers forced to wear silly costumes to promote some sale or acknowledge some holiday. As with the meeting time, I was frostily told that “stories” was part of agile and that we were going to follow the script to the letter. And, no, even though the “scrum” was nothing more than a status update we couldn’t do it in email as I had done for the last 20 years.For this I spent an extra (unpaid) hour driving to work. O Brave New World.

Working Independently

Twice in 2010 I came out to Vietnam to see my new house, first under construction and then living in it for three weeks. My contract at Real had been extended even though half the company was laid off while I was there but it finally ran out, ending most pleasant job I’d had in a long time. I got along with everyone, I had some major achievements, the only jerk there was someone I didn’t work with and who went in one of the layoffs.

The writer’s house in VietnamI had planned to move around 2019 when I reached retirement age. But the thought of going through dreary whiteboard interviews and a series of high-stress jobs (talking about “stories”) made me sick and I had so enjoyed living in my beautiful new house that I decided to pack up and go, and left the USA on 11/15/2010, intending to retire at 56, play my guitars, read my physics library, live my life in very strange language and relax.I did learn to speak Vietnamese; otherwise I was bored out of my mind. I wasn’t meant for idleness. I didn’t do squat.A friend suggested learning to write for the iPhone and iPad; the tools were free, and I missed programming. I bought a MacBook, learned iOS, Objective C, and XCode and soon had an app for sale. I was back in the game.From 2011 to 2016 I wrote iOS and MacOS applications, first for myself and then for clients. It was okay but I wanted more money so I started going through freelancing agencies. In 2017 I got a job doing servers for a company in California; I learned C#, Entity Framework, ASP.NET and when the friend who had recommended me drifted away from the job I took over servers and database. This lasted 30 months. It was a great gig and got me some current skills. I love servers and databases.All this time I was working solo. I was part of a team but the divisions were very high; a browser developer in Sydney and me in Vietnam. We had to collaborate on the REST API but we both worked independently.

The Perplexing Present

When that ended last August I figured finding more remote work would be easy, that my independence and readiness to take broad responsibility would both be assets, as they always had been.I found a software industry changed beyond recognition.

Jargon and Fads

“Stories” was just the beginning. At my previous job we had two development leads who spoke in serial jargon. In addition to recognizable phrases like “industry standard,” which was supposed to be a supporting argument, there were others like “technical debt” that turned to be a non-blaming way of saying “unfinished work.” “Branch hygiene” translated to Doing Nothing about accumulating Git branchesThe industry is now laden with jargon. “Agile” is everywhere, meaning something different for everyone who mentions it, same for “refactoring” which nearly as I can tell is a synonym for “edit.” A “sprint” is a small milestone with an overtone of overwork, which is definitely nothing new.Well, there have been user scenarios, unfinished work, and editing as long as I’ve been in the industry and the old words worked just fine. Small milestones are not revolutionary. Overwork I don’t need to say anything about.I think if I had to sit through a “sprint retrospective” (“let’s spend four hours discussing what we just learned about teamwork”) I would go stark raving mad.Piling on additional meetings, sure as hell nothing new about that.

Independence As Conceit

This is one of the creepier new ideas; people such as myself who can manage large projects alone aren’t stellar developers, we’re conceited tyrants and prima donnas headed for demotion or termination. It’s all about teams, working together, playing foosball at work, putting feet up on the team table, holding alcohol-fueled team morale sessions, and doing mob- and pair-programming.This is Hell’s innermost circle.Oddly enough, job postings still seem to favor developers who can work independently, with minimal supervision and high initiative. Maybe someone needs to tell them that these are bad people and really they want to hire teams who work like Siamese twins.

The End of Flow

Open offices like the titular graphic; collaborative programming means sitting in excruciatingly uncomfortable proximity with someone in constant communication in what is supposed to be a continuous code review but which makes concentration entirely impossible. The constant din of conversation, no door to close for silence and focus, wearing headphones means you’re not a team player.It was Flow that created greatness in the past, taking it away sets mediocrity as the highest attainable bar.

Development is Secondary to Testing

This final entry is probably the weirdest change in software development.Admittedly, in the past we didn’t take testing seriously. There was a standing joke at Microsoft that nobody should use an even-numbered software version because it depended on customers reporting bugs; don’t use version 2.0 because version 2.1 will fix all the bugs reported by customers, at least the ones triaged as worth fixing.I didn’t laugh.I think we are now seeing an overreaction to this, spurred by the faintly ridiculous approach called Test-Driven Development.Test-Driven Development is Fundamentally Wrong Part III’ve read in many discussions that there is nothing more important in software than the unit tests; they are more vital than the deliverable itselfdocuments are obsolete; the unit tests are the design; they are where the API are defined writing tests to a completed design is inferior to writing tests to a pre-implementation guessanything short of 100% test coverage is dereliction of duty, 100% coverage is a point of honor developers are solely responsible for testing their own work, we don’t need blackbox testers anymore, we don’t need a second pair of eyes.I don’t think I need point out the fanaticism of these attitudes.The last one is self-evidently absurd to anyone with any experience; every one of us has blind spots, cases we overlook, and we will overlook the same cases writing tests that we will overlook writing code. This is elementary, not subtle.

Never Onsite Again

I love writing software. I love solving problems and developing functionality. I’ve loved it since I wrote a GW-BASIC program to generate lists of prime numbers in 1984, I’ve loved it since I wrote a program in COMPASS Assembly language in 1967. It was a hobby that became a profession.But it’s crazy now. I could not work in an open office, I wouldn’t last a week listening to jargon and dealing with the compulsive conformity and the recurring meetings and the derisive sneers at people who work alone. I hope the industry comes back to something like what it was in 1990 with mental focus valued and encouraged.I loved my server development work, and I hope to find a niche where I can do it again. But it’s not going to be in any place that does pair programming and uses invented neologisms for old things.I’m switching over to technical writing, I have a new job doing that for a company in Japan from the solitude and solace of my home in Vietnam. Meanwhile I will learn new skills that are in demand for remote work and hope to find more server and database development in environments I can stand.Environments that don’t seem crazy.

中文摘要

可能带有个人色彩,仅供参考

作者:Chris Fox

1,

1967年,我13岁时开始学习编程。

1988年,我正式进入了软件行业,通过编程养活自己。那一年,我34岁。

2、

1989年,我加入微软公司,那是微软为程序员提供单人办公室的最后一年。我们编程时,几乎没有干扰,这真是太好了。当时,微软的观念是必须为程序员创造不受打扰的环境,让他们全身心地投入工作。

3、

1990年5月,Windows 3.0 发布,公司出现了真正的变化。

突然之间,我与一个吸烟的同事共用一个办公室,他整天在电话里大声聊天。更糟糕的是,我们开始有更多的会议。

4、

接下来的20年,情况越变越糟。程序员像农奴一样被使用,许多人饱受压力、精疲力尽,每周工作70个小时以上。但是实际上,其中真正用来完成工作的时间只有4-6个小时,其余时间都为通过质量检查系统苦苦挣扎,设法应付各种质量措施。

5、

到了2009年,一切都变得混乱了。程序员对代码质量的热爱,完全被复选框式的机械处理取代了。在2008年末,我的主管要求我,代码都必须有单元测试,以便在系统中为该项目勾选"具有单元测试"的那个框。不久,他又要求我尝试"测试驱动的开发"(TDD)的新编程模式。

最后,当他们要求我做结对编程时,第二天我就因为愤怒而辞职了。

6、

离开微软后,我去了西雅图市中心的 Real Networks 公司工作。在西雅图,交通堵塞是一个大问题,我一般在早上高峰时间之后的9:30去上班,这样只要开车30分钟,就能到公司,还算不错。

7、

不久,我所在的团队开始尝试敏捷开发,每天早上8:30举行一次"站立会议"。这正好赶上早高峰,30分钟的通勤时间变成了90分钟,我必须在早上7:00出门才行。我几乎没有办法准时到达,并且感到非常疲倦。我询问是否可以稍微推迟会议。不行,你难道不知道站立会议必须在早晨举行吗?

为此,我只能(无偿地)多花了额外的时间开车去上班。

8、

这种会议真是很荒谬,每个程序员报告自己正在做的事情。大部分时候,我们做的事情跟昨天相同,偶尔会做一些新的事情,但没有什么特别可说的。会议上,产品经理会表现出生机勃勃、欢快愉悦的情绪,听起来很投入,而实际上我知道他们上班时很多时间都在脸书上玩游戏。

9、

许多次,我听到"故事"(Story)这个词。我问,"故事"是什么意思?回答是用户场景或者使用案例的新名称。随着我对敏捷开发的了解越多,遇到的重命名和名词重定义就越多。我看不出来这能对工作带来多少的新价值,唯一带来的就是更多的会议。

我建议不要使用"故事"这个名词,结果被冷淡地告知,"故事"是敏捷开发的一部分,我们将紧跟这种新的开发方法。

10、

我的原计划是,2019年65岁时退休,然后搬到东南亚国家享受退休生活。但是,经历过了沉闷的站立会议、白板上的迭代看板、一系列高压力的工作、对"故事"的不停谈论,我越来越对这个工作感到恶心。

2010年11月15日,56岁时,我退休了。

11、

我在越南买了一栋房子(上图),然后收拾行装,离开了美国。我非常喜欢这栋漂亮的新房子,准备在那边弹吉他,阅读物理书籍,体验截然不同的文化,放松身心。

12、

在越南过了一段日子以后,生活变得很闲,我只好把时间用来学越南语,否则就太无聊了。

13、

一位朋友建议我可以试试 iPhone 和 iPad 开发,软件工具是免费的。我怀念编程,就买了一台 MacBook,学习了 iOS、Objective-C 和 Xcode,很快就写出了一个可以出售的 App。我又回到了这个行业。

14、

2011年到2016年,我一开始为自己写 iOS 和 MacOS 应用程序,然后出售。这样也不错,但是我想挣更多的钱,就开始通过自由职业网站的中介,接一些客户的活。

15、

2017年,我获得了一家加利福尼亚公司的远程工作,为他们做服务器端开发。我学习了 C#、Entity 框架、ASP. NET。当推荐我的人离职了,我就接管了服务器端和数据库开发。这样已经持续了30个月。这是一段很棒的经历,让我掌握了一些最新技能,我喜欢服务器端和数据库编程。

这些时间我一直是一个人工作,但也是团队的一员。整个开发部门都是远程的,浏览器客户端开发人员在悉尼,我在越南。我们通过 RESTful API 协作,彼此都是独立工作。

16、

回顾我的30年程序员生涯,软件行业发生了翻天覆地的变化。

现在的软件业有更多时尚的行话和术语,比如用户故事、技术债务、敏捷、重构、迭代、里程碑等等。在我看来,所谓迭代,就是说这段时间你会过度劳累,没有其他含义。

奇怪的是,他们用各种办法监督程序员,但是招聘的时候,职位要求依然写着,需要具有独立工作精神、高度主动性的人。这真是讽刺。

17、

现在的软件业还流行开放办公室,这意味着完全不可能集中精力。你的工作被持续不断地打断,没法关门保持沉默和集中注意力。如果你戴着耳机,就意味着你的团队合作精神不够。

18、

最后,测试已经变味了。以前,我在微软公司,我们没有那么认真对待测试。微软经常开玩笑说,任何人都不应该使用偶数版本的软件,因为它是测试版,适合那些愿意向我们报告错误的客户。比如,请勿使用2.0版,因为2.1版将修复客户报告的所有2.0版的错误,至少是比较严重的错误。

现在的软件业提倡测试驱动开发这种荒谬方法。我在许多地方都读到,在软件开发中,没有什么比单元测试更重要了,甚至比交付成果的本身还要重要。单元测试是设计,是定义API的地方。测试覆盖率不到100%,就是存在欠缺,100%覆盖率是程序员的荣誉, 开发人员应该负责测试他们的产品。我们不再需要黑匣子测试流程,也不需要测试工程师。

我认为,这些态度充满了狂热主义。每个人都有盲点,总是会存在忽略编写测试的案例与忽略编写代码的案例。

19、

我喜欢编程,喜欢解决问题和开发功能,从小开始直到现在都是如此。

以前,我选择服从那些流行的做法,但是现在不会了。我不会在开放式办公室工作,不会持续一个星期听所谓的专业术语,不会将各种新词用来描述旧事物,不会结对编程,不会参加频繁的会议,不会在意对团队协作精神的要求,也不会嘲笑那些独自工作的人。

20、

我喜欢服务器端开发,未来希望还可以做这方面的工作。同时,我正在转向技术写作,学习远程工作所需的新技能。

我喜欢现在这种一点不疯狂的环境。


暮春三月,江南草长,杂花生树,群莺乱飞