[HN Gopher] Why Segment Went Back to a Monolith ___________________________________________________________________ Why Segment Went Back to a Monolith Author : BerislavLopac Score : 500 points Date : 2020-04-29 09:25 UTC (13 hours ago) (HTM) web link (www.infoq.com) (TXT) w3m dump (www.infoq.com) | StreamBright wrote: | I don't blame them, microservices requires discipline, careful | planning, in depth monitoring and debugging capabilities and | whole different mindset. Very few companies can implement it | successfully. | bpyne wrote: | The takeaway is about trade-offs. They made a rational decision | to improve fault isolation by dividing the app into smaller | building blocks managed separately. After working with it for a | while, they realized the higher operational overhead made the | architecture a bad choice for them. So they went back to a | monolith architecture and tried to do fault isolation within the | boundaries of that architecture, which might have made fault | isolation not as good as in the micro-services architecture but | it was acceptable. | | It's incredibly tough to know the full effect of a trade-off on | your organization until you start going down that path. | | We're early in the process of adopting a micro-service | architecture. With only a handful of services so far, I can | already see how a team of two is going to spend a lot more time | with operational issues and debugging. | dpix wrote: | I see a lot of places that seem to either think that: | | 1. Microservices will let them ship things faster or | | 2. It's microservices everywhere or nothing | | Microservices might let you ship faster if you are really good at | deciding where to draw the lines between services and really good | at managing multiple deployment pipelines and all the infra - | that's a pretty tough ask. | | Also, if you have a monolith it's perfectly fine to pull out one | or two parts that need to scale much more efficiently and leave | most of your codebase in the monolith, but a lot of times I see | companies think once you have created one microservice the | monolith is now the worst thing possible and it needs to be | broken up entirely. | | My general rules for this are to always start in a monolith and | break things out as they start to fail or break other parts of | the codebase, and don't go all in just because you now have one | microservice that works well by itself | cytzol wrote: | This, this, this! It's been said elsewhere in these comments, | but the term "micro"-services really do them a disservice, like | it's expected that you need to break your application up into | little pieces, to eliminate complexity. But many applications | are inherently complex, and splitting them up isn't going to | get you anywhere. | | I've been trying to advocate for a "solar system model of | services", where you have a big core application in the middle | (the sun), surrounded by helper services of various kinds. Your | important business logic can be left alone, but the database, | other data stores, functions, timers, queues, integrations with | third-party systems, one-off jobs, and other things can all | stay in orbit. | | There _are_ benefits that you get from multiple services that | you don 't get from a monolith: having to rely on service | discovery instead of hard-coding addresses or passwords, being | unable to assume that the server your code is running on will | live forever, and requiring a concrete CI-CD pipeline to get | your code up-and-running are all good things to have, no matter | your model, so it's important to have a clearly-defined process | for them. A service-oriented architecture can give you that -- | put down the pickaxe, you don't need to split the monolith in | two. | throwaway894345 wrote: | Another aspect no one seems to talk about is whether your | deployment is monolithic or fragmented. It seems like a lot | of the pain of managing microservices comes from designing a | coherent CI/CD pipeline, how to share libraries between | various microservices, etc. If you have a monorepo, good | build tooling, and a good infrastructure as code tool, I | think much of that pain goes away, but none of those things | are easy and the precise selection and combination of tools | depends a lot on your organization (I wouldn't recommend | Bazel or Nix--build tools--to a small or medium-sized | organization, for example). | cgrealy wrote: | >> If you have a monorepo, good build tooling, and a good | infrastructure as code tool, | | Yep, and so many organisations ignore these. Especially | after a less successful transition to micro-services. | | "you mean you want to spend more time doing non-customer | visible development? You just did that micro services thing | a while ago!" | | "Yes, but to take proper advantage of that we need to | invest in the right infrastructure and tooling" | | "how can I sell that?" | throwaway894345 wrote: | Honestly, that sounds like the devops team didn't | communicate well with the business when they pitched them | microservices. The business can't reasonably know that | moving to microservices entails a change in | infrastructure and tooling--you have to build that into | your high level estimates. | gregmac wrote: | I've found it most helpful to think in terms of deployments: | Each (micro)service effectively gets deployed independently. | | One implication of this is you need to ensure your APIs are | backwards compatible with any other services - even if it's | only one service that your team also manages. This also | includes databases, if shared by multiple services (which I | won't get into, suffice to say congrats, your database schema | is now also a crappy API). | | As soon as you start having concurrent deployment dependencies | -- that is, the updates for service a + b _both_ have to be | deployed at the same time or things are broken -- you 've | effectively built a monolith anyway, just with an annoying code | layout (eg, spread across multiple repositories). | | You can use orchestration to tie these deployments together, | but this means you're effectively building a monolith with a | microservice architecture. Is that _really_ what you want? | dpix wrote: | Sharing databases across services (micro or not) is generally | a pretty bad idea exactly for reasons around versioning. | | Versioning APIs is a pretty standard way to get around this. | | If your deployment relies on synchronized service deployments | you really dont have independent services at all. | danenania wrote: | "Sharing databases across services (micro or not) is | generally a pretty bad idea" | | I don't think such a blanket statement is justified. There | are plenty of situations where it may make sense to pull | out some functionality into its own service--so it can be | written in a different language, scaled independently, | isolated from failures, or whatever--but where giving that | service its own separate database would be serious | overkill, complicating ops and introducing potential data | integrity issues for no real benefit. | | "If your deployment relies on synchronized service | deployments you really dont have independent services at | all." | | So what? That's really the point: blindly following the | Microservices (TM) doctrine is often a mistake. It's better | to just solve whatever problem you're facing in the | simplest possible way. While that _may_ mean by-the-book | microservices with independent databases, in many cases | something in between is a better choice. | dpix wrote: | I didn't mean it as a completely blanket statement, hence | why I said "generally". In my experience it's a lot | harder to manage a contract between a db schema and | multiple codebases over managing versioned contracts | between APIs. | | "It's better to just solve whatever problem you're facing | in the simplest possible way." | | I completely agree with this, but I dont beleive that | syncronizing deployments across multiple services is ever | simple - have been in this situation at a past company | where it would take an entire week every 3 months to do a | deployment | danenania wrote: | Fair enough, but I think even "generally" is too strong. | There's a huge cost to splitting into multiple dbs, and | I'd say it should be avoided by default unless the | benefits clearly outweigh the complexity costs. Just to | give one example, authentication gets _way_ more | difficult with separate dbs, and you get a whole new | class of potential security bugs. | | Your concerns about versioning and deployments are | certainly valid, but I don't think they outweigh the | costs of turning your data layer into a distributed | system until a project gets very large or those issues | are actively causing you headaches. | folmar wrote: | Writable views or stored procedures are a pretty standard | way to versioning database access from clients. | SquishyPanda23 wrote: | > this means you're effectively building a monolith with a | microservice architecture. Is that really what you want? | | I actually kinda do want that, although maybe it's a niche | thing. | | It would be nice to be able to deploy a monolith that's | already cut at seams where there's an obvious API boundary. | At one extreme, you could imagine a single binary where | processes communicate via RPC. | | What that would give you is an easy way to split off | microservices as they're needed. | | I'm sure somebody has done work along these lines. | dpix wrote: | This is actually a similar approach to how next.js deployed | to vercel (previously zeit) works by default. Each page or | api endpoint is served by an individual lambda function so | they can scale up or down independently | | https://nextjs.org/docs/deployment#optimized-for-nextjs | stcredzero wrote: | As Matt Easton says: "Context!" | | I think "5 Whys" might be a useful exercise here. | | Why was building X as a microservice faster? [reason]? Well, | why was that? | | _My general rules for this are to always start in a monolith | and break things out as they start to fail or break other parts | of the codebase, and don 't go all in just because you now have | one microservice that works well by itself_ | | I like this. A key tactic is to always do things, such that one | can change one's mind! | eweise wrote: | Starting with a monolith could lead to really difficult | refactorings unless you structure the code in a way that it can | be easily decoupled. | afarrell wrote: | I once worked in a monolith that was structured in a way that | it could have been easily decoupled. It never was because the | codebase was so modular and well-tested that the only time we | ever felt the need was when trying to assign ownership to | runtime exceptions. | | https://gocardless.com/blog/getting-started-with-coach/ was | the framework. | mikepurvis wrote: | Exception triage often requires examining the stack | regardless-- even if you have multiple processes, you're | still going to have errors bubbling up from your pool of | shared library code. | stcredzero wrote: | Law of Demeter! | | That idea had a lot of influence from Smalltalk, where the | natural way of developing was in a monolith. So tactics like | that which are about decoupling by default were a good idea | in that context. | | https://wiki.c2.com/?LawOfDemeter | JamesBarney wrote: | Monolith -> microservices : difficult refactoring | | Microservices -> monolith : difficult refactoring | | Microservices with poorly chosen context boundaries -> | microservices with well chosen context boundaries: very | difficult refactoring. | eweise wrote: | "Monolith -> microservices : difficult refactoring" I guess | my point is that it doesn't have to be complicated if you | architect the monolith carefully. That usually doesn't | happen though because frameworks don't necessarily promote | the practice and projects are short sighted. | JamesBarney wrote: | It's also really hard. Trying to determine how to split | up any code base into logical divisions such that you | when adding the next 5 years of functionality you'll have | the fewest number of cross division processes is hard. | | This is why Martin Fowler recommends starting with a | monolith and refactoring into microservices unless you | have extensive experience building out very similar | applications in the same domain. | dpix wrote: | The same argument can be made for building separate services | too. Could become very difficult to merge data between two | services after you had redundant information being saved | across the two because of a bad design up-front. | rhizome wrote: | The thing that jumps out to me: there are WAY more page-loading | indicators now than there has ever been before. Lots more | jumping content, lots more laggy content population, many more | elements sliding around...I know "worse is better" is a truism | of sorts in technology, but this is ridiculous. | | What good do any of these architecture decisions make when the | experience for the user, the _customer_ , is measurably worse? | I mean, aside from not being able to interact with elements of | a page before a chain of JavaScript finally gives the all- | clear, sites clearly _look_ worse with grayed placeholders and | whatnot. There should be a Conway 's Corrollary for revenue- | oriented choices. | [deleted] | Tobani wrote: | At my current place of work we have | | 1 monolith and 2 "Micro-Serivces" | | Working in the monolith is fine, but running tests is slow | because it is a giant rails app that is 7+ years old. | | There is 1 "microservice" that does its thing and the few | people who need to interact with it like it. | | the second microservice was created, deployed and abandoned. | Now people want to move it into the core monolith. It is a | distinct unit of functionality that doesn't really have any | overlap with the core app. I'm going through and adding all of | the tooling to this project because it enables us to solve a | certain class of problem (Report generation) that the monolith | can't do very well for a couple of reasons. Articles like this | have fueled the fire to re-combine it but the pain points have | nothing to do with this particular service being separate. | JamesBarney wrote: | If it's working well why change it? | | If your co-workers argument is just "microservices bad" then | obviously they are making a mistake. But in the general I've | seen far more frequent inappropriate splitting of monoliths | than inappropriate combining of microservices. (this is | honestly the first time I've heard of it.) | Tobani wrote: | Honestly it doesn't work well now as a developer. It is | about a week worth of work away from being a great | developer experience. They'll come around. Honestly every | time I have split out a separate service it is because the | current state of affairs is _bad_ and there is a distinct | need. Those handful of things have been rock solid and | needed very little attention, but it has been a last | resort. | chrisan wrote: | I mean you admit it yourself, far too often the splitting | off is inappropriate. Normally an inappropriate | microsservices is a net negative over all that costs you | money in the long run. Just because its working doesn't | mean it is efficient. | | My last two "assimilations" where because one microservice | was written in Java. The original guy left and no one | (around the company) likes to touch Java (or pretend they | don't know/do it) which means it was alaways me who had to | update it. It was a very small service, likely why he | thought small = micro! but it was about 3 hours of work in | the monolith. Now anyone can update/contribute to it and | not bug me every time | | The other was a microservice that only served the monolith. | New features required the monolith to be updated in order | to realize the new features. | JamesBarney wrote: | Makes total sense. | NomDePlum wrote: | That advice of starting with a Monolith has consistently been | given by those involved in Microservices since the start. I | remember a Fowler article in particular. Unfortunately the "if | you only have a hammer everything is a nail" analogy holds true | when people start looking at where microservices may fit into | an overall system architecture. Their answer is invariably - | everywhere! | | Really small, reusable/shareable and stable domains are the | sweet spot for microservices. As you say that is most likely to | come from decomposing from a monolith. Microservices can really | help with building rich domain components in an overall | architecture and removing complexity from other components | through delegation to the microservice is my experience. They | just don't need to be everywhere. | | The same problem of over-eagerness is becoming apparent with | some of the movement to event-based architectures. People | become obsessed acolytes and there is no other way. When in | fact they may well be ideal for a portion of your overall | system architecture but are unlikely to serve it all well. | [deleted] | resca79 wrote: | I think that microservice approach is good when you can share | those services between many applications In most cases | microservices can be the new premature optimization because you | can start to lose the focus on the product itself and think about | the the microservice as a product | neya wrote: | Microservice is not an organizational problem. Microservices is a | design problem. If you implement DDD (Domain Driven Design) first | to your application and then start to design the application | around your DDD concept, then, it might work. | | But, it's extremely hard even to do that. Microservices simply | complicates things if any of your domains need to share code with | each other. Many DDD paradigms exist to address this, but none | are practical. For example, authentication related code. IF one | domain sets a cookie and the other one has to rely on that to | keep the user (a shared model between the two domains) | authenticated, then this means, you need to duplicate code bases | across two domains or in the very least put them into some sort | of shared helper/library, which DDD is kind of against. | | That's why it totally makes sense to go Monolith first and really | identify the parts of your application that are slowing you down | either development wise, testing wise or performance wise and put | them into separate contexts. | | Phoenix actually does Microservices right. From all the way to | scaffold generation to instructing best practices on keeping your | domains properly separated. But even then, I've burnt my finger | many a times trying to write simple CMS solutions into mutliple | microservices then going back to monoliths again. | fouc wrote: | How many places have gone from monolith to microservices and back | to monolith? I'm sure there's been quite a few. | rapsey wrote: | Or they just drowned in their micro service complexity and | never made it back. | thinkharderdev wrote: | Exactly, I would wager that very few organizations go from | monolith to microservices and back. Getting organization buy- | in to do the "big rewrite" is hard. Getting buy-in to do the | second "big rewrite" after the first one didn't go well is | going to be even harder. | james_s_tayler wrote: | Just waiting for O'Reilly to drop a book called "Microservices | to Monolith" | PopeDotNinja wrote: | A few years ago when the topic of outsourcing/offshoring | development was a hot topic for conversation, I bumped into a | consultant at a bar. We got to talking about offshoring, and | he said he has two folders full of notes, one about | offshoring & one about bringing resources in-house. He said | he whenever one approach starts to peak, he starts pitching | the other one. | pjmlp wrote: | I bet plenty of them. | | A team that fails to understand how to write modular code, is | just going to write spaghetti RPC calls, while having to deal | with all the traditional failures and performance issues of | distributed computing. | | Naturally it is a recipe doomed to fail in the large majority | of cases, but it doesn't matter because whoever drove the | change is no longer at the company and a new consulting | team/new hire gets the money to drive everything back to the | monolith. | | So goes the money around on plenty of consulting gigs. | swah wrote: | I feel this at my current work - and the worst thing is that | they have some really smart folks which can understand the | whole thing and make it work for a few years more. | tartrate wrote: | > A team that fails to understand how to write modular code, | is just going to write spaghetti RPC calls | | This is interesting. I always assumed we were talking about | good developers here. | | I wonder what's a more likely cause for a failed attempt at | microservices. Is it developer incompetence and lack of | discipline, or is it environmental factors related to the | product and the organization? | pjc50 wrote: | For almost all works produced by more than one developer | the "good developer / bad developer" dichotomy is just | useless social darwinism. Talking about the team, | organisation, incentives, or business is far more useful. | | (My favourite example is John Romero, part of the very | small team that produced Doom - but who also produced | Daikatana, which keeps showing up on lists of notoriously | bad games.) | ratww wrote: | IME it is always environmental factors. | | When you have 200 developers working on the same product | without well defined boundaries it will be a mess with a | monolith, and a mess with microservices. | | Also arbitrary rules such as "one service per team" or "one | service per employee" that force engineers to jerry-rig | things that don't belong together. Either allow them to | make a new service, make or a new team, or admit that | microservices are not single-purpose and are just a blob of | multipurpose code. I've seen this way too much. | | Also pure organizational inertia working against good | engineering practices: sometimes a team will be severely | overworked while others are overstaffed. But god forbid | there's a temporary reorganization to improve the work of | engineers, so people send tasks to other teams, but there's | minimal communication between engineers. | xxs wrote: | Truth be told, no one stops you from having modular 'monolith'. | It feels the name was invented just to sell books and | conference tickets (and yummy consulting fees). | | There is no substitute for a good model and responsibility | separation, (micro)services or otherwise. | ratww wrote: | I agree. | | Writer Michael Feathers has an article where he suggests that | Microservices are a replacement to encapsulation, all we have | to do it use encapsulation well. | | https://michaelfeathers.silvrback.com/microservices-and- | the-... | bob1029 wrote: | We did this, but on the trip back we made some major | improvements. | | We didnt stop at monolithic service. We stopped at monolithic | repository+organization. There is now 1 VS2019 solution that | covers our entire business. All of our services can be built | out from this one solution via various configurations. We've | even created additional solution "views" for more focused work | (i.e. so you don't have to load a bunch of projects you don't | care about for a specific task). | | At this point, if we ran into scalability issues with a | monorepo, I'd start looking for better source control/CI/CD | technologies rather than splitting things up in hopes of | arbitrarily keeping git viable. The benefits of having all of | your source code in 1 repository with strongly-typed models | throughout are impossible to overstate. When checkbuilds | complete successfully in GitHub, we know the entire business is | clean. Not just 1 little aspect of the product stack. | gfodor wrote: | My takeaway from these kinds of stories is that microservices | make sense if it's no longer possible to operate a monolith. By | existence proof, that was clearly never the case at Segment. The | common fallacy seems to be that microservices lead to better | software via better architecture, regardless of human factors | like team size. My sense is that it's the opposite: microservices | are a necessary evil to scale teams past a certain size due to | the bottlenecks that emerge with monoliths as more people begin | trying to make changes simultaneously, and should be viewed as | neutral at best in terms of a software architecture pattern to | increase reliability, performance, etc. In practice, it seems | wise to keep your engineering team as small as possible for many | reasons, one large one of which is that past a certain point you | will be forced to move to microservices. All other things being | equal, that's a move you don't want to ever have to make. | | If you have hundreds of engineers then certainly microservice | architecture starts to make sense, since even the idea of | transactional deploys of the monolith break down due to queuing | at that scale. But jeeze, don't pull that trigger until you | actually find yourself backing up on necessary complexity like | deploy queues, PRs stuck due to inability to maintain the branch | given the velocity of master, etc. Don't let Conways law lead you | prematurely to microservices. If I'm ever in a position where I | am feeling real pain that leads to an urgency for microservices, | I am probably going to first ask the question if I can just fire | some people to make the problem go away. The risk of the | transition to microservices is just that high. | | It's the same rule of thumb with other things like hiring, | feature roadmaps, etc: YAGNI. If you are hiring someone before | the pain is so high the work cannot be done otherwise, building | features before you have people explicitly showing the need for | them, or making deep, cross cutting architectural changes that | impact everyone before they are strictly necessary due to | concrete problems with shipping software, you're probably | choosing the wrong use of opportunity cost, capital, etc. | pulse7 wrote: | TL;DR: "If microservices are implemented incorrectly ... you're | drowning in the complexity." | the_mitsuhiko wrote: | I want to see the microservice architecture where you don't | drown in complexity. | yehosef wrote: | Could it be valid to say that even if microservices are | implemented correctly, you're swimming (if not drowning) in | complexity? But for some problems and teams, that's better than | the alternative. | boffinism wrote: | That final paragraph is pretty brutal. Are engineers really so | reliably obnoxious? | 7777fps wrote: | In general, yes. | | Everyone seems to have their preferred style of coding, and it | is an easy defence mechanism, when presented with anyone who | tries and finds it wanting, to say that "Well they didn't do it | properly". | | You find that with Microservices vs Monolith, Strong types vs | Weak types, Exception Handling vs Results, Agile vs Waterfall. | | People fragment into camps which turn into echo chambers and | it's easy to dismiss anyone who doesn't commit to that cult as | being unpure and not worthy of being in the cult anyway. | patsplat wrote: | Is it about process space and programming languages? Or is it | about source control and CI architecture? | | How is a monolith different from a monorepo? | malisper wrote: | If you take a look at some of Segment's open source code, it | isn't hard to see why they wound up struggling with | microservices. It looks like they subscribe to the "left-pad" | style of software development. They have tons of repositories | that have less than 10 lines of code. They have a two line | repository for calling _preventDefault_ [0], a four line | repository for getting the url of a page[1], and a eight line | repository for clearing the browser state that calls into eight | different packages[2]. | | Disclaimer: I run a Segment competitor. I'm pretty biased, but | still... | | [0] https://github.com/segmentio/prevent- | default/blob/master/lib... | | [1] | https://github.com/segmentio/canonical/blob/master/lib/index... | | [2] https://github.com/segmentio/clear- | env/blob/master/lib/index... | arno_v wrote: | Oh my god! Who in its right mind comes up with this? The | boilerplate is 10x the size of the actual code :'( | freedomben wrote: | Others have covered most of my thoughts but I haven't seen | platform mentioned. | | If you already have a platform like Kubernetes/OpenShift | (preferably with a service mesh) micro services make a lot more | sense to me and can be done well. It gets easy to deploy and | scale independently, but still have very low latency | communication with a strong security model built in. | | If you are deploying everything to completely independent | platforms/infrastructure, I get a lot more conservative with | "what should be its own service" and what shouldn't. Building a | distributed monolith (a bunch of dependent services that aren't | reusable/composable) is the worst of all worlds. | ajsharp wrote: | I see quite a few people defending microservices; the org is the | problem, they must not have written the software correctly, etc. | Most org structures are not great. Most software is not great. If | you expect the exception to be the rule you're setting yourself | up for a career full of disappointment. | | Microservices are a modern re-branding of service-oriented | architecture, but 'microservices' sounds cuter and less like it | belongs in Java-land, and there's some theoretical idea that | splitting your app into even smaller pieces will somehow make the | whole thing better. | | SOA/microservices solves a few problems and introduces a great | many. The original SOA proponents were pretty explicit about | this. Beware! There be dragons here! But one of the main pieces | of prescriptive advice from domain driven design is helpful for | splitting into distributed services: split along domain lines | with minimum inter-service dependencies. Payments is an obvious | one. Microservices seems to buck much of this advice in favor for | a blissfully ignorant principle of "small" or "isolated". Good | luck isolating something that is not meant to be isolated. | | Scaling software is hard. Scaling teams is harder. Trying to | scale teams by scaling/distributing software is an understandable | goal but extremely hard to pull off because of additional | complexities and costs you incur in doing so. Dev gets harder, | deployment/ops becomes harder, testing becomes harder. Cross-team | communication, documentation, API publishing and adherence goes | from being very low impact within an org to suddenly being | critically important. | | To do SOA/microservices effectively you need complete | organizational buy-in, and you have to commit completely to | developing tooling and solving all the associated problems in | moving to a services approach. Often, it's easier to just put it | all back together, organize the code in such a way to minimize | merge conflicts and wait for the ungodly slow test suite to run | in CI. There are good reasons you rarely hear SOA/microservices | success stories outside of enormous companies (Netflix, Facebook, | Google, Amazing, etc). Doing this stuff takes an enormous | investment and commitment from the entire organization, and there | are just lower friction ways to skin this cat if you don't | operate at mega web scale. | | Growing a monolith is hard. Growing a microservices/SOA | architecture is also very hard. Growing is hard. | DrScientist wrote: | > split along domain lines with minimum inter-service | dependencies. | | Exactly, and done right that quite often means big | 'microservices'. | | All too often I see the 'functional programming disease' where | the aim is to deconstruct to the smallest possible reusable | functions ( 'micro' services right? ), often prematurely, | creating high levels of compositional complexity and with zero | tools to help you understand how the actual 'app' - say payment | system works if it's distributed across 20 services. | | Yep each single microservice is simple - but the payment system | might not be and that's what you need to understand - better if | your payment system is one thing - with maybe one or two things | separated out if you need to scale that part. | capableweb wrote: | "Yep each single microservice is simple - ..." but the whole | is not. | | I always find it more interesting what's _not_ in the single | microservices, the stuff you do see. When you make a diagram | with boxes and arrows, the interesting stuff would be the | arrows, not the boxes themselves. | crdrost wrote: | Indeed my loudest prescription to people doing service- | oriented architectures of any kind is to simplify these | arrows. | | The common mistakes that I see are for two services to | share read access to a common database, or to discover each | other and send RPCs to each other. Both really dangerous | for exactly this reason! The common database obscures how | the two communicate with each other, and invariably | everything connected to a database becomes one service -- | call it a "mini-lith" if the overlapping sets created by | databases do not cover the whole architecture. The problem | is the preponderance of implicit arrows; when I reason | about what it means to make this datetime nullable so that | I can store such-and-so, I need to consider whether | everybody who can read that datetime will be prepared for | its nullability. | | RPCs and APIs are the same way. I add a contract about what | I am outputting and then everybody needs to know about my | contracts and I must commit to them or else modify all of | my consumers. So because the arrows are bi-directional | everything just becomes one monolith again. | | Instead, I recommend message brokers -- all that pubsub | stuff. A given service tells all the other services | simultaneously "this happened," and it is their | responsibility in their codebase to listen for that event | and then say "okay, then this must happen." Publishing a | new version of the event is done by just emitting both the | old and the new version of the event and perhaps having a | shared standard for deprecation across the codebase so that | you get deprecation warnings in your prod logs. | | Every service has its own database and they generally only | communicate to each other through these broadcasts, makes | the arrows into the "stuff you do see". | ajsharp wrote: | Completely agree. The micro thing is rooted in a desire for | simplicity, which is laudable from a theoretical perspective. | Small is simple and simple is nice to work with. But in any | production software it's usually a pipe dream. | | Kind of the whole point of software is to take a bunch of | complexity and make it simpler for the end user. The fact | that the software visually looks like shit or is difficult to | work with because it's difficult to reason about is a rather | unfortunate side-effect, but usually has no bearing on actual | business success. | | There are lots of things we should try to do to reduce | software complexity and make it easier and safer to work with | and change. But trying to force simplicity by way of size | usually has the opposite effect. | tabtab wrote: | It's sometimes said that in software, there hasn't been | anything truly new under the sun since the 1970's, just | incremental refinements or repacking under a different name. | And Lisp has been around since about 1960. | | So if any fad/trend comes along promising the sun and stars | of simplicity or productivity, search IT history and find the | downsides and trade-offs. | | I wish there were more KISS pundits than fad pundits. | breischl wrote: | >Cross-team communication, documentation, API publishing and | adherence goes from being very low impact within an org to | suddenly being critically important. | | Totally agree, but I think this is underappreciated by many. | People tend to wave this away by just saying we'll just use | Swagger/gRPC/whatever-doc-gen-tool, but that's not the main | problem. The problem is that each service needs to have some | coherent purpose, and must adhere to that purpose. Changes to | that must be reflected through a proper API change and | migration. But that requires thought, discipline, and | (sometimes slow) work. | | When you inevitably run into a situation where you could | instead throw a quick hack into the wrong service that will | make things work _now_ the temptation to do it very strong | (bonus points if this is due to regulatory changes). But now | you have an undocumented behavior dependency between those | services - they 're coupled in a subtle way. And eventually the | accretion of those results in a distributed monolith instead of | a plain-old monolith. | | >domain driven design is helpful for splitting into distributed | services: split along domain lines with minimum inter-service | dependencies | | Definitely, yes. But then when your business evolves in some | way that causes all your domains to be inappropriate, you're up | a creek again. I don't think there's really a solution to that, | though. | viach wrote: | That may sound cynical but if we agree that software development | is a show (bet, entertainment, whatever) for investors in 99%, | then microservices are good to keep people excited. | mikejulietbravo wrote: | I saw a talk with Alexandra from Segment before. When it makes | sense to go with monolith it makes sense. | | When it makes sense to use microservices, it makes sense. | | Doing anything for no reason whatsoever never makes sense. | | That is all. | patsplat wrote: | Note that one big database can decimate productivity as well. | debrice wrote: | "Monolith vs Micro-services?" is philosophy at this point. It's a | good brain exercise, a great starter for debate, it reveals a lot | of insights... all because there is no actual answer. | HeroOfAges wrote: | I wonder why they are so easily able to work with and integrate | external services, but they couldn't work with and integrate with | their own internal services. I think it has to do with the fact | that the boundaries to the external services are well defined and | enforced because there is a physical aspect to it. Perhaps they | lack the will to create and enforce those boundaries between | their internal services. | davedx wrote: | My experience of moving to a microservice architecture: the most | important consideration with microservices is "who will develop, | maintain and operate them?". You can split them down functional | lines, architectural lines, whatever you like, but if you don't | have teams with definite ownership of each microservice (and that | aren't swamped by maintaining lots of them like it seems happened | with Segment), it will become impossible. The "operational | complexity tax" is a real thing but is manageable if your | engineer:service ratio is sensible and considered. | mark_l_watson wrote: | I have always viewed using many micro services as something that | adds complexity, something to be used when necessary. | | I started working remotely as a consultant in the early 2000s | when my wife and I moved to a remote area. I had several | development jobs that used the same monolith pattern: I would | embed everything in a web app using Apache Tomcat, taking | advantage of work threads for background tasks. The only external | services were a database and crontab settings to frequently | snapshot databases. This pattern was so easy to code to, so easy | to debug and deal with any runtime problems. One customer | reported that a system ran without stopping for six years (ouch, | no OS upgrades??) until they restarted it on a larger server. | | Micro services can be great, but not always the best choice when | horizontal scaling is not required. | sealthedeal wrote: | They went to 50+ services in a few months, were applying the same | policies across all services. It sounds like they didn't plan | well enough and jumped straight into it, without any good DevOps | or infrastructure mindset. It was a disaster waiting to happen. | This shouldn't be an article that people read and say "Oh Im | never using Microservices". This should be an article people read | and say WOW that is exactly the right way to NOT break apart a | monolith. | [deleted] | danielrhodes wrote: | Before going full microservices, try writing your code in a hyper | modularized way and see if this doesn't solve your problem first. | hedora wrote: | Are there any case studies where microservices went well? | | From an end user perspective, Netflix runs in "constantly | degraded" mod. | | From an engineering perspective, they track "number of successful | stream starts", instead of percentage of the time 100% of their | services are working. That's a huge red flag. | | As a researcher, the monitoring and fault-propagation / modeling | work they've done to get it to stay up at all is impressive, but | it's not clear all of that tooling would be necessary if they | didn't have to reason about N^2 fault tolerance scenarios, where | N = 100's of microservices. That's on the order of one fault | tolerance scenario for each atom in the universe. | bradrobertson wrote: | Like others have mentioned here, simply pointing out examples | where microservices have failed doesn't imply that | microservices can't succeed. I've attempted to bake bread twice | and they both failed. I didn't conclude that baking bread can't | be done, but that my skills to do it were insufficient. | | There are lots of examples of successful companies using | microservices, but I believe the real problem is in defining | what constitutes a microservice. Most people call things | "microservices" that are nothing of the sort. I can | unequivocally say if you built a "service" that depends on | other things being 100% available (like another "service") than | you haven't built a microservice (ie: those things you built | shouldn't be called services). | | By that token, autonomy is a pretty important factor. The Udi | Dahan teachings (https://particular.net/adsd) (currently | available for free) promote this style of architecture. A | concrete example of a toolkit for building _true_ microservices | can be found in Message DB (https://github.com/message- | db/message-db) and/or Eventide (http://docs.eventide- | project.org/) | | I wouldn't suggest, however, that anyone can just watch the | course, pick up these tools and succeed. Like baking a good | loaf of bread, it takes a lot of skill, work and experience. | Whether or not you succeed at building microservices is | ultimately up to you and your team. | marcosdumay wrote: | By sheer number of attempts somebody probably got good results | with microservices somewhere. | | Netflix runs quite well in practice. I think they do redundant | service calls, what is the only minimally sane way to develop a | distributed system. The funny thing is that I have never seen | any serious discussion of redundant calls, except for it being | implicit on practical designs on the anecdotal "how it works | for us" articles that pop once in a while. Most times people | won't even discuss redundant servers. I imagine everybody | thinks it's obvious, and well, I would agree, except for the | fact that most people I see do not think so. | | But well, Netflix couldn't avoid having a distributed system, | so they aren't really representative for nearly anybody. | brown9-2 wrote: | > From an engineering perspective, they track "number of | successful stream starts", instead of percentage of the time | 100% of their services are working. That's a huge red flag. | | They don't measure how often 100% or their services are up | because perfect uptime is not the goal and is too expensive (if | it's even possible). If an internally facing service being down | doesn't affect a core metric like number of stream starts by | customers, then it's foolish to treat it as needing 99.999% | uptime. | realntl1 wrote: | Why do you assume they have more fault tolerance scenarios | simply because they have more deployable units? | | In every service architecture I've worked with in the last few | years, you could theoretically run every single "service" | within the same physical process -- provided they all shared | the same runtime/lang the way a monolith does. I tend to start | service architectures using Ruby exclusively with the Eventide | toolkit, so this is actually a viable approach for most teams | I've worked with. But it's never ultimately made sense. | Weighing the pros/cons, a consolidated deployment topology | wouldn't add any benefit, and it would actually make it far | more difficult for the operations folks, practically speaking. | | I've helped put services into production that 1. carry out | crucial, "core" business logic reliably and efficiently, 2. can | be scaled horizontally without changing the code, 3. never | raise exceptions or cause outages, and 4. don't need to be | touched for years because new features are more naturally | composed around them anyways (i.e. open/closed principle). | Practically speaking, it's quite a bit easier for human | programmers to reach this degree of precision with a smaller | program than with a much larger one. And if you add up a lot of | these high quality programs, you get a high quality system. | Building a high quality system out of a single program is much, | much harder for humans in practice. | | I'll use crude terms here for a second: every _good_ service | put into production brings a net benefit to the organization | relative to the same code having been entangled with an | existing pile of code. That may sound like a "No True | Scotsman" fallacy, but the _definition_ of "good" in this | context is precisely the net benefit being added. If you build | and deploy services that have a high degree of quality, you get | a corresponding benefit. If you build and deploy programs that | _don't_ stand on their own, _don't_ leverage durable messaging, | and take other programs down with them when they crash, then | you get a rather large mess on your hands. In fact, you never | had a service architecture at all; we call this failure mode a | "distributed monolith." | | I'll acknowledge that most attempts at microservice | architectures in the wild don't seem to succeed. Anecdotally, | they are particularly prone to failure when their architects | don't understand the underlying principles of distributed | systems all that well; they neglect important considerations | like messaging idempotence, the deleterious effect of | synchronous request/response messaging, and the need for | deliberate, thoughtful design. In other words, they build | systems out of N number of microservices, and get N^2 fault | tolerance scenarios, which you adeptly called out for being | foolish. They're arguably worse off than if they went with a | monolith, but neither would be an architecture I'd personally | want to work with. | hmeh wrote: | I'm currently working with realntl on a transition to | Eventide from a Rails monolith for a client project. We | reached a point where the monolith was getting harder and | harder to change. This is inevitable in my experience, no | matter how careful you think you are. | | Though the transition is still in progress, I can say that | the path forward is clear and hopeful. This company had | previously explored other "SOA" paths (distributed monolith) | and it was clear that those were very problematic. Luckily, | we were able to steer them to an actual evented architecture. | | As I said, it's still early days for this particular project, | but if you're feeling your monolith is getting harder and | harder to develop on, you should start looking into evented | architectures. Eventide (ruby)/messagedb (postgresql) are | awesome technologies and would be the first I'd consider. | Eventide also has a nice slack community filled with people | that are learning and improving their software design skill | both in the large (architecture) and the small (individual | classes/etc). It's small, but they're good people. | curryst wrote: | > As a researcher, the monitoring and fault-propagation / | modeling work they've done to get it to stay up at all is | impressive, but it's not clear all of that tooling would be | necessary if they didn't have to reason about N^2 fault | tolerance scenarios, where N = 100's of microservices. That's | on the order of one fault tolerance scenario for each atom in | the universe. | | That doesn't seem true. I would imagine that at Netflix scale, | you probably have request tracing libraries that can give you a | graph of service dependencies. Whether it's worthwhile to | consume that, or easier to just let Chaos Monkey run rampant is | another question. | | Also, I very rarely have issues with Netflix. Typically when I | do I can just exit the stream and restart it. Anecdata, but I | could count on one hand the number of times I've had a title | just not play, or Netflix be down entirely. | gowld wrote: | If Netflix were a monolithic, then the whole system would | collapse instead of degrading. | dx034 wrote: | A monolith can run distributed and be scaled across data | centers. It's not a mainframe application with one host. One | process can crash without affecting system stability. | musingsole wrote: | > Are there any case studies where microservices went well? | | You answered your own question with Netflix. While you're right | that it's not clear Netflix would've needed to develop their | chaos monkey tooling and the like, it's not clear at all at | that an equivalent system is possible as a monolith. Even if a | monolithic Netflix system were technically possible, it's not | clear if a monolithic system would be organizationally feasible | either (Conway's Law) | dx034 wrote: | Why wouldn't it be possible? It doesn't mean you can't | modularize the application. And scaling can also work well | for monoliths. I don't see how Netflix' service (browsing the | catalog, serving content, reencoding videos) can't be done in | a monolith. | 87zuhjkas wrote: | Well, lets assume N = 999, then N^2 = 998001, so nowhere near | the number of atoms in the universe, which is estimated to be | about 10^80. | mbrameld wrote: | I think the person you're replying to meant 2^N based on the | context. They're saying you have to account for every | possible combination of services being down. | vorpalhex wrote: | Microservices working well is entirely about the team, and my | current group of teams works very well with the monolith | pattern. A big part of this is because (for business reasons, | not technical ones) they frequently trade ownership of parts - | so if a service isn't well constrained it will be very quickly. | We also have mature DevOps practices and engineers handle | significant parts of DevOps themselves instead of just kicking | the can. | | But the reason I say this is about the team is because I've | seen a well built, well groomed service be passed off to an | outside team and immediately turned into a disaster. Same | service, same business case, just a team without the DevOps | savvy and willingness to follow the patterns. | | Netflix does some.. unusual things with microservices, mostly | with how they treat version rollovers. It's not bad or good, | but it looks different from how many other shops handle the | same problem and it means asking the question "is everything | working?" is extremely difficult but asking the question "how | many people are able to start watching?" is pretty easy. | sbellware wrote: | If the question "are there any case studies where microservices | went well" is a valid question, then so must be, "are there any | case studies where monolithic architecture went well". | | My point being that if and only if we have a track record as an | entire field of making decisions based on case studies, AND if | case studies have a track record of being objective rather than | proffered as a result of a marketing agenda, then the question | is ultimately legitimate. | | There are more shops by total count that fail with monolithic | architecture. That's inevitable just based on the infinitesimal | number of projects executed as service architectures rather | than monoliths at large in the wild. But still, we carry on | with monolithic architectural style as if its outcomes were | assured. | | It's far easier for the vast majority of developers to build a | monolith because it allows development to proceed without | having to have any knowledge of or practice with the tricks and | traps of distributed systems - an entire body of knowledge that | a developer might never get meaningful and practical exposure | to for an entire career. | | The trouble starts when microservices are attempted by | developers who can't imagine that there are entire bodies of | software development knowledge that developers aren't presently | in possession of. | | Microservices is just, as Adrian Cockroft used to say, | "Service-Oriented Architecture with bounded contexts". | | Web development is absolutely not a preparatory course in | service oriented architecture. But the vast majority of web | developers who attempt to take on SOA while simultaneously | presuming an omniscience in all things software development due | to their experiences only with monolithic web development will | often fail to build a SOA. They usually end up with something | that isn't quite SOA and isn't quite a monolith. And that's | where the failures largely come from. | | I work exclusively in microservices and SOA, and have since | 2015. Before that, I worked principally as a web app developer, | and did some work off-and-on in SOA implementations. And before | that I spent years becoming oriented to the architecture. I | don't make the mistakes that web developers typically do when | they presume that web development knowledge is a sufficient | prerequisite for working in SOA. | | So, it's not a question of whether an architectural style works | or doesn't. The majority of failures in microservices can be | attributed to ignorance and to the narcissism that is | permissive of it. | | So, I would ask this question instead: Are there any cases | where developer over-confidence and over-simplification went | well? | | These qualities don't tend to serve any architectural style | well. | | I've never heard of a well-designed SOA not going well. Every | single case of microservice project remediation that I've | participated in had as the most significant contributing factor | an utter disregard for the body of knowledge that the | microservices architectural style is built upon. | | There are a lot of things that developers can get away with | when doing the kinds of tinkering and wandering that typifies | typical web development work. But those things don't work once | we cross the line into SOA. And unfortunately, the incessant | chasing after trivial resume candy hasn't prepared the average | developer for the rigorous mindset needed for SOA work. | | As "microservices" became to next fad for perennial fad chasers | of the software development world, they finally encountered a | kind of work that they could not get away with by faking it. | And so, we see a lot of failures. But the vast majority of the | failures are personal failures and character failures, rather | than failures of an architectural style. | | The fat part of the developer bell curve was simply | overreaching when it presumed to try to get away with building | service architectures with the same level of disinterest in | architecture and process that we can get away with in typical | web development. Like a kid with copious experience building | kites presuming to strap themselves to a hang glider and just | "going for it". The outcomes are mostly predictable. | | In the end, if a little time is invested in learning the | fundamentals that have so far been eschewed for the sake of | expediency, anyone can succeed with SOA and microservices. It's | not that the realities of the architectural style are | unlearnable, but it can't be arrived at by the level of | tinkering and wandering that we can just get away with in | monolithic web development. | beastcoast wrote: | Amazon does micro services (or SOA) extremely well. In fact | they practically invented the concept. It's intricately linked | with the 2 pizza team and service ownership concept (you build | it, you support it) | goodpoint wrote: | Amazon does SOA with 1 service <--> 3 to 10 engineers. | | This is much bigger than the typical _micro_ services, and by | choice. | corpMaverick wrote: | and the concept of well defined API's for each service. | Legion wrote: | Monolith vs microservice feels like a higher level case of the | expression problem. | revskill wrote: | Whatever monothlic or microservice, it's all about modularity. | Monothlic or microservice is just the implementation on how you | achive modularity. | | So the problem here, to me, is how you design the modularity for | your system, not how you implement it. | rvz wrote: | Still waiting for Monzo's following blogpost on cutting down | their outrageous number of 1500 microservices [0] and moving some | back into monoliths. I'm not sure if I would be too excited over | the number of microservices if there is a degree of complexity | involved here. That is just too many here. | | [0] https://monzo.com/blog/we-built-network-isolation- | for-1-500-... | okal wrote: | Why do you think/feel that there are "too many"? What's the | threshold for an acceptable number of microservices? (Not | asking this to be confrontational. Just curious, because it's a | sentiment I've seen before, without the reasoning behind it | being articulated.) | sweeneyrod wrote: | One per developer seems like a fairly loose upper bound. | overlordalex wrote: | Even then this is risky - if that developer is hit by a bus | do you throw the service away and have another developer | write it again? | | We recently had an interview candidate say this when we | questioned the wisdom of having over a thousand | microservices: some in languages that only the one | developer maintaining them used! For me this is insane, but | I digress | | Monzo says that they have 800 people, and 1500 services. If | we're generous and say 500/800 are developers, then each | developer is responsible for 3 services! A team of 6 would | have 18 projects in their domain. | rkangel wrote: | There is a classic tradeoff here between top down | organisation dictates giving consistency vs engineering | independence giving flexibility. | | Two organisations that I know of who favour the latter | are Spotify and Netflix. It has benefits - different | languages are good for different jobs and engineers like | to be able to choose their tools. | | It would be bad if this was taken too far, and something | was written in a language only one person knows, but that | problem already exists with the technical knowledge if | something only has one mantainer. | lifeisstillgood wrote: | I have this thing about micro-services/complexity in that it | follows Conway's Law - the architecture follows the | organisational structure. | | If you push authority and decision making and responsibility for | a _service_ to a (2 pizza) team then guess what, microservices | work really well. | | If you have vast monolithic centralised production operations | teams, and no way in hell is their C-Exec going to assign two of | them to look after the user-login service, you might not do so | well. | | Like most things, the organisation needs to change to get the | best out of the opportunities software offers. Those that don't | will face increasing friction and eventually die off. | gilbetron wrote: | Conway's Laws isn't a law, it's just an interesting thought | experiment. Organization and architecture bidirectionally | effect each other, but not directly, and not completely. I hate | how current discourse invokes these different "Laws" as if they | are physical properties of the universe. I've worked at places | with a strong, hierarchical organization that created a | wonderful set of "micro" services, and I've worked at places | with a chaotic environment that developed monoliths. | | There are shitty hierarchies and shitty flat organizations, | just like there are shitty monoliths and shitty microservices. | | Sorry if you actually agree with this more nuanced view, it's | just that I've seen Conway's "Law" invoked more than once in | this discussion and it drives me bonkers. I get the same way | when someone ("Medium Developers" I call them, more than green | but less than seasoned who swallow everything the read on | Medium as gospel and run around quoting it zealously) quoted | liskov substitution principle at me as if it was one of | Newton's Laws. | SeeTheTruth wrote: | Thank you for everything you said. The reality is more | nuanced and depends on the specifics. The "law" being | zealously cited here isn't a rule. Nor is the thought an | approach is wrong if a big organization failed at it. | musingsole wrote: | Conway's Law is a physical law in the same sense as Murphy's | Law. | | It's also obviously true. The organization builds the | architecture. The architecture either helps or hinders the | organization. The organization builds a new architecture. | There's no indirect connection here. If you've seen | hierarchical organizations implement microservices, it's | because that organization's complement was a microservices | architecture. And likewise for a chaotic organization. | | --well, sidetrack: Aren't strongly hierarchical organizations | the best suited for microservices? With all the strongly | divided responsibilities and whatnot? | 87zuhjkas wrote: | > Conway's Law is a physical law in the same sense as | Murphy's Law. It's also obviously true. | | It's like a tautology: "In logic, a tautology is a formula | or assertion that is true in every possible | interpretation." | pestaa wrote: | 2 pizza team? | | Well finally I might get my own microservice after all. | Autowired wrote: | This metric is also unsuitable for Europe, where generally | pizzas are individual. | dx034 wrote: | You can get party pizzas but in that case the two pizza | team might be a bit large. | guywhocodes wrote: | Absolutely, you probably can't succeed with microservices | without selforganizing teams. You just get more hot potatoes to | drop | jbverschoor wrote: | Well.. just consider every "microservice" a separate company, | exposing its own product/service. Also think about all the | overhead that comes with it - product managers, finance, | recruitment etc. | pjc50 wrote: | See Coase and the "Theory of the Firm": | https://en.wikipedia.org/wiki/Theory_of_the_firm | | Occasionally companies actually do this by fragmenting | divisions into separate companies, such as outsourcing IT. It | has a very broad range of outcomes, from saving to destroying | the business. | dmix wrote: | So like monoliths vs microservices it's probably a balance | between the two (leaning heavily in one direction). | | I've never understood why it needs to be either/or. Is it | really that difficult to support a microservice deployment | that only represents 50% or even 20-25% of the org/project? | crispyporkbites wrote: | If all the services that the microservice needs are also | services behind an API, what's the overhead? Something like: | | _hire( "developer", 10, | "10x).addToPayroll().office("openplan", | "wfh").enforceHRPolicies()_ | | Is all you need | | The best thing about this is that you can keep everything in | change control and just rollback whenever you need to, or | spin up new companies at will. | TeeWEE wrote: | It seems like they introduce microservices for the wrong reason. | Instead of having a service per team, the focussed on services to | solve a technical problem: | | "Having a code repository for each service was manageable for a | handful of destination workers" | | Microservices should be introduced to make teams go faster, not | to decouple external api endpoints.... | Cthulhu_ wrote: | I mean you are right of course, but at the same time I can't | knock the superficial idea of having one codebase for one | domain-specific application. Applications / codebases like that | are usually not the problem; it's integrating them into the | larger whole where things start getting fucky. | ryanthedev wrote: | Poor design. Sharing code between microsercices is always a | design smell. | | You are just building services on top of another monolith... | | Sounds like you needed to abstract the work being send to the | worker, instead of abstracting the worker around the work. | | Meaning don't have many workers for one payload type. Abstract | the payload and have a single worker... | | That's why most systems become complex and spaghetti. Poor | abstraction, so you use shared code to fix it... | silvestrov wrote: | I see it like organization of large companies: you have to split | it into divisions, but you can't make every single person their | own division. | | Don't make the divisions too large, don't make them too small. | | The art is to make them the proper size for the particular | company. | | If you have a small company you don't need divisions. If you have | a large one, you need to make divisions as you no longer can | speak to every single employee. | brootstrap wrote: | "voices of experience pointing out that most decisions are made | based on the best information available at the time." | | funny in my experience with digital and particularly larger | corporate jabronis. The people who makes decisions are fucking | McKinsey consultants who know nothing about the actual project, | are only contracted for 6 months, then they are gone. Rinse and | repeat, maybe one out of every 3 or 4 attempts somebody actually | gets it right and the project doesnt completely fail. | mcansky wrote: | there is a related post on Segment's blog : | https://segment.com/blog/goodbye-microservices/ which helps to | get a bit more details and contexts | | update : and related video | https://www.youtube.com/watch?v=lv5o3qnQu5w | DrScientist wrote: | I'm struggling to understand the problem with shared code and the | desire to fragment the code repo! | | Why can't you have both independently deployed microservices and | a shared code base? | | If the deployment lifecycle is different for each microservices | and each _deployment_ is self-contained, then they can be | deployed with different versions of the code - even if they use | the same source tree and share code. | | Obviously the shared code needs to be properly maintained and | evolved, but it seems to me a lot of the software engineering | problems occur when people move away from source code | dependencies - with great tooling - versioning, diffs, debuggers | - to other types of dependencies ( shared libs etc ) where the | tools are non-existent or very simple. | | Now granted if you needed to fix a critical bug in the shared | code - that would require a redeploy of everything, but that | happens much less frequently than the need to deploy a single | service with immunity as long as your keep your microservice | contract. It also means the discipline of making sure every | services is deploy-able at anytime is kept to. | | And if you didn't share code - you probably wouldn't be fixing a | single bug once, you'd have much more code, with many more bugs. | gowld wrote: | > Why can't you have both independently deployed microservices | and a shared code base? | | This is what everyone does, so I can't even comprehend what | Segment was doing. Maybe they were deploying a fleet of | microservices inside a monolithic deployment? If so, there's no | wonder it failed. | zzbzq wrote: | We do separate code repos, my last place did separate repos, | place before that did monolith(s) but still did separate | repos for anything not in the same monolith. I'm pretty sure | it's more common to do separate repos, rather than mono-repo, | for separate services. | | Seems to me, though, the problem is people trying so hard to | reuse code. That's the main problem cited in the article. | People get really gung-ho about reusing code and creating | shared libraries, but reusing code is actually bad most of | the time. You should strive to only depend on things that you | can reasonably expect to not change, and that you don't need | to update even if a new version comes out. What you're | supposed to do is take that code in the shared library, and | make it a microservice, and obey the usual backward/forward | compatibility rules. | | Using a monolith hides that problem because the code remains | easy to update and build, but just as fragile and in need of | heavy testing whenever you change code modules that have | multiple consumers. That goes against the idea of mono-repos | as well. | kelnos wrote: | > _People get really gung-ho about reusing code and | creating shared libraries, but reusing code is actually bad | most of the time._ | | Disagree here, in general. I'm not in the ruby hyper-DRY | camp, but copypasta is not the solution to dependency | management problems. | | Creating shared libraries does require discipline; you | should do your best to just avoid breaking changes ever, | and on the rare occasion you must, you need heavy | communication and testing to ensure consumers find out | about the change. And you can only change the API of the | library; you can never incompatibly change how the library | interacts with other services. I get that this is hard, but | it's worthwhile if you can do it right. | | We have thousands (maybe even tens of thousands) of lines | of share library code at this point. Some of it is probably | not necessary, but most of it we'd be completely lost | without. Reimplementing core logic and utility classes and | auth code over and over again is a great way to burn out | your developers and create bugs. And these bugs are even | worse than your garden-variety bugs, because you have to | track them down and fix them over and over, and each fix is | slightly different because each reimplementation is | slightly different. | | I agree that sometimes sharing code is a bad idea, but | asserting it's bad "most of the time" is completely | antithetical to my experience. | [deleted] | topher200 wrote: | Segment's business in particular has them integrating with | dozens of unique endpoints. There's an inherent desire for | code-reuse in a system like that, along with customization | required per endpoint. | crimsonalucard wrote: | I bombed an interview before because I said microservices can be | really bad. | leogout wrote: | > One of the key takeaways was that spending a few days or weeks | to do more analysis could avoid a situation that takes years to | correct. | | Exactly my point when I was working on a new project architecture | and we had to choose between two authentication methods. Because | once all your applications rely on an authentication system you | can't just switch to the other one like that... Sadly we did not | take the time six month ago and today we are working on a | migration which could have been avoided. | mynegation wrote: | Why don't you share your insights? | gridlockd wrote: | Microservice-Architecture is one of these trends where the value | is unproven, the upfront costs are high and the unknowns are | unknown. | | There's also a clear conflict of interest with SAAS and Cloud | providers benefiting from the perception that microservices are | the way to go. | | Under these circumstances, letting _someone else_ figure out all | the issues is the wise thing to do. Thanks to the authors for | doing just that. | kkapelon wrote: | >Shared libraries were created to provide behavior that was | similar for all workers. However, this created a new bottleneck, | where changes to the shared code could require a week of | developer effort, mostly due to testing constraints. | | That is a big red flag. Microservices that suffer from shared | code changes are not really microservices, but a distributed | monolith instead. | pjc50 wrote: | This is really a time-of-binding argument; the difference | between a "library" and a "service" is that one is in-process | and accessed over function calls, and the other is out-process | and accessed over RPC. | | If you change code that other services are using, you can break | those other services. No way round that. | zzbzq wrote: | There are circumstances where they are equivalent, but | they're very different overall. Namely, if you use a service, | you update it once and see the new behavior everywhere. If | you use a shared library, you have to update and redeploy | every service. Libraries are strictly inferior in that | scenario. This sounded, to me, like it was Segment's problem. | They were updating shared libraries all over the place all | the time. | | I generally avoid creating shared libraries, they're a trap. | They have a very narrow band of usefulness squeezed in | between the more palatable solutions of creating new services | or just copy & pasting code and allowing it to diverge for | each different use-case. | Autowired wrote: | While that is true, a microservices architecture can (and in | my opinion should) rely on messaging and account for message | schema evolution. Dependencies between services should be way | less coupling than dependencies between an application and a | library. | marcosdumay wrote: | A library API can rely on versioning and account for schema | evolution too. Even different versions can coexist if you | decide that's important from the beginning (what is the | same requirement as with services). | | The only real difference is that services have a slow | serialized network interface that fails 4 or 5 orders of | magnitude more often than libraries, but can migrate over | memory domains. | caust1c wrote: | Schema evolution is just as big of a dependency hell as | managing direct library dependencies. With a monolithic | architecture, a lot of those concerns are contained within | the context of a single repo, and can be tested much more | easily than with many repos. | gridlockd wrote: | > Microservices that suffer from shared code changes are not | really microservices, but a distributed monolith instead. | | In other words, if you can share a lot of code between | services, a monolith is actually an appropriate architecture. | NewEntryHN wrote: | If you have zero coupling, it means you have multiple products. | gitgud wrote: | A good architecture is orthogonal, meaning parts can scale | independently... | | Shared code shackles everything together, like global | variables... | MaxBarraclough wrote: | That sounds like an overly broad generalisation. | | They might well all share the same basic framework code, of | course. Why not share code for recurring concerns like auth? | bauerd wrote: | Idea is that you have a service that authorizes transactions | klohto wrote: | Because if you share something (like auth for example), you | should have microservice for that. The question is not about | duplicate code, but about duplicate libraries that handle the | same thing. Decoupling the auth process into separate | microservice removes the bottleneck. | alkonaut wrote: | Eventually you'll have a service to format phone numbers in | the format that the company needs to be standard across all | services. | | If you don't want to do that, then you need a simple shared | library for that. | | The problem is that there is no easy way to draw the line | between "this is obviously a trivial library function we | should just link into our code" and "this is something we | can't share because it would create friction or break our | isolation". | | Auth is obviously a "service" but phone number formatting | as a service seems extreme. | jmt_ wrote: | I'm reminded of the classic problem of static utility | classes, where you have functions for say formatting | phone numbers, or computing a commonly occurring simple | mathematical function. It can be difficult to figure out | how to better modularize the functionality provided by | this class, the motivation typically being having a large | static utility class often violates the principle of a | class having a clear, single responsibility. Breaking up | a large static class into other static classes that | better encapsulate some functionality/concept can help | but isn't always the best solution. | | So lets say we have shared code for doing something like | phone formatting. My question for more experienced | microservice practitioners is -- does it make sense to | create a microservice for preprocessing data in general? | Phone number-formating-as-a-service is excessive but | creating a microservice for processing data where phone | number formatting is just one aspect of this service | makes sense to me. All other services can throw data at | the data processing service and get data back in some | sort of standard and expected way conforming to whatever | business logic/processing rules required. | curryst wrote: | One of the lines is going to be acceptable performance. | Your phone number formatting microservice is going to be | orders of magnitude slower than a client library. | | The auth service will likely have to hit a DB anyways. | Assuming the microservice call has roughly the same | network latency as the DB call and the DB has 0 response | time, it would double the total time to perform the auth. | It only gets more favorable as DB response times go up. | | More generally, I think microservices make sense in | scenarios where the time to process the request is longer | than the network latency incurred by making it a | microservice. Things that have to hit a DB are generally | okay. Pure functional things that just compute on CPU and | RAM are generally not, unless they're very | computationally expensive like running a simulation or | something like that. | gridlockd wrote: | > Auth is obviously a "service" but phone number | formatting as a service seems extreme. | | You clearly haven't finished drinking your Kool-Aid yet. | barrkel wrote: | Sharing code or reinventing the wheel repeatedly is inevitable | once you have more than one concern by which you can divide | services. | | For example: let's say you have lots of integrations, and you | need to scale compute, and parse and generate common data sent | to and from the integrations. | | You can either have a monolithic integration service which you | scale out on load; or you can have integration-specific | services that scale out on load and share your data parsing & | generation library. Due to multiple concerns, there's no "best | slice". | | FWIW, scaling out compute is a stronger argument to me for a | service boundary than responsibility segregation. Scaling out | requires distribution; scaling up complexity doesn't, though it | can help for other reasons, like CI/CD. I prefer FaaS | architectural patterns with the freedom to share libraries in | different functions (images) to services, especially if long- | running state is not needed. | kkapelon wrote: | Sorry for not being clear. | | Having a shared library is not a bad thing on its own. Making | the library a bottleneck is the anti-pattern. | | If you wish to have a shared-library of microservices you | should be prepared to have multiple versions of it running at | the same time without any pressure to update everything at | once. | | If your shared library is the bottleneck, it means that your | microservices are tighly coupled (hence the distributed | monolith) | dx034 wrote: | Reinventing all parts for every microservice sounds wasteful to | me. Especially if they handle the same data and/or use the | similar business logic. | kminehart wrote: | A common practice is to introduce services that handle shared | functionality. | | One common example is, instead of having a shared library | that reads & verifies JWTs, use a gateway service that | handles this before requests reach the upstream service. | | This means changes to your organization's JWT code will only | require a redeployment of one service, the JWT Auth service. | dx034 wrote: | But that also for input handling, formatting or simple | business libraries? Sure you could implement that as | services but that would probably result in up to a hundred | service calls for one customer interaction. Maybe it looks | clean from an architecture perspective but I can't imagine | how that'll result in a good user experience. | kkapelon wrote: | Let me clarify because I wasn't clear in the parent comment. | | Microservices using shared libraries -> ok | | Microservices "suffering" from shared libraries -> not ok. | jmilloy wrote: | That just sounds like the shared libraries needed to make | breaking changes less often. If you're going to make changes to | core code, it's going to take time to get everything up to date | no matter how your code is organized. In other words, shared | code needs to be treated just like a third-party | library/service (both from the developers and users points of | view). | gowld wrote: | One view is that the difference between a service and a | microservice is that a microservice can be sketched between | being a local library or wrapped in an RPC server. | jmilloy wrote: | > can be sketched | | What does that mean? | karmakaze wrote: | What's notably absent are descriptions of problems with | versioning interfaces, failures from network unreliability, or | problems managing connecting infrastructure, or poor delineation | of service boundaries leading to undesired change dependencies-- | which is to say it seems like they executed well. There's no sign | they fell into common pitfalls. | | There are definitely some good insights here that I don't often | read about. The idea that with a sufficient number of | microservices (say 50+) you not only treat your instances as- | cattle-not-pets you have to treat the service types en-masse as- | cattle-not-pets. This requires more automation and organized | management as pointed out by the need for tuned autoscaling | rules. This requires continued investment into automating things | you would do manually if you had 50- services. | | The other thing to consider is that going to microservices and | back to a monolith is not necessarily a failure. Microservices | are good for periods of high change velocity, once a platform is | mostly built requiring much less new development consolidation | completely makes sense. At all points, we're solving for | impedance mismatch, whether that's the org structure, velocity of | changes, or numbers of developers vs numbers of deployed units. | d--b wrote: | It doesn't seem like their end architecture is anywhere near what | they had at the beginning... It's a lot smarter, and it sounds | like it's a monolithic distribution system that manages hot- | swappable services. So the whole thing seems to fall in the | "micro services where we need them" kind of architecture. | | They just went from naive monolith, to naive micro services, then | to smart coupling of the two... | MatekCopatek wrote: | I always felt like the biggest benefit of microservices (for the | average company that just jumped on the band wagon) was simply | the fact it forced them to break things up. Yes, they could | achieve the same result with none of the overhead on a monolith, | but it would take... discipline. It's much easier to just enforce | a hard external constraint. | | Realizing this and circling back is still a useful life lesson. | vegannet wrote: | If your code is bad in a monolith, it'll be bad with | Microservices. If you can't build a good monolith, you can't | build a good Microservices architecture -- because it | introduces even more complexity and requires even more | consideration. | | Discipline is fundamental to good software engineering: you | can't force it with Microservices. | guywhocodes wrote: | I think this, approaching DDD, is the most common reason | engineers push for it these days. | curryst wrote: | Another reason is that it gives you more agency to adjust | your code. Want to refactor? Cool, I don't have to talk to 15 | teams about how this might impact them. Same thing with | changing a schema, changing scaling strategies, etc, etc. I | can do things in 2 weeks that would take 2 weeks of just | talking to people on a monolith. That might be more | organizational than a technical limit, but I've never seen an | agile monolith before. | pknopf wrote: | It isn't worth the added friction though. | | And if you happen to leak concerns in your services (in a | monolith), it's really easy to adjust, as opposed to having | to coordinate the deployment of 5+ services. | | And even then, a distributed monolith is still a risk. | | Micro-services add cement to your project. Be prepared to | keep boundaries you write for a long time. | nickcw wrote: | I think that the problem here was that they were fighting against | Conway's Law: https://en.wikipedia.org/wiki/Conway%27s_law | | > Any organization that designs a system (defined broadly) will | produce a design whose structure is a copy of the organization's | communication structure. | | I think microservices work well in organizations that are big | enough to have a team per microservice. However if you've just | split your monolith up and have the same team managing lots of | microservices you've made a lot more work for the team without | the organisational decoupling which are the real win of | microservices. | | In my experience it is really difficult to fight Conway's law, | you have to work with it and arrange your business accordingly. | ljm wrote: | In all honesty, I think the monolith/microservice distinction | misses the point a little bit. | | It's inevitable that the longer the codebase exists, the more | difficult it is to maintain. It's a battle that you can't | necessarily win and it's turtles all the way down as your | dependencies, and their dependencies, tackle the same issues. | | All it takes is one or two roughly defined APIs and you've | already created the nucleation point for ever-more tech debt, | and while you'll be able to tame some of it you won't manage | all of it due to business requirements, or other teams | depending on private APIs to save time, or whatever else you | can imagine. Switch the architecture and you'll either have all | your problems bunched in one codebase, or you'll have | distributed your problems all over the place. | | I'd go as far as saying that a perfect monolith and a perfect | distributed architecture are theoretical ideals that require | perfect communication to build them. | FpUser wrote: | So you are saying something in line of: let's increase our | development staff X-fold and then we can finally do the same | thing that way fewer people doing just fine right now? | dmix wrote: | Just because monoliths may have diminishing returns at | certain team/project scale doesn't mean the scale itself is | the problem... | FpUser wrote: | The problem is with people trying to do "cool" things when | completely unwarranted | Tomis02 wrote: | With microservices there's no way around it, as there's | additional overhead when splitting a for loop between | multiple services. Won't stop people from jumping on the | bandwagon though. | detaro wrote: | They're clearly not saying that. If your team is too large to | effectively work on a monolith, splitting it up can make | sense, _but_ you also need to split the team into smaller | groups responsible for different parts. And if you don 't end | up with teams responsible for individual services, you likely | split to small. And quite possibly, your staff isn't large | enough to warrant it. | kitd wrote: | As with a lot of things, it comes down to communication. | Between teams, and between the services they write. Which is | just another expression of Conway's Law. | | IIRC Fred Brooks pointed out that the # of bugs in a system | correlates closely with the # of lines of communication within | and between the teams. Joshua Bloch recommends in "Effective | Java" that, if possible, 3 potential clients should participate | in the design of an API, for the same reason. So a well- | designed interface or OpenAPI spec is worth its weight in gold. | | Ofc, "microservices" here means separate running instances | available on a network. But monoliths can be "service"-oriented | as well. OSGi was good for this in Java, but any system able to | load shared objects or plugins dynamically can follow the same | pattern. And the benefit is that, if your app hits the jackpot | and needs to scale outwards, the service interfaces, ie the | lines of communication, are already well-defined. | | So, service-oriented monolith first, then microservices if | needed. | beh9540 wrote: | > As with a lot of things, it comes down to communication. | Between teams, and between the services they write. Which is | just another expression of Conway's Law. | | This is so accurate. I've heard engineers give state not | needing to communicate, chillingly, as a positive for | microservices, like "we won't need to talk to each other if | all of us are working on different services". My other | favorite is using microservices as an excuse for why the | product isn't working "oh, _my_ service is working fine, but | _his_ service is doing this when it shouldn 't", when we're | on a small engineering team. | afarrell wrote: | > not needing to communicate | | _sighhhhhhhhh_ | | API documentation is a medium of communication as much as | any user interface. | | If you don't keep this in mind, then using your service's | application programming interface will be a bad experience. | dllthomas wrote: | I think there's an element of truth to the engineers' | claims. Working on different code bases means there are a | lot of things you would otherwise need to talk about that | now you don't. It's very much the case that you still need | your interfaces to be clear (in fact, clearer!) but those | discussions can be somewhat isolated, so more work can | proceed asynchronously. Just _how_ isolated depends on how | exact (and correct) the specifications are, which is a | question of trading up-front work against interruption. | organsnyder wrote: | > So a well-designed interface or OpenAPI spec is worth its | weight in gold. | | When I worked on a SOA team, I tried to begin any new effort | (whether a new API or modification to existing API) solely | discussing the API contract. It was (ideally) high-level | enough that business analysts and project managers would | understand it, and it helped to guide us away from getting | mired in implementation discussions too early. | | At that organization, we rarely had the opportunity to | involve multiple customers at the same time during design | discussions (we were typically engaged to help a specific | consumer implement a specific feature), but the institutional | memory in the SOA team helped us to keep in mind | existing/potential other users of each particular webservice. | hinkley wrote: | The last place I worked that split the devs into UI and | backend teams was in a sort of slapstick comedy situation. | Nothing ever shipped on time because the front end and | backend could never quite talk to each other or needed | elaborate conversations to do the simplest of things. This | was our new flagship project, I got consolidated in from | another team and ended up as a lead not long after. | | We had been doing some UML modeling, sequence diagrams | during planning, and still having this problem, so rather | than repeating the same action and expecting a different | outcome I started trying to flip the script. What ended up | working was not code diagrams but data flow diagrams and | sequences. To get X you need Y, and to derive Z you need A, | B, and X. To publish you need all five. | | After that, the APIs mostly wrote themselves, we reordered | a few different forms, but most importantly variance | dropped like a rock. | username3 wrote: | Can you share examples of your data flow diagrams? Do any | open source projects share these documents? | hinkley wrote: | Mostly these were white boarded, but essentially I/we | would draw a collaboration diagram (although I could have | sworn these used to be called something else). They | showed what data was needed to make certain decisions | (eg, a conditional drop down that is populated based on | another piece of data, or complex validation steps) and | where to get data that already existed. | dionian wrote: | activity diagram? | hinkley wrote: | Yeah it looks like the activity diagram was substantially | altered in UML 2.0. What we called an activity diagram | then looks more like a collaboration diagram now. | lubesGordi wrote: | Maybe its conways law, or maybe it's just that designing a | distributed service is difficult, and when you break a monolith | down, you're having to deal with distributing that monolith N | times, and solving those CAP issues N times, which usually is | not trivial. Not to mention tuning the network. | andy_ppp wrote: | Yeah, the problem with microservices is because the | organisation structure is wrong. I've literally heard every | excuse about microservices at this point. My architecture is | better but it doesn't have a snappy name; it's called the | smallest possible number of services that can be reasoned about | and network partitions are NOT necessary to create bounded | contexts in a codebase, often just a directory is FINE. | yowlingcat wrote: | I agree. I hate the term microservice for the same reason I | hate superlative infected clickbait titles. There's no need | for half of the word to exist. Service. What's wrong with | service? | cturner wrote: | Microservice implies systems that are decoupled for | deployment purposes. For example, Microservice A could | restart to a new version while Microservice B keeps | running. This is a more complicated interaction contract | than services where their deployment is coordinated in | concert. | xorcist wrote: | But this was true in the middleware type of products too, | and you can't get more monolithic than that. | brown9-2 wrote: | I don't think this is accurate. I've worked at companies | that did "service-oriented architecture" long before the | rise of the term "microservice" and it was clearly | recognized that different "services" shouldn't be so | coupled together you can't redeploy them separately. | vorpalhex wrote: | There was a period of time when Service had a different | meaning than microservice. A service traditionally may | exist across bounded contexts and be almost a mini-monolith | whereas a strict microservice should touch very few data | models and exist strictly in a bounded context. | | Of course real life is messy and plenty of people realized | writing small single purpose services was valuable, and | plenty of people build giant "microservices" that have | nothing to do with the original term and are just badly | constructed monoliths. | corpMaverick wrote: | It is probably too late to change the name. But you have a | good point, the "micro" prefix is highly misleading. | Furthermore, there is little guidance in the literature on | how big the microservices are. | rumanator wrote: | > There's no need for half of the word to exist. | | Yes there is. A service is a very generic concept to the | point it's only relevant as a high-level concept. | | The concept of a microservice makes all the sense in the | world if you look back to where we came from: web services. | When compared with all the work and requirements and | complications of using SOAP and WSDL and UDDI and | everything around, just sending small JSON payloads around, | and the ability to peel off smaller services leveraging | that architecture approach, was a far lighter and | uncomplicated way of doing business. | | I mean, the name microservices becomes obvious once you | look back and all that you see is macroservices. | JohnL4 wrote: | Plenty. A subroutine is a service. A library is a service. | A Windows daemon is a service. The vendor I just inked a | contract with provides a service. A web service is a | service. | | I really hate that word when used without further | definition. | wtetzner wrote: | > A subroutine is a service. | | Which makes the term "microservice" even weirder, given | that any microservice is going to be bigger than a single | subroutine. | lllr_finger wrote: | I agree with you, but I find some value in people using | that term - it signals to me that I should consider the the | architecture was prematurely split-up and could suffer from | the various pitfalls associated with microservices. | jrochkind1 wrote: | That's not what the person you are replying to said though, | "the organizational structure is wrong". More like: It is a | mistake to use microservices UNLESS you have a certain | organizational structure/capacity already. | | I think they were saying something more aligned with your | opinion than you read it as. | Retric wrote: | We are dealing with poorly defined terms. However, services | mapping ~1:1 teams was generally called service oriented | architecture not micro services. Micro services involved | breaking things into even smaller chunks, so backing off of | that idea really just means SOA as originally defined is a | bad idea. | parasubvert wrote: | That's not quite right, SOA as originally defined had no | mapping to team structure or deployment runtime, it was | mostly about defining discrete service interfaces and | ensuring your clients used that contract rather than back | channels to communicate. Most often you had a dozen | services running in a single app server cluster. Conway's | law was rarely discussed (with some exceptions). | | Microservices tended towards a single runtime per | service, ensuring the deployment lifecycle was tied to | the build lifecycle and thus allowing for independent | evolution. | [deleted] | Retric wrote: | I am not saying that's how SOA was defined, just that it | was used to refer to such team organization around | architecture. EX: _Amazon famously uses a Service- | oriented architecture where a service often maps 1:1 with | a team of 3 to 10 engineers._ | https://en.wikipedia.org/wiki/Microservices | | At the beginning Microservice was generally viewed as | more granular than SOA, though that's been backed off of. | strictfp wrote: | Noo! Building teams around software components cements your | architecture and prevents most cross-cutting improvements. | | I'll claim that splitting a well-structured monolith into | microservices will always make it less maintanable, but it | might be worth it if you need to for some reason like | elasticity or failure tolerance. | | But for the love of god, keep the design open. Don't tie the | existence of internal software components to peoples | livelihoods. | pjc50 wrote: | The opposite of "has a team around it" is "abandoned". Or at | least low down on somebody's priority list. | strictfp wrote: | That's generally true, and it's a big problem with | microservices, because they need so much upkeep. | | But if your code is living as a few hundred or thousand | readable lines in the common codebase, that isn't really a | problem. The code is there, readable and working, and if | anyone needs to change it they can. If it falls out of | fashion, it can be deleted. | [deleted] | yowlingcat wrote: | What is your alternative? Tying "the existence of internal | software components to people's livelihoods" across the | expanse of the entire codebase is the only remotely effective | approach I've seen to scaling the SDLC at scale. | cturner wrote: | "What is your alternative?" | | Aggressively small teams, with no hands-off middle- | management layer. | | You can build massive capability around a small number of | well-managed message-backbones and a single codebase. By | keeping the number of hands small and the structure flat, | you force high standards. (Skilled staff won't tolerate | distractions caused by bad engineering or inadequate | automation.) | | Heuristic for analysing firms: who has strategic power in | decision-making? Conventional answer: a group of hands-off | middle-managers who run on meeting tempo, and who are | valued by how many people and systems report into them. | Under AST: an engineering effort running on maker tempo in | cooperation with a hands-on sales effort. | | Microservices tend to have multilateral contracts with | other systems in the organisation. This steers all planning | towards meetings. This creates middle-management bloat. | herval wrote: | Is there any example where this works (articles, | presentations, etc)? In particular, anywhere with more | than a couple dozen developers? | dodobirdlord wrote: | Amazon has a famous love for what they call "two-pizza | teams" and you can find writeups about the philosophy by | searching the term. The joke is that a team should be | small enough that you only need to order two pizzas to | feed them all. The philosophy is about the number of | participants in the decision-making process. Keep teams | small and give them total ownership of decision making so | that decisions can be made by a small group of people who | work with each other every day. That way no meetings (and | certainly no cross-team meeting) need to happen for most | decisions to be made. | herval wrote: | Amazon is very well known for having A LOT of middle | managers too, so I'm not sure it's a good example? | wtetzner wrote: | > The joke is that a team should be small enough that you | only need to order two pizzas to feed them all. | | That's a tricky way to measure, given that I can eat a | large pizza myself in a single sitting ;) | strictfp wrote: | Think of all the open source libs. Generally speaking, | anyone can contribute to any part of the project. | | That's not to say that some people are better than others | at certain parts of the codebase, but you don't want people | fighting to keep old cruft in because it's on their job | title (figuratively speaking). | | You can organize around customers, use-cases, platforms, | concerns or other things. Some might naturally map 1-1 to | software components, but the software component should not | be the "reason d'aitre" for a team, rather the customer | experience or something else which can transcend multiple | interations of the software. | yowlingcat wrote: | I see, you meant things in a more literal sense. I | generally agree with you in that case, that the customer | experience should be the thing which the team owns, which | incidentally involves owning software components. But on | the other hand, it's also certainly the case that at a | company of a given size or in a given sector, certain | kinds of software components and infrastructure are not | directly customer facing and yet must be owned in house, | and logistically serve as one of (if not the only) | competitive advantage over competitors. | | Is it wasteful to have whole teams at GOOG, FB et al | owning and improving the state of the art of | infrastructure? It depends. At a certain point, there are | enough internal customers for teams to reach contribution | margin positive on engineering initiatives that have no | direct but only second order effects on customer | experience. | michaelcampbell wrote: | I've seen this pendulum swing both ways, often within an | organization. Cross functional teams owning code bases allows | divergence to specialize and ownership of a release, teams | with a single functional focus allows efficiency of work and | cross cutting gains. | | Both have their boatloads of suck, neither is inherently | better. Interestingly, trying to mix them to get the benefits | of each doesn't seem to invalidate any of their downsides; | often it exacerbates them. | mjburgess wrote: | > Don't tie the existence of internal software components to | peoples livelihoods. | | The claim is that such ties, at the macro-structure level, | are inevitable and exist regardless. | | The point is then to determine the best way either to | restructure the organisation, or, the code base, to cope. | strictfp wrote: | I think the ties arise because people are actively seeking | areas of responsibility. Software components are an obvious | grab if your eyes are on the software specifically. But | there are other ways of dividing your teams; based on for | instance customers, use-cases, aspects of the code | (performance, security). | | The problem is that the software usually keeps expanding | until programmers find it hard to cope. If you split teams | up so that some people are only concerned with a certain | part of the codebase, chances are you are going to grow the | size of the codebase by a quite large factor. | | I think there should be an incentive in place to keep the | codebase small and understandable by most. | jhrmnn wrote: | It's pretty hard to keep the design open once the whole | architecture is bigger than what a single programmer can keep | track of. Say, the Linux kernel. The overall architecture is | fixed, there's no way around it. At that point, splitting | into components that are maintained separately does no harm. | AFAIK the Linux kernel is maintained like that already in | practice, even if it's a single repo. | strictfp wrote: | I agree with you in such cases, but I'm willing to bet that | most codebases don't need to be as big as they are, and | that it's better to create an incentive to collaborate and | keep the codebase maintanable and small. | nickbauman wrote: | I cannot agree more: I worked at a company where we went from a | monolith deployed on IaaS with a couple handful of engineers to | Docker containers deployed on ECS with over 200 engineers. The | main reason we did it was because Docker+ECS was cheaper than a | bunch of EC2 instances and you can't effectively use 200+ | engineers with a single monolith. | | After 2 years we had over 450 microservices while keeping our | AWS bill flat or slightly decreasing. | wgjordan wrote: | On the other hand, over 200 engineers on payroll is way more | expensive than a couple handful! | | Presumably you're getting significant value out of the | additional engineering work in which case the architecture | shift probably makes sense (to stay aligned with the expanded | organizational structure), but there are also cases where a | small and flexible team maintaining a simple monolith would | be much more nimble and cost-effective. | [deleted] | darkr wrote: | > I think microservices work well in organizations that are big | enough to have a team per microservice. | | Presumably by definition we're talking about a few hundred | lines of code, or a couple of weeks development time here at | most. What does this team do all day otherwise? | tomc1985 wrote: | A team _per_ microservice? That sounds really wasteful. How | many microservices need constant evolution? | abraxas wrote: | There is nothing wrong with most developers working on and | communicating about the entire code base. Having teams work in | silos is not a benefit. You're touting as a benefit what is one | of microservices' gravest issues - teams stop communicating | beyond the surface level of their respective APIs. | marcosdumay wrote: | Have you tried coordinating entire teams to work on a shared | codebase? | | Honestly, I have never been in an organization so large that | this became a necessity (if you solve tens of different | problems, that would require almost thousands of developers). | But coordinating single developers without an API is hard | enough already, I can only assume for teams its nearly | impossible. | jacobr wrote: | Define "codebase"? You can have multiple services, user | facing apps or modules inside a single repository, but if | there are no boundaries coordination will be difficult of | course. | dahfizz wrote: | I don't agree with your premise that development structure == | deployment structure. There are plenty of good ways of | splitting up development of a monolith without the huge devops | headache of deploying microservices. | he0001 wrote: | But does conway's law require microservices? It doesn't say | anything about microservices. | camillovisini wrote: | > Melvin Conway, who introduced the idea in 1967. | he0001 wrote: | Yes, I don't think that you need microservices to be able | to tackle Conway's law. At least it doesn't have anything | to do with each other. | | You could still do microservices and still fail to deal | with Conway's law. | detaro wrote: | > _You could still do microservices and still fail to | deal with Conway's law._ | | That's what the poster suggests happened. Nowhere do they | suggest that microservices are overall required. | corpMaverick wrote: | You don't tackle Conway's law. You can't. You use it on | your favor by creating organizational structures that | reflect the design that you want in your software. | axegon_ wrote: | Mmmmyes and no. Depending on the size of your project, that may | not be the case. I've had to work with two titans of monoliths, | maintained by relatively small teams(anywhere between 2 and 6-7 | people for several million lines of code). At some point | managing a codebase this big within a single project becomes a | huge burden, for both developers and even more so for those who | develop and do code-reviews(first hand experience right here). | At times I've spent 3 weeks straight doing code reviews with 2 | notebooks filled with notes and diagrams of the different | components inside the code. And at that point, the easiest and | most sensible thing to do is chunk out large parts of the | project and put them aside as a microservice with the adequate | amounts of tests. For small projects, microservices make little | absolutely no sense. But in the case of something the size of | AdWords(which my two such experiences can be compared to), you | are playing with a raging lion if you decide to go monolith. | | My argument here is that it's not so much the size of your team | but rather the size and scale of your project that needs to be | taken into consideration. | BareNakedCoder wrote: | Good monoliths are highly modularized. But it's a whole | different thing to package up a module as a separately | deployable unit for external "public" use (external to your | app, that is, not your company). | | I'm just curious to know, when you said "the easiest and most | sensible thing to do is chunk out large parts of the project | and put them aside as a microservice" ... were these chunks | separately deployable units for external "public" use. | fennecfoxen wrote: | I think this is actually one of the reasons that | microservices became a thing to begin with: teams wouldn't | actually apply engineering best practices. | | Microservices actually make you encapsulate your code, at | least within the microservices, because you can't call out | to it directly. They don't necessarily _force_ you to | implement the single responsibility principle, but they do | a good job of pushing you. Microservices implement a | service-locator pattern through DNS or web routing, one | form of the dependency inversion principle. Microservices | make you pass data around as entities, instead of Active | Record instances. | | The price for this sort of thing is very steep, though; | distributed systems are inherently icky, harder to trace, | and more prone to failure, and besides this, you've added | network overhead to each service call. | | I wish more engineering teams would consider spending half | the effort of microservices on simply disciplining their | monoliths. They might get somewhere... | momokoko wrote: | _> They don 't necessarily force you to implement the | single responsibility principle, but they do a good job | of pushing you._ | | In my experience, if your services are developed by the | same people, and not separated by teams, engineers will | often tightly couple the services with fragile and opaque | dependent changes regardless. | | While in monolith this is painful, at least you have a | complete stack trace and the ability to run things | through a step debugger you orient yourself. In a | distributed system tribal knowledge tends to be your only | savior. | | When we design systems, we need to spend more time | thinking about what is most likely to happen as opposed | to what we feel should happen. | goostavos wrote: | >I wish more engineering teams would consider spending | half the effort of microservices on simply disciplining | their monoliths | | 100%. This is an uphill battle, though. I've encountered | so many engineers who equate "real engineering" with | "building giant machines." You just can't convince them | otherwise. | | I've watched people build giant, real-time stream | processing pipelines compromising tons of moving pieces | (lambda, sqs, s3, sns, stepFunctions, etc..) to build... | a reporting table, and all for... 1.3gb of data. | Literally. | | Ultimately, despite the "sell," I don't think | microservices as a forcing function for good practices | works in practice. If the team lacks the skills to build | a disciplined monolith, then they 100% lack the skills to | build a distributed one. | joshdick wrote: | You're right, and I think you've highlighted what makes a | good monolith so hard to build and maintain. | | You need to be disciplined to keep a monolith highly | modularized. For microservices, in contrast, their | architecture encourages modularization. | tinkertamper wrote: | I don't know that you need to be much more disciplined to | write a large application in a module way vs writing any | application in a modular way. A monolith could definitely | get messy though if you write them how I see people write | microservices. | axegon_ wrote: | Oh, all of those were heavily modularized to begin with. | But that wasn't enough to keep them manageable. So at the | end what we did is figure out which are the core components | between the different modules, isolate what they did and | put them aside in a smaller microservices, which were | easier to track, maintain and monitor. What was once the | monolith is now arguably just an interface/API for all the | heavy lifting which is done by microservices. Again, my | point is that all this must be done depending on the scale | and complexity of your application. If you are going to | make an authentication microservice for an application that | has 50,000 users which simply fetches a username and | compares a hash in a database, obviously you are doing it | wrong. I am talking about applications which in the | simplest of times operated on 24 different databases | located in completely different geographical locations(the | case of my first such monolith). Some of those databases | used different engines. And due to the nature of the | infrastructure and the requirements we couldn't simply | ditch everything and start over from scratch. So splitting | everything into microservices was the only option. And this | is something I was working on back in 2012 iirc so back | when microservices were considered witchcraft by most | people. And yes, I'm talking about several million lines of | code and 2 developers - my inexperienced out of uni ass, | and an utterly conservative dev twice my age. Took us | around 6 months but the project was extremely successful. | | There is this trend in technology - every few years | everyone changes their minds about everything: | | * 2012 - sql is the best. | | * 2016 - sql sucks, nosql is the future | | * 2020 - nosql suck, sql is the best. | | * 2024 - {fill in the blank}. | | The same thing is happening with microservices. But in | addition docker, kubernetes and recently unikernels have | joined the party. The concept is the same though. | | What I am trying to say is that either of those can be good | or bad in different scenarios. It's a question of picking | the most appropriate one for the situation. | pjmlp wrote: | The fun is that we have seen this so many times. | | Sun RPC, CORBA, DCE, DCOM, XML-RPC, SOAP, REST, gRPC,.... | dasil003 wrote: | If you've got 7 people maintaining millions of lines of code, | you're going to have a heavy burden no matter what you do. | Extracting a service does not a priori simplify anything. It | can encapsulate and enforce a more strict boundary, and | optimize compile time or test suite throughput and operations | for the extracted logic, but it always comes with overhead, | and if the interface between the services is not well-defined | and stable it can easily be a net-negative in terms of | productivity as you are now giving up your in-language tools | for distributed systems tools. Now if you have large swathes | of code stable functionality, then it's easier, but at that | point why not just isolate modules within the same codebase? | alyricalgenius wrote: | Problem with micro-services is that it comes with a huge amount | "that's the RIGHT way to do it" and infinite articles talking | about what they are and developers fighting over if your services | are too big or too small. | | That usually results in abandoning the effort to actually map the | use case of your particular application, model your services to | the size that make sense to your project... Any big enough system | will need some services or workers beyond a single monolith, it | doesn't matter if they say they follow micro-services, if they | follow any other type of SOA or whatever, these silver bullets | are killing engineering. Every project needs to take time to be | planned, thought it, refactored, analyzed. If you read a bunch of | shit on HN and go applying you end up with a random monster. | thedevopsguy wrote: | Without knowing more about their architecture it is difficult to | comment beyond the conclusion Alexandra Noonan came to, stated at | the beginning of the article. It looks like to me that the | architectural assumptions were changing too quickly due to the | demands of a fast growing business. Having all their code in a | single repository means that they can control dependencies, | versioning and deployment centrally, it gives them central | control of their software development lifecycle. I can't see how | they could not have had the same benefits of the monolith if | their microservices existed in a single repo to begin with and | had the appropriate tooling to enforce testing, versioning, | deployment across all services in the repo. I guess this is the | whole monorepo debate and tooling. | | This article for me is more about the complexity of managing a | large team across different sites where the architecture needs to | change rapidly when modularity is absent. They did get a | measurable benefit around performance, though. I wonder if | Alexandra will comment on the challenges of running a team in an | environment of this complexity? | gen220 wrote: | I totally agree with you. | | I think this article is more evidence against the credibility | of multi-repo than against "microservices". | | Anecdotally, my current place of work has grown to about 200 | engineers, maintains a monorepo, and hundreds of deployed cron | jobs, ad-hoc jobs, and "microservices". We have none of the | problems discussed here. We invest maybe 20 eng weeks a year in | monorepo-specific tooling, and perhaps another 30 eng weeks per | year in "microservices"-tooling. | pjc50 wrote: | If the microservices are in a single repo and tested and | deployed together then they are arguably no longer | microservices but a "distributed monolith"! | thedevopsguy wrote: | I'm referring to having the same testing, | deployment,packaging,versioning policies etc being | consistently applied across projects within the same | repository not deploying, testing and releasing together. | | It's the drift and inconsistencies across these concerns | across projects that makes deployment and operations less | predictable. | goodpoint wrote: | Spot on. In Amazon's SOA, having different services that need | to be deployed at the same time is a no-no. | BerislavLopac wrote: | As it is so often the case, the choice between monolith and | microservices is not a binary one; rather, it is a sliding scale | between two extremes. | | On one end we have a real monolith: a single executable binary, | with no external dependencies apart from the OS bindings. This is | very rare in practice, and most commonly found in games and | probably mobile apps; when it comes to Web-based services, even a | traditional idea of single-codebase app usually has a SQL | database as an external dependency. | | On the other end of the scale there is a complex system | consisting of hundreds or even thousands [0] of tiny services | that require complex orchestration mechanisms such as a service | hub or service mesh. | | So each team (in a wide sense: could be a company, organisation, | department etc) needs to consider where they fall in the | continuum, considering a) which architecture will provide most | benefit while b) still being maintainable by the team; both the | architecture and the team need to evolve together. | | [0] https://qconlondon.com/london2020/presentation/monzo | 87zuhjkas wrote: | I think we can have both architectures Monolith and Microservices | peacefully co-existing, with their own pros and cons. | crimsonalucard wrote: | I have an idea. Bring the concept of microservices into software! | | Within software module interfaces that can only communicate with | one another via socket like serial interfaces with no type | checking! | | Or simply have all your software modules running as forked | processes on the same hardware and have them all communicate with | one another via sockets or http. That means every software module | must be it's own server! | | To further imitate microservices, make sure that code in one | software module can never ever be moved to another software | module. Make it hard to reorganize things. Also make sure teams | can only ever work on one section of the code base. | | Does the above make any sense to you? If it doesn't make any | sense to you it's probably because code organization using | microservices doesn't make any sense period because the examples | above are literally doing the same thing in software that is done | in hardware. | | If it does make sense to you, then why are you using | microservices to add extra complexity to the code? If you can do | the same in software then you'd be doing the exact same thing as | the hardware equivalent minus the extra complexity of multiple | containers or VMs. | | Don't use hardware to organize code, use code to organize code | and use hardware to maximize performance. | me551ah wrote: | I'm just curious if there is a middle ground somewhere? | | On one end you have a giant monolith. All services rolled into | one which includes your API, Middle ware and then Database. | | One the other end you have microservices which bundle services | into individual distinct units with each service being | responsible for its API, middleware and database. | | Are there any preexisting patterns which seek to combine these | two and come up with an architecture which is midway between | those two. A few months ago I had read an article about Data | Oriented Architecture on HN which comes close though I'm | wondering if there are others. | boffinism wrote: | There's what DHH calls the 'Citadel' architecture, which is | basically you carve off a few small chunks from your monolith | where needed and call them 'outposts': | | https://m.signalvnoise.com/the-majestic-monolith-can-become-... | ulshv wrote: | Service-Oriented architecture? This node.js framework | specifically implements it: https://feathersjs.com (as an | example) | bencollier49 wrote: | > which includes your API, Middle ware and then Database | | Layered microservices are an antipattern. In most cases, | functionality is best divided by domain. | thinkharderdev wrote: | This is why I struggle with microservice architectures. It | seems like there is a basic contradiction. On the one hand, | it's vitally important that the microservices are carved into | the correct modules otherwise you get a nightmare of | operational complexity where simple functional changes | require coordinated changes across multiple services. But | defining the correct way modules requires a bird's-eye | architectural view of the entire system, which seems | contradictory to idea of self-organizing, independent teams. | I can see how it works when the right way to divide things up | is obvious or when you are dealing with IaaS or PaaS | services, but in a complex business domain who decides how to | carve things up? | marcosdumay wrote: | > In most cases, functionality is best divided by domain. | | So, SOA? | hinkley wrote: | > "If microservices are implemented incorrectly or used as a | band-aid without addressing some of the root flaws in your | system, you'll be unable to do new product development because | you're drowning in the complexity." | | Which is nearly verbatim what some of us have been telling you | since before the term microservices was coined. | | Coupling is the problem. Yes, microservices add friction to | coupling, but they don't prevent it. Coupled microservices exist | (boy howdy), and they're resource intensive, resistant to | evolution, or both. | sida wrote: | Might be a stupid question, it wasn't clear to me in the article. | | Did they go back to a monolith service or a monolith repo? It | really just sounded like monorepo | crimsonalucard wrote: | Microservices in terms of code organization was always a | redundant concept. | | You can organize code with functions and namespaces, why do you | need hardware to segregate code? It only makes the segregation | permanent but offers nothing else beneficial in terms of code | organization. | | The underlying reasoning was always that developers tend to move | outside of boxed software modules if it wasn't enforced by | hardware so the modules will end up not being modules but | everything will be blurred into monoliths. | | I always figured that if you want really hard lines drawn between | software modules you can still do the same stuff in software | itself, like why do you need actual silicon or VMs/Containers to | do it? | | The only real need for different services is performance, | otherwise all the benefits and downsides of microservices can be | replicated in software. | scott113341 wrote: | Previous discussion from her blog post on the same topic: | https://news.ycombinator.com/item?id=17499137 | stepanhruda wrote: | > There is now a single code repository, and all destination | workers use the same version of the shared library. | | What if I told you this is unrelated to microservices? You can | keep all of their sources in the same repository, sharing | dependencies. | deltron3030 wrote: | This older "breaking up the monolith" GraphQL talk from Prisma is | interesting: https://invidio.us/watch?v=_MmyTahR9ok | | Especially if you consider RedwoodJS, a new full stack JS | framework that's build on Prisma technology (their stuff is an | alternative to Rails Active Record ORM). My takeaway is that they | provide a similar monolith like experience by acting as a glue | between different services. | phodge wrote: | My org is starting to migrate from a PHP Monolith to | Microservices as a way of freeing ourselves from PHP. | | Microservices will require more time spent writing interservice | APIs, and code execution will be slower since many procedure | calls will require data serialization and network requests. But | we believe it will be worth the overhead to not be locked into | PHP for every new component of the project. | acd wrote: | Another advantage of monoliths is speed. Running on a Local L1-L3 | cache will be orders of a magnitude faster than serializing | network round trip and deserializing json in micro service. | | Performance per watt/dollar of computing. | zerotolerance wrote: | Having read their articles a few times, the issues that they were | attributing to microservice architecture were really CI problems. | hexmiles wrote: | > Also, a proper solution for true fault isolation would have | been one microservice per queue per customer, but that would have | required over 10,000 microservices. | | I'm a bit confused, they seem to imply that they need a | microservice per costumer/destination, but you generically have | one instance (aka process) per costumer not an entire separate | codebase. The article seem to use the same term for two different | concepts. Or i am missing something? | mping wrote: | Sounds like a job for Erlang | jillesvangurp wrote: | This is a discussion on pretty much every team I've been on for | the last 5 or so years. I agree mostly this stuff is done for the | wrong reasons. | | IMHO it doesn't matter if you replace microservices by | components, corba objects, rpc objects, soap services, etc. It | all boils down to chopping your software into smaller bits that | than immediately start having a need for sending messages between | them, finding each other, defending their boundaries, etc. | | So, the first mistake would be assuming this is a new problem to | think about. It's not. You can find similar debates about how to | chop up software ever since people moved beyond just having their | code ship in punch card form. | | The right discussion to have would be first deciding whether you | want to break down by your logical architecture so that your | deployment architecture reflects that or your organization | diagram (aka. Conway's law). Then the next step is deciding | whether your primary goal is network isolation of unrelated | chunks of code or enabling asynchronous development of these | chunks of code (if so, there are other solutions). Usually it | boils down to, again, Conway's law: different teams just don't | want their stuff to depend on shit happening in another team | because of internal bureaucracy and hassle. | | Now say you have a valid business reason or technical reason for | actually wanting to have different stuff be isolated (e.g. for | scaling reasons or security reasons). The next step is deciding | whether this means you also want to break up your code base. | Monorepos and microservices are a thing. Look at e.g. lerna for | node.js, or multi module gradle projects on the jvm. In Go this | is well supported as well. If you're really sure that you don't | want micro services because of Conway's law there are lots of | valid reasons for having a well structured mono repo with a bit | of reuse of shared functionality, a simplified review process and | more visibility in what is happening. | | IMHO people do this for completely the wrong reasons; like | wanting to try out some new language, organizational issues, etc. | that ultimately result in fragmented code bases, lots of devops | overhead and complexity (it's never simple or cheap), lots of | project management overhead, etc. You pay a price. | ChrisMarshallNY wrote: | This sounds like the old arguments about OOP. | | Turning everything into an object can make a small program into a | big program, so it's maybe not such a good idea for small-scale | stuff. | | http://www.solipsys.co.uk/new/TheParableOfTheToaster.html | | However, in my experience, OOP made it possible to do really big | stuff. | | It's all about not having a "one-size-fits-all" approach. I don't | think it's just about scaling architectures; it's about changing | architectures to match scale. | | It's difficult as hell to make these changes, because people get | invested in methodology, and insist on applying the same lens to | everything we do. | | It sounds like they had the right idea, but they probably had the | wrong people. | kumarvvr wrote: | The reason OOP made it possible to do big stuff, seems tobe | because it improved the average productivity of the average | programmer. | | With procedural code, you would need an exceptional programmer | to produce a big program. With OOP, an average programmer can | deconstruct a problem into its component parts and solve it, | mainly because, the human brain can reason about concrete | objects more easily, than say, abstract methods like functional | programming. | | Edit : OOP has encapsulation which, in my view, significantly | reduces the cognitive load when thinking about state management | in an app. I remwmber writing a small graphics library using | Borland Graphics Interface in Turbo C++. It was a breeze to do | because I know about 'things' I want on my screen and coded my | classes to reflect those things. | FpUser wrote: | "Turning everything into an object can make a small program | into a big program, so it's maybe not such a good idea for | small-scale stuff." | | In my experience OOP actually makes programs smaller. Assuming | of course they have good programmers/architects and the program | itself is larger than "Hello world". | darkerside wrote: | In my experience, OOP makes programs different. Might be | bigger or smaller, but the real difference is complexity. Not | in that it makes things more or less complex, but in that it | moves the complexity around to different places. Those places | being complex (and others simpler) might make it easier or | harder to maintain your program, which is what makes these | decisions highly dependent on your particular systems and | teams. | FpUser wrote: | OOP does not "move" complexity. People do. | darkerside wrote: | Guns don't kill people, people kill people. With guns. | FpUser wrote: | To get your line to a logical conclusion: do not program | at all | mbrameld wrote: | Ooh, sweet false dichotomy! | FpUser wrote: | Ooh, sweet equating of programming paradigm to guns. | mbrameld wrote: | Ooh, sweet non sequitur. | mbrameld wrote: | A distinction without a difference. | FpUser wrote: | There is a difference. OOP is just one of many tools to | help accomplish a task. Many other tools as well. It is | up to the people how to use tools for a job and what | tools for what job. You equating OOP with the dangerous | things that should be kept away has no basis in | programming. | afiori wrote: | The concept of footgun exists. | mbrameld wrote: | The way people use OOP causes them to move the complexity | in a particular way. That's why the distinction doesn't | make a difference in this context. You're right, | technically it wasn't OOP that was writing the code, it | was the person. We would have never figured that out | without your guidance, we all just though OOP was banging | away on the keyboard. | ChrisMarshallNY wrote: | Don't get me wrong. I love OOP, and have been using it since | before it was cool. It's been a standard wrench in my toolbox | for decades. | | In fact, I have been running into folks, these days, that | don't understand it, as, apparently, OOP is becoming | "uncool." | | I've always been a "right tool for the right job" kind of | guy. I started off with ML (Machine _Language_ , not Machine | _Learning_ ). I am quite comfortable, sitting down with a | breadboard, and flashing an OS. | | But I remember the old days of OOP, where "classic" | structured programmers didn't "get" OOP, and designed these | horrific chimeras. | | I always make it a point to understand my methodology and | drivers "to the bone." Just because someone at a conference | said it, doesn't mean that I should use it for everything. | jjgreen wrote: | Please write a blog post called "Horrific OOP chimeras" and | post a link on HN ... | ChrisMarshallNY wrote: | Oh...the stories I could tell... | | But I have made it a point of personal ethos not to post | criticism or polemics, denigrating/excoriating the work | of others. | | I know that could buy me a lot of clicks (and probably | some considerable HN Above The Fold time), but I think we | have enough negativity and finger-pointing on the | Internet. | | If you read my stuff, you won't see much of that. I may, | in a rather vague way, allude to something that gives me | a frowny-face, but I don't want that to be part of my | "personal brand," so to speak. | | I do take tremendous personal pride in my work; both | coding and writing, and hold myself to a high bar. I may | even project that bar onto others (only in some | circumstances), but I don't think it's helpful to do so | in public. | | I find it most gratifying to write a "This is how _I_ do | this... " post, as opposed to a "This isn't how _you_ | should do it... " post. | FpUser wrote: | Lots of words. What's the conclusion? OOP is bad? Or maybe | it is incompetent people who manage to f.. things up no | matter what you give them or people with the agenda going | on holy crusades? | ChrisMarshallNY wrote: | No, OOP is not "Bad." I'm not feeling particularly | argumentative. I apologize if what I wrote upset you. I | suspect that we may actually agree on most things. | | In some cases, it is not the best tool for the job, but I | find that I tend to use OOP for almost everything I do; | large or small. | | It isn't of much use in small utility scripts, though, | and some languages are just not written to natively | support it. In those cases, procedural (or FP) is the way | to go. | | There are new- _ish_ methodologies, like functional | programming, and protocol-oriented programming, that | deprecate "classic" OOP. Some folks are using these as | backing for declaring OOP "dead." | | I suspect that might be a bit...premature. My current | fave lang is Swift, which pretty much allows you to use | any methodology you want, or mix them together _(Will it | blend? That is the question)._ | | I have found that it isn't helpful for me to "write off" | _any_ methodology, and most of my work is actually a | hybrid approach; with elements of multiple methodologies. | | BTW: I'm a "lots of words" kind of guy. | | Prolix, JAMES Prolix... | FpUser wrote: | _" There are new-ish methodologies, like functional | programming, and protocol-oriented programming, that | deprecate "classic" OOP. Some folks are using these as | backing for declaring OOP "dead."_ | | Those are anything but new-ish. In programming new often | means that some old concept suddenly becomes fashionable. | Myself I do not restrict to any single paradigm and use | what I believe is the most suitable for current task. | ChrisMarshallNY wrote: | Note the _" -ish"_. I know that they aren't actually new, | and that many "new paradigms" are actually rebranded old | stuff (I have been writing software since the early | 1980s, and have seen these waves sweeping through the | industry; often, with some amusement). | | What does happen, though, is that a canon develops, based | on these technologies, and [actual] new techniques get | created, based on them. | | Some of these are nightmares, and need to be strangled | before they can crawl off the slab, but sometimes, a gem | comes up. | | I write about some of my experiences around that here: | https://littlegreenviper.com/miscellany/concrete- | galoshes/#e... | | I remember writing "object-oriented" software for classic | C, in the late 1980s. I called it the "faux object" | pattern, and was based in state being kept in a structure | that was passed around functions. I refined and | formalized the idea when I encountered Apple's QuickDraw | GX in the early '90s (I suspect that may be the _only_ | good thing that I ever got from that sad debacle). | | I used the faux object pattern in an SDK I designed in | 1994, and it's still being used to this day. Back then, | you couldn't pass OOP across module connections, so we | had to figure out a way to do it with C. | | Nowadays, I can easily pass Swift extensions and virtual | implementations across SDKs; no sweat. It's cool. | afiori wrote: | In my uninformed opinion many of these "nothing new" | cases happen because the newcomer actually solved some | (maybe minor) pain point in usability of the old | solution. Maybe combined with some good old nostalgia. | | In general I agree that people should study more the | past, but I do not see any point in dismissing new trends | just because the do not market their full genealogy | upfront. | fouc wrote: | Sounds pretty unlikely. You don't need OOP to have fairly DRY | and well organized code that is nice and small. | FpUser wrote: | You do not need a lot of things to write software. Does not | mean you can no benefit from those when applied with good | reasons. OOP concepts can help while coding certain domains | and yet other can benefit from a different style. | gridlockd wrote: | This phenomenon can be described as "excessive factoring" and | it can easily happen under any paradigm. | | Perhaps it's more prevalent with OOP programmers, but perhaps | it just appears that way because the boilerplate for classes is | a bit larger than the boilerplate for functions and structs. | hedora wrote: | The "micro" in "microservices" implies "excessive factoring". | Otherwise they'd be services. ___________________________________________________________________ (page generated 2020-04-29 23:00 UTC)