<story><title>How to design software architecture for startups</title><url>https://appventuretime.blog/how-to-design-software-architecture-for-startups</url></story><parent_chain><item><author>BoppreH</author><text>&amp;gt; Shared data structures? Common library? Services have an API. If you are sharing data structures and a common &amp;quot;core&amp;quot; library across services, yes, you are officially doing it wrong.&lt;p&gt;Maybe I&amp;#x27;ve been doing this wrong all my life then.&lt;p&gt;Imagine I want to fetch user data by id from Galactus, the user data service. I know what &lt;i&gt;shape&lt;/i&gt; of data I want from it, and Galactus knows what &lt;i&gt;shape&lt;/i&gt; of data it provides. Should both my service and Galactus have full, individual copies of this data structure? Alternatively, if Galactus has a published schema that I refer to, isn&amp;#x27;t that a shared data structure?&lt;p&gt;By extracting the user data &lt;i&gt;shape&lt;/i&gt; to a common repository (library, header, schema, whatever), not only we deduplicate code, but we also centralize documentation. Maybe the `address` field is cached and frequently outdated, and someone from Galactus noted this down along with where to find the golden source.&lt;p&gt;Once you factor in other sources of redundancies (username regex, recommended logging, business-specific snippets), that naturally becomes a common library.&lt;p&gt;I get that it sacrifices some service independence, but is this piece of independence always so worth it, that common libraries are &amp;quot;officially doing it wrong&amp;quot;?</text></item><item><author>mjr00</author><text>I hate to be the guy who says &amp;quot;you aren&amp;#x27;t doing services right,&amp;quot; but... you aren&amp;#x27;t doing services right.&lt;p&gt;&amp;gt; Each service has to be maintained and deployed and increases the boilerplate needed for shared data structures, complicated communication protocols and infrastructure. By the time we released our app, the common library used by most services has been updated over a hundred times. And every service has to follow suit eventually.&lt;p&gt;Shared data structures? Common library? Services have an &lt;i&gt;API&lt;/i&gt;. If you are sharing data structures and a common &amp;quot;core&amp;quot; library across services, yes, you are officially doing it wrong. From the architecture diagram it also looks like there&amp;#x27;s only one MongoDB instance, which, if you have multiple services talking to the same database[0], is &lt;i&gt;also&lt;/i&gt; a major sign that you&amp;#x27;re doing it wrong.&lt;p&gt;IMO the author came to the correct conclusion, that monoliths are better for a new project, but for the wrong reasons. Or maybe the right reasons which aren&amp;#x27;t clearly explained, which is that at the beginning you don&amp;#x27;t have a good enough grasp of the domain to properly separate into independent services.&lt;p&gt;[0] yes, there are exceptions where you can have multiple services use the same physical database to reduce maintenance overhead, but enforce separate ownership through different logical databases or even table-level permissions, but I&amp;#x27;m assuming that wasn&amp;#x27;t done here.</text></item></parent_chain><comment><author>cogman10</author><text>&amp;gt; Should both my service and Galactus have full, individual copies of this data structure?&lt;p&gt;Yes!&lt;p&gt;Maintaining that structure should be painful.  Why?  Because it&amp;#x27;s an exposed public API and there are ramifications to updating it that need to be thought out.&lt;p&gt;Further, it can be super easy to pollute that structure with information only relevant to the server or client.&lt;p&gt;Using something like JSON schema, openapi, or grpc&amp;#x2F;protobufs can make generating that second structure easy, but sharing it is something that has caused my org tremendous headaches.</text></comment>
<story><title>How to design software architecture for startups</title><url>https://appventuretime.blog/how-to-design-software-architecture-for-startups</url></story><parent_chain><item><author>BoppreH</author><text>&amp;gt; Shared data structures? Common library? Services have an API. If you are sharing data structures and a common &amp;quot;core&amp;quot; library across services, yes, you are officially doing it wrong.&lt;p&gt;Maybe I&amp;#x27;ve been doing this wrong all my life then.&lt;p&gt;Imagine I want to fetch user data by id from Galactus, the user data service. I know what &lt;i&gt;shape&lt;/i&gt; of data I want from it, and Galactus knows what &lt;i&gt;shape&lt;/i&gt; of data it provides. Should both my service and Galactus have full, individual copies of this data structure? Alternatively, if Galactus has a published schema that I refer to, isn&amp;#x27;t that a shared data structure?&lt;p&gt;By extracting the user data &lt;i&gt;shape&lt;/i&gt; to a common repository (library, header, schema, whatever), not only we deduplicate code, but we also centralize documentation. Maybe the `address` field is cached and frequently outdated, and someone from Galactus noted this down along with where to find the golden source.&lt;p&gt;Once you factor in other sources of redundancies (username regex, recommended logging, business-specific snippets), that naturally becomes a common library.&lt;p&gt;I get that it sacrifices some service independence, but is this piece of independence always so worth it, that common libraries are &amp;quot;officially doing it wrong&amp;quot;?</text></item><item><author>mjr00</author><text>I hate to be the guy who says &amp;quot;you aren&amp;#x27;t doing services right,&amp;quot; but... you aren&amp;#x27;t doing services right.&lt;p&gt;&amp;gt; Each service has to be maintained and deployed and increases the boilerplate needed for shared data structures, complicated communication protocols and infrastructure. By the time we released our app, the common library used by most services has been updated over a hundred times. And every service has to follow suit eventually.&lt;p&gt;Shared data structures? Common library? Services have an &lt;i&gt;API&lt;/i&gt;. If you are sharing data structures and a common &amp;quot;core&amp;quot; library across services, yes, you are officially doing it wrong. From the architecture diagram it also looks like there&amp;#x27;s only one MongoDB instance, which, if you have multiple services talking to the same database[0], is &lt;i&gt;also&lt;/i&gt; a major sign that you&amp;#x27;re doing it wrong.&lt;p&gt;IMO the author came to the correct conclusion, that monoliths are better for a new project, but for the wrong reasons. Or maybe the right reasons which aren&amp;#x27;t clearly explained, which is that at the beginning you don&amp;#x27;t have a good enough grasp of the domain to properly separate into independent services.&lt;p&gt;[0] yes, there are exceptions where you can have multiple services use the same physical database to reduce maintenance overhead, but enforce separate ownership through different logical databases or even table-level permissions, but I&amp;#x27;m assuming that wasn&amp;#x27;t done here.</text></item></parent_chain><comment><author>Misdicorl</author><text>Another answer:&lt;p&gt;&amp;gt; Imagine I want to fetch user data by id from Galactus, the user data service. I know what shape of data I want from it, and Galactus knows what shape of data it provides. Should both my service and Galactus have full, individual copies of this data structure?&lt;p&gt;No. Galactus should have the full shape of the &amp;quot;user object&amp;quot; but should never put that on the wire or expose it. The wire API should expose sensible things like &amp;quot;what is the billing and shipping address(es) of this user id&amp;quot;. Galactus is responsible for maintaining the mapping between the &amp;quot;user object&amp;quot; and whatever the relevant return format is for those data.&lt;p&gt;Edit: This allows you to run API migrations and data migrations independently. Which is &lt;i&gt;crucial&lt;/i&gt; for any service that will last longer than 1 year.</text></comment>