{"id":2206,"date":"2025-10-10T01:34:28","date_gmt":"2025-10-09T18:34:28","guid":{"rendered":"https:\/\/kienthucmo.com\/?p=2206"},"modified":"2026-01-25T00:38:34","modified_gmt":"2026-01-24T17:38:34","slug":"tim-hieu-nguyen-ly-thiet-ke-phan-mem","status":"publish","type":"post","link":"https:\/\/kienthucmo.com\/vi\/tim-hieu-nguyen-ly-thiet-ke-phan-mem\/","title":{"rendered":"T\u00ecm hi\u1ec3u nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m: N\u1ec1n t\u1ea3ng c\u1ee7a ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m hi\u1ec7u qu\u1ea3"},"content":{"rendered":"\n<p>Trong ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m, thi\u1ebft k\u1ebf kh\u00f4ng ch\u1ec9 l\u00e0 v\u1ebd s\u01a1 \u0111\u1ed3 hay ch\u1ecdn c\u00f4ng ngh\u1ec7 &#8211;  \u0111\u00f3 l\u00e0 ngh\u1ec7 thu\u1eadt s\u1eafp x\u1ebfp c\u1ea5u tr\u00fac sao cho m\u00e3 ngu\u1ed3n d\u1ec5 hi\u1ec3u, d\u1ec5 b\u1ea3o tr\u00ec v\u00e0 th\u00edch nghi v\u1edbi thay \u0111\u1ed5i. Hi\u1ec3u r\u00f5 nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m gi\u00fap m\u00ecnh tr\u00e1nh \u0111\u01b0\u1ee3c technical debt, gi\u1ea3m b\u1edbt l\u1ed7i khi b\u1ea3o tr\u00ec, v\u00e0 ph\u00e1t tri\u1ec3n s\u1ea3n ph\u1ea9m nhanh h\u01a1n m\u00e0 kh\u00f4ng r\u1ed1i r\u1eafm.<\/p>\n\n\n\n<p>Trong b\u00e0i vi\u1ebft n\u00e0y m\u00ecnh s\u1ebd c\u00f9ng b\u1ea1n t\u00ecm hi\u1ec3u kh\u00e1i ni\u1ec7m, c\u00e1c nguy\u00ean l\u00fd n\u1ec1n t\u1ea3ng (\u0111\u1eb7c bi\u1ec7t SOLID), m\u1ed9t s\u1ed1 nguy\u00ean l\u00fd b\u1ed5 tr\u1ee3, c\u00e1ch \u00e1p d\u1ee5ng v\u00e0o th\u1ef1c t\u1ebf, v\u00e0 nh\u1eefng sai l\u1ea7m th\u01b0\u1eddng g\u1eb7p khi thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"704\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-2.jpg\" alt=\"Nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m\" class=\"wp-image-2211\" style=\"width:655px;height:auto\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-2.jpg 1024w, https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-2-300x206.jpg 300w, https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-2-768x528.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">1. Kh\u00e1i ni\u1ec7m v\u00e0 vai tr\u00f2 c\u1ee7a thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m<\/h2>\n\n\n\n<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m (software design) l\u00e0 m\u1ed9t giai \u0111o\u1ea1n quan tr\u1ecdng trong v\u00f2ng \u0111\u1eddi ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m, n\u1eb1m gi\u1eefa ph\u00e2n t\u00edch y\u00eau c\u1ea7u v\u00e0 vi\u1ebft m\u00e3. N\u1ebfu giai \u0111o\u1ea1n ph\u00e2n t\u00edch gi\u00fap tr\u1ea3 l\u1eddi c\u00e2u h\u1ecfi <em>\u201cPh\u1ea7n m\u1ec1m c\u1ea7n l\u00e0m g\u00ec?\u201d<\/em>, th\u00ec giai \u0111o\u1ea1n thi\u1ebft k\u1ebf l\u1ea1i \u0111i s\u00e2u v\u00e0o <em>\u201cPh\u1ea7n m\u1ec1m s\u1ebd \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng nh\u01b0 th\u1ebf n\u00e0o?\u201d<\/em>. \u1ede b\u01b0\u1edbc n\u00e0y, m\u00ecnh b\u1eaft \u0111\u1ea7u chuy\u1ec3n c\u00e1c y\u00eau c\u1ea7u ch\u1ee9c n\u0103ng v\u00e0 phi ch\u1ee9c n\u0103ng th\u00e0nh nh\u1eefng m\u00f4 h\u00ecnh k\u1ef9 thu\u1eadt c\u1ee5 th\u1ec3  &#8211;  nh\u01b0 c\u1ea5u tr\u00fac l\u1edbp, m\u00f4-\u0111un, giao di\u1ec7n, lu\u1ed3ng d\u1eef li\u1ec7u, v\u00e0 m\u1ed1i quan h\u1ec7 gi\u1eefa c\u00e1c th\u00e0nh ph\u1ea7n trong h\u1ec7 th\u1ed1ng.<\/p>\n\n\n\n<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m kh\u00f4ng ch\u1ec9 l\u00e0 v\u1ebd s\u01a1 \u0111\u1ed3 hay chia module, m\u00e0 c\u00f2n l\u00e0 ngh\u1ec7 thu\u1eadt t\u1ed5 ch\u1ee9c logic v\u00e0 tr\u00e1ch nhi\u1ec7m \u0111\u1ec3 h\u1ec7 th\u1ed1ng v\u1eeba ho\u1ea1t \u0111\u1ed9ng hi\u1ec7u qu\u1ea3, v\u1eeba d\u1ec5 m\u1edf r\u1ed9ng v\u1ec1 sau. M\u1ed9t b\u1ea3n thi\u1ebft k\u1ebf t\u1ed1t l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u1ec3 nh\u00f3m ph\u00e1t tri\u1ec3n hi\u1ec3u r\u00f5 vai tr\u00f2 t\u1eebng ph\u1ea7n, tr\u00e1nh ch\u1ed3ng ch\u00e9o c\u00f4ng vi\u1ec7c, \u0111\u1ed3ng th\u1eddi gi\u00fap s\u1ea3n ph\u1ea9m c\u00f3 c\u1ea5u tr\u00fac r\u00f5 r\u00e0ng v\u00e0 d\u1ec5 duy tr\u00ec l\u00e2u d\u00e0i.<\/p>\n\n\n\n<p>M\u1ee5c ti\u00eau ch\u00ednh c\u1ee7a thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m g\u1ed3m:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u1ea1o c\u1ea5u tr\u00fac d\u1ec5 hi\u1ec3u cho m\u00e3 ngu\u1ed3n: m\u00e3 s\u1ea1ch, r\u00f5 r\u00e0ng, gi\u00fap ng\u01b0\u1eddi kh\u00e1c d\u1ec5 \u0111\u1ecdc, d\u1ec5 ti\u1ebfp n\u1ed1i c\u00f4ng vi\u1ec7c.<\/li>\n\n\n\n<li>\u0110\u1ea3m b\u1ea3o kh\u1ea3 n\u0103ng t\u00e1i s\u1eed d\u1ee5ng v\u00e0 m\u1edf r\u1ed9ng: c\u00e1c th\u00e0nh ph\u1ea7n \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf linh ho\u1ea1t \u0111\u1ec3 c\u00f3 th\u1ec3 thay \u0111\u1ed5i ho\u1eb7c m\u1edf r\u1ed9ng m\u00e0 kh\u00f4ng \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn h\u1ec7 th\u1ed1ng chung.<\/li>\n\n\n\n<li>Thu\u1eadn ti\u1ec7n cho ki\u1ec3m th\u1eed v\u00e0 b\u1ea3o tr\u00ec: khi m\u1ed7i ph\u1ea7n c\u00f3 tr\u00e1ch nhi\u1ec7m ri\u00eang bi\u1ec7t, vi\u1ec7c vi\u1ebft test, s\u1eeda l\u1ed7i ho\u1eb7c n\u00e2ng c\u1ea5p s\u1ebd \u0111\u01a1n gi\u1ea3n h\u01a1n nhi\u1ec1u.<\/li>\n\n\n\n<li>Gi\u1ea3m thi\u1ec3u r\u1ee7i ro khi thay \u0111\u1ed5i y\u00eau c\u1ea7u: nh\u1edd t\u00e1ch bi\u1ec7t c\u00e1c ph\u1ea7n h\u1ee3p l\u00fd, thay \u0111\u1ed5i \u1edf m\u1ed9t khu v\u1ef1c s\u1ebd \u00edt t\u00e1c \u0111\u1ed9ng \u0111\u1ebfn ph\u1ea7n kh\u00e1c, gi\u00fap h\u1ec7 th\u1ed1ng \u1ed5n \u0111\u1ecbnh h\u01a1n trong d\u00e0i h\u1ea1n.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" width=\"930\" height=\"545\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/la-gi.jpg\" alt=\"Nguy\u00ean l\u00fd thi\u1ebft k\u1ebf l\u00e0 g\u00ec\" class=\"wp-image-2221\" style=\"width:641px;height:auto\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/la-gi.jpg 930w, https:\/\/kienthucmo.com\/wp-content\/uploads\/la-gi-300x176.jpg 300w, https:\/\/kienthucmo.com\/wp-content\/uploads\/la-gi-768x450.jpg 768w\" sizes=\"(max-width: 930px) 100vw, 930px\" \/><figcaption class=\"wp-element-caption\">Kh\u00e1i ni\u1ec7m v\u00e0 vai tr\u00f2 c\u1ee7a thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m <\/figcaption><\/figure>\n<\/div>\n\n\n<p><strong>Ph\u00e2n bi\u1ec7t gi\u1eefa ki\u1ebfn tr\u00fac v\u00e0 thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m<\/strong>: Hai kh\u00e1i ni\u1ec7m n\u00e0y th\u01b0\u1eddng b\u1ecb nh\u1ea7m l\u1eabn, nh\u01b0ng th\u1ef1c t\u1ebf ch\u00fang ph\u1ee5c v\u1ee5 \u1edf hai c\u1ea5p \u0111\u1ed9 kh\u00e1c nhau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m (software architecture) gi\u1ed1ng nh\u01b0 b\u1ea3n quy ho\u1ea1ch t\u1ed5ng th\u1ec3 c\u1ee7a m\u1ed9t th\u00e0nh ph\u1ed1  &#8211;  n\u00f3 x\u00e1c \u0111\u1ecbnh c\u00e1c khu v\u1ef1c ch\u00ednh, c\u00e1ch ch\u00fang li\u00ean k\u1ebft, v\u00e0 nguy\u00ean t\u1eafc v\u1eadn h\u00e0nh chung. V\u00ed d\u1ee5: l\u1ef1a ch\u1ecdn m\u00f4 h\u00ecnh h\u1ec7 th\u1ed1ng microservices, monolithic, layered, hay event-driven.<\/li>\n\n\n\n<li>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m (software design) th\u00ec chi ti\u1ebft h\u01a1n, gi\u1ed1ng nh\u01b0 thi\u1ebft k\u1ebf t\u1eebng t\u00f2a nh\u00e0 trong khu quy ho\u1ea1ch  &#8211;  n\u00f3 quy\u1ebft \u0111\u1ecbnh t\u1eebng l\u1edbp, interface, module ho\u1ea1t \u0111\u1ed9ng ra sao, c\u00e1ch ch\u00fang giao ti\u1ebfp, chia s\u1ebb d\u1eef li\u1ec7u, v\u00e0 \u0111\u1ea3m b\u1ea3o tu\u00e2n theo ki\u1ebfn tr\u00fac t\u1ed5ng th\u1ec3.<\/li>\n<\/ul>\n\n\n\n<p><strong>Vai tr\u00f2 trong vi\u1ec7c tr\u00e1nh \u201ctechnical debt<\/strong>\u201d:<br>M\u1ed9t thi\u1ebft k\u1ebf t\u1ed1t gi\u00fap h\u1ec7 th\u1ed1ng d\u1ec5 d\u00e0ng th\u00edch \u1ee9ng v\u1edbi thay \u0111\u1ed5i m\u00e0 kh\u00f4ng ph\u00e1 v\u1ee1 c\u00e1c ph\u1ea7n \u0111\u00e3 \u1ed5n \u0111\u1ecbnh. Khi c\u1ea7n th\u00eam t\u00ednh n\u0103ng m\u1edbi, l\u1eadp tr\u00ecnh vi\u00ean c\u00f3 th\u1ec3 m\u1edf r\u1ed9ng m\u00e0 kh\u00f4ng ph\u1ea3i ch\u1ec9nh s\u1eeda s\u00e2u b\u00ean trong l\u00f5i c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh. Ng\u01b0\u1ee3c l\u1ea1i, thi\u1ebft k\u1ebf thi\u1ebfu t\u1ed5 ch\u1ee9c  &#8211;  ch\u1eb3ng h\u1ea1n vi\u1ebft m\u00e3 ch\u1ed3ng ch\u00e9o, kh\u00f4ng c\u00f3 ranh gi\u1edbi r\u00f5 r\u00e0ng  &#8211;  s\u1ebd t\u1ea1o ra c\u00e1i g\u1ecdi l\u00e0 <em>n\u1ee3 k\u1ef9 thu\u1eadt (technical debt)<\/em>. C\u00e0ng v\u1ec1 sau, vi\u1ec7c th\u00eam ho\u1eb7c s\u1eeda ch\u1ee9c n\u0103ng s\u1ebd c\u00e0ng kh\u00f3, v\u00ec thay \u0111\u1ed5i nh\u1ecf c\u00f3 th\u1ec3 \u1ea3nh h\u01b0\u1edfng d\u00e2y chuy\u1ec1n \u0111\u1ebfn nhi\u1ec1u n\u01a1i kh\u00e1c. Gi\u1ed1ng nh\u01b0 vi\u1ec7c x\u00e2y nh\u00e0 m\u00e0 kh\u00f4ng c\u00f3 b\u1ea3n v\u1ebd r\u00f5 r\u00e0ng, c\u00e0ng s\u1eeda c\u00e0ng r\u1ed1i, c\u00e0ng d\u1ec5 s\u1ee5p.<\/p>\n\n\n\n<p>T\u00f3m l\u1ea1i, thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m l\u00e0 c\u1ea7u n\u1ed1i gi\u1eefa \u00fd t\u01b0\u1edfng v\u00e0 hi\u1ec7n th\u1ef1c, gi\u1eefa m\u1ee5c ti\u00eau c\u1ee7a ng\u01b0\u1eddi d\u00f9ng v\u00e0 gi\u1ea3i ph\u00e1p k\u1ef9 thu\u1eadt c\u1ee7a l\u1eadp tr\u00ecnh vi\u00ean. N\u00f3 kh\u00f4ng ch\u1ec9 gi\u00fap m\u00e3 ngu\u1ed3n g\u1ecdn g\u00e0ng, d\u1ec5 hi\u1ec3u m\u00e0 c\u00f2n t\u1ea1o n\u1ec1n t\u1ea3ng v\u1eefng ch\u1eafc cho s\u1ef1 ph\u00e1t tri\u1ec3n l\u00e2u d\u00e0i c\u1ee7a s\u1ea3n ph\u1ea9m.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m c\u01a1 b\u1ea3n<\/h2>\n\n\n\n<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m kh\u00f4ng ch\u1ec9 l\u00e0 vi\u1ec7c s\u1eafp x\u1ebfp m\u00e3 ngu\u1ed3n sao cho \u201cch\u1ea1y \u0111\u01b0\u1ee3c\u201d, m\u00e0 l\u00e0 ngh\u1ec7 thu\u1eadt t\u1ed5 ch\u1ee9c h\u1ec7 th\u1ed1ng m\u1ed9t c\u00e1ch h\u1ee3p l\u00fd, linh ho\u1ea1t v\u00e0 d\u1ec5 ph\u00e1t tri\u1ec3n l\u00e2u d\u00e0i. D\u00f9 ph\u1ea7n m\u1ec1m c\u00f3 quy m\u00f4 nh\u1ecf hay l\u1edbn, c\u00e1c nguy\u00ean l\u00fd c\u01a1 b\u1ea3n sau lu\u00f4n l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u1ecbnh h\u01b0\u1edbng cho m\u1ecdi thi\u1ebft k\u1ebf hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"626\" height=\"420\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-3-e1760034051557.jpg\" alt=\"C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m c\u01a1 b\u1ea3n\" class=\"wp-image-2213\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-3-e1760034051557.jpg 626w, https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-ly-thiet-ke-phan-mem-3-e1760034051557-300x201.jpg 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><figcaption class=\"wp-element-caption\">C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m c\u01a1 b\u1ea3n<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.1. Nguy\u00ean l\u00fd chia t\u00e1ch m\u1ed1i quan t\u00e2m (Separation of Concerns)<\/h3>\n\n\n\n<p>\u0110\u00e2y l\u00e0 nguy\u00ean l\u00fd c\u1ed1t l\u00f5i nh\u1ea5t trong thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m. N\u00f3 khuy\u1ebfn kh\u00edch vi\u1ec7c ph\u00e2n chia h\u1ec7 th\u1ed1ng th\u00e0nh nhi\u1ec1u ph\u1ea7n, m\u1ed7i ph\u1ea7n ch\u1ec9 ch\u1ecbu tr\u00e1ch nhi\u1ec7m v\u1ec1 m\u1ed9t nh\u00f3m ch\u1ee9c n\u0103ng c\u1ee5 th\u1ec3.<br>V\u00ed d\u1ee5, trong m\u1ed9t \u1ee9ng d\u1ee5ng web, ph\u1ea7n giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng (UI), ph\u1ea7n x\u1eed l\u00fd nghi\u1ec7p v\u1ee5 (Business Logic), v\u00e0 ph\u1ea7n truy c\u1eadp d\u1eef li\u1ec7u (Database Access) n\u00ean \u0111\u01b0\u1ee3c t\u00e1ch bi\u1ec7t r\u00f5 r\u00e0ng.<br>\u0110i\u1ec1u n\u00e0y gi\u00fap cho vi\u1ec7c ph\u00e1t tri\u1ec3n song song, ki\u1ec3m th\u1eed \u0111\u1ed9c l\u1eadp v\u00e0 b\u1ea3o tr\u00ec d\u1ec5 d\u00e0ng h\u01a1n, \u0111\u1ed3ng th\u1eddi gi\u1ea3m nguy c\u01a1 l\u1ed7i lan truy\u1ec1n gi\u1eefa c\u00e1c th\u00e0nh ph\u1ea7n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2. Nguy\u00ean l\u00fd tr\u1eebu t\u01b0\u1ee3ng h\u00f3a (Abstraction)<\/h3>\n\n\n\n<p>Tr\u1eebu t\u01b0\u1ee3ng h\u00f3a gi\u00fap \u1ea9n \u0111i chi ti\u1ebft ph\u1ee9c t\u1ea1p, ch\u1ec9 gi\u1eef l\u1ea1i nh\u1eefng g\u00ec c\u1ea7n thi\u1ebft \u0111\u1ec3 ng\u01b0\u1eddi d\u00f9ng ho\u1eb7c th\u00e0nh ph\u1ea7n kh\u00e1c t\u01b0\u01a1ng t\u00e1c.<br>Nh\u1edd tr\u1eebu t\u01b0\u1ee3ng h\u00f3a, l\u1eadp tr\u00ecnh vi\u00ean kh\u00f4ng c\u1ea7n bi\u1ebft c\u00e1ch m\u1ed9t m\u00f4-\u0111un ho\u1ea1t \u0111\u1ed9ng b\u00ean trong, m\u00e0 ch\u1ec9 c\u1ea7n bi\u1ebft c\u00e1ch s\u1eed d\u1ee5ng n\u00f3.<br>V\u00ed d\u1ee5: khi b\u1ea1n d\u00f9ng m\u1ed9t l\u1edbp <code>DatabaseConnector<\/code>, b\u1ea1n kh\u00f4ng c\u1ea7n quan t\u00e2m n\u00f3 k\u1ebft n\u1ed1i qua TCP hay HTTP  &#8211;  ch\u1ec9 c\u1ea7n bi\u1ebft c\u00f3 th\u1ec3 g\u1ecdi <code>connect()<\/code> v\u00e0 <code>execute_query()<\/code>.<br>Nguy\u00ean l\u00fd n\u00e0y l\u00e0m t\u0103ng kh\u1ea3 n\u0103ng t\u00e1i s\u1eed d\u1ee5ng, b\u1ea3o m\u1eadt n\u1ed9i b\u1ed9 d\u1eef li\u1ec7u, v\u00e0 gi\u1ea3m s\u1ef1 ph\u1ee5 thu\u1ed9c gi\u1eefa c\u00e1c ph\u1ea7n trong h\u1ec7 th\u1ed1ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.3. Nguy\u00ean l\u00fd m\u00f4-\u0111un h\u00f3a (Modularity)<\/h3>\n\n\n\n<p>M\u00f4-\u0111un h\u00f3a l\u00e0 vi\u1ec7c chia h\u1ec7 th\u1ed1ng th\u00e0nh nhi\u1ec1u \u0111\u01a1n v\u1ecb nh\u1ecf, \u0111\u1ed9c l\u1eadp (modules), m\u1ed7i \u0111\u01a1n v\u1ecb c\u00f3 th\u1ec3 ph\u00e1t tri\u1ec3n, ki\u1ec3m th\u1eed, v\u00e0 tri\u1ec3n khai ri\u00eang bi\u1ec7t.<br>M\u1ed9t m\u00f4-\u0111un t\u1ed1t c\u00f3 ch\u1ee9c n\u0103ng r\u00f5 r\u00e0ng, giao di\u1ec7n \u0111\u01a1n gi\u1ea3n, v\u00e0 \u00edt ph\u1ee5 thu\u1ed9c v\u00e0o m\u00f4-\u0111un kh\u00e1c.<br>Nh\u1edd \u0111\u00f3, khi c\u1ea7n s\u1eeda \u0111\u1ed5i hay th\u00eam t\u00ednh n\u0103ng, ta ch\u1ec9 c\u1ea7n thay \u0111\u1ed5i m\u1ed9t ph\u1ea7n nh\u1ecf thay v\u00ec \u1ea3nh h\u01b0\u1edfng to\u00e0n h\u1ec7 th\u1ed1ng.<br>Nguy\u00ean l\u00fd n\u00e0y l\u00e0 ti\u1ec1n \u0111\u1ec1 quan tr\u1ecdng \u0111\u1ec3 ph\u00e1t tri\u1ec3n c\u00e1c ki\u1ebfn tr\u00fac hi\u1ec7n \u0111\u1ea1i nh\u01b0 microservices hay plugin-based systems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.4. Nguy\u00ean l\u00fd \u0111\u00f3ng g\u00f3i (Encapsulation)<\/h3>\n\n\n\n<p>\u0110\u00f3ng g\u00f3i gi\u00fap gi\u1edbi h\u1ea1n ph\u1ea1m vi truy c\u1eadp d\u1eef li\u1ec7u, \u0111\u1ea3m b\u1ea3o r\u1eb1ng c\u00e1c ph\u1ea7n kh\u00e1c c\u1ee7a h\u1ec7 th\u1ed1ng kh\u00f4ng th\u1ec3 can thi\u1ec7p tr\u1ef1c ti\u1ebfp v\u00e0o tr\u1ea1ng th\u00e1i n\u1ed9i b\u1ed9 c\u1ee7a m\u1ed9t l\u1edbp hay m\u00f4-\u0111un.<br>V\u00ed d\u1ee5, trong l\u1eadp tr\u00ecnh h\u01b0\u1edbng \u0111\u1ed1i t\u01b0\u1ee3ng, ta th\u01b0\u1eddng \u0111\u1ec3 thu\u1ed9c t\u00ednh \u1edf ch\u1ebf \u0111\u1ed9 \u201cprivate\u201d v\u00e0 cung c\u1ea5p ph\u01b0\u01a1ng th\u1ee9c \u201cgetter\/setter\u201d \u0111\u1ec3 truy c\u1eadp c\u00f3 ki\u1ec3m so\u00e1t.<br>\u0110i\u1ec1u n\u00e0y gi\u00fap gi\u1ea3m l\u1ed7i kh\u00f4ng mong mu\u1ed1n, t\u0103ng t\u00ednh \u1ed5n \u0111\u1ecbnh, v\u00e0 t\u1ea1o ra r\u00e0o ch\u1eafn b\u1ea3o v\u1ec7 logic b\u00ean trong kh\u1ecfi b\u1ecb thay \u0111\u1ed5i tu\u1ef3 ti\u1ec7n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.5. Nguy\u00ean l\u00fd t\u1ed1i gi\u1ea3n (Simplicity)<\/h3>\n\n\n\n<p>\u201c\u0110\u01a1n gi\u1ea3n l\u00e0 t\u1ed1i th\u01b0\u1ee3ng\u201d \u2013 nguy\u00ean l\u00fd n\u00e0y nh\u1ea5n m\u1ea1nh r\u1eb1ng thi\u1ebft k\u1ebf n\u00ean \u0111\u1ee7 \u0111\u1ec3 gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1, kh\u00f4ng n\u00ean ph\u1ee9c t\u1ea1p h\u00f3a kh\u00f4ng c\u1ea7n thi\u1ebft.<br>M\u1ed9t thi\u1ebft k\u1ebf \u0111\u01a1n gi\u1ea3n s\u1ebd d\u1ec5 hi\u1ec3u h\u01a1n, d\u1ec5 ki\u1ec3m th\u1eed, d\u1ec5 b\u1ea3o tr\u00ec v\u00e0 \u00edt l\u1ed7i h\u01a1n.<br>Nhi\u1ec1u h\u1ec7 th\u1ed1ng th\u1ea5t b\u1ea1i kh\u00f4ng ph\u1ea3i v\u00ec thi\u1ebfu ch\u1ee9c n\u0103ng, m\u00e0 v\u00ec thi\u1ebft k\u1ebf qu\u00e1 r\u01b0\u1eddm r\u00e0 khi\u1ebfn vi\u1ec7c m\u1edf r\u1ed9ng tr\u1edf n\u00ean kh\u00f3 kh\u0103n.<br>Gi\u1eef cho m\u1ecdi th\u1ee9 \u201cv\u1eeba \u0111\u1ee7\u201d l\u00e0 m\u1ed9t d\u1ea5u hi\u1ec7u c\u1ee7a thi\u1ebft k\u1ebf tr\u01b0\u1edfng th\u00e0nh.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m n\u1ed5i b\u1eadt \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng r\u1ed9ng r\u00e3i<\/h2>\n\n\n\n<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m hi\u1ec7n \u0111\u1ea1i ch\u1ecbu \u1ea3nh h\u01b0\u1edfng s\u00e2u s\u1eafc t\u1eeb nhi\u1ec1u nguy\u00ean l\u00fd c\u1ed1t l\u00f5i gi\u00fap h\u1ec7 th\u1ed1ng d\u1ec5 m\u1edf r\u1ed9ng, d\u1ec5 hi\u1ec3u v\u00e0 gi\u1ea3m r\u1ee7i ro thay \u0111\u1ed5i. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 nh\u1eefng nguy\u00ean l\u00fd n\u1ed5i b\u1eadt \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng r\u1ed9ng r\u00e3i trong th\u1ef1c t\u1ebf, t\u1eeb ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng nh\u1ecf \u0111\u1ebfn h\u1ec7 th\u1ed1ng quy m\u00f4 l\u1edbn.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"600\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-tac-thiet-ke-phan-mem-4.jpg\" alt=\"C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m n\u1ed5i b\u1eadt \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng r\u1ed9ng r\u00e3i\" class=\"wp-image-2215\" style=\"width:649px;height:auto\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-tac-thiet-ke-phan-mem-4.jpg 800w, https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-tac-thiet-ke-phan-mem-4-300x225.jpg 300w, https:\/\/kienthucmo.com\/wp-content\/uploads\/nguyen-tac-thiet-ke-phan-mem-4-768x576.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">3.1. Nguy\u00ean l\u00fd SOLID<\/h3>\n\n\n\n<p><strong>SOLID<\/strong> l\u00e0 b\u1ed9 5 nguy\u00ean t\u1eafc do <strong>Robert C. Martin<\/strong> \u0111\u1ec1 xu\u1ea5t, \u0111\u01b0\u1ee3c xem l\u00e0 kim ch\u1ec9 nam cho l\u1eadp tr\u00ecnh h\u01b0\u1edbng \u0111\u1ed1i t\u01b0\u1ee3ng (OOP). C\u00e1c nguy\u00ean t\u1eafc n\u00e0y gi\u00fap ph\u1ea7n m\u1ec1m d\u1ec5 m\u1edf r\u1ed9ng, d\u1ec5 ki\u1ec3m th\u1eed v\u00e0 duy tr\u00ec trong th\u1eddi gian d\u00e0i:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Single Responsibility Principle (SRP):<\/strong> M\u1ed7i l\u1edbp ch\u1ec9 n\u00ean c\u00f3 m\u1ed9t tr\u00e1ch nhi\u1ec7m duy nh\u1ea5t. Khi thay \u0111\u1ed5i y\u00eau c\u1ea7u, ta ch\u1ec9 c\u1ea7n s\u1eeda m\u1ed9t n\u01a1i.<\/li>\n\n\n\n<li><strong>Open\/Closed Principle (OCP):<\/strong> Class n\u00ean m\u1edf r\u1ed9ng \u0111\u01b0\u1ee3c nh\u01b0ng kh\u00f4ng s\u1eeda \u0111\u1ed5i tr\u1ef1c ti\u1ebfp. Thay v\u00ec ch\u1ec9nh s\u1eeda code c\u0169, ta k\u1ebf th\u1eeba ho\u1eb7c m\u1edf r\u1ed9ng h\u00e0nh vi th\u00f4ng qua interface, strategy, hay decorator.<\/li>\n\n\n\n<li><strong>Liskov Substitution Principle (LSP):<\/strong> L\u1edbp con ph\u1ea3i c\u00f3 th\u1ec3 thay th\u1ebf ho\u00e0n to\u00e0n l\u1edbp cha m\u00e0 kh\u00f4ng l\u00e0m thay \u0111\u1ed5i k\u1ebft qu\u1ea3 mong \u0111\u1ee3i.<\/li>\n\n\n\n<li><strong>Interface Segregation Principle (ISP):<\/strong> T\u00e1ch c\u00e1c interface l\u1edbn th\u00e0nh nhi\u1ec1u interface nh\u1ecf, chuy\u00ean bi\u1ec7t \u0111\u1ec3 tr\u00e1nh vi\u1ec7c l\u1edbp con ph\u1ea3i tri\u1ec3n khai nh\u1eefng h\u00e0m kh\u00f4ng c\u1ea7n thi\u1ebft.<\/li>\n\n\n\n<li><strong>Dependency Inversion Principle (DIP):<\/strong> M\u00f4-\u0111un c\u1ea5p cao kh\u00f4ng n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o m\u00f4-\u0111un c\u1ea5p th\u1ea5p, m\u00e0 c\u1ea3 hai n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o abstraction (giao di\u1ec7n).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.2. Nguy\u00ean l\u00fd DRY (Don\u2019t Repeat Yourself)<\/h3>\n\n\n\n<p>Nguy\u00ean l\u00fd <strong>DRY<\/strong> nh\u1ea5n m\u1ea1nh: <em>\u201cM\u1ed7i ph\u1ea7n tri th\u1ee9c trong h\u1ec7 th\u1ed1ng ch\u1ec9 n\u00ean t\u1ed3n t\u1ea1i \u1edf m\u1ed9t n\u01a1i duy nh\u1ea5t.\u201d<\/em><br>L\u1eb7p l\u1ea1i logic khi\u1ebfn vi\u1ec7c b\u1ea3o tr\u00ec tr\u1edf n\u00ean kh\u00f3 kh\u0103n \u2014 thay \u0111\u1ed5i m\u1ed9t ch\u1ed7, nh\u01b0ng qu\u00ean c\u1eadp nh\u1eadt ch\u1ed7 kh\u00e1c, d\u1eabn \u0111\u1ebfn l\u1ed7i kh\u00f4ng nh\u1ea5t qu\u00e1n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.3. Nguy\u00ean l\u00fd KISS (Keep It Simple, Stupid)<\/h3>\n\n\n\n<p>KISS khuy\u00ean r\u1eb1ng <strong>\u201cgi\u1ea3i ph\u00e1p \u0111\u01a1n gi\u1ea3n th\u01b0\u1eddng l\u00e0 gi\u1ea3i ph\u00e1p t\u1ed1t nh\u1ea5t\u201d<\/strong>.<br>Thi\u1ebft k\u1ebf ph\u1ee9c t\u1ea1p kh\u00f4ng ch\u1ec9 kh\u00f3 hi\u1ec3u m\u00e0 c\u00f2n d\u1ec5 t\u1ea1o ra l\u1ed7i ti\u1ec1m \u1ea9n. M\u1ed9t \u0111o\u1ea1n m\u00e3 ng\u1eafn, r\u00f5 r\u00e0ng s\u1ebd d\u1ec5 duy tr\u00ec v\u00e0 m\u1edf r\u1ed9ng h\u01a1n trong t\u01b0\u01a1ng lai.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.4. Nguy\u00ean l\u00fd YAGNI (You Aren\u2019t Gonna Need It)<\/h3>\n\n\n\n<p>Nguy\u00ean l\u00fd <strong>YAGNI<\/strong> c\u1ea3nh b\u00e1o: <em>\u201c\u0110\u1eebng vi\u1ebft nh\u1eefng g\u00ec b\u1ea1n ngh\u0129 s\u1ebd c\u1ea7n \u2014 h\u00e3y ch\u1ec9 vi\u1ebft nh\u1eefng g\u00ec b\u1ea1n th\u1ef1c s\u1ef1 c\u1ea7n ngay b\u00e2y gi\u1edd.\u201d<\/em><br>Nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean c\u00f3 xu h\u01b0\u1edbng \u201cover-engineering\u201d, c\u1ed1 g\u1eafng d\u1ef1 \u0111o\u00e1n v\u00e0 vi\u1ebft s\u1eb5n t\u00ednh n\u0103ng ch\u01b0a ch\u1eafc s\u1ebd d\u00f9ng t\u1edbi.<br>\u0110i\u1ec1u n\u00e0y l\u00e0m t\u0103ng \u0111\u1ed9 ph\u1ee9c t\u1ea1p v\u00e0 chi ph\u00ed b\u1ea3o tr\u00ec.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.5. Nguy\u00ean l\u00fd High Cohesion \u2013 Low Coupling (T\u00ednh g\u1eafn k\u1ebft cao, ph\u1ee5 thu\u1ed9c th\u1ea5p)<\/h3>\n\n\n\n<p>M\u1ed9t thi\u1ebft k\u1ebf t\u1ed1t c\u1ea7n \u0111\u1ea1t t\u00ednh g\u1eafn k\u1ebft cao (High Cohesion) &#8211; ngh\u0129a l\u00e0 c\u00e1c th\u00e0nh ph\u1ea7n trong m\u1ed9t m\u00f4-\u0111un ph\u1ea3i ph\u1ee5c v\u1ee5 c\u00f9ng m\u1ed9t m\u1ee5c \u0111\u00edch r\u00f5 r\u00e0ng &#8211; v\u00e0 \u0111\u1ed9 ph\u1ee5 thu\u1ed9c th\u1ea5p (Low Coupling) &#8211;  t\u1ee9c l\u00e0 c\u00e1c m\u00f4-\u0111un kh\u00f4ng n\u00ean ph\u1ee5 thu\u1ed9c ch\u1eb7t v\u00e0o nhau.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.6. Nguy\u00ean l\u00fd Separation of Interface and Implementation (T\u00e1ch bi\u1ec7t giao di\u1ec7n v\u00e0 hi\u1ec7n th\u1ef1c)<\/h3>\n\n\n\n<p>Nguy\u00ean l\u00fd n\u00e0y khuy\u1ebfn kh\u00edch vi\u1ec7c x\u00e2y d\u1ef1ng giao di\u1ec7n (interface) t\u00e1ch r\u1eddi kh\u1ecfi ph\u1ea7n hi\u1ec7n th\u1ef1c (implementation).<br>Nh\u1edd \u0111\u00f3, ta c\u00f3 th\u1ec3 thay th\u1ebf ho\u1eb7c m\u1edf r\u1ed9ng m\u1ed9t m\u00f4-\u0111un m\u00e0 kh\u00f4ng \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn ph\u1ea7n c\u00f2n l\u1ea1i c\u1ee7a h\u1ec7 th\u1ed1ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.7. Nguy\u00ean l\u00fd Composition over Inheritance (\u01afu ti\u00ean k\u1ebft h\u1ee3p h\u01a1n k\u1ebf th\u1eeba)<\/h3>\n\n\n\n<p>Thay v\u00ec k\u1ebf th\u1eeba \u0111\u1ec3 m\u1edf r\u1ed9ng h\u00e0nh vi, nguy\u00ean l\u00fd n\u00e0y khuy\u1ebfn kh\u00edch k\u1ebft h\u1ee3p (composition) c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng l\u1ea1i v\u1edbi nhau.<br>K\u1ebf th\u1eeba ch\u1eb7t ch\u1ebd khi\u1ebfn c\u1ea5u tr\u00fac c\u1ee9ng nh\u1eafc, trong khi composition gi\u00fap linh ho\u1ea1t h\u01a1n v\u00e0 d\u1ec5 thay \u0111\u1ed5i h\u00e0nh vi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. \u1ee8ng d\u1ee5ng nguy\u00ean l\u00fd thi\u1ebft k\u1ebf trong th\u1ef1c t\u1ebf<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"608\" height=\"373\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/ung-dung-nguyen-ly-thiet-ke-phan-mem.jpg\" alt=\"\u1ee8ng d\u1ee5ng nguy\u00ean l\u00fd thi\u1ebft k\u1ebf trong th\u1ef1c t\u1ebf\" class=\"wp-image-2217\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/ung-dung-nguyen-ly-thiet-ke-phan-mem.jpg 608w, https:\/\/kienthucmo.com\/wp-content\/uploads\/ung-dung-nguyen-ly-thiet-ke-phan-mem-300x184.jpg 300w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/><\/figure>\n<\/div>\n\n\n<p>Vi\u1ec7c \u00e1p d\u1ee5ng c\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m v\u00e0o d\u1ef1 \u00e1n th\u1ef1c t\u1ebf kh\u00f4ng ch\u1ec9 gi\u00fap m\u00e3 ngu\u1ed3n \u201c\u0111\u1eb9p\u201d h\u01a1n, m\u00e0 c\u00f2n \u0111\u1ea3m b\u1ea3o h\u1ec7 th\u1ed1ng d\u1ec5 m\u1edf r\u1ed9ng, d\u1ec5 b\u1ea3o tr\u00ec v\u00e0 h\u1ea1n ch\u1ebf t\u1ed1i \u0111a l\u1ed7i ph\u00e1t sinh v\u1ec1 sau.<\/p>\n\n\n\n<p>B\u1eaft \u0111\u1ea7u nh\u1ecf, c\u1ea3i ti\u1ebfn d\u1ea7n: \u1ede giai \u0111o\u1ea1n \u0111\u1ea7u, b\u1ea1n kh\u00f4ng c\u1ea7n \u00e1p d\u1ee5ng m\u1ecdi pattern ph\u1ee9c t\u1ea1p. H\u00e3y b\u1eaft \u0111\u1ea7u t\u1eeb c\u00e1c nguy\u00ean l\u00fd n\u1ec1n t\u1ea3ng nh\u01b0 SRP (Single Responsibility Principle), DRY (Don\u2019t Repeat Yourself) v\u00e0 SoC (Separation of Concerns) \u0111\u1ec3 gi\u1eef cho m\u00e3 ngu\u1ed3n g\u1ecdn g\u00e0ng, m\u1ed7i ph\u1ea7n ch\u1ec9 \u0111\u1ea3m nh\u1eadn m\u1ed9t nhi\u1ec7m v\u1ee5 r\u00f5 r\u00e0ng.<\/p>\n\n\n\n<p>S\u1eed d\u1ee5ng abstraction v\u00e0 dependency injection: Vi\u1ec7c d\u00f9ng interface v\u00e0 Dependency Injection (DI) gi\u00fap b\u1ea1n d\u1ec5 d\u00e0ng thay \u0111\u1ed5i ho\u1eb7c m\u1edf r\u1ed9ng ch\u1ee9c n\u0103ng m\u00e0 kh\u00f4ng c\u1ea7n s\u1eeda to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng. \u0110i\u1ec1u n\u00e0y \u0111\u1eb7c bi\u1ec7t h\u1eefu \u00edch trong qu\u00e1 tr\u00ecnh unit test \u2014 b\u1ea1n c\u00f3 th\u1ec3 mock d\u1eef li\u1ec7u v\u00e0 ki\u1ec3m th\u1eed t\u1eebng ph\u1ea7n ri\u00eang bi\u1ec7t.<\/p>\n\n\n\n<p>Code review &amp; testing: Thi\u1ebft l\u1eadp checklist cho qu\u00e1 tr\u00ecnh review nh\u01b0: tu\u00e2n th\u1ee7 SRP, t\u00ean bi\u1ebfn r\u00f5 ngh\u0129a, h\u1ea1n ch\u1ebf l\u1eb7p m\u00e3, logic d\u1ec5 hi\u1ec3u. K\u1ebft h\u1ee3p <strong>unit test<\/strong> v\u00e0 integration test gi\u00fap \u0111\u1ea3m b\u1ea3o m\u1ed7i thay \u0111\u1ed5i kh\u00f4ng l\u00e0m \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn ch\u1ee9c n\u0103ng hi\u1ec7n t\u1ea1i.<\/p>\n\n\n\n<p>Refactor \u0111\u1ecbnh k\u1ef3: Khi ph\u00e1t hi\u1ec7n code smell (m\u00e3 kh\u00f3 \u0111\u1ecdc, tr\u00f9ng l\u1eb7p, ho\u1eb7c ph\u1ee9c t\u1ea1p), h\u00e3y refactor s\u1edbm. Vi\u1ec7c l\u00e0m n\u00e0y gi\u00fap ki\u1ec3m so\u00e1t technical debt v\u00e0 gi\u1eef cho d\u1ef1 \u00e1n \u1ed5n \u0111\u1ecbnh l\u00e2u d\u00e0i.<\/p>\n\n\n\n<p>T\u00e0i li\u1ec7u v\u00e0 ki\u1ebfn tr\u00fac r\u00f5 r\u00e0ng: M\u1ed9t ki\u1ebfn tr\u00fac t\u1ed1t lu\u00f4n \u0111i k\u00e8m t\u00e0i li\u1ec7u ng\u1eafn g\u1ecdn: s\u01a1 \u0111\u1ed3 m\u00f4-\u0111un, README h\u01b0\u1edbng d\u1eabn c\u00e1ch ch\u1ea1y, test v\u00e0 tri\u1ec3n khai.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5 th\u1ef1c t\u1ebf: Trong h\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd ng\u01b0\u1eddi d\u00f9ng, ta c\u00f3 th\u1ec3 chia tr\u00e1ch nhi\u1ec7m r\u00f5 r\u00e0ng:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Controller<\/strong>: nh\u1eadn v\u00e0 x\u1eed l\u00fd HTTP request.<\/li>\n\n\n\n<li><strong>Service<\/strong>: th\u1ef1c hi\u1ec7n logic nghi\u1ec7p v\u1ee5 nh\u01b0 ki\u1ec3m tra d\u1eef li\u1ec7u, \u0111i\u1ec1u ph\u1ed1i lu\u1ed3ng x\u1eed l\u00fd.<\/li>\n\n\n\n<li><strong>Repository<\/strong>: giao ti\u1ebfp v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u.<\/li>\n<\/ul>\n\n\n\n<p>C\u00e1ch ph\u00e2n t\u00e1ch n\u00e0y gi\u00fap m\u1ed7i th\u00e0nh ph\u1ea7n ho\u1ea1t \u0111\u1ed9ng \u0111\u1ed9c l\u1eadp, d\u1ec5 ki\u1ec3m th\u1eed, d\u1ec5 thay \u0111\u1ed5i \u2014 \u0111\u00fang tinh th\u1ea7n c\u1ee7a c\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m hi\u1ec7n \u0111\u1ea1i.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Th\u00e1ch th\u1ee9c v\u00e0 sai l\u1ea7m th\u01b0\u1eddng g\u1eb7p trong thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m<\/h2>\n\n\n\n<p>D\u00f9 n\u1eafm v\u1eefng c\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf, trong th\u1ef1c t\u1ebf vi\u1ec7c \u00e1p d\u1ee5ng ch\u00fang v\u1eabn d\u1ec5 g\u1eb7p sai l\u1ea7m n\u1ebfu thi\u1ebfu kinh nghi\u1ec7m ho\u1eb7c kh\u00f4ng c\u00f3 \u0111\u1ecbnh h\u01b0\u1edbng r\u00f5 r\u00e0ng. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 nh\u1eefng v\u1ea5n \u0111\u1ec1 ph\u1ed5 bi\u1ebfn m\u00e0 c\u00e1c nh\u00f3m ph\u00e1t tri\u1ec3n th\u01b0\u1eddng m\u1eafc ph\u1ea3i &#8211;  c\u00f9ng v\u1edbi c\u00e1ch kh\u1eafc ph\u1ee5c hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"765\" height=\"415\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/thach-thuc-ap-dung-nguyen-ly-thiet-ke-phan-mem.jpg\" alt=\"Th\u00e1ch th\u1ee9c v\u00e0 sai l\u1ea7m th\u01b0\u1eddng g\u1eb7p trong thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m\" class=\"wp-image-2219\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/thach-thuc-ap-dung-nguyen-ly-thiet-ke-phan-mem.jpg 765w, https:\/\/kienthucmo.com\/wp-content\/uploads\/thach-thuc-ap-dung-nguyen-ly-thiet-ke-phan-mem-300x163.jpg 300w\" sizes=\"(max-width: 765px) 100vw, 765px\" \/><\/figure>\n\n\n\n<p><strong>Over-abstraction \/ Premature abstraction:<\/strong><br>M\u1ed9t l\u1ed7i kinh \u0111i\u1ec3n l\u00e0 tr\u1eebu t\u01b0\u1ee3ng h\u00f3a qu\u00e1 s\u1edbm, t\u1ea1o ra nhi\u1ec1u l\u1edbp, interface ho\u1eb7c t\u1ea7ng trung gian khi ch\u01b0a th\u1ef1c s\u1ef1 c\u1ea7n thi\u1ebft. \u0110i\u1ec1u n\u00e0y khi\u1ebfn m\u00e3 ngu\u1ed3n tr\u1edf n\u00ean r\u1ed1i r\u1eafm, kh\u00f3 theo d\u00f5i v\u00e0 kh\u00f3 debug. Quy t\u1eafc \u0111\u01a1n gi\u1ea3n l\u00e0: <em>n\u1ebfu hi\u1ec7n t\u1ea1i ch\u1ec9 c\u00f3 m\u1ed9t implementation, \u0111\u1eebng t\u1ea1o interface v\u1ed9i<\/em> \u2014 h\u00e3y ch\u1edd \u0111\u1ebfn khi c\u00f3 nhu c\u1ea7u m\u1edf r\u1ed9ng th\u1eadt s\u1ef1 m\u1edbi tr\u1eebu t\u01b0\u1ee3ng h\u00f3a.<\/p>\n\n\n\n<p><strong>Over-engineering:<\/strong><br>M\u1ed9t s\u1ed1 l\u1eadp tr\u00ecnh vi\u00ean c\u00f3 xu h\u01b0\u1edbng \u201cd\u1ef1 ph\u00f2ng m\u1ecdi t\u00ecnh hu\u1ed1ng\u201d b\u1eb1ng c\u00e1ch thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng c\u1ef1c k\u1ef3 ph\u1ee9c t\u1ea1p. K\u1ebft qu\u1ea3 l\u00e0 th\u1eddi gian ph\u00e1t tri\u1ec3n k\u00e9o d\u00e0i, m\u00e3 kh\u00f3 \u0111\u1ecdc v\u00e0 kh\u00f3 b\u1ea3o tr\u00ec. H\u00e3y \u00e1p d\u1ee5ng nguy\u00ean l\u00fd <strong>YAGNI (You Aren\u2019t Gonna Need It)<\/strong> \u2013 ch\u1ec9 vi\u1ebft nh\u1eefng g\u00ec th\u1eadt s\u1ef1 c\u1ea7n cho hi\u1ec7n t\u1ea1i, sau n\u00e0y c\u00f3 th\u1ec3 m\u1edf r\u1ed9ng d\u1ea7n khi c\u00f3 y\u00eau c\u1ea7u m\u1edbi.<\/p>\n\n\n\n<p><strong>Thi\u1ebfu nh\u1ea5t qu\u00e1n trong team:<\/strong><br>Ngay c\u1ea3 thi\u1ebft k\u1ebf t\u1ed1t c\u0169ng d\u1ec5 tr\u1edf n\u00ean h\u1ed7n lo\u1ea1n n\u1ebfu m\u1ed7i th\u00e0nh vi\u00ean vi\u1ebft code theo phong c\u00e1ch ri\u00eang. S\u1ef1 kh\u00f4ng th\u1ed1ng nh\u1ea5t v\u1ec1 c\u00e1ch \u0111\u1eb7t t\u00ean, c\u1ea5u tr\u00fac th\u01b0 m\u1ee5c hay quy t\u1eafc format l\u00e0m gi\u1ea3m ch\u1ea5t l\u01b0\u1ee3ng d\u1ef1 \u00e1n. Gi\u1ea3i ph\u00e1p l\u00e0 th\u1ed1ng nh\u1ea5t coding standard, d\u00f9ng style guide, linting tools, v\u00e0 code review \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o t\u00ednh \u0111\u1ed3ng b\u1ed9 trong to\u00e0n nh\u00f3m.<\/p>\n\n\n\n<p><strong>B\u1ecf qua ki\u1ec3m th\u1eed v\u00e0 CI\/CD:<\/strong><br>M\u1ed9t thi\u1ebft k\u1ebf d\u00f9 t\u1ed1t \u0111\u1ebfn \u0111\u00e2u nh\u01b0ng thi\u1ebfu test v\u00e0 Continuous Integration (CI) th\u00ec s\u1edbm mu\u1ed9n c\u0169ng ph\u00e1t sinh l\u1ed7i khi m\u1edf r\u1ed9ng. Vi\u1ec7c thi\u1ebft l\u1eadp pipeline CI gi\u00fap t\u1ef1 \u0111\u1ed9ng h\u00f3a ki\u1ec3m th\u1eed, ph\u00e1t hi\u1ec7n l\u1ed7i s\u1edbm v\u00e0 gi\u1eef cho h\u1ec7 th\u1ed1ng lu\u00f4n \u1ed5n \u0111\u1ecbnh.<\/p>\n\n\n\n<p><strong>Ghi ch\u00fa:<\/strong><br>Lu\u00f4n \u01b0u ti\u00ean t\u00ednh d\u1ec5 \u0111\u1ecdc (readability) h\u01a1n s\u1ef1 \u201cth\u00f4ng minh\u201d trong code. Refactor s\u1edbm khi th\u1ea5y d\u1ea5u hi\u1ec7u l\u1eb7p l\u1ea1i ho\u1eb7c ph\u1ee9c t\u1ea1p h\u00f3a. Duy tr\u00ec test coverage \u1edf m\u1ee9c h\u1ee3p l\u00fd \u0111\u1ec3 t\u1ef1 tin khi ch\u1ec9nh s\u1eeda hay m\u1edf r\u1ed9ng ph\u1ea7n m\u1ec1m. M\u1ed9t thi\u1ebft k\u1ebf t\u1ed1t kh\u00f4ng ch\u1ec9 n\u1eb1m \u1edf s\u1ef1 tinh vi, m\u00e0 \u1edf kh\u1ea3 n\u0103ng gi\u00fap con ng\u01b0\u1eddi hi\u1ec3u v\u00e0 l\u00e0m vi\u1ec7c v\u1edbi n\u00f3 d\u1ec5 d\u00e0ng nh\u1ea5t.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. K\u1ebft lu\u1eadn<\/h2>\n\n\n\n<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m l\u00e0 c\u1ea7u n\u1ed1i quan tr\u1ecdng gi\u1eefa t\u01b0 duy \u00fd t\u01b0\u1edfng v\u00e0 s\u1ea3n ph\u1ea9m th\u1ef1c t\u1ebf \u2014 n\u01a1i t\u01b0 duy k\u1ef9 thu\u1eadt g\u1eb7p g\u1ee1 t\u00ednh s\u00e1ng t\u1ea1o. M\u1ed9t thi\u1ebft k\u1ebf t\u1ed1t kh\u00f4ng ch\u1ec9 gi\u00fap ph\u1ea7n m\u1ec1m ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh, m\u00e0 c\u00f2n gi\u00fap \u0111\u1ed9i ng\u0169 ph\u00e1t tri\u1ec3n d\u1ec5 d\u00e0ng m\u1edf r\u1ed9ng, b\u1ea3o tr\u00ec v\u00e0 th\u00edch \u1ee9ng v\u1edbi thay \u0111\u1ed5i trong t\u01b0\u01a1ng lai.<\/p>\n\n\n\n<p>Qua b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh c\u00f9ng b\u1ea1n \u0111\u00e3 t\u00ecm hi\u1ec3u t\u1eeb kh\u00e1i ni\u1ec7m, vai tr\u00f2, \u0111\u1ebfn c\u00e1c nguy\u00ean l\u00fd c\u1ed1t l\u00f5i nh\u01b0 <strong>SOLID<\/strong>, <strong>DRY<\/strong>, <strong>KISS<\/strong>, <strong>YAGNI<\/strong>, c\u00f9ng v\u1edbi c\u00e1ch \u00e1p d\u1ee5ng th\u1ef1c t\u1ebf v\u00e0 nh\u1eefng th\u00e1ch th\u1ee9c th\u01b0\u1eddng g\u1eb7p. C\u00f3 th\u1ec3 th\u1ea5y r\u1eb1ng, thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t \u201cb\u01b0\u1edbc\u201d \u0111\u01a1n l\u1ebb trong quy tr\u00ecnh ph\u00e1t tri\u1ec3n, m\u00e0 l\u00e0 m\u1ed9t t\u01b0 duy xuy\u00ean su\u1ed1t \u2013 hi\u1ec7n di\u1ec7n t\u1eeb d\u00f2ng code \u0111\u1ea7u ti\u00ean cho \u0111\u1ebfn khi ph\u1ea7n m\u1ec1m tr\u01b0\u1edfng th\u00e0nh.<\/p>\n\n\n\n<p>\u0110i\u1ec1u quan tr\u1ecdng l\u00e0 kh\u00f4ng ch\u1ea1y theo s\u1ef1 ho\u00e0n h\u1ea3o tuy\u1ec7t \u0111\u1ed1i, m\u00e0 h\u1ecdc c\u00e1ch thi\u1ebft k\u1ebf v\u1eeba \u0111\u1ee7, r\u00f5 r\u00e0ng v\u00e0 linh ho\u1ea1t. Khi hi\u1ec3u \u0111\u01b0\u1ee3c \u201cv\u00ec sao\u201d \u0111\u1eb1ng sau m\u1ed7i nguy\u00ean l\u00fd, ta s\u1ebd bi\u1ebft \u201ckhi n\u00e0o\u201d n\u00ean \u00e1p d\u1ee5ng v\u00e0 \u201ckhi n\u00e0o\u201d n\u00ean \u0111\u01a1n gi\u1ea3n h\u00f3a.<\/p>\n\n\n\n<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m l\u00e0 m\u1ed9t h\u00e0nh tr\u00ecnh h\u1ecdc h\u1ecfi kh\u00f4ng ng\u1eebng. M\u1ed7i d\u1ef1 \u00e1n, m\u1ed7i d\u00f2ng code \u0111\u1ec1u l\u00e0 c\u01a1 h\u1ed9i \u0111\u1ec3 m\u00ecnh hi\u1ec3u s\u00e2u h\u01a1n v\u1ec1 c\u00e1ch con ng\u01b0\u1eddi v\u00e0 c\u00f4ng ngh\u1ec7 t\u01b0\u01a1ng t\u00e1c. V\u00e0 \u0111\u00f3 c\u0169ng ch\u00ednh l\u00e0 v\u1ebb \u0111\u1eb9p c\u1ee7a ngh\u1ec1 l\u1eadp tr\u00ecnh \u2013 v\u1eeba l\u00e0 khoa h\u1ecdc, v\u1eeba l\u00e0 ngh\u1ec7 thu\u1eadt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. T\u00e0i li\u1ec7u tham kh\u1ea3o<\/h2>\n\n\n\n<p>[1] R. C. Martin, <em>Clean Architecture: A Craftsman\u2019s Guide to Software Structure and Design<\/em>. Prentice Hall, 2017.<br>[2] R. C. Martin, <em>Agile Software Development: Principles, Patterns, and Practices<\/em>. Prentice Hall, 2002.<br>[3] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, <em>Design Patterns: Elements of Reusable Object-Oriented Software<\/em>. Addison-Wesley, 1994.<br>[4] S. McConnell, <em>Code Complete: A Practical Handbook of Software Construction<\/em>, 2nd ed. Microsoft Press, 2004.<br>[5] M. Fowler, <em>Refactoring: Improving the Design of Existing Code<\/em>, 2nd ed. Addison-Wesley, 2018.<br>[6] IEEE Computer Society, <em>Guide to the Software Engineering Body of Knowledge (SWEBOK)<\/em>, Version 3.0, 2014.<br>[7] D. Thomas and A. Hunt, <em>The Pragmatic Programmer: Your Journey to Mastery<\/em>, 20th Anniversary ed. Addison-Wesley, 2019.<br>[8] M. Feathers, <em>Working Effectively with Legacy Code<\/em>. Prentice Hall, 2004.<br>[9] M. H\u00fcttermann, <em>DevOps for Developers<\/em>. Apress, 2012.<br>[10] IEEE Std 1016-2009, <em>IEEE Standard for Information Technology\u2014Systems Design\u2014Software Design Descriptions<\/em>, IEEE Computer Society, 2009.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m l\u00e0 c\u1ea7u n\u1ed1i quan tr\u1ecdng gi\u1eefa t\u01b0 duy \u00fd t\u01b0\u1edfng v\u00e0 s\u1ea3n ph\u1ea9m th\u1ef1c t\u1ebf \u2014 n\u01a1i t\u01b0 duy k\u1ef9 thu\u1eadt g\u1eb7p g\u1ee1 t\u00ednh s\u00e1ng t\u1ea1o. M\u1ed9t thi\u1ebft k\u1ebf t\u1ed1t kh\u00f4ng ch\u1ec9 gi\u00fap ph\u1ea7n m\u1ec1m ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh, m\u00e0 c\u00f2n gi\u00fap \u0111\u1ed9i ng\u0169 ph\u00e1t tri\u1ec3n d\u1ec5 d\u00e0ng m\u1edf r\u1ed9ng, b\u1ea3o tr\u00ec v\u00e0 th\u00edch \u1ee9ng v\u1edbi thay \u0111\u1ed5i trong t\u01b0\u01a1ng lai.<\/p>\n","protected":false},"author":1,"featured_media":2209,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowieHDDA:productID":"","footnotes":""},"categories":[17],"tags":[34],"class_list":["post-2206","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cong-nghe-phan-mem","tag-nguyen-ly-thiet-ke-phan-mem"],"_links":{"self":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts\/2206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/comments?post=2206"}],"version-history":[{"count":5,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts\/2206\/revisions"}],"predecessor-version":[{"id":3317,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts\/2206\/revisions\/3317"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/media\/2209"}],"wp:attachment":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/media?parent=2206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/categories?post=2206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/tags?post=2206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}