3 ms·
To expand on that microservices point, there's a particular form of systems blindness that happens when people focus on one part of a system, think they underst
by throwaway984393 5y ago
To expand on that microservices point, there's a particular form of systems blindness that happens when people focus on one part of a system, think they understand that one part, and then ignore all the others, as if all you need to know is what's right in front of you.
I see it every day, in every team that I work with. The team works on component A. Maybe they can see that it's supposed to work with components B and C (maybe). So they design for those components alone. Meanwhile, components D, E, F, and G depend on components B and C. But because they don't directly work with each other, team A doesn't know that its design decisions will cause problems for D/E/F/G, and those teams don't learn about the limits of A. And they don't even think to ask. It's really nutty.
As a systems veteran, I already know problems are going to happen purely because of not having a deeper understanding of the system. If I ask them to go out of their way to discover the interaction of the whole system, they balk (because "that's not my job"), and upper management doesn't care that nobody knows how the whole system works. It's like this at most places I've worked. We need a revolution in establishing these conventions of building components in a system, the way the 12 factor app redefined building a modern stateless app.
- DelightOne 5y agoHow are all connections usually tracked, if they are?
- throwaway458864 5y agoAssuming you mean the connections between the components - a hodge-podge of different models, tools, techniques. There is no one way to do it, partly because of how different any given system can be from another. Even within software engineering, it really depends on the industry you're in, the application of the software, the stakeholders, the risks. But generally speaking, most people only track the connections at design time, as an artifact of overall architecture. And this isn't great, because as the system changes (modern software systems change constantly) the entire system development lifecycle is not being re-assessed every time some component changes. So in the best case, with a Waterfall model, you have very well defined connections in design, and you have to pray that your SDLC validates that design. But most people prefer Agile, which in practice means "I don't need a well defined system! #YOLOEngineering". So everything is built ad-hoc and nobody even attempts to figure out the entire picture. And in that case, Operations may be told to figure it out (they're the ones running it all, so they have the best vantage), and they tend to implement monitoring and distributed tracing that enables cobbling together a picture of how things are actually working. But that's not fed back into teams' designs, it's just used for addressing problems after the fact. To be specific: you might use ADRs and manually crafted diagrams to map out the connections, or UML, or some other systems diagramming tool/standard. But often that's created only at a certain level of the system, and doesn't dive deep into component interfaces or tolerances/limits or availability. So the full picture can never be seen from one view, and it's almost never the teams themselves mapping it out.
- DelightOne 5y agoThat's exactly what I meant. For standardization, does Kubernetes help in that regard? For example when using network rules to whitelist what component is allowed to communicate with what service? I imagine extracting the current rules and building a graph makes discovery easier. No tolerance/limits/throughput or availability data is included though. The approach is also limited to the cluster level, excluding out-of-cluster communication, while having everything in the cluster may not be that secure.
- yourapostasy 5y agoOh, ho ho. It is so much more than network dependencies. K8s helps somewhat by pointing a possible direction, but this is truly an Alice in Wonderland, "just how deep into the rabbit hole do you want to go?" problem space. Note the following is from the big-org perspective, small organizations don't really have this problem nearly as bad, but might start seeing this more as we all move into the cloud. IMHO, the declarative configuration management folks have their heart in the right place, but at their level we've already lost a lot of information and are just shoving around peas on the plate. Post hoc systems information capture is always a lossy, imprecise, empirically-driven affair. Service registries are only scratching the tip of the iceberg. Everyone is afraid to bite the bullet and start Encoding All The Things, because down that path lies religious wars over what to encode and how to express the encoding. Even with a service registry, I lack information on SLO's, SLA's, RTO's, RPO's, planned outages, A/B (and C/D/E/...) state, ownerships of all kinds, responsibilities of all kinds, architecture, deps of all kinds, onboarding steps and constraints, governance gates, decomm steps and constraints, change approval gates, the timing of each of those, and so on. That's just capturing the information; now imagine the insanity of walking that nightmare graph to seek impossible interlocks (which we humans accept by overriding with outages, for example), or figure out just how long it should take to accomplish a given set of related goals. We currently handle this as an industry through blunt force trauma on the problem space itself, while contorting ourselves as Matrix-like as possible to sustain as little in return upon ourselves in the process, through a hodge podge of techniques, tools, processes, and exasperation. At this point, I'm not exactly certain we'll fully address this space without a Culture Mind-level AI (said tongue in cheek, I really do think there is some promising work being done in this field, it is just a grind).
- secondaryacct 5y agoI lead a team that went beyond this problem in an investment bank: we must make the trading resistant to volume increase, whatever the system. It's an exhausting exercise: we must constantly join new team, extract the source code from their grippy hands, show them how to profile, explain the globality of the problem, how doing a good job only matters if down the line people can still trade whatever the volume and yes, even if it's a silly volume, what can we do. We were able to really get creative solutions by stopping the absolute technical talk and just ask stupid questions: what's our upstream maximum rate, how fast are we feeding down stream, what's blocking in the middle, how do we scale (usually we can stop at profiling after we find 3 horrendous beginner mistakes, thank God lol)
- EastSmith 5y agoNot optimized code is not code with "beginners mistakes". It is simply code that need optimisation.
- Too 5y agoBoiling water in a pot without the lid on is a beginners mistake. The fix is easy, obvious and the gains are significant. Claiming that it eventually works anyway is setting a low standard. With code the factor can often be several magnitudes larger than the example above. Like using O(N*N) where O(N) is the norm, spawning a thread for every function call, doing rpc for things that should be local, and so on. These things are bad practices and it’s ok to call them mistakes. Beginners will make mistakes and that is acceptable. Everybody learns.
- mbrodersen 5y agoNot understanding how your software fits in the overall system and not understanding what is important is a beginner mistake.
- deleted 5y ago[deleted]