Tác giả: Robert C. Martin

Người dịch: Hoàng Ngọc Diêu | Biên tập: Phạm Anh Đới

Alphonse làm Jerry ngạc nhiên khi tìm ra giải pháp ưa nhìn để chuyển một tệp qua socket. Trong quá trình làm việc, anh gặp Jasmine, người hướng dẫn mới.

Ở mức .045 hiện tại, cái đích vẫn là những phần đời của tương lai. Mỗi thế hệ từ lúc khởi hành cảm như những phần đời kéo dài vô tận trước khi chúng xảy ra. Ðôi khi cảm giác này đầy tuyệt vọng – nhưng hôm nay không phải thế. Hôm nay, tôi dùng một ít thời gian vô tận ấy để chế diễu Jerry.

Tôi duỗi tay ra phía trước bàn phím và bẻ mấy khớp tay. Tôi lắc lư cái đầu, giả vờ chỉnh xương cổ. Tôi dừng lại, nhìn lơ láo, tỏ vẻ trầm ngâm. “Ô!” tôi nói, “tôi nghĩ là tôi biết một cách hay hơn!” Jerry đảo mắt và thở dài, đợi tôi bắt tay vào làm. Tôi quyết định không đi quá trớn, thế rồi tôi bắt đầu làm việc.

Ðể gửi một tệp tin xuyên qua socket, Jerry đã phải gởi ba dòng chữ trước. Một dòng có string “Sending”, dòng kế tiếp chứa tên tệp tin và dòng cuối chỉ định chiều dài của tệp tin. Rồi sau đó Jerry mới gởi chính tệp tin ấy như một chuỗi từ. Ðoạn mã như sau:

private void writeSendFileCommand() throws IOException {
    os.println(“Sending”);
    os.println(itsFilename);
    os.println(itsFileLength);

    char buffer[] = new char[(int) itsFileLength];

    fileReader.read(buffer);

    os.write(buffer);

    os.flush();

}

Khi đọc tệp tin ngược lại từ socket, gã gọi readLine ba lần, mỗi lần cho mỗi ba dòng gã gởi đi. Gã dùng “Sending” string như một phương thức nhận diện của một chuyển xuất và lưu giữ cái thứ nhì như tên của tệp tin; cái thứ ba là chiều dài của tệp tin. Gã dùng nó để chỉ định chuỗi từ được dùng như một tầng đệm. Rồi sau đó gã dùng chiều dài để đọc số lượng từ thích ứng từ socket.

private void parse(String cmd) throws Exception {
    if (cmd != null) {
        if (cmd.equals(“Sending”)) {
            filename = is.readLine();

            fileLength = Long.parseLong(is.readLine());

            content = new char[(int) fileLength];

            is.read(content, 0, (int) fileLength);

            fileReceived = true;

        }

    }

}

Mọi thứ làm việc ngon lành, nhưng tôi biết cách hay hơn. Ðầu tiên, tôi đổi đoạn kiểm thử để đọc đối tượng thay vì những dòng:

public void serve(Socket socket) {
    try {
        os = new PrintStream(socket.getOutputStream());
        is = new ObjectInputStream(socket.getInputStream());

        os.println(“SMCR kiểm thử Server”);

        os.flush();

        parse((String) is.readObject());

    } catch (Exception e) {

    }

}

private void parse(String cmd) throws Exception {

    if (cmd != null) {

        if (cmd.equals(“Sending”)) {

            filename = (String) is.readObject();

            fileLength = is.readLong();

            content = (char[]) is.readObject();

            fileReceived = true;

        }

    }

}

Kế tiếp tôi thay đổi phần SMCRemoteClient để viết objects thay vì strings.

public boolean connect() {
    …
    os = new ObjectOutputStream(smcrSocket.getOutputStream());
    …

}

private void writeSendFileCommand() throws IOException {

    os.writeObject(“Sending”);

    os.writeObject(itsFilename);

    os.writeLong(itsFileLength);

    char buffer[] = new char[(int) itsFileLength];

    fileReader.read(buffer);

    os.writeObject(buffer);

    os.flush();

}

Tôi chạy trọn bộ các kiểm thử và chúng làm việc ngon lành. “Thấy chưa?” tôi gáy lên. “Tôi nghiệm ra viết đối tượng thay cho chuỗi thì tốt hơn.”

Eureka!

Tôi nhìn Jerry, nhưng có gì đó thay đổi – đôi mắt gã không tập trung. Gã đứng dậy và bắt đầu rảo quanh. Thỉnh thoảng gã dừng lại, nhìn vào màn hình, nhìn tôi, lắc đầu và lại tiếp tục rảo bước. Gã lẩm nhẩm gì đó về năm tháng, kinh nghiệm và sự ngu xuẩn. Tôi hơi hãi.

Sau rốt, gã dừng lại, nhìn tôi thẳng vào mắt và nói: “À, Alphonse, mày xong rồi đó.”

“Tôi làm gì sai vậy Jerry?” tôi thì thầm.

Gã nhìn tôi chằm chặp vài giây. Thế rồi gã xoay người hướng về thang máy và ra lệnh, “đi theo tao.”

Chuyến đi trên thang máy yên lặng như nhà mồ. Trạng thái của Jerry khó mà đoán nổi: gã không hẳn là giận dữ nhưng chắc chắn là gã bực dọc, và lẽ gì đó tôi đã dính vào sự bực dọc này. Trong thang máy, chúng tôi lặng lẽ thay đổi vị trí để giảm mức lệch coriolis -2- tôi cố nghiệm ra lý do tại sao phần mã nguồn đơn giản tôi thay đổi có thể tạo ảnh hưởng ghê gớm đến gã như thế.

Tôi theo Jerry vào một phòng khách ở một trong những tầng thuộc “low-g”. Các tay học việc không thường được phép vào các tầng trên .49g. Trên đường đi lên, tôi không dõi các bảng hiệu của các tầng lầu nhưng tầng này có vẻ thấp hơn .4g. Bên trong phòng khách có năm gã “du hành” lập trình viên khác. Jerry giới thiệu tôi với nhóm này. Tôi gắng nhớ hết tên của mọi người: Johnson, Jasmine, Jason, Jasper và Jennifer. Jerry bảo tôi đứng giữa phòng khách trong khi gã và mọi người ngồi trên salon xung quanh tôi. Sau đó Jerry xoay về phía nhóm lập trình viên và với vẻ kiểu cách, gã tuyên bố, “À, có chuyện đã xảy ra. Tôi tin rằng Alphonse là tay học việc đầu tiên trong năm vào “Micah his Journeyman.”

Tôi cảm thấy ngực tôi ngừng đập một nhịp và mắt tôi mở rộng ra. Ðây là điều hết sức đơn giản! tôi không dự tưởng điều này!

“Có ai làm Micahed năm nay chưa nhỉ?” Jerry hỏi. Tiếng xì xầm lan ra khắp phòng nhưng mọi người đều lắc đầu – hiển nhiên là chưa có ai.

Jasmine nhìn tôi chằm chặp hồi lâu. Trong khi cô ta dán mắt vào tôi, nàng bảo Jerry: “OK, Jer, cho bọn tôi nghe câu chuyện ấy đi.”

Jerry thở dài, gã cố gắng một cách rõ rệt để lấy lại tư thế và bắt đầu nói.

“Như các bạn biết, ông C yêu cầu tôi làm cái SMCRemote cho nó chạy.” Ðám lập trình viên đều gật đầu; hiển nhiên họ biết chuyện này. “Alphonse và tôi bỏ ra cả ngày cho bài tập SocketServer; và nó làm việc rất tốt.”

Thêm một cú sốc: SocketServer chỉ là một bài tập?

“Từ lúc làm cho nó chạy được, chúng tôi bắt đầu đặt phần máy khách của SMCRemote lại với nhau. Một trong những trường hợp kiểm thử là chuyển tải một tệp tin từ máy khách đến máy chủ qua socket.” Lại thêm những cái gật đầu trong phòng.

Jerry càng bối rối thấy rõ. Gã trăn trở trên ghế và tránh những ánh mắt, gã nhìn chằm chặp xuống sàn nhà. “Tôi chỉnh định việc chuyển xuất tệp tin bằng cách gởi ba dòng chữ theo sau bằng một chuỗi từ. Dòng đầu tiên là danh tính của việc chuyển xuất, dòng thứ hai là tên tệp tin và dòng thứ ba là chiều dài tệp tin.” Lại thêm gật đầu – điều này chẳng làm họ ngạc nhiên tí nào.

“Rõ ràng, đây chỉ là một cách đơn giản cho mấy cái kiểm thử có thể đạt để chúng tôi có thể tái câu trúc thành một dạng tốt hơn.” Lại thêm gật đầu; thêm những tiếng xầm xì đồng ý. “Và rồi…” Jerry ngừng lại. “Alphonse nói là hắn nghĩ là hắn có à… ờ…. một ý kiến hay hơn.”

Căn phòng trở nên yên tĩnh. Ðôi mắt của Jasmine vẫn dán chặt vào tôi, nhưng cái nhìn của nàng chuyển từ trạng thái đánh giá sang suy đoán. Từng người một, tôi cảm thấy những tia nhìn của các tay “du hành” ngừng lại ở tôi. Làm gì mà lớn chuyện vậy? Tại sao họ đang đòi cái Micah cho tôi nhỉ?

Johnson là người phá tan không khí u ám.

“Không phải bồ muốn cho bọn tôi biết –” gã buộc miệng nói, rồi ghìm lại bằng một cú hít vào nặng nề.

Liếc nhìn, tôi thấy Jerry đang gật đầu. Gật đầu cho chuyện gì nhỉ?

Ðề nghị ngây thơ

Tôi không chịu nổi nữa. Tôi rời khỏi cái nhìn của Jasmine, nhìn thẳng vào mắt của từng tay “du hành” trong phút chốc rồi nói: “Tất cả những gì tôi đề nghị chỉ là việc chuyển tải đối tượng thay vì chuỗi! tôi chẳng thấy việc ấy lại là một Micah!”

Jennifer bước về phía tôi và nói, “Vâng, bồ chỉ làm ngần ấy. Và, không, tôi không giả định là bồ nghĩ ngợi gì nhiều về nó – nhưng với bọn tôi, đây là chuyện lớn.”

“Tại sao?” tôi rít lên, thật sự hoảng sợ.

“Bởi,” Jerremy giải thích, “đặc điểm quan trọng nhất của một lập trình viên giỏi là khả năng suy nghĩ một cách trừu tượng. Thật ra rất ít người có thể làm như thế. Mày mới vừa chứng tỏ là mày có thể làm điều này.”

Tôi đâm nghi ngờ. “Nó chỉ là một đối tượng thôi mà,” tôi lặp bắp.

“Chính xác,” Jennifer nói. Bọn họ đều gật đầu một cách nghiêm chỉnh.

Tôi lắc đầu. “Ôi, thì, nếu đây là điều hay – một Micah gì đó – tại sao Jerry có vẻ cáu kỉnh vậy?”

“Ô, chuyện ấy!” Jasmine cười to. “Jerry xuống đây vào giờ nghỉ lần trước và kể cho bọn mình về vấn đề chiều dài tệp tin của cậu. Anh ấy chắc rằng cậu sẽ rất có ấn tượng khi thấy chiều dài của tệp tin sẽ khớp khít vào chuyển xuất tệp tin. Anh ấy dự phỏng cậu sẽ ngạc nhiên biết chừng nào.”

“Ừa,” Jasper cười điệu đàng, “và cậu lại đi mà chỉ cho gã chiều dài này trở nên lạc đề.”

Tôi nuốt nước bọt, cố chịu đựng. “Tôi đã làm thế sao?”

Jerry đứng dậy và nói, “ngẫm lại chuyện đó đi Alphonse. Nếu mày gởi một chuỗi từ như một object, tại sao mày còn phải gởi chiều dài của tệp tin riêng ra nữa? Trong sáu tháng tới đây, mấy tay này thế nào cũng sẽ nạo sườn tao về chuyện này” gã nói thêm một cách thiểu não.

“Bọn tớ chắc chắn sẽ làm thế!” Jennifer cười toe toét. “Mỗi khi xét duyệt mã nguồn của anh ấy, bọn tớ sẽ hỏi anh tham số chiều dài tệp tin ở đâu!” Cô ta cười rúc rích trong khi Jerry nhăn nhó và cứng đờ khuôn mặt.

“Cậu phải biết, Alphonse,” Jasmine giải thích, “không những cậu đã tạo nên một bước trừu tượng đáng kể, giải pháp của cậu còn đơn giản hơn giải pháp của Jerry. Hơn nữa, nó là một cách đơn thuần phế bỏ dự tính của Jerry với nhu cầu chiều dài của tệp tin. Cậu đã Micahed anh ấy!”

Tôi bắt đầu hiểu ra sự thể. Ít ra tôi không bị dính vào một phiền toái nào…

“Tôi nghĩ là,” Jasmine nói, “một biến cố như thế này cần đổi cặp (làm việc). Jerry, tôi đổi người học việc với anh. Anh nhận Andy và tôi sẽ làm việc với Alphonse vài ngày.”

… hay là tôi?

-1-           “Micah” ở đây, trong bài này, có lẽ là một loại đặc quyền hoặc một vinh dự lớn lao. Theo tự điển MerriamWebster thì Micah là tên của một nhà tiên tri người Do Thái ở thế kỷ thứ 8 sau Công nguyên. “Micah” xuất xứ từ nguyên thủy chữ MIkhAyAh (tiếng Hebrew).

-2-           Coriolis: tên của nhà toán học, kỹ sư công chánh người Pháp Gaspard G. Coriolis. Xem thêm tiểu sử và công nghiệp của Coriolis ở: http://www-gap.dcs.st-and.ac.uk/~history/Mathematicians/Coriolis.html

Còn tiếp…

Nguồn

Tác giả: Robert C. Martin

Người dịch: Hoàng Ngọc Diêu | Biên tập: Phạm Anh Đới