Từ trên xuống là một cách tuyệt vời để mô tả những thứ bạn biết hoặc để xây dựng lại những thứ bạn đã xây dựng.
Vấn đề lớn nhất từ trên xuống là khá thường xuyên đơn giản là không có "đỉnh". Bạn sẽ thay đổi suy nghĩ về những gì hệ thống nên làm trong khi phát triển hệ thống và trong khi khám phá tên miền. Làm thế nào có thể là điểm khởi đầu của bạn một cái gì đó mà bạn không biết (tức là những gì bạn muốn hệ thống làm)?
Một "địa phương" từ trên xuống là một điều tốt ... một số suy nghĩ trước khi mã hóa rõ ràng là tốt. Nhưng suy nghĩ và lên kế hoạch quá nhiều thì không, bởi vì những gì bạn đang hình dung không phải là kịch bản thực sự (trừ khi bạn đã ở đó trước đó, tức là nếu bạn không xây dựng, mà là xây dựng lại). Từ trên xuống toàn cầu khi xây dựng những thứ mới chỉ là vô nghĩa.
Từ dưới lên phải là (trên toàn cầu) cách tiếp cận trừ khi bạn biết 100% vấn đề, bạn chỉ cần giải pháp đã biết để được mã hóa và bạn không quan tâm đến việc tìm kiếm các giải pháp thay thế khả thi.
Cách tiếp cận Lisp là từ dưới lên. Bạn không chỉ xây dựng từ dưới lên mà bạn còn có thể định hình các viên gạch theo cách bạn cần. Không có gì là cố định, tự do là toàn bộ. Tất nhiên tự do chịu trách nhiệm và bạn có thể tạo ra những điều khủng khiếp bằng cách lạm dụng sức mạnh này.
Nhưng mã khủng khiếp có thể được viết bằng bất kỳ ngôn ngữ nào. Ngay cả trong các ngôn ngữ được định hình là lồng cho tâm trí, được thiết kế với hy vọng rằng với những ngôn ngữ đó, ngay cả những con khỉ cũng có thể có được các chương trình tốt và chạy (một ý tưởng quá sai ở nhiều cấp độ đến nỗi chỉ đau khi nghĩ về nó).
Ví dụ của bạn là về một máy chủ web. Bây giờ trong năm 2012, đây là một vấn đề được xác định rõ, bạn có thông số kỹ thuật cần tuân thủ. Một máy chủ web chỉ là một vấn đề thực hiện. Đặc biệt là nếu bạn đang nhắm đến việc viết một máy chủ web hoàn toàn giống với các máy chủ web khác hiện có thì không có gì thực sự không rõ ràng, ngoại trừ một số chi tiết vụn vặt. Ngay cả nhận xét của bạn về RSA vẫn đang nói về một vấn đề được xác định rõ ràng, với các thông số kỹ thuật chính thức.
Với một vấn đề được xác định rõ ràng, với các thông số kỹ thuật chính thức và các giải pháp đã biết thì mã hóa chỉ là kết nối trong các dấu chấm. Từ trên xuống là ok cho điều đó. Đây là thiên đường quản lý dự án.
Tuy nhiên, trong nhiều trường hợp, không có cách tiếp cận nổi tiếng nào được chứng minh sẽ được sử dụng để kết nối các dấu chấm. Trên thực tế rất thường rất khó để nói ngay cả những gì là dấu chấm.
Ví dụ, giả sử bạn được yêu cầu hướng dẫn một máy cắt tự động căn chỉnh các bộ phận được cắt thành vật liệu in không hoàn toàn phù hợp với logo lặp đi lặp lại theo lý thuyết. Bạn được cung cấp các bộ phận và hình ảnh của vật liệu như được chụp bằng máy.
Một quy tắc liên kết là gì? Bạn quyết định. Một mô hình là gì, làm thế nào để đại diện cho nó? Bạn quyết định. Làm thế nào để sắp xếp các bộ phận? Bạn quyết định. Các bộ phận có thể được "uốn cong"? Nó phụ thuộc, một số không và một số có, nhưng tất nhiên không quá nhiều. Phải làm gì nếu vật liệu quá biến dạng đối với một phần để cắt nó chấp nhận được? Bạn quyết định. Có phải tất cả các cuộn vật liệu giống hệt nhau? Tất nhiên là không, nhưng bạn không thể sửa lỗi người dùng để điều chỉnh quy tắc căn chỉnh cho mỗi cuộn ... điều đó là không thực tế. Những hình ảnh đang nhìn thấy các máy ảnh? Các vật liệu, bất cứ điều gì có thể có nghĩa là ... nó có thể là màu sắc, nó có thể là màu đen hơn màu đen trong đó chỉ có phản xạ ánh sáng làm cho mô hình rõ ràng. Nó có nghĩa là gì để nhận ra một mô hình? Bạn quyết định.
Bây giờ hãy thử thiết kế cấu trúc chung của một giải pháp cho vấn đề này và đưa ra một báo giá, bằng tiền và thời gian. Đặt cược của tôi là ngay cả kiến trúc hệ thống của bạn ... (vâng, kiến trúc) sẽ sai. Dự toán chi phí và thời gian sẽ là những con số ngẫu nhiên.
Chúng tôi đã triển khai nó và bây giờ nó là một hệ thống làm việc, nhưng đã thay đổi suy nghĩ về hình dạng của hệ thống rất nhiều lần. Chúng tôi đã thêm toàn bộ hệ thống phụ mà thậm chí không thể truy cập được từ các menu. Chúng tôi đã chuyển đổi vai trò chủ / nô lệ trong các giao thức nhiều lần. Có lẽ bây giờ chúng tôi đã có đủ kiến thức để cố gắng xây dựng lại nó tốt hơn.
Các công ty khác tất nhiên đã giải quyết vấn đề tương tự ... nhưng trừ khi bạn ở một trong những công ty này, rất có thể dự án chi tiết từ trên xuống của bạn sẽ là một trò đùa. Chúng tôi có thể thiết kế nó từ trên xuống. Bạn không thể bởi vì bạn chưa bao giờ làm điều đó trước đây.
Bạn có thể có thể giải quyết vấn đề tương tự quá. Làm việc từ dưới lên tuy nhiên. Bắt đầu với những gì bạn biết, học những gì bạn không và thêm vào.
Hệ thống phần mềm phức tạp mới được phát triển, không được thiết kế. Thỉnh thoảng ai đó bắt đầu thiết kế một hệ thống phần mềm phức tạp lớn mới từ đầu (lưu ý rằng với một dự án phần mềm phức tạp lớn, chỉ có ba khả năng: a] đặc tả là mờ, b] đặc tả sai và tự mâu thuẫn hoặc c] cả ... và thường xuyên nhất [c] là trường hợp).
Đây là những dự án lớn của công ty điển hình với hàng ngàn và hàng ngàn giờ được đưa vào các slide powerpoint và sơ đồ UML. Họ luôn thất bại hoàn toàn sau khi đốt một lượng tài nguyên đáng xấu hổ ... hoặc trong một số trường hợp rất đặc biệt, cuối cùng họ cũng cung cấp một phần mềm quá đắt chỉ thực hiện một phần nhỏ của thông số kỹ thuật ban đầu. Và phần mềm đó luôn bị người dùng ghét ... không phải là loại phần mềm bạn sẽ mua, mà là loại phần mềm bạn sử dụng vì bạn bị ép buộc.
Điều này có nghĩa là tôi nghĩ rằng bạn chỉ nên nghĩ về mã? Tất nhiên là không. Nhưng theo tôi, việc xây dựng nên bắt đầu từ dưới cùng (gạch, mã cụ thể) và nên đi lên ... và sự tập trung và chú ý của bạn đến chi tiết sẽ theo nghĩa "mờ dần" khi bạn đang đi xa hơn những gì bạn có. Từ trên xuống thường được trình bày như thể bạn nên đặt cùng một mức độ chi tiết cho toàn bộ hệ thống: chỉ cần giữ cho nó tách mọi nút cho đến khi mọi thứ rõ ràng ... trong các mô-đun thực tế, hệ thống con được "phát triển" từ chương trình con. Nếu bạn không có kinh nghiệm trước đây trong vấn đề cụ thể, thiết kế hệ thống con, mô-đun hoặc thư viện từ trên xuống của bạn sẽ rất kinh khủng. Bạn có thể thiết kế một thư viện tốt khi bạn biết những chức năng nào được đưa vào, chứ không phải cách khác.
Nhiều ý tưởng của Lisp đang trở nên phổ biến hơn (các hàm hạng nhất, đóng, gõ động như mặc định, thu gom rác, lập trình siêu dữ liệu, phát triển tương tác) nhưng Lisp vẫn ngày nay (trong số các ngôn ngữ tôi biết) khá độc đáo về cách dễ dàng định hình mã cho những gì bạn cần.
Ví dụ, các tham số từ khóa đã có sẵn, nhưng nếu chúng không có thì chúng có thể được thêm vào. Tôi đã làm điều đó (bao gồm xác minh từ khóa tại thời điểm biên dịch) cho trình biên dịch Lisp đồ chơi mà tôi đang thử nghiệm và nó không mất nhiều mã.
Thay vào đó, với C ++, hầu hết những gì bạn có thể nhận được là một nhóm các chuyên gia C ++ nói với bạn rằng các tham số từ khóa không hữu ích hoặc việc triển khai mẫu được hỗ trợ một nửa cực kỳ phức tạp, bị hỏng, thực sự không hữu ích. Là các lớp C ++ đối tượng hạng nhất? Không và không có gì bạn có thể làm về nó. Bạn có thể có nội tâm trong thời gian chạy hoặc tại thời gian biên dịch? Không và không có gì bạn có thể làm về nó.
Tính linh hoạt ngôn ngữ này của Lisp là điều làm cho nó tuyệt vời cho việc xây dựng từ dưới lên. Bạn có thể xây dựng không chỉ các chương trình con, mà cả cú pháp và ngữ nghĩa của ngôn ngữ. Và theo một nghĩa nào đó, bản thân Lisp là từ dưới lên.