LỜI NÓI ĐẦU Tiêu đề cuốn sách này là Clean Architecture. Đó là một cái tên đầy tham vọng. Thậm chí, có người còn cho rằng nó kiêu ngạo. Vậy tại sao tôi lại chọn cái tên đó, và tại sao tôi viết cuốn sách này? Tôi bắt đầu viết dòng code đầu tiên vào năm 1964, khi mới 12 tuổi. Giờ là năm 2016, nghĩa là tôi đã viết code hơn nửa thế kỷ. Trong khoảng thời gian đó, tôi đã học được một vài điều quan trọng về cách cấu trúc hệ thống phần mềm — những điều mà tôi tin rằng nhiều người khác cũng sẽ thấy hữu ích. Tôi học được những điều này qua việc xây dựng rất nhiều hệ thống, cả lớn lẫn nhỏ. Tôi đã làm hệ thống nhúng nhỏ, cũng như hệ thống xử lý theo lô quy mô lớn. Tôi từng phát triển hệ thống thời gian thực, hệ thống web. Tôi làm từ ứng dụng console, ứng dụng giao diện GUI, phần mềm điều khiển quy trình, game, hệ thống kế toán, viễn thông, công cụ thiết kế, ứng dụng vẽ, và rất nhiều loại khác nữa. Tôi đã xây dựng ứng dụng đơn luồng, đa luồng, ứng dụng có vài tiến trình nặng, ứng dụng có nhiều tiến trình nhẹ, ứng dụng đa bộ xử lý, ứng dụng cơ sở dữ liệu, ứng dụng toán học, ứng dụng hình học tính toán, và vô số các thể loại khác. Tôi làm rất nhiều ứng dụng, rất nhiều hệ thống. Và từ tất cả những kinh nghiệm ấy, tôi đã nhận ra một điều gây sửng sốt: **Nguyên tắc kiến trúc phần mềm là như nhau!** Điều này khiến nhiều người ngạc nhiên vì các hệ thống tôi làm ra đều rất khác biệt. Tại sao những hệ thống rất khác nhau ấy lại tuân theo chung một bộ nguyên tắc kiến trúc? Tôi kết luận rằng những quy tắc kiến trúc phần mềm không phụ thuộc vào bất kỳ biến số nào khác. Điều này càng đáng ngạc nhiên hơn khi bạn nhìn vào sự thay đổi của phần cứng trong nửa thế kỷ qua. Tôi bắt đầu lập trình trên những chiếc máy to như tủ lạnh, có chu kỳ chạy chỉ nửa megahertz, 4K bộ nhớ chính, 32K đĩa lưu trữ, và giao diện teleprinter 10 ký tự mỗi giây. Còn giờ đây, tôi đang viết lời nói đầu này trên một chuyến xe buýt ở Nam Phi, dùng MacBook có bốn lõi i7 chạy 2.8GHz mỗi lõi, 16GB RAM, ổ SSD một terabyte, màn hình retina 2880×1800 hiển thị video siêu nét. Sự khác biệt về sức mạnh tính toán là kinh ngạc. Phân tích hợp lý sẽ cho thấy chiếc MacBook này ít nhất mạnh hơn những máy đầu tiên mà tôi dùng đến 10^22 lần. Hai mươi hai bậc độ lớn là một con số cực kỳ lớn. Nó bằng số angstrom từ Trái Đất đến Alpha-Centauri. Nó cũng bằng số electron trong ví hoặc túi xách của bạn. Và đây chính là sự tăng trưởng sức mạnh tính toán trong đời tôi. Và với sự thay đổi khổng lồ về sức mạnh phần cứng, phần mềm tôi viết bị ảnh hưởng thế nào? Chắc chắn là trở nên lớn hơn. Tôi từng nghĩ 2.000 dòng code là chương trình lớn — đó là một bộ thẻ đục lỗ nặng 10 pound. Nhưng giờ đây, phần mềm không được xem là lớn nếu chưa vượt 100.000 dòng. Phần mềm hiện cũng nhanh hơn nhiều. Ngày nay, ta làm được những gì mà vào những năm 1960 còn chưa thể mơ tới. Những tác phẩm như The Forbin Project, The Moon Is a Harsh Mistress, hay 2001: A Space Odyssey từng cố hình dung tương lai công nghệ, nhưng họ đã sai lệch rõ ràng. Chúng tưởng tượng máy móc khổng lồ có ý thức. Thực tế lại là những chiếc máy cực nhỏ, nhưng vẫn chỉ là… máy móc thuần túy. Và còn một điều nữa về phần mềm hiện tại, so với phần mềm trước kia: nó được tạo nên từ cùng một thành phần. Vẫn là các câu lệnh if, câu lệnh gán, và các vòng while. Bạn có thể phản biện rằng giờ chúng ta có ngôn ngữ tốt hơn và những mô hình lập trình ưu việt hơn. Dù ta lập trình bằng Java, C#, hoặc Ruby, và dùng thiết kế hướng đối tượng, nhưng mã nguồn vẫn chỉ là tổng hợp của trình tự, lựa chọn và lặp — y hệt như những thập niên 1950 và 1960. Khi nhìn thực tế vào công việc lập trình, ta nhận ra rất ít thay đổi trong 50 năm qua. Ngôn ngữ thì cải tiến chút ít. Công cụ tốt hơn nhiều. Nhưng các thành phần cơ bản cấu thành chương trình vẫn không đổi. Giả sử tôi đem một lập trình viên năm 1966 tới năm 2016, cho cô ấy ngồi trước MacBook chạy IntelliJ dùng Java; có thể cô ấy sẽ cần 24 giờ để sốc lại tinh thần. Nhưng rồi cô ấy vẫn có thể viết code. Java chẳng khác biệt mấy so với C hay Fortran. Và nếu tôi đưa bạn trở lại năm 1966, chỉ bạn cách viết và sửa code PDP-8 bằng cách đục băng giấy trên máy teleprinter 10 ký tự mỗi giây, bạn có thể cần 24 giờ để chấp nhận sự thất vọng. Nhưng rồi bạn vẫn có thể viết được code. Mã lệnh thực ra cũng không đổi thay nhiều. Đó chính là bí mật: tính bất biến của mã lệnh là lý do khiến nguyên tắc kiến trúc phần mềm được duy trì nhất quán trên mọi loại hệ thống. Các quy tắc kiến trúc phần mềm chính là quy tắc sắp xếp và tổ chức các thành phần lập trình cơ bản. Và vì các thành phần căn bản này là phổ quát và không đổi, nên các quy tắc sắp đặt chúng cũng luôn như vậy. Những lập trình viên trẻ có thể cho rằng điều này là phi lý. Họ sẽ khăng khăng rằng mọi thứ hiện nay đều mới mẻ và khác biệt, rằng quy tắc cũ đã lỗi thời. Nếu họ nghĩ vậy thì thật đáng tiếc. Các quy tắc vẫn như xưa. Bất chấp ngôn ngữ, framework, và mô hình mới, những quy tắc đó vẫn y nguyên, từ khi Alan Turing viết mã máy đầu tiên năm 1946. Chỉ có một điều thay đổi: ngày trước, chúng ta không biết quy tắc là gì. Vì thế, chúng ta đã vi phạm chúng hết lần này đến lần khác. Giờ thì với hơn 50 năm kinh nghiệm, ta đã nắm được các quy tắc đó. Và chính những quy tắc – bất biến và vượt thời gian – ấy là chủ đề cốt lõi của cuốn sách này. Đăng ký bản sao Clean Architecture trên trang InformIT để thuận tiện cập nhật những bổ sung hoặc sửa lỗi khi có. Để bắt đầu đăng ký, truy cập informit.com/register, đăng nhập hoặc tạo tài khoản. Nhập mã ISBN sản phẩm (9780134494166) rồi nhấn Submit. Tại tab Registered Products, tìm liên kết Access Bonus Content bên cạnh sản phẩm này và theo đó để truy cập tài liệu bổ sung. Bạn nên đăng ký bản sao Clean Architecture trên trang InformIT để thuận tiện cập nhật bổ sung hoặc sửa lỗi khi có. Để bắt đầu, vào informit.com/register, đăng nhập hoặc tạo tài khoản, nhập mã ISBN sản phẩm (9780134494166), nhấn Submit. Trong tab Registered Products, nhấp vào liên kết Access Bonus Content bên cạnh sản phẩm này để truy cập tài liệu bonus. 1. Và rất có khả năng người đó là nữ, bởi hồi ấy phụ nữ chiếm tỷ lệ lớn trong đội ngũ lập trình viên.