Design docs at Google (2020)
industrialempathy.com
industrialempathy.com
I wrote a very high level doc shortly after joining the company outlining a fairly trivial task (one that has been performed many times across other product areas).
A colleague virtually took me aside and told me "this is not how we do things here". Which was kind of a wake up call as he told me to make sure to 'evaluate many more ways to get this done' despite the way I outlined literally being a slight variation on the recommended way.
When questioned about why this would be needed he said "it shows broad consideration".
"Fake work" is very much a thing at google, I wish I joined a different team.
From your description you fall into both categories, which means your colleague was correct. Now, your amount of details is very scarce, so it’s extremely likely that I’m getting the situation wrong. But look at it from an enterprise level perspective or change management, if you allow slight deviations here and there for thousands of employees then you’ll very quickly end up with what would be the equivalent of the difference between Italian, Spanish and French. Which all shares the same Latin “standard” and then deviated ever so slightly.
If you think there is a lot of pseudo work involved with managing the bureaucracy of enforcing a design doc standard then you should see just how much pseudo work it saves.
Some people may (and clearly do thrive) in such environments but I personally did not.
This particular scenario was a simplified excerpt but very well captures my perceived experience. Having to write a design for for something that was a solved problem (by a team maintaining a framework) felt like pure busy work.
If there was a higher meaning to this process this higher meaning (other than looking good / getting promoted) was not communicated in any effective manner.
Maybe I'm dis-illusioned with the current culture in big-tech but a promotion should be a result of doing good work, not doing work that is designed to look good.
And yes I understand that some of these mechanisms may exist to provide employees a clearer path for ascending the corporate ladder.
Standards solve those problems at the cost of some overhead and waste, due to being what they are: a fairly generic reification of best practice (at best).
Even though some overhead is just inherently part of the game, the efficacy of standards (and metrics) does vary. Not all have equal merit. And it does sound like some of the Google standards went off the rails a bit.
Last but not least, it’s a total waste of time to have actual developers do it. Instead of working on something useful. Of course the challenge then becomes that 90% of the architects and whatever actually don’t know how to write their own design documents from changes, which means they need to waste developer time to do it… meaning that no only are they a completely useless employee they are also wasting the time of useless employees.
This shouldn’t be taken as black and white. As I wrote earlier, it can be done to help work flow. It’s just than in reality these processes usually end up doing far more harm than good. But if you, are, going to do it, at least enforcing standard is the right thing to do.
I personally avoid working at places with too much bureaucracy because I don’t want to waste my time writing documents nobody will ever read after they are approved.
What a good early design doc can do is turn meaningless changes (e.g., doing a project for the sake of promo) into meaningful non- or minimal change. The best code is the one not written.
And at least in my area (Core), the design docs only go through anything like a formal process when it's a larger project that would take years or multiple engineers. Other areas are probably different.
Some companies I worked at after Google were reluctant to discuss their promotion process in detail, because they saw what happens when people microoptimize for it.
If you want a team that lands stable customer-loved products, make THAT your performance review. Turns out that's hard to do objectively and consistently.
For example:
* Require features to be launched for a period of time rather than in development or shoved out the door a week before perf
* Have metrics for customer satisfaction and oncall pages be incorporated
Etc.
Have excited engineers, pay them well, have them work on something that is aligned with their career & deliver value to their customers, they don't really need much more than that. All the rest is simply trying to "processi-ze" what is a human
Never said that. I don’t have a solution. Well I have a partial solution, but not complete:
Reward all team members equally for the performance of the team, or even the company. For instance: the pie is divided into 3 pieces: company, team, and individual performance. Candy is given out based on performance of both.
It doesn’t fix the hackable metrics issue, but when people collaborate the side effects are better than when they think of their own promotions, and worse when they’re competing against their direct peers for a fixed bucket of candy per team. Such incentives are directly opposing collaboration between the very people that need to collaborate the most.
Senior engineers will:
* Design a significant project which lands with measurable customer impact
* Demonstrate expertise in at least one core skill outside of coding (test infrastructure, SRE, security, accessibility, etc.)
* Demonstrate leadership by either being a TL, owning and leading team pillar efforts (security review, etc.), etc.
* etc.
Mid-level engineers will:
* Own either a small feature end to end or a significant piece of a larger design
* Contribute to at least one non-coding pillar
* etc.
These generally have more areas and can be further granular such as "low-performing midlevel is X, satisfactory is Y, exceeding is Z"
Just proves the point, this person just cargo culted what makes google so famous in recent years. If you only metric is to launch new projects, you’re only gonna launch new projects. Who’s gonna get promoted for maintenance.
Again, not trying to debate what the specific bar should be, just giving examples of the kind of metrics you can use. What's your preferred alternative? Lines of code? Whenever your boss feels like it? Stuff like that is why no one believes a "senior staff superstar" from the hot startup of the week is any good and requires them to do whiteboarding.
Thus, there are rules, and they are written down. If they're not visible to normal employees, they guess the rules based on who they see get promoted (cargo cult) while the committee uses the true metrics.
It's not like becoming a manager is a secret cult where you're dropped in and you suddenly have carte blanche to do anything. At established companies there are rules and procedures, and while you will likely have access to more information than individual contributors, you won't just be promoting whoever you feel like without having to go through others.
I steadily got in better shape as they kept cancelling the projects I worked on and I slowly lost and sort of will to care about my actual job. The quality of my work ended up suffering a lot as I realized just how pointless trying to work there was for me but the pay was too good to want to leave.
Edit: I was unlucky though. I knew some people with more stable projects. I went through 4 cancelled projects in close to 6 years
Write docs that slow things down, don't code/build projects, and do it all in the name of greed and the only justification is that it will get cancelled anyways (probably because no real work was being completed).
Edit: also if Google wanted me to really care about my job more than for self interest that relationship needed to be a two way street. The relationship of the devoted employee and disinterested company is common but to me comes across as a bit pathetic. I did a good job there purely because that's how I enjoy doing my job, if the company collapsed I wouldn't have shed a single tear (that's a lie, I miss the free food)
One of the things that had been problematic at Google is the creation of many more products than are really needed, leading to the infamous Google Graveyard. One of the reasons I have come to like writing design docs for my ideas is that a lot of the ideas turn out to be crap when they get written out. Quite a few are good enough that they have already been done, or close enough, which my colleagues can then inform me of. This is a very lightweight way of trimming out useless projects.
And no, Reader wasn't useless. Different story.
Google could still keep the boring, but profitable products. Just like Microsoft does (although they bundle them).
But it seems that in google promotions are not made for boring things that work.
Many of these people are external consultants who have been working with the company for 15+yrs. So, there is a fair standard in place already because the tasks are done by the same people. But then they go out of their way trying to create a boogeyman of "what happens if people don't follow the standards?".
The end result is that either design docs don't exist or woefully out of date. Hence the company has to keep hiring these same consultants year after year on hugely inflated costs.
There it is. There's good scratch to be made in prolonging the problem.
If you're designing something, and there's only a single solution under consideration, either there's no design, or you're not being thorough. Choices and tradeoffs are what make design
1. Presumably you've written the doc to be read by other people. What's obvious to you might not be obvious to them.
2. If you have no "alternatives considered", it's an indicator that you didn't consider any alternatives. I can think of times when "this is obvious and it's the way we've always done it" sent me down the wrong path. Spending just a couple of minutes considering whether obvious == correct, and writing down why, is not a bad investment in the long term.
3. I can only speak for myself, but I don't enjoy being criticized and I don't enjoy being wrong. "Alternatives Considered" is often at the end of the doc and I'm tempted to avoid it because there's a very real possibility that I will find the process of explaining why we don't just do option B instead leads to a realization that option B is a better alternative than the plan I just spent all that time on.
9/10 times it's short and easy, but it's still a worthwhile exercise for the reasons above. Explaining the "don't do anything" alternative is a good way to reinforce the cost/benefit of what you're proposing, and it's usually pretty easy to put yourself in someone else's shoes for a second and think of the first "but why don't you just" that will probably pop into their head. Write down "because it won't scale" and you've saved yourself that conversation. (joking. maybe.)
That's actually a huge problem because it can veer onto intellectual dishonesty and being combative for nothing. Instead, one should be trying to look for the right/best path forward, regardless of what they thought. Should be easy to discard erroneous ideas.
The goal is not to be right. It's to find what's right.
This is why I think design docs need to be lightweight and reviewed early. Design docs shouldn't be a masterpiece perfected in isolation over the course of days or weeks. That guarantees the author has calcified their opinions. When I was on review panels at Amazon, 99% of them were an exercise in futility -- the author had already poured concrete. It is very, very, very hard to avoid the mental trap of "Hrmph! I've thought about this more deeply than anyone else" that comes from living down in the isolated world of "doing design."
The earlier you get other eyes involved, the more likely people will actually listen to feedback and consider alternatives. You still, of course, need that heads down time to put in all the details, but the overall shape of the design shouldn't be a big reveal when you hit the design review.
Meaning that if someone designs something huge, end-to-end, it's going to be difficult for external people to address potential flaws within the design. A lot of interlinked parts requiring to have the full mental model loaded in the brain. So one should go step by step.
It's also true that not every feedback is equal and it's important to think in advance about how to address rebuttals since most people don't give in-depth feedbacks but surface gut feeling (which can be invaluable too, even if simply in terms of UX), unless they have wondered about how to solve the same exact problem before. That requires more time spent thinking about the design.
Time is measured in quarters, money is measured vaguely by proximity to sales.
Thought using excel as a database was bad? Try working in a system where strings are `eval`ed in SQL, and every state change is stored in intermediate or virtual tables, then thrown away, so no actual version control is taking place; just diffing and merging Unix configuration files.
Why not use diff and patch? Takes too much time and money, they only know SQL.
Now on a team of many OG Googlers (15+ years tenure) and Design Docs only exist when they’re needed (something that touches multiple systems, something that’s obviously complicated with many trade offs, etc) Otherwise it’s just “write the CLS.”
> Otherwise it’s just “write the CLS.
(apologies for the noob question) but what is cls in this instance?This almost certainly has nothing to do with the team or tenure, but everything to do with what levels they are(n't) trying to get promoted to. Have you controlled for that and still seen a distinction?
In these contexts, design docs are meant as an asynchronous communication tool for information heavy topics. And this is so asynchronous, you will talk to those people join 10 years later if you product becomes so successful. I've been saved multiple times thanks to some random design doc from 2010 that explains the weird decision that still haunts us. This probably doesn't work very well on lean/small teams or less complex tasks. But engineering culture usually has its own rationale and context, even if it has become a cargo culture.
> The decision whether to write a design doc comes down to the core trade-off of deciding whether the benefits in organizational consensus around design, documentation, senior review, etc. outweigh the extra work of creating the doc
I'd argue that extra work of creating the doc is an upside because it clarifies your thought process, and design-by-committee is a massive downside.
In fact, I happen to be writing this during a design-doc meeting. I am getting absolutely nothing from it. I was writing code all morning and the background noise now prevents me from continuing productive work.
By and large I didn't notice that strategy working.
On the other hand, for context, people wrote large docs on what the team did and does, what the problems are, etc. and those did tend to be long and exaggerated.
I read many docs that, to me, obviously made up a decision and showcased the thing we already wanted by the time the doc was started, and 2+ silly alternatives (at least one way too simple and an unnecessary overkill) and contrasted them to pick the thing that was reasonable.
Too many have learned (correct or not) that promo committees want to see that only the author wrote a doc and no one else. This further slows down everything and disincentivizes cross learning. I know software engineers who spend a full quarter or more in isolation writing design docs. The majority of the writing in a design doc is the actual design, but the other 99% is the definition of the problem. Too many times I have been in a review and spent a bunch of time improving the definition of the problem which results in the design needing to be scrapped and most of the doc needing to be re-written.
Worst case scenario is when by improving the problem definition a simple solution appears that doesn't require a complex design. The author having invested a lot of time in a complex design (that historically and many committees still look for to promote off of) will push back against anything that is simple. The difficult trick is helping the engineers to improve their problem definition early in the writing process.
I have seen design docs that have no alternatives presented. The design doc was simply a labor intensive way to write down what needed to get done or what someone wanted to do.
This also results in design docs turning into a bug tracking system if you squint. In a hand wavy way everyone is working on their design doc, not bugs, bugs can't get you promoted.
And OP like to wax poetically about how when you join a team you can just go and look at the design doc like that is a simple and obvious thing. They are often not tracked in any central place. For many teams design docs are not owned by the team or the project, but by the individual because you can make sure no one else contributed. This is again for the promo committee sake. Many design docs you can't get access to, not because they are super secret, but just because. And it isn't like teams have say two or three design docs, no there is a mountain of design docs to read. And with around a two year turn over at Google many design docs get lost to time. At any other company this could be like if you joined the team and I said everything you need can be found by reading all the closed bugs or read every commit message in the main branch.
Anywhere else I would have been grabbed after lunch and would have worked on defining the problem for a few hours with the team at the whiteboard. The senior members teaching the younger in real time how to think about these things and iterating quickly. Most of the time this would be written down in the bug tracking system or for bigger stuff in the project's wiki/folder to be owned by all.
All of the above can be improved and I have worked on improving all of them, but culture is a slow thing to change. Design docs are a good idea as a concept, but there are pitfalls and the way they are being used by many (not all!) at Google is not it.
The worst case is really when even more time has been spent coding, testing, releasing, and integrating the overly complex design, and then it's extra work on top to get rid of it.
> Anywhere else I would have been grabbed after lunch and would have worked on defining the problem for a few hours with the team at the whiteboard.
I do that at Google regularly, often in parallel with writing the doc. Nothing beats talking with an experienced engineer directly.
I long for design docs that are worth more than their cost.
There is a wide range of types of design docs, and none of them are useful. I've rarely seen any useful design doc at Google. I feel that design docs are for engineers who are too much process-oriented.
Here are the types of design docs I've encountered in the wild:
* The promo design doc: it's not really explaining what this is trying to solve, it's more stating that this project is awesome, and makes the company better. The logical conclusion is that the author of this doc should be promoted.
* The turbo-encabulator[1] design doc: this is a technobabble design doc which is full of terms never encountered before, and which is not understandable unless you're a senior member of the team. I'm sometimes not even sure the senior members of the team understand it...
* The new-grad design doc: this a design doc with no substance, but as the person just graduated from university, they felt compelled to make is as long as possible, to prove... I don't know what... It is not conveying any information. They most likely copied/pasted huge chunks of the code they've already written, to fill most of the ~70 pages of the doc.
* The made-up-facts design doc: this a design doc full of "everybody knows that", "they all say". Of course, it's not as obviously done as some politicians do it. But the design doc will push their design with "this follows good practices", "this software is slow, therefore..." who defined the good practice? why is it a good practice? what is slow? was it measured? is it an end user feeling?
This is 99% of the design docs I've seen out there. Of course, exceptions exists, but they're very rare, in my experience. I'm shocked that the author pushes for this practice... But again, they were no engineer, they were a director, I guess design docs make sense for their position, for which I'm still trying to figure out the value these folks bring.
I noticed early on though, that design docs maintained in Google Docs tended to be of lower quality than those maintained in the version control repository. Not sure if that was just a proxy for when they were written or whether the code review process is just more rigorous than editing things in Docs, but the only time I wrote a large (40 page-ish?) design doc I did it using hand written HTML and we worked through the code review system, as was traditional. I also posted it to the central mailing list and web server and got feedback from employee number 3, which was nice. The central location made it easy to find them as they were sorted by category.
Still I don't recall design docs being important enough to matter for a promotion by themselves. Promos were supposed to be about overall impact, not production of specific artifacts. Of course the system was badly flawed, and often yielded surprising decisions in a bad way, but I don't remember ever reading an obviously-optimized-for-perf design doc back then.
If you can find the website that holds the design docs hand written in HTML from the earlier years, try perusing some of those and see if you find them more useful (or would have done when the systems were contemporary). Some of them old ones like SmartASS were full of detailed explanations of the underlying equations and models, which was quite helpful for understanding how it worked, as well as the explanations of why those approaches were chosen. Reading those helped informed my own design work later. I wasn't a director, just an engineer, and they did help.
There are also some Chrome design docs linked to from the chromium.org website that I found helpful in the past for understanding its design.
How can you prove "impact" to a committee who otherwise doesn't know your work, without providing evidence in the form of docs, code examples, and other artifacts?
Still, the intuition is obvious enough. If you don't tie incentives to some sort of verifiable impact on the business then a lot of people end up doing make-work in which the appearance of doing work substitutes for actually being useful. As this wider thread is complaining about, in fact.
A common form of this complaint can be found in any business that makes software, that refactoring or "tech debt" style work is hard to justify via business oriented metrics. There's some truth to that, but also I came to feel that forcing people to find some sort of business-related metric they're affecting helps keep engineers honest. When to take on and when to pay down tech debt is one of the most nuanced and difficult subjects for any engineer to learn on their path to seniority, and becoming obsessed with refactoring is one of the most common failure modes along the way. Saying "but how did this actually affect the business" forces a reality check that can help avoid doomed rewrites and other pathologies.
For example, Google has a system that automatically finds and deletes dead code. This is the sort of thing that at first seems hard to justify, but with a bit of work you can do it. Work out the overall eng cost of maintaining each line of code (some napkin calculations are fine), work out how much code you're able to delete, work out the cost of developing the auto-deleter system, show that money spent on maintenance of dead code > cost of developing the system. Business impact demonstrated, done.
It doesn't have to be monetary either. I never demonstrated monetary impact. It was all things like "contributed to the launch of X that increased traffic by Y". In the case of the security and antispam work it was "successfully blocked Z attacks against our users", stuff like that. The impact is obvious even if not expressed in dollar terms.
Am I going to be a difficult person here finding each and single flaw about the doc or should I just allow it, let the other person get more visibility and just move on with my work. Why should I be a bottleneck here for a pointless battle.
I write them mainly as a tool to get visibility with superiors. I try to make them as fancy as possible to to make them think i am "leadership material". I've been feeding them to chatgpt to rewrite them in fancy language.
Granted, I've never worked in an org with more than 30-40 engineers, as I've always worked in startups. I'm sure things are different in big tech, but I've had positive experiences with them.
The promo design doc is directly incentivized by managers: “if you just see a bunch of CLs, it doesn’t tell a story. You need to write it down as a coherent narrative and get some >L5s to comment on it”. “It’s not for me it’s for the committee - they aren’t familiar with your work so you need to explain it”.
> But again, they were no engineer, they were a director, I guess design docs make sense for their position
Yeah I think it’s just high potency ammunition in the middle management[1] turf wars. Not even product managers care much about DDs.
[1]: Liberal definition: anyone who uses the word “cross-functional” colloquially, independent of their actual job title.
IDK how you can think that you never need to write a document
These are relatively informal documents that the primary author or authors of a software system or application create before they embark on the coding project.
"Before they embark on the coding project". The design is the coding project, it's all the same thing. The idea that you can work out the design on paper before committing any code is just wrong. (The design doc approach in fact admits that you need to write some code up front, but tries to strictly compartmentalise it as "prototypes that show the implementability of the design".)
A big feature of the up-front design doc is that it gives people license to nitpick, AKA review, before any serious coding starts. In my experience this usually means the doc gets extended by more and more caveats and discussions of pointless alternatives, and can become less of a "design doc" and more of a "please just let me start building this thing" doc.
In cases where there are significant architectural problems that require a change in direction, they're better solved by talking to and collaborating with the right people in advance, rather than crafting a detailed design doc only to have it shot down.
If you stick closer to the "relatively informal document" idea, and maintain the doc as you go, that can actually be useful, as it helps you produce useful documentation as well as a working system. But that's less "design doc" and more "write documentation as part of a continuous, collaborative process".
* It empties my head of the immediate parts of the idea, letting me move on to deeper parts and more productive considerations.
* It makes flaws more obvious, especially to myself.
* It makes it easier to share these thoughts, especially with people in other offices. They usually give really good feedback.
* It gives me a much better idea of how much work is involved than if I just start coding.
* It usually points out some things I need to learn before I start coding - adjacent systems, appropriate tech choices, etc.
Yes, it's also good for promo, but a successful project is better.
I often get comments on how useful my docs are, so I think I'm onto something.
I worked at Amazon and their design doc culture was amazing. My next job was at a place that (I think) borrowed their engineering culture from Google (or maybe the ambient startup culture of SF?) and their design doc process was a pointless joke.
(disclaimer: very org dependent, as all statements about Amazon are.)
They are one mechanism that fits in a broader working culture. If you’re working solo, it’s an extravagant exercise. If you’re in a huge team, it’ll enable leveraging more expertise across the team and act as documentation.
There are a few different failure modes.
* Valuing output not outcomes is classic misalignment. (writing 40 page docs for promo — this doesn’t work except for very junior folks who are proving the ability to string words together more than deep eng)
* As mentioned, it’s a bit much of solo teams. Other small teams can comfortably communicate through issues (Jira) plus breakout sessions to hash out ideas.
* Engineers also need to be onboarded to effective design doc writing. (note a top commenter frustrated that their first effort isn’t immediately met with adulation, a possible flag.)
Writing about code is hard. Usually this is an exercise celebrated on HN. If you’re in a team, beware if you find your work is always that which doesn’t need to be explained and deeply considered in a shareable doc.
Maybe one out of ten do I see someone who went way overboard but it is really not a time sink for the average SWE.
This is exactly how I'd design a company if I wanted to burn as much money as possible.
This system tends to prevent visionary efforts and aspirational projects because non-consensus focused efforts are quashed and thinking “outside of the accepted norm” means you’re going to be punished by the collective.
This type of system breeds groupthink, and the tradition focused nature of “the way we do things” intrinsically enforces that doing anything else frequently becomes dangerous to your career.
The valley has all manner of company cultures that rely on tropes wrapped in ‘agile’ and ‘design thinking’ verbiage that are primarily enshrined institutionalization masquerading as ‘the right way’ and usually comes with a healthy side dish of social enforcement of whatever ‘engineering cult culture’ variation that campus has arrived at.
I can’t tell you the number of people I’ve met who left Google because it was limiting their career, even when they were deeply comfortable working there. It’s not a few.
The real quality work being done at Google is by SREs -- not SWEs -- in Ads / Search & Core. The infrastructure they build and maintain is amazing and hard to explain to people outside. I say this as a former SWE there.
This is why they pay so high. It's a trap. That, and the apparent "status" of working there (which has mostly worn off now)
You've expressed my frustration with what I experienced there exactly. But I do wish I could have that pay back...
Also re: "agile" I came into "agile" 20ish years ago in the form of eXtreme Programming, and it looked nothing like the cargo cult that is SCRUM or its imitations today. It was, in the end, a set of precepts to put creative power into the hands of developers and let them just get things done without management getting in the way of how -- but in exchange the customer is given the ability to say what things get done and (to some degree) when. Developers do their own estimates. "You ain't gonna need it". No big "upfront design". Refactoring and testing, architecture and design built in as a constant overhead as just standard best practices, not stories or tasks in themselves. Planning meetings are coworkers hashing things out in a room, and "stories" are sticky notes on a whiteboard expressed in minimal, non-technical terms. Standups are literally people in a circle giving a very brief update, in case anybody else is interested, not a ritual to prove you're attending work today, or to show off.
In this system, design is an emergent property of a creative group of experts working together. It doesn't preclude design documents, and it still involves architecture discussions. But it doesn't require an explicit PRD/design-doc process.
How I'd like to work in a shop like that again. I can tell you Google was the polar opposite. Everything took forever.
Ah, ah, ah. This is why they pay so high so far.
I predicted the layoffs a year before started.
Lots of good comments already describing the uselessness of design docs at Google. I wanted to add one additional perspective that I find problematic.
As mentioned design docs are "promo" material which causes massive amounts of fluff. But they also seem to substitute actual documentation!
Every design doc is out of date pretty much the minute they are finished but teams point to them instead of writing documentation. The result.... documentation at Google as pretty bad and out of date.
Honestly I would've really preferred if documentation / instructions were promo material instead of writing 20 pages about what you DIDNT DO. Write 2 pages about how to use what actually exists
I picked out one at random just to check if my skeptical reaction is fair: https://github.com/kubernetes/enhancements/tree/master/keps/...
- OK, this is actually a really good and useful doc!
- However, it's not an up-front design doc, it has clearly been written after the bulk of the work has been done, to explain and justify rolling out a big change. (See the "implementation history" timeline: https://github.com/kubernetes/enhancements/tree/master/keps/...)
- It looks like the template wasn't very useful; most of the required sections are marked "N/A", and there are comments like The best test for work like this is, more or less, "did it work?"
I don’t think this particular doc, although it is a really good doc, supports the design doc process as described in the original article. It looks like good work being done in spite of the process, not because of it. It’s obviously just one data point, but I’d put it down as a negative point.
I wonder if anyone has done a proper investigation into whether the process is a good one?
Shades of Parnas! [0]
[0] 'A Rational Design Process: How and Why to Fake It', Parnas, Clements, https://users.ece.utexas.edu/~perry/education/SE-Intro/fakei...
Example: https://rfd.shared.oxide.computer/rfd/0177
Main index: https://rfd.shared.oxide.computer
The project shipped on time (successfully), but the director gave feedback on the design doc and asked for changes to the approach a day afterwards.
Awkwardly, that director had no clue the project shipped the day prior without his input, and he held a special meeting with me to apologize for completely ignoring months of requests to review and approve the design doc.
I hate design docs. I wasn’t even at Google, but worked somewhere that uses design doc culture. Thanks Google.
Getting a stale approval and request for revisions 6mo later after shipping only made me feel more so that design docs are just technical fluff pieces with no useful purpose beyond its origination.
The amazon way is much less toxic, but does come with a need for writer to invest heavily on a high quality doc. Personally, the Amazon way is better but only works due to their peculiar culture.
They are outdated as soon as implementation start, by different degrees depending on the project.
Side note but I think this average tenure number hasn't been updated in a very long time. In London for example, a third of employees have been here for more than 5 years.
You could usually tell which parts are not going to be controversial and start with those.
There are some other much better ones in my opinion, and some great internal docs on writing and examples. I wish those were public.
In 2018, the template for this "One-pager" was two pages long
Where I work - this is what they want from a design doc. They want it to be such that you could hand it off to anyone and they could implement it.
What does HN think about that?
That'd be lovely indeed. I have never seen one that I felt comfortable with, though. And I've seen a few.
When LLMs rose in popularity, I had hopes of having a way to tackle the problem of formulating requirements in a way that would be less painful than it is now.
To me, computer programming is a form of communication, where the requirements are close to humans, and program code is nearer to the machine. On the computer side, we have linters, compilers, and a deterministic system that executes the code. On the human side we have people stating requirements such as "The system should be easy to use."
That said, about this point:
- Ensuring consideration of cross-cutting concerns.
My answer would be "Avoid cross-cutting concerns because they are a violation of the separation of the concerns principle; a violation of the cross-cutting kind" ;p
My observation is that while avoiding cross-cutting concerns can seem challenging at first, creating a code architecture which avoids them leads to much more maintainable and easy to follow code. I've worked on many complex projects; distributed systems, blockchains, P2P messaging systems... but I'm yet to encounter a project which cannot be structured in a way to avoid cross-cutting concerns completely.
That said, IMO, aspects mentioned in the article like "security, privacy, observability" aren't really separate 'concerns' but merely desired characteristics of software components.
Some cross-cutting concerns are about more than just code, but things like "how will you monitor this for reliability?" or "this system reads user-sensitive data, how will those reads be audited?" and so on. Usually the answer is short: "use standard system xyz" - but having it there and ensuring it's followed through on are important.
For example, in aspect-oriented development, they tend to promote injecting a logger into all the components; but other development methodologies might instead make it so that messages and errors bubble up the component tree (e.g. for non-error messages, might use event emitters, message passing, callbacks, or other kinds of channels). But the idea is that the messages for all components are aggregated, handled and logged near the top level in a central place; so you don't need to inject a logger instance into every component; it loosens the coupling of your components with the rest of your application... Also, logging might be just one of things you do with those messages.
It's nice to have that logic near the top level of the code. I find it extremely valuable when the important outputs of the system (what the developer or user can physically observe) can be traced starting from a single source file (or at least, as few files as possible).
2. Review (may be in multiple rounds)
3. Implementation and iteration
4. Maintenance and learning
Missing step 5: Promotion and deprecation
Some more discussion then:
https://workspaceupdates.googleblog.com/2023/09/winding-down...
Which means that basically only apps that are approved by Google for OAuth can use IMAP in the near future.