Túi nâu 7: Ruby

Robert C. Martin

13/6/2007

Ngày 31/10/1944

“Chúng ta cần lên kế hoạch cho nhiệm vụ liên quan tới Clyde càng sớm càng tốt!” Von Braun nói trong cuộc họp hàng tháng của Hội đoàn. Hội đoàn đã duy trì sự đồng nhất của họ với tư tưởng các nhà lãnh đạo trong suốt nhiệm kỳ của dự án Nimbus. Các chiến lược và ý tưởng mới thường xuất phát từ sự đồng thuận đó của tập thể giờ đây vững mạnh của những con người thích lý tưởng hóa và liều lĩnh.

“Nhưng điều đó sẽ làm tổn hại đến sứ mệnh của chúng ta đối với sao Hỏa!” Sergey Korolyov nói. “Chúng ta không có thời gian để lãng phí! Chúng ta phải nhìn thấy trên sao Hỏa có những gì để chúng ta có thể lên kế hoạch cải tạo nó, hoặc tất cả chúng ta sẽ biến mất mà không có dấu vết! ”

Von Braun gật đầu. “Phải, Sergey, chúng ta phải đến sao Hỏa. Và anh cũng nói đúng, nhiệm vụ mới này sẽ trì hoãn mục tiêu kia một chút. Nhưng chúng ta cũng phải tìm hiểu xem liệu có thể sử dụng động cơ Ulam để đẩy Clyde ra khỏi quỹ đạo. Nếu như có thể thì… ”

“Không được! Anh không thể đẩy được một đống đá hỗn tạp. Không có gì để đẩy cả. Vật đẩy sẽ chỉ…”

“Không Sergey, chúng tôi nghĩ chúng ta có thể! Nhìn đây.” Von Braun đưa ra ​​một sơ đồ tàu không gian hình kỳ lạ.

“Lưu ý rằng con tàu này có hai cơ cấu truyền động Ulam, một cái ở mỗi đầu. Chúng ta gọi nó là “Piston” vì vài lý do chút nữa sẽ nói rõ ràng. Chúng tôi xếp một tá, hai tá, một trăm những pít-tông như thế rất gần với Clyde, chổng mông bọn nó vào hắn. Sau đó, chúng tôi khởi động cả hai động cơ trên mỗi piston. Các tàu không di chuyển quá nhiều vì cả hai động cơ đều có lực đẩy qua lại bằng nhau và ngược lại; nhưng lực đẩy phía sau của các con tàu đẩy lùi Clyde! ”

Sergey, và những người khác, sững sờ trong im lặng. Von Braun thấy phản ứng của họ và sự bình tĩnh của ông biến mất. Ông cúi đầu, và bắt đầu nức nở. Và khi những tiếng nức nở làm toàn thân run rẩy ông ta kiên định nói: “Chúng ta sẽ đẩy Clyde ra xa chúng ta. Chúng ta sẽ đẩy anh ta ra xa chúng ta.”

Thứ 3, 5/3/2002, 1115

Chúng tôi phải đổi sang một phòng họp lớn hơn bởi vì rất nhiều người đã đến tham dự phiên họp hôm nay. Ở đó có những người tôi đã không gặp từ lúc còn đi học. Thậm chí có một số người mà tên của họ tôi không chắc nhớ đúng. Tôi đếm tổng cộng 25 người.

Tôi thấy Avery, là thằng cha ngồi ủ rũ ở ngay phía sau Jean. Tôi cứ nghĩ hắn ta muốn tránh bà ấy càng xa càng tốt; nhưng có khi bà ấy có những ý tưởng khác. Tôi lưu nhớ vấn đề này lại để hỏi hắn khi chúng tôi có dịp gặp riêng.

Jasper đã đứng sẵn trước căn phòng và đang chạy ngược xuôi với nụ cười rạng rỡ hết cỡ với những người tham dự khi họ ổn định chỗ ngồi. Tôi cố gắng không để lộ sự sợ hãi của mình khi bản thân cố gắng chống đỡ với phong cách “quá sức lố” của hắn.

“Ruby! Ruby!” Hắn ta đột nhiên khóc. “Ruby, Ruby, Ruby!”

Tôi thấy một số người hướng dẫn cử động không thoải mái ở chỗ của họ. Jasmine buông một tiếng rên thất vọng.

Jasper tươi cười và sau đó đảo mắt nhìn đám đông. “Vâng, tôi biết, các bạn đã nghe đến nó trước đây.”

“Ừ, chúng ta có Jasper.” Giọng nói của Jasmine nhấn nhá kèm theo sự chế nhạo gây ức chế. “Những kẻ ở Ulam hẳn phải tìm thấy liều thuốc khá mạnh trên Altair IV.”

Có những cái đập tay, những cái cười thầm và cả tiếng khúc khích giữa những người hướng dẫn. Sự cạnh tranh giữa Dyson và Ulam là một vấn đề liên quan tới huyền thoại và niềm kiêu hãnh. Nhưng Jasper không hề im lặng chịu trận. Thay vào đó, hắn ta phun ra một tràng:

“Đúng thế, hai mươi con người đó đã làm một số điều khá kỳ lạ trong quá khứ, nhưng cô phải thừa nhận rằng hiệu suất phần mềm gần đây của họ đang cạnh tranh mạnh mẽ với chúng ta với tỉ lệ 16 – dưới 60. Ý tôi là nền tảng công cụ Rails mới này đang giúp họ hoàn thành công việc với tốc độ ROHSHUS.”

“Nó không an toàn!” Jasmine quả quyết với sự đồng thuận âm thầm của một số người khác. “Chúng sẽ gặp phải lỗi thời thực thi!”

Jasper ra sức lắc đầu. “KHÔNGGGGGG, số lượng của chúng tạo nên khác biệt! Hãy nhớ rằng chúng ta đã học TDD từ chúng trong ’99. Chúng đã được kiểm thử đơn vị trong hơn tám năm và tỷ lệ lỗi thực thi của chúng thấp hơn rất nhiều so với của chúng ta! ”

Đôi mắt xanh của Jasmine sáng lên với sự tự tin, nhưng cô lại lắp bắp trong sự bất lực. “N-Nhưng từ bỏ kiểu an toàn phân loại thời gian biên dịch thật là – điên rồ!” Có những cái gật đầu và những tiếng lầm bẩm bày tỏ sự tán thành từ những người khác. Jasper dang rộng hai tay kháng cự khi nửa tá cuộc hội thoại bên lề đã bùng phát. Có vẻ như cuộc nói chuyện của Jasper đã kết thúc trước khi nó bắt đầu.

Tôi khá bối rối. Tôi không biết nhiều về ngôn ngữ Ruby, chỉ biết rằng một anh chàng nào đó tên là Matz ở Ulam đã phát minh ra nó vài năm về trước. Tôi chuẩn bị giơ tay lên và yêu cầu Jasper giải thích khi Jean đứng dậy và nhìn quanh phòng một cách mong đợi. Tôi có thể thấy Avery đang trừng mắt nhìn từ phía sau bà ấy,và rồi giữ ánh mắt trên sàn nhà. Tất cả các cuộc trò chuyện ngoài lề nhanh chóng kết thúc.

“Các bạn yêu quý của tôi, CÁC BẠN YÊU QUÝ của tôi! Vâng, đúng là chúng ta không nhất thiết phải đồng ý với mọi thứ họ làm ở Ulam. Chỉ có Chúa mới biết được, tôi đã có những hiểu lầm riêng của tôi về tất cả những hành vi tai quái mà họ đang làm. Nhưng chúng ta phải nhớ rằng những người dũng cảm đó đã đến gần như hầu hết những hành tinh như chúng ta đã từng, và vẫn nằm trong số những người sống sót trong hạm đội của chúng ta.”

Lời nhắc nhở gián tiếp về những tổn thất cho hạm đội của chúng tôi đã làm bẽ mặt những kẻ có giọng điệu chống đối. Jasmine chùng vai, thở dài và nắm lấy tay Jerry. Jean tiếp tục:

“Bây giờ chúng ta hãy dành sự tôn trọng cho Jasper bằng việc lắng nghe những gì anh ta nói. Tôi chắc chắn có điều những thứ mà tất cả chúng ta có thể học hỏi từ anh ấy hôm nay.”

Jean ngồi xuống và thì thầm điều gì đó bên tai Avery. Hắn ta nhăn nhó rồi đưa tầm mắt ra khỏi sàn nhà và hướng về phía trước.

“Vậy thìiiii, NHƯ TÔI đang NÓI:” Jasper lấy lại vị trí từ Jean và dùng hết sự cường điệu vào nó. “Ruby! Vẫn nhớ về buổi nói chuyện tuyệt vời của Adelade ngày hôm qua chứ? Cô ấy đã nói cho chúng ta về việc sử dụng mẫu Abstract Factory để phá vỡ các phụ thuộc thời gian biên dịch trong dự án SMCRemote. Cô ấy muốn tạo ra một kiến ​​trúc plug-in cho phép các trình tạo mã khác được thêm vào mà không ảnh hưởng đến hệ thống lõi. Chà, đây là cách ta giải quyết vấn đề đó trong Ruby. ”

Jasper điều khiển bức tường nhìn những ngón tay của hắn, và hắn ta bắt đầu gõ vào giữa không trung. Đoạn mã sau xuất hiện trên tường.

require ‘cpp_generator’

require ‘java_generator’

class GeneratorFactory

def createCpp

return CppGenerator.new

end

def createJava

return JavaGenerator.new

end

end

“Cái này thực sự không có vẻ gì thú vị cả Jasper.” Jasmine nói. “Nó không khác biệt quá nhiều so với phiên bản Java mà Adelade đã cho chúng ta thấy ngày hôm qua.”

“Cô gần như đúng rồi đấy, Jazzy.” Jasper nói với một nụ cười toe toét. Tôi có thể thấy Jasmine đỏ bừng vì giận dữ. “Lưu ý rằng không có lớp cơ sở. Hệ thống Java của Adelade đã triển khai một giao diện có hai phương thức tạo.”

Jerry đã chặn lại phản ứng đầy giận dữ của Jasmine bằng cách nói “Được rồi, Jasper, nhưng điều đó có nghĩa là cậu đã mất cấu trúc  trình plug-in. Chương trình SMCRemote sẽ phụ thuộc vào GeneratorFactory, và do đó sẽ biết về CppGenerator và JavaGenerator.”

“Nosireee, Jerry-O! Đó chính là toàn bộ vấn đề! Bà thấy đấy, SCMRemote không biết hệ thống là loại đối tượng gì.”

“Hử? Điều đó không có nghĩa lý gì cả. Phải biết nếu không nó sẽ không thể gọi createCpp hoặc createJava.”

Jasper rõ ràng đang trên đà sôi nổi, nhưng Jasmine không thèm đếm xỉa đến hắn ta. “Không, Jerry, anh ấy đúng. Trong Ruby các kiểu được kiểm tra tại thời gian thực thi, không phải lúc biên dịch, do đó chương trình SMCRemote không cần phải biết kiểu đối tượng của hệ thống là gì. ”

Jasmine sải bước đến tường và đẩy Jasper ra khỏi lối đi. Cô viết đoạn mã sau:

class SMCRemote

def initialize(factory)

@factory = factory

end

def selectLanguage(language)

case language

when “C++”

@generator = @factory.createCpp

when “Java”

@generator = @factory.createJava

end

end

def generator

@generator

end

end

“Chú ý”, cô ấy nói, “rằng không có yêu cầu các câu lệnh. SMCRemote không cần biết bất cứ điều gì về hệ thống. Nó chỉ đơn giản giả định rằng các phương thức createCpp và createJava tồn tại. Nếu như không, thì sẽ có lỗi thực thi. Và ĐÓ là cái tôi muốn nói về cách ngôn ngữ này không an toàn. Trình biên dịch sẽ không cho ta biết nếu phương thức không tồn tại. Ta phải đợi cho đến khi… ”

Jasper cuối cùng cũng lấy lại thế chủ động và ngắt lời Jasmine. “Phải, Jazzy, chúng ta đã nghe về nó trước đây rồi. Vấn đề là cấu trúc plugin tồn tại. SMCRemote không cần biết gì về GeneratorFactory.”

Hoàn toàn bối rối, tôi đứng dậy và hỏi một số câu hỏi. “Tôi xin lỗi, điều này có thể là cơ bản, nhưng tôi không chắc tôi hiểu tất cả cú pháp đó. Tôi đoán lafg def được sử dụng để để nghĩa một hàm đúng không? ”

“Chính xác rồi đấy Fonze!”

“Và ký hiệu @ bằng cách nào đó được kết nối với các biến instance?”

“Đúng, đúng rồi! Bất kỳ biến nào có tiền tố là dấu @ đều là một biến instance.”

“Được rồi, vậy anh không phải khai báo các biến instance ở bất kì đâu cả sao?”

“Không, không có khai báo nào cả! Nó không tuyệt vời sao! ”

“Tôi không biết nó tuyệt vời như thế nào, tôi có thể thấy nó hoạt động không?”

Jasper đưa cho tôi một trong những nụ cười rộng nhất và rạng rỡ nhất mà tôi từng thấy. Nó gần như tách đầu hắn ta ra làm hai vậy.

“Chắc chắn rồi! Hãy chỉ nhìn vào sự tuyệt vời này!” Và hắn ta gõ như sau trên tường

describe SMCRemote do

before do

@factory = GeneratorFactory.new

@smc = SMCRemote.new(@factory);

end

it “should create a JavaGenerator when passed ‘java'” do

@smc.selectLanguage(“Java”)

@smc.generator.class.name.should == “JavaGenerator”

end

it “should create a CppGenreator when pass ‘C++'” do

@smc.selectLanguage(“C++”)

@smc.generator.class.name.should == “CppGenerator”

end

end

Cú pháp này hoàn toàn xa lạ với tôi. Tuy nhiên, sau một phút tôi có thể thấy rằng đây là một loại kiểm đơn vị khác lạ. Hàm trước giống như thiết lập trong JUnit. Các khối của nó giống như các hàm kiểm thử. Các động từ “should” giống như xác nhận. Tất cả làm nên một loại ý nghĩa kỳ quặc.

Jasper nhìn tất cả chúng tôi mong chờ, và sau đó với một cái vẫy tay, hắn ta chạy các kiểm thử này, và chúng đều đã vượt qua.

“Tôi… Chỉ… Đừng… Lấy… Nó.” Jerry khóc. “Tôi không hiểu SMCRemote có thể gọi một trong hai hàm tạo đó bằng cách nào mà không biết loại @factory. Nó thật khó hiểu.”

“Hãy nghĩ về nó theo cách này, Jerry.” Jasmine nói. Gần đây cô đã kiên nhẫn hơn với Jerry. “SMCRemote không biết rằng nó có thể gọi createJava trên @factory, vì vậy nó hỏi @factory nếu nó có một phương thức có tên là createJava. Nếu vậy, nó gọi nó. Nếu không thì nó sẽ bom.”

Jerry hoài nghi. “Ý cô là nó truyền qua createJava như một chuỗi và thực hiện tìm kiếm? Điều đó sẽ rất chậm.”

“Và nguy hiểm.” Cô đáp lại trong khi gật đầu.

“Đó không phải là lý do mà Ruby chậm.” Jasper thốt lên.

“Nhưng nó vẫn khá chậm, phải không.” Jasmine châm biếm.

“Nó nhanh hơn thế.” Hắn rên lên.

Mọi người bắt đầu rời khỏi phòng. Thời gian của chúng tôi đã trôi qua rất lâu.

“Tôi không biết về ngôn ngữ ngốc nghếch này.” Jerry nói với Jasmine.

“Tôi có…” Tôi nghe cô ấy nói khi họ rời đi.

Jean và Avery bước ra. “Trở lại làm việc bây giờ thân mến của tôi. Chúa ơi! Chúng ta thực sự muộn. ”

Chẳng mấy chốc chỉ còn Jasper và tôi. Jasper đứng bất động, nhìn chằm chằm vào cánh cửa với vẻ mặt bối rối. Cuối cùng hắn ta nhìn tôi và lẩm bẩm. “Chà, mọi chuyện chắc chắn đã không diễn ra tốt như tôi nghĩ.”

Tôi phớt lờ điều đó và nói. “Jasper, có rất nhiều điều tôi không hiểu về Ruby, nhưng tôi có chú ý đến một thứ. Anh có thể giữ cấu trúc plug-in, cách ly hoàn toàn SMCRemote khỏi Generator, mà không sử dụng bất kỳ sự kế thừa nào. “

Jasper nhìn tôi qua khóe mắt, và tôi thấy nụ cười nở rộ trên khuôn mặt đó bắt đầu lớn dần.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.