A Philosophy of Software Design
ΠΠ½ΠΈΠ³Π° ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Ρ ΠΎΡΠΎΡΠ΅Π³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ. Π ΠΎΡΠ½ΠΎΠ²Π΅ Π»Π΅ΠΆΠΈΡ Π΄Π²Π° ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠ°Π²ΠΈΠ»:
- ΠΊΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ Ρ ΠΎΡΠΎΡΠΎ
- ΠΊΠ°ΠΊ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΏΠ»ΠΎΡ ΠΎ
ΠΡΠΎΡΠ΅ Π½Π°ΡΠ°ΡΡ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΏΠ»ΠΎΡ ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ: ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ ΠΏΠ°ΡΡΠ° ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΡΡΠΊΠΎΠΉ Π·ΠΎΠ½Ρ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΡΡΠ΄Π½ΠΎΡΡΡΠΌ ΠΊ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΡΠ²ΠΈΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΊΡΠ°ΡΠ½ΡΡ ΡΠ»Π°Π³ΠΎΠ². Π ΡΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ Π²ΠΈΠ΄Π° βClean Codeβ, βRefactoringβ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΈΠ²Π½ΠΎΡΠΈΡΡΡΡ.
Π Π²ΠΎΡ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°ΡΡ Ρ ΠΎΡΠΎΡΠΎ - Π·Π΄Π΅ΡΡ ΡΠΆΠ΅ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΌΡΡΠ»ΠΈ. ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π³Π»ΡΠ½ΡΡΡ Π·Π΄Π΅ΡΡ, Π½ΠΎ Ρ Π±Ρ Ρ ΠΎΡΠ΅Π» ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ: Shallow vs Deep modules. ΠΠΎΠ΄ shallow ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΈΡΠΎΠΊ, Π° Π²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΡΠΌΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½Π° ΠΈ ΠΏΡΠΎΡΡΠ°. Π ΡΠ°ΠΊΠΈΡ ΠΌΠΎΠ΄ΡΠ»ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ²: ΡΡΠΎ ΠΈ ΠΏΠ»ΠΎΡ ΠΎΠ΅ [[ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ]], ΠΈ Π²ΡΡΠΎΠΊΠ°Ρ [[ΡΠΏΠ»ΠΎΡΡΠ½Π½ΠΎΡΡΡ]], Π° ΡΠ°ΠΊ ΠΆΠ΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ [[ΡΠΊΡΡΡΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ]]. Π Π΄Π°Π»ΡΡΠ΅ ΠΌΡ Π²ΡΡ ΠΎΠ΄ΠΈΠΌ Π½Π° ΠΊΡΠΈΡΠΈΠΊΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠΎ βΠ½Π΅ Π±ΠΎΠ»ΡΡΠ΅ N ΡΡΡΠΎΡΠ΅ΠΊ Π½Π° ΡΡΠ½ΠΊΡΠΈΡβ. ΠΠ΅Π΄Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΡΡΠ΅ ΠΏΡΡΠΌΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΊΡΡΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. Π ΠΊΠ½ΠΈΠ³Π΅ ΠΆΠ΅ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΡΡΡ, ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΠΌΠ΅Π½Π½ΠΎ Π·Π° ΡΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ ΠΊΡΠ±ΠΈΠΊΠΈ ΠΊ ΡΡΠΈΠΌ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΊΡΡΠ²Π°ΡΡ Π·Π° ΡΠΎΠ±ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ.
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ Ρ ΠΎΡΠ΅ΡΡΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ Π³Π»Π°Π²Ρ ΠΏΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ ΠΊΠΎΠ΄Ρ. Π Π½ΠΈΡ ΡΠ°ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΡΠ΅ΠΌΠ°, ΡΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ΄Ρ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ Π΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ. Π ΡΠ°ΠΊ ΠΆΠ΅ ΡΡΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΊΠΎΠ΄Ρ, ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π½Π°Π΄ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠΎ Π½Π°Π²ΠΎΠ΄ΠΈΡ Π½Π°Ρ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΡ [[Readme Driven Development]], ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ΄.
Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Π½ΡΠΆΠ½ΠΎ Π·Π°Π΄ΡΠΌΠ°ΡΡ ΠΎ ΡΠΎΠΌ, Π½ΡΠΆΠ½Π° Π»ΠΈ ΠΎΠ½Π° Π½Π°ΠΌ. Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π»ΠΈΡΠ½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΎΠ½Π° Π²Π²Π΅Π΄ΡΡ ΠΈΠ»ΠΈ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΈ ΡΠ΄Π΅Π»Π°Π½Π° Π² Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΎΠ΄Π΅. ΠΡΠΎ Π²ΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ Π΄ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ΄Π°, ΠΈ Π΄Π°ΠΆΠ΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΅ΠΌ ΡΠ±ΠΎΡ Π²ΡΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ.
Π’Π°ΠΊ ΠΆΠ΅ Π²ΠΈΠ΄Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ. Π ΡΡΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΈΠ΄Π΅Ρ ΡΠΈΡΠ½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΠ· Building Evolutionary Architectures.
ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, Π»ΡΡΡΠ°Ρ ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ software engineering Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.
Π¦ΠΈΡΠ°ΡΡ
- 202305090925: recognize code more complicated than needs to be
- 202305090936: recognize complexity is a crucial design skill
- 202305090937: practical definition of complexity
- 202305090951: cognitive load is how much you need to know in prior
- 202305090957: unknown unknowns are the worst
- 202305100914: complexity accumulates rapidly, but hard to eliminate
- 202305100922: to manage deps you introduce interface
- 202305100923: best modules are those whose interfaces are much simpler than their implementations
- 202305100927: deep and shallow modules
- 202305110916: information leakage
- 202305100932: shallow module
- 202305110925: information hiding and deep modules are closely related
- 202305120920: module needs simple interface, and not implementation
- 202305130845: indications that two pieces of code are related
- 202305131153: exceptions are part of interface
- 202305140921: comment is an abstraction to code
- 202305140913: design it twice
- 202305140924: comments capture information from designer mind
- 202305230914: comments can fill missing details
- 202305230925: Implementation Documentation Contaminates Interface
- 202305250826: bug about variable naming
- 202305250828: names are a form of abstraction
- 202305250836: comment driven development
- 202305300907: the design of a mature system is determined more by changes made during the systemβs evolution
- 202305300909: comments close to code for transactional update
- 202305300912: enforce convention through automation
- 202305300913: When in Rome, do as the Romans do.
- 202305300918: increments of development should be abstractions
- 202305310916: expensive operations for today
- 202305310926: good designer spend more time in design phase
- 202305310927: the most important software design principles
- 202305310928: list of red flags in code
ΠΠ°Π΄Π°ΡΠΈ
- #task ΠΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΡΠ΅ Π²ΡΠ΄Π΅ΡΠΆΠΊΠΈ ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ Zettels β³ 2023-08-09 β 2023-08-11
- #task ΠΠ°ΠΏΠΈΡΠ°ΡΡ Π²ΡΠ΄Π΅ΡΠΆΠΊΡ ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ β³ 2023-09-10 β 2023-09-11
- #task ΠΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ²ΠΎΠΈ Π·Π°ΠΌΠ΅ΡΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠ΄Π΅ΠΉ ΠΈΠ· ΠΊΠ½ΠΈΠ³