From Newsgroup: rec.music.classical
<div>I had my fair share in designing and building large systems. I've taken part in rewriting Uber's distributed payment systems, designing and shipping Skype on Xbox One and open-sourcing RIBs, Uber's mobile architecture framework. All of these systems had thorough designs, going through multiple iterations and had lots of whiteboarding and discussion. The designs then boiled down to a design document that was circulated for more feedback before we started building.</div><div></div><div></div><div></div><div></div><div></div><div>Architect 3d Ultimate 17.5 Keygen Softwarel</div><div></div><div>Download:
https://t.co/XQGFsTz6zV </div><div></div><div></div><div>All of these systems were large at scale: hundreds of developers build them - or on top of them - and they power systems used by millions of people per day. They were also not just greenfield projects. The payments system rewrite had to replace two, existing payments systems, used by tens of systems and dozens of teams, all without having any business impact. Rewriting the Uber app was a project that a few hundred engineers worked simultaneously on, porting existing functionality to a new architecture.</div><div></div><div></div><div>Let me start with a few things that might sound surprising. First, none of these designs used any of the standard software architecture planning tools. We did not use UML, nor the 4+1 model, nor ADR, nor C4, nor dependency diagrams. We created plenty of diagrams, but none of them followed any strict rules. Just plain old boxes and arrows, similar this one describing information flow or this one outlining class structure and relationships between components. Two diagrams within the same design document often had a different layout and were often added and modified by different engineers.</div><div></div><div></div><div>Second, there were no architects on the teams that owned the design. No IT architects or enterprise architects. True, neither Uber nor Skype/Microsoft have hands-off software architect positions. Engineers at higher levels, like staff engineers, are expected to still regularly code. For all the projects, we did have experienced engineers involved. However, no one person owned the architecture or design. While these experienced developers drove the design process, even the most junior team members were involved, often challenging decisions and offering other alternatives to discuss.</div><div></div><div></div><div></div><div></div><div></div><div></div><div>Third, we had practically no references to the common architecture patterns and other jargon referenced in common software architecture literature, such as Martin Fowler's architecture guide. No mentions of microservices, serverless architecture, application boundaries, event-driven architecture, and the lot. Some of these did come up during brainstormings. However, there was no need to reference them in the design documents themselves.</div><div></div><div></div><div>Why was our approach different from what is commonly referred to in software architecture literature? Actually, our approach is not that different in principle, to most architecture guides. Almost all guides suggest starting with the business problem and outlining solutions and tradeoffs: which is also what we do. What we don't do is use many of the more complex tools that many architects or architecture books advocate for. We document the design as simple as we can, using the most straightforward tools: tools like Google Docs or Office365.</div><div></div><div></div><div>I know of banks and automotive companies where developers are actively discouraged from making any architecture decisions without going up the chain, getting signoff from architects a few levels up, who are overseeing several teams. This becomes a slower process, and architects can get overwhelmed with many requests. So these architects create more formal documents, in hopes of making the system more clear, using much more of the tools the common literature describes. These documents also reinforce a top-down approach, as it is more intimidating for an engineer, who is not an architect, to question or challenge the decisions that have already been documented using formal methods, that they are not that well-versed in. So they usually don't do so. To be fair, these same companies often want to optimize for developers to be more as exchangeable resources, allowing them to re-allocate people to work on a different project, on short notice. It should be no surprise that different tools work better in different environments.</div><div></div><div></div><div>Clean design is similar to clean code: it's easy to read and easy to comprehend. There are many great ways to write clean code. However, you will rarely hear anyone suggesting to start with applying the Gang of four design patterns to your code. Clean code starts with things like single responsibility, clear naming, and easy to understand conventions. These principles equally apply to clear architecture.</div><div></div><div></div><div>So what is the role of architecture patterns? I see them similarly in usefulness as coding design patterns. They can give you ideas on how to improve your code or architecture. For coding patterns, I notice a singleton pattern when I see one, and I raise my eyebrow and dig deeper when I see a class that acts as a facade, only doing call-throughs. But I've yet to think "this calls for an abstract factory pattern". In fact, it took me a lot of time to understand what this pattern does and had my "aha!" moment, after working with a lot of dependency injection - one of the few areas, where this pattern is actually pretty common and useful. I'll also admit that although I spent a lot of time reading and comprehending the Gang of four design patterns, they've had far less impact on becoming a better coder than the feedback I've gotten from other engineers on my code.</div><div></div><div></div><div>Similarly, knowing about common architecture patterns is a good thing: it helps shorten discussions with people, who understand them the same way as you do. But architecture patterns are not the goal, and they won't substitute for simpler system designs. When designing a system, you might find yourself having accidentally applied a well-known pattern: and this is a good thing. Later, you can reference your approach easier. But the last thing you want to do is taking one or more architecture pattern, using it as a hammer, looking for nails to use it on.</div><div></div><div></div><div>Architecture patterns were born after engineers observed how similar design choices were made in some cases, and those design choices were implemented similarly. These choices were then named, written down, and extensively talked about. Architecture patterns are tools that came after the solution was solved, in hopes of making the lives of others easier. As an engineer, your goal should be more about solving solutions and learning through them rather than picking a shiny architecture pattern, in hopes that that will solve your problem.</div><div></div><div></div><div>I've heard many people ask for tips on becoming better in architecting and designing systems. Several experienced people will recommend reading up on architecture patterns and reading books on software architecture. While I definitely do recommend reading - especially books, as they provide a lot more depth than a short post - I have a few suggestions, that are all more hands-on than just reading.</div><div></div><div></div><div>The best software design is simple and easy to understand. The next time you're starting a new project, instead of thinking, "How will I architect this system, what battle-tested patterns should I use and what formal methodology should I document it with?", think "How can I come up with the simplest possible design, in a way that's easy for anyone to understand?".</div><div></div><div></div><div>Software architecture best practices, enterprise architecture patterns, and formalized ways to describe systems are all tools that are useful to know of and might come in handy one day. But when designing systems, start simple and stay as simple as you can. Try to avoid the complexity that more complex architecture and formal tools inherently introduce.</div><div></div><div></div><div>Since my graduation (late 2005) I was working for the same company as a c++ software engineer. A year ago I was promoted as a software architect but I have found myself involved more and more in qualification and fixing bugs, level 2 support.</div><div></div><div></div><div>Given above, your estimates "50% of my time spent... analysing the software logs... 30% fixing other's bugs" put you far far off of what software architect is normally expected to do.</div><div></div><div></div><div>Note that per se, activities like analyzing logs or fixing other's bugs could legitimately occupy part of architect's time - provided that these serve the primary purpose of this role - that is, making high-level design choices and establishing technical standards. Actually, this is the case for any kind of software development / maintenance / testing activities.</div><div></div><div></div><div>For example, if analyzing logs led you to an insight on how to make it easier - by improving design, or tooling, or coding standards - this would be perfectly justifiable effort for an architect. Similarly, it could be completely OK for architect to get their hands dirty fixing particular bug(s) - as long as this would result in specific design / process improvements leading to lower bug rate, etc.</div><div></div><div></div><div>On a little more positive note, your question demonstrates at least one skill that is quite important for architect: ability to classify different kind activities and track efforts spent on these. Consider adding to your "toolbox" complementary skills to summarize your observations and estimates and clearly communicate these, especially up the management ladder. :)</div><div></div><div></div><div>I see the role of an architect a privilege. You get to influence the product in a way not many other people can - the only one theoretically more influential than you are is he product R&D manager (and, possibly, marketing) - but he's way to busy managing.</div><div></div><div></div><div>You have a management issue: fixing bugs and improving code quality is the job of developpers, as an architect you should be issuing guidelines and actual architecture (UML or whatever floats your boat), then giving regular code reviews to ensure these guidelines are followed correctly.</div><div></div><div></div><div>This is definitely a type of work that you are NOT supposed to do, for this role. According to my experience/observations, architect have to be involved in application design, improvements, technical requirement clarifications and potential performance issues (not checking logs everyday, but primarily analyzing sever issues/errors ) that needs to be addressed or avoided.</div><div></div><div> dd2b598166</div>
--- Synchronet 3.21a-Linux NewsLink 1.2