Live data from Hacker News

Rethinking the IDE for the 2020s

movingfulcrum.com

51–60 of 64 posts

Re: Rethinking the IDE for the 2020s

#51
post #15

Earlier quoted context omitted.

I work in a large microservices environment. It’s very important that IDEs don’t make it easy to reach inside other services. The whole point is to create cognitive barriers at the public APIs. The pain of coordinating changes across services is a feature: it is telling you that your architecture is wrong.

And what qualifies as a micro service in your environment? Can you give a few examples? How many people work on each micro service? Etc etc. Would love to hear more details so I can build a better mental picture.

I'm not the OP, but I can give you some examples from when I worked at Airbnb a few years ago:

* Each team (let's call it eight engineers per team on average) typically managed a few services.

* Services were typically ~thousands of lines of code to ~tens of thousands. Rarely, there were very small services that were hundreds of lines of code. There was a giant service -- the original Rails app -- called "Monorail" that had millions of lines of code, but was actively being dismantled. My understanding is that there is now a code freeze on Monorail, and the only changes allowed are changes that remove code from it and move it to a smaller service (either an existing one or a new one).

* Services communicated with each other over HTTP or Kafka, typically using Thrift, although also sometimes using JSON. Airbnb had an in-house "service mesh" (developed before the term service mesh existed) that abstracted away individual machines and was capable of operating at the HTTP or TCP layer.

A few classic examples of mostly-single-responsibility services:

* Prometheus (which I wrote) abstracted away reverse geocoding and correctly caching and manipulating results from geocoder APIs.

* Medusa abstracted away ranking and filtering listings by date/amenities/etc.

* Micasa abstracted away basic CRUD operations on individual listings.

Airbnb intentionally used codenames for services rather than calling them by what they did, which I wasn't a huge fan of; I forget most of the codenames now (and hardly anyone knew all of the codenames offhand even at the time). Some other example without the cute names were the pricing recommendation service (used to recommend prices to new hosts), the calendar management service, the experience CRUD service, etc.

Re: Rethinking the IDE for the 2020s

#52
post #49
post #19

Cross-repo refactoring (even worse: renaming) seems like an at best worthless and at worst quite costly thing to optimize your toolchain around. Having stable interfaces between systems is very important. The whole point of having separate systems is so you don't have to change one when you change the other. If that's not the case, you're better off with a monorepo.

I see what you're saying but I don't agree. Repo topology might not be a choice. Almost certainly new features will cut across multiple projects. Why make that hard? Tools should help you do the right thing. They should not be a painful bludgeon against other devs. Enabling fast and easy end to end testing is only helpful.

I agree that you should write tools to improve the workflows you actually have. But this post, as I read it, is not written from the point of view of narrow problems and solutions — or rather, it is, but it is trying to be something else. It is talking about The Evolution of the IDE. And from that point of view I think my criticism is appropriate.

Re: Rethinking the IDE for the 2020s

#53
post #15

Earlier quoted context omitted.

I work in a large microservices environment. It’s very important that IDEs don’t make it easy to reach inside other services. The whole point is to create cognitive barriers at the public APIs. The pain of coordinating changes across services is a feature: it is telling you that your architecture is wrong.

And what qualifies as a micro service in your environment? Can you give a few examples? How many people work on each micro service? Etc etc. Would love to hear more details so I can build a better mental picture.

Without being too specific, the gateways I have in the codebases in front of me:

Data:

- Canonical data repositories for each of: order, transaction, customer, feedback, geography, privacy opt-in/out.

- Hadoop SQL facade.

- Support contact analytical service for a particular type of issue.

Business operations:

- Core order fulfillment service (orders populate into repository when complete).

- Support contact operational services: ingestion, routing, and auto-resolution.

Product infrastructure:

- Machine learning model serving engine.

- Map drawing service.

- Translations service.

- Dynamic configuration service.

- A/B test service.

- Server-Sent-Events hub service for our mobile apps.

- Facades for each of: voice, SMS, mobile native pushes, email.

- Marketing campaign service (dumber but more convenient facade to the previous).

Basic infrastructure:

- Column store.

- Secrets service.

- Cache service.

- Blob storage service.

- Workflow engine.

- Timer service (technically a subset of a workflow engine).

- Message queue.

Each one of these is backed by a team of 2-10 people. I have been inside 2 or 3 of them to fix bugs that affected me.

Re: Rethinking the IDE for the 2020s

#54

One big opportunity for IDEs to explore is the code visualization. Especially in languages like Java the abstraction, decomposition, delegation are heavily used for (sometimes) good reasons but at the cost of simplicity, and it's more difficult to see what's really going on (compared to simplified spaghetti). There have been some weak attempts in IDEs (e.g. auto generated UML), but it's not really useable. Closest se…

When I read the first paragraph of your comment, I thought to myself "SourceTrail seems to be designed for this problem". Reading the second paragraph, it seems you have tried SourceTrail and found it lacking. Can you please elaborate those short comings. I recently became aware of SourceTrail from an HN post few days ago, but have not used it.

Re: Rethinking the IDE for the 2020s

#55
post #42
post #2

“A typical organization in the 2020s has: Hundreds of microservices” Can people with expertise in this situation speak about how typical it is? I guess if you have all those services then you need your IDE to help - but surely this isn’t super common? If it is, what sort of size of micro service are we talking here? I’ve worked in orgs with 3M line codebases, and I’d struggle to find a hundred ways to partition the c…

In corp this is certainly true - 100s and 100s of services - but YOUR work is scoped to one domain and I wouldn't see you needing to check out the world. Each team has developed it's own way to work with it's subset of services - I doubt every team across every org could figure out how to run everyone elses domains to even make checking out the world a useful exercise. As a long term corporate exercise, maybe that wo…

That exercise is monorepo migration. Every target has to work with nothing more than "buck build" or "bazel test" or whatever, or you can't check it in. And anything that runs in production must be checked in.

I'm not sure whether it was really worth it for us, but it did solve that problem.

Re: Rethinking the IDE for the 2020s

#56
post #49
post #19

Cross-repo refactoring (even worse: renaming) seems like an at best worthless and at worst quite costly thing to optimize your toolchain around. Having stable interfaces between systems is very important. The whole point of having separate systems is so you don't have to change one when you change the other. If that's not the case, you're better off with a monorepo.

I see what you're saying but I don't agree. Repo topology might not be a choice. Almost certainly new features will cut across multiple projects. Why make that hard? Tools should help you do the right thing. They should not be a painful bludgeon against other devs. Enabling fast and easy end to end testing is only helpful.

In general a new feature should have its home in one service and make calls to the existing network APIs of other services. If you’re regularly having to change the innards of those services to support new use cases, you have serious architecture debt.

Re: Rethinking the IDE for the 2020s

#57

Context: I most recently worked at Facebook, which develops and maintains an in-house IDE, Nuclide, for working with its massive codebases; currently it uses VSCode as a base, although it previously used Atom. In a previous life I led the DevTools team at Airbnb (and before that did various other things at Airbnb). This article hits most of the nails exactly on the head, at least from the perspective of large corpora…

I would be a fan of it if I could get Jetbrains-level code intelligence, but so far I can only get VSCode level intelligence, and to me that more than erases the benefits of faster execution.

Re: Rethinking the IDE for the 2020s

#58
post #40
post #32

Earlier quoted context omitted.

Yes. It's way cheaper. You can get a new CPU for $200, but you can't rewrite VSCode in the time that money would provide.

Why is the only other option to rewrite VSCode? How about another editor? Vim, emacs...?

Okay then replace "rewrite VSCode" with "turn Vim/Emacs into the same IDE experience as VSCode/IntelliJ".

Re: Rethinking the IDE for the 2020s

#59
post #10

I switched from IntelliJ to Emacs about a year ago, and honestly these things seem relatively trivial in that environment, because I can write small ELisp functions that automate things like this without much effort or ceremony. For example it's quite easy to automate checking out repos, applying AST refactorings using LSP Mode, and then committing and sending PRs using VC/Magit. Or configuring projects and "Run Butt…

I was gonna post something much like this. Agreed, Emacs is not a modern IDE. Emacs is from the future.

Re: Rethinking the IDE for the 2020s

#60
post #49

Earlier quoted context omitted.

I see what you're saying but I don't agree. Repo topology might not be a choice. Almost certainly new features will cut across multiple projects. Why make that hard? Tools should help you do the right thing. They should not be a painful bludgeon against other devs. Enabling fast and easy end to end testing is only helpful.

In general a new feature should have its home in one service and make calls to the existing network APIs of other services. If you’re regularly having to change the innards of those services to support new use cases, you have serious architecture debt.

You're being overly zealous. Every service has callers. Sometimes you want to work on the caller concurrently with the callee. Sometimes even the same person can work on the feature end to end.

There is no reason that making that easy to do will cause tech debt. You already have other means to your services cleanly versioned and compatible, such as tests. Making things environments easy to run locally doesn't change that.

Post reply on HN