From 331f4c3cac82dbb1786fc44742ce0db5f609eab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Barrila=CC=81?= Date: Fri, 21 Feb 2025 09:11:36 +0100 Subject: [PATCH 1/2] lets start to write something --- .../hero.jpg | Bin 0 -> 30774 bytes ...cing-coupling-in-software-design-review.md | 36 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 public/posts/balancing-coupling-in-software-design-review/hero.jpg create mode 100644 src/content/blog/balancing-coupling-in-software-design-review.md diff --git a/public/posts/balancing-coupling-in-software-design-review/hero.jpg b/public/posts/balancing-coupling-in-software-design-review/hero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6902fd5a5a0334104ab589f09fb9091e4bf35031 GIT binary patch literal 30774 zcmZ5`b6_N0)9=I^+cqb*oosBI6WdO9H@59$V_O^Bwrz8FZ=UCU?{`u4PxtBWIdx9q z{HCh@uKe8rpvXvml>~r+0RUj14EVba_y&N2f`WyH{Uii*BqRhRBwREkG!$$k6clU} zY-|(^Yzz!MY;<&NJPd3cavTC&Vmutu&kJ%gG74%Ma%^f2Fj!cqf4+u=MJL5Z!XqO< zz@a6h!6Ty}Bg17Nqah{3ASc5kCdR`fz#$;Rqo5#1!lfX^X2Qk8CL^UL#-^bA+Xq1X z0@ekl1_4F}07nIbKn43d0AL3I05JbZ`hN%v90C#w8s^LACH2?wx z7yujv0_F3gI}zYY1H8x&v-o2ZR8E`>VLtKXK?}GhZDBkWVJj^#^a7N-usP9z`n|9U zKXNOtytyKH(V19%{W<;p$Gn)O<}y}w+dz}W+h7bIhKMyjGqscyR0VrdTI3Z>yR~6b z^jJi#v4k)fLbBa)ZIvnnwMF;{Wk%AOOt(750%ep7Te*u0X^62(k@Lt5*-roZ0Lepz zr~Q^b?rp|!fXnILVZJVZ#2c1iFFpZ9djio9_=FX{4BJ(+!U=laOq|t`Az{i(R^f1% zynExR(C|hk7ahC=fiV+UIi4eh*O8%XaT`D@`Vv0?OB<8IdJ%f)rR-V^c=iU>?Cb(RCfD&UNs(b7L*dZdz%xuXushwn|>L z3+thkjCr~TZpyz1_#nv908PF+_Zs;8(G?i>5%P7IqfYrlhPLc@zxsdT)%_3~#(<>4 z#S{)ElirV#2Gp;K(G42%I98MCw+>^Wcf0_1gg7p zu#5(VW_8*8Li*n8hu??vdUUPojNv-vS9dy`dF*P)NZmZ%do6E4Y+Awtp^u-D_0H2V zAQCC_dTKN(&ZfGjX?C(!K{hsA;QVZS_U=tz`J)oRkz>FF=C4rsa}h&VLEj92j%19CGhJ=zYp4gbx%kiI zZy2({@{F+5DBjIyDd)tM03<)K_+Aot%^^nAi#xul%;Nx6@^RKTwRs;|+H|cuUHu@% zdG5aeLz4cTocK_R)+Thq%uumS)Ye?(`O?Xlsuy>I{xKR#uJ3Oi<4Un~Y~kNpgi}#g zc|tsm(Gp@+H|I7@AM?Pb^H{klz^q>mThdn#%pb4(&M>^D(OnkI2Nu_|xUJi_X6}8m z6K?L$iE8_@81&s6ru(JVV>vk%nnQEh(O8e&N>6hPsFvUU0+75W-ck z8d74#%yvh^Uxq8~%NTFpW&p=CxCH;0xNC^UG`X9l)WYndb5_ogPS;-mhHIk7a0|3h zyAzh8hVurwNf+($&u@lCUT$FSQ$SmDR`y4i)TdqquoA@jYbqm<=TOL%zG zX~Mm~fGJ1gBym;&8y8u(*rh-i!N8H7IH-z){%M|ukttI#GHQ1ABytM(cD_SPa?!~haO7psHiD#a@*)}NI8|SzjrG0oA`jt&{dd{lrO6q7PYu- zZ0hZ+YDXLvOxJF;MECL5IrCbOF}PL@^EdrE%Hi3)ku7a#;9u2V)G>SxfXEd#bCd>O zyj_s^lz&}sc*Cn>&yL!*%${K;1psz-L(J3o~li^c6-b1tXHsp~H52lgTmi!Ev` zTEC3|E++^vu%8iwM+SPD+{M^%j{kQXEALS-^>obBTex%Z0~Hp*L;J_TtpKv(5oeLL zL8+bWUERWt4v!h*rXZ1@p@VqqXueZ$~ocx zWz*q2`23M;{0&aLRCM{`C-f_{(F|}2;R}4}DDw+y(v60gU&7~yrY0ozG2p`IrUx2z zmt=FjRlnvMq`4Tc#1S-ul!e1-8Mu|=Rznv4zZI~$E;fvG*~vt#Jy|HHW%JT*03~Sg zuukJZvV!#&r_w!bzufHoPK(Zfo<3d|ll9wDa5>40)TtZ`>9ImQjHPH$Y+AiZtw-mfeYs9*x(mXus@hfj9 zd(5xrV!1w6sS^z~^dK~86!L9PE?$yMO?U&q6aJ$bRvm)X0}WxY+b>R~2DotGnPUBP zes=^*#wq$8(_Iad4-d~Qw)`1h^<*n6W_uN?HSzjGDX@v^!-IANMc!Q(61l|16?Bzr zhV;7n1bSLmD~mv>xF9CVd?eX#yrG2TPt`2j zzJCEy97XIgtiC(=ug*_8Gi~fSiup%##yJ zjcqSi1-z68A@kfejWK>%e|}R^d&gTUdPE<=D9(h3$4E`<0hOErI~c>{g$tWXm+m+~ zaqqtq4DLQ$+|jbxDxpJ)ljuxN=XKS{#~W189I)fUUi%_9IlgHo&{lQ+1^7Q56Ej6O zDOXgN%|RZevXNo@%~KzAU5^;e^#awWj}3y3X{XtsY3U0llMaeiCl;W6s2msHkk zv)w(QxVr(7D~mt;7Qmoexoa3RnA7bw6f;{6NZewit8)GeaQz?C3Y2WHi)!>)yz&v0 z3YJw*z5VT>%XzvmYK@yQ2ToEqlmbb)EUx%duV#PtbXIh`43B@HM%v7Hkn&N#?x_D^ zV1JrW+o#OM4O9lV#j(Zhb@tw_Tj}2TKY#@vbdQB^Ygv8fd#-!^5-lDq=&_ZKs!}kE z$q~$!hs2r=p@80RB?_amCn{D((VEdqTmNkj6T z54V?&!~bHoM!k=z^i6*5xu6OXc>0KmZ@z@VYQAi+OD<|lo^ zQ2-<=8WajT1}O^(87rHJGBY$Lxu}XU1-p~*Cm8()sDga~Cql4?!91+Oy^QkLbHJea z1EI0C;m^Mu&|7mYS)+*5>egS4uEDa0--NfQov&Rb*@Q<#?_e!(+c#%PMD!lJ2ZK3i zy%5?1FPMX_k-#r@1LEklo~bx%d75`MmIX|0lqBo6qVjJ+v{LI4;rWgeBQ`G4V_;-} z`jF}+)pk0~k?@jTWN~blA+DtfSB1F|@YsT>tl{e2K@YQ$ihljSD$0Y;xecIf;7?gu zDrYh6E{8j_W_fO6vaL5js6LM4@2l`IQd{y;3tl8~1 zj;SuEKn9=KR$mOren|>>4@>|l{IaUHy4CYYEM`A~!Z4(!7{NJeozf-Kjlnyq_IlG~ z)@@-ulW;+B($n<+PzvRkF#U;*xYT+X!6oOC=(;jUxU{wAIWqKg6EWuz`c8ge51o`$ z;Ii!aTI}2va|2Q(c!5HVetB2=<*pA-P6fgL~-lTz-XfW9n z_pwSA2|2Zozw7I{NLb#^tPDARX7?QzF;Y(_#7dN>1Tu=4a{m|;CUuXOBUV*c>odj5 zHQ5VGVH?l+4q^lnqE!LQE_L;FkUqV5CY1^) zPD?0i9=)yMyi&G-%I1gGcGQfok|U_fl!#@y*wn-OQdE>)$^K34i9Q0ezmlYyiVusb zV}UF6S#Yz6f4waMF(Fq33IeSdAw_h($<{LQpQ844`;X{dqe7={i2U zV!>A3EzzqtNFDFWl@^($NibyJl2jt_hzLI2>uM0SO(6l6AGT_Yp*9U4=F^@_4&;uC zoaPlCiK)r*cN0Had>FT8$>R%F!#ykQVr3>xJ*?FhCH`Q0QYa-}cVXNdHU3trw5Wwb z&xPt7;+0*@6^XMwc?h;OMI%!Z#t^`DikR|+JocXtjkE$G4L2SPBvw{yZ$@{Iegz_m zjuqi@Ruy;U$>YGD)vlJg*ssk4qBS!yiBKtv zxm22hE&{^`gD33{BQ$(~Sq-;T2|QI4j?r#tgA5TJgDl$-Lm)~l@azUD>xRM#9Tu&5 z+z;HUW}#gj&C}YC5qb|mdk;;V9d}##T1wxN7gmo7Cy%u(mwUL)Gq-WOI==mSYOAlF zp+M5oRo0g*Sr3@gB}B{x;b2}I63>#B<+sq{)r#zbC9d>}4(U1g^qsmtcA314(~S|2 z0~U9iM)3&(d$D$X!OBK7ZG1t4%&%CVZga0sw`B@Dmfhp%Tl|#0&KPgwzofkje}r~x zy>BDyI5PF_Y&n$QOofJPbse4>Vb9r_is!a*$-^j_($bNzAzg+r2@kEfnZ2&fr=XrR zF>hyOY3|X{<1?+NnIJ_F7ip6Y)Kv@U{F-euwBWq5DB&bNQ#m6;0mo`l*U^1(TH#

APRLWA^Q>a^E~5OVhXWs8Pt2<7v#sc|=(< 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 Hw_pF+c3s(e literal 0 HcmV?d00001 diff --git a/src/content/blog/balancing-coupling-in-software-design-review.md b/src/content/blog/balancing-coupling-in-software-design-review.md new file mode 100644 index 0000000..512511e --- /dev/null +++ b/src/content/blog/balancing-coupling-in-software-design-review.md @@ -0,0 +1,36 @@ +--- +title: 'Balancing Coupling in Software Design - a review' +description: "we ave read this 300 pages book on coupling is it worth it? (spoiler yes!)" +author: Alberto Barrilà +keywords: ["book", "coupling", "software design"] +pubDate: '03-01-2025 10:00' +updatedDate: '03-01-2025 10:00' +heroImage: 'balancing-coupling-in-software-design-review/hero.jpg' +timeRead: '10' + +--- + +Coupling is generally considered a bad thing, something you just don't want in your code. +So why read a 300 pages book on this subject, well lets find out... + +## What Is Coupling? + + + +## Coupling and Complexity + +## Interactions + +## Modularity + +## Structured Design + +## Connascence + +## Integration Strength + +## Distance + +## Volatility + +## Balancing Coupling From 2c7cf78427e46d1af0780ad61ac832aaffce638c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Barrila=CC=81?= Date: Fri, 20 Jun 2025 11:44:59 +0200 Subject: [PATCH 2/2] adds first post revision --- ...cing-coupling-in-software-design-review.md | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/src/content/blog/balancing-coupling-in-software-design-review.md b/src/content/blog/balancing-coupling-in-software-design-review.md index 512511e..c6b9f02 100644 --- a/src/content/blog/balancing-coupling-in-software-design-review.md +++ b/src/content/blog/balancing-coupling-in-software-design-review.md @@ -1,36 +1,107 @@ --- title: 'Balancing Coupling in Software Design - a review' -description: "we ave read this 300 pages book on coupling is it worth it? (spoiler yes!)" +description: "we have read this 300 pages book on coupling is it worth it? (spoiler yes!)" author: Alberto Barrilà keywords: ["book", "coupling", "software design"] -pubDate: '03-01-2025 10:00' -updatedDate: '03-01-2025 10:00' +pubDate: '06-23-2025 10:00' +updatedDate: '06-23-2025 10:00' heroImage: 'balancing-coupling-in-software-design-review/hero.jpg' timeRead: '10' --- -Coupling is generally considered a bad thing, something you just don't want in your code. -So why read a 300 pages book on this subject, well lets find out... - ## What Is Coupling? +Coupling is a normal part of designing a system, every system has a purpose and is made up of components, for the system to work, these components need to interact and that's what coupling means. +Coupling may happens when parts of the system need to share information or have to follow a time related process, the more they share, the more connected they become. This lead to the fact that if one part changes, the other might need to change too. Even without sharing information, components can still be linked if they depend on the same timing. ## Coupling and Complexity +When making design decisions in your software systems, it's helpful to start by identifying which domain you're in. Are you dealing with a clear, complicated, complex, or chaotic situation? Which decision-making approach best fits the domain you're in? + +Here is where the Cynefin framework can help you. Cynefin is used it to explain complexity as situations where the results of an action can only be understood in hindsight. In Cynefin terms, complexity arises from weak connections between actions and their outcomes. + +In complex situations, decision-making requires running safe experiments to explore possible outcomes. In software design, we often make these decisions based on intuition. However, the next time you need to experiment before making a choice, take a moment to consider where the complexity is coming from. + ## Interactions +The complexity of a system isn't just about how big it is or how many parts it has. It's about how those parts interact with each other. + +Thinking about interaction we can define two type of complexity. Global complexity refers to how components interact with each other, while local complexity is about interactions within a single component. Both need to be managed carefully. + +Good constraints can help control complexity by limiting the system's flexibility and reducing the chances of unpredictable interactions. As usual is a matter of tradeoff + ## Modularity +Modularity aims to reduce complexity by organizing knowledge into separate modules. The main goal is to allow the system to evolve over time to meet future needs. So, modular design requires thinking not just about today's requirements, but also about what might be needed in the future. + +And this is where problems arise, be careful not to go overboard. A system designed to handle any possible change can become too complicated. Finding the right balance is key—systems shouldn't be too rigid or too flexible. + ## Structured Design +Larry L. Constantine began developing the ideas behind the structured design methodology as early as 1963. These ideas were then published in collaboration with Edward Yourdon in the early 1970s. You may think that today, over half a century later, this material is outdated and irrelevant, well it turn out that is a big no. + +Even though the structured design methodology was designed more than half a century ago, the problems it was supposed to solve, and some of its solutions, are still very relevant today. + ## Connascence +Module coupling was first introduced in the context of procedural programming, but with the rise of object-oriented programming, a more detailed model was needed. Meilir Page-Jones (1996) developed the Connascence model to address this need. + +Unlike traditional module coupling, Connascence describes different ways knowledge is shared between components. It has two main types: static connascence and dynamic connascence. + +Static connascence deals with decisions that need to be made at compile time for modules to work together while Dynamic connascence focuses on dependencies that happen during runtime. + ## Integration Strength +Structured design's module coupling and connascence focus on different ways knowledge is shared between modules. The integration strength model combines both approaches for a more complete analysis of how components relate to each other. + +With the integration strength model, you can evaluate not just the types and levels of knowledge shared between components, but also how that knowledge flows at different levels—like from an object's methods to services in a distributed system. + ## Distance +When you make design decisions, it's important to consider not just the knowledge shared between components, but also how far that knowledge needs to travel. You can measure this by looking for the closest common ancestor module of the components. Also, remember that social factors can impact how far the knowledge travels, which can affect the cost of updating the design in the future. + +Finally, keep in mind the impact of lifecycle coupling. Components that are close to each other can influence each other's lifecycles, causing changes even if they don't share knowledge. In other words, even without direct connections, components may still need to evolve together because of their lifecycle dependencies. + ## Volatility +To design a modular system, you need to understand the business domain of the system. By identifying the subdomains and their types, you'll get a sense of how volatile each component is. Core subdomains are usually the most volatile. + +Volatility can also come from technical issues, like the need to improve the design or changes in the organization. In some cases, the design itself can make components volatile, as it connects the most unstable parts with the right level of integration strength. + ## Balancing Coupling + +An integration is stable when either the integration strength or volatility (or both) are low. If both volatility and distance are high, the cost of making changes becomes high. + +When integration strength and distance are opposite, the system becomes more modular. But if they're equal, it leads to complexity. + +Global complexity occurs when both integration strength and distance are high.Local complexity happens when both values are low. + +The balance between these factors can be calculated with this formula, where MIN_VALUE and MAX_VALUE define the numeric range: + +`BALANCE = max(|STRENGTH - DISTANCE|, MAX_VALUE - VOLATILITY) + MIN_VALUE` + +Creating modularity is important, but even more important is maintaining it over time. + +## Rebalancing Coupling + +Software changes can be divided into tactical and strategic changes. Tactical changes are about how the system works—either adding new features that fit the current design or improving existing functionality. Strategic changes can disrupt a modular design by upsetting the relationships between components. + +Integration strength can increase over time with new features.The distance between components can grow due to refactoring or changes in the organization.Volatility can change if the business domain shifts. + +These changes can significantly affect the system. To keep things balanced, you'll need to adjust the other coupling factors. If you don't address the imbalance, it can lead to technical debt and added complexity. + +## Fractal Geometry of Software Design + +Prof. Geoffrey West has been researching the dynamics of growth in complex systems for many years. His research revealed that the same laws of physics govern growth in a broad range of systems; more specifically, network-based systems and software design can be seen as a network-based system. + +Not all parts of a network-based system grow at the same rate, some grow slower, while others grow faster. These differences make larger systems more efficient. Expanding a system's functionality builds on what's already there. However, as a system grows, its complexity also increases—often at a faster rate. + +Growth-driven complexity can limit how much a software system can grow. But, like in nature, we can manage complexity using fractal modularity: ensuring that component interactions are balanced at all levels. This is where the balanced coupling model comes in—it acts as a guide for designing modular systems. + +## Conclusion + +Coupling is a core part of system design, and modularity depends on balancing its three dimensions (Knowledge Sharing, Physical Distance and Volatility). + +Reading a 300 pages book on this topic not only expanded my knowledge on how software design need to take coupling deeply in consideration but also give me some truly practical (also in the mathematical way) hint to tame this monster.