Clean Coder – Giới Thiệu Tiền Đề

(Đừng bỏ qua phần này, bạn sẽ cần tới nó)

Tôi đoán một khi bạn đã cầm quyển sách này lên thì tức là bạn đang là một lập trình viên và có mong muốn trở thành một người chuyên nghiệp. Bạn nên trở thành như vậy. Lập trình viên chuyên nghiệp là những người mà ngành phát triển phần mềm của chúng ta luôn cần khủng khiếp.

Tôi cũng là một lập trình viên. Tôi đã làm lập trình viên được 42 năm rồi; và trong khoảng thời gian đó – hãy để tôi nói với bạn – Tôi đã chứng kiến tất cả. Tôi đã từng bị sa thải. Tôi đã từng được ca ngợi. Tôi đã từng làm một trưởng nhóm, một người quản lý, và từng làm cả vị trí một CEO. Tôi đã làm việc với những lập trình viên sáng giá và tôi cũng đã làm việc với cả những người kém năng lực. Tôi đã làm việc trong các hệ thống phần cứng/phần mềm nhúng tiên tiến nhất thế giới, và tôi cũng đã làm việc trong các hệ thống trả lương của công ty. Tôi đã lập trình bằng COBOL, FORTRAN, BAL, PDP-8, PDP-11, C, C++, Java, Ruby, Smalltalk, và hàng tá những hệ thống và ngôn ngữ khác. Tôi đã làm việc với cả những tên trộm thẻ tín dụng không đáng tin, và tôi cũng đã làm việc với cả những chuyên gia cực kỳ tài giỏi.

Trong những trang sách này, tôi sẽ cố gắng định nghĩa thế nào là một lập trình viên chuyên nghiệp. Tôi sẽ mô tả thái độ, kỷ luật, và hành động mà tôi cho đó là những sự chuyên nghiệp cơ bản.

Tôi đã biết về những thái độ, kỷ luật, và hành động đó như thế nào? Đó là bởi vì tôi đã phải học chúng một cách hết sức khó khăn. Bạn sẽ thấy, khi tôi có được công việc đầu tiên là lập trình viên, sự chuyên nghiệp là cụm từ cuối cùng mà bạn sẽ dùng để mô tả tôi.

Vào năm 1969, tôi mới 17 tuổi. Khi đó, cha tôi đang theo đuổi một việc kinh doanh tại địa phương có tên là ASC và ông đã thuê tôi làm lập trình viên bán thời gian tạm thời cho ông. (Vâng, cha tôi có thể làm những thứ như thế này. Có lần tôi đã thấy ông đi ra ngoài đứng ngay trước một ô tô đang chạy và giơ cánh tay ra hiệu “Dừng lại!”. Chiếc xe đó đã dừng lại. Không một ai  nói “không” với cha tôi). Công ty đó đó đặt tôi làm việc trong một căn phòng nơi mà tất cả các hướng dẫn sử dụng máy IBM được lưu giữ tại đó. Họ giao cho tôi công việc bổ sung những bản cập nhật cả năm trời vào những tài liệu hướng dẫn này. Tại đây tôi lần đầu tiên đã nhìn thấy câu: “Trang này được để trống có chủ đích”.

Sau một vài ngày cập nhật hướng dẫn sử dụng, người giám sát đã yêu cầu tôi viết một chương trình Easycoder[1] đơn giản. Tôi đã rất sợ hãi với lời yêu cầu đó. Tôi chưa bao giờ viết một chương trình cho một máy tính thực sự nào trước đó. Tuy nhiên, tôi đã nuốt trôi được các cuốn sách về Autocoder và biết được cách phải bắt đầu thế nào.

Chương trình này chỉ đơn giản đọc các record[2] từ một băng từ, và đặt lại các ID của những record này với ID mới. ID mới này được bắt đầu đánh số từ 1 và tăng lên 1 đối với mỗi record mới. Các record với ID mới này sau đó được ghi vào một băng từ mới.

Người giám sát tôi đã chỉ cho tôi một kệ sách mà trên đó có rất nhiều các chồng thẻ màu đỏ và xanh dương. Tưởng tượng rằng bạn mua 50 bộ thẻ bài, 25 bộ đỏ và 25 bộ xanh dương. Sau đó bạn xếp chồng những bộ bài này chồng lên nhau. Các chồng thẻ này cũng trông giống như vậy. Mỗi một thẻ này bao gồm mã nguồn cho một thư viện các subroutine[3] mà những lập trình viên tại đây thường sử dụng. Các lập trình viên sẽ đơn giản lấy bộ thẻ đầu tiên khỏi chồng thẻ, đảm bảo rằng họ chỉ lấy những thẻ đỏ hoặc xanh dương, và sau đó đặt tấm thẻ đó vào cuối của bộ chương trình của họ.

Tôi đã viết chương trình của tôi trên một vài biểu mẫu code. Biểu mẫu code là các tấm giấy hình chữ nhật lớn được chia thành 25 dòng và 80 cột. Mỗi dòng thể hiện một thẻ. Bạn viết chương trình của bạn trên biểu mẫu code này bằng các khối ký tự viết hoa và một chiếc bút chì #2. Trong 6 cột cuối cùng tại mỗi dòng, bạn sẽ viết một chuỗi số bằng chiếc bút chì #2 đó. Thông thường thì bạn sẽ tăng chuỗi số lên 10 để bạn có thể chèn thêm các thẻ vào sau này.

Những biểu mẫu code đó luôn đi với những người đánh chữ. Công ty này có vài chục nhân viên nữ chuyên lấy các biểu mẫu code từ một cái rỏ lớn, và sau đó “gõ” chúng trong các máy điện báo đánh chữ. Những chiếc máy này rất giống với các máy gõ chữ, ngoại trừ là các ký tự được đánh trên các tấm thẻ thay vì được in trên giấy.

Tới ngày tiếp theo, người đánh chữ trả lại chương trình cho tôi bằng một lá thư liên phòng. Các tấm thẻ đã được đánh trong bộ thẻ của tôi được bọc bởi các biểu mẫu code mà tôi đã đưa kèm với một sợi dây thun. Tôi nhìn vào những tấm thẻ để tìm những lỗi đánh phím, nhưng không phát hiện ra lỗi nào cả. Vì vậy sau đó, tôi đặt bộ thư viện subroutine vào cuối bộ chương trình của tôi, rồi đưa bộ thẻ lên tầng cho những người vận hành máy tính.

Những chiếc máy tính này được đặt trong những căn phòng được khóa kín, điều kiện môi trường trong phòng được kiểm soát chặt chẽ, và nền nhà được nâng lên (để đi các loại dây cáp). Tôi gõ vào cánh cửa rồi có một người vận hành lạnh lùng lấy bộ thẻ từ tôi và đặt nó vào một các rỏ khác nằm trong phòng máy tính. Khi họ chuẩn bị xong thì họ sẽ chạy bộ thẻ chương trình của tôi.

Ngày tiếp theo tôi đã nhận lại bộ thẻ này. Nó được bọc trong tờ danh sách các kết quả của chương trình đã chạy và được giữ lại bằng một sợi dây thun. (Chúng tôi dùng rất nhiều dây thun vào những ngày đó!)

Tôi đã mở danh sách kết quả và nhìn thấy chương trình biên dịch của tôi đã bị lỗi. Thông báo lỗi trong danh sách này rất khó để cho tôi có thể hiểu được, vì vậy tôi đưa nó cho người phụ trách tôi. Ông ấy nhìn nó một lúc, lầm bầm trong miệng, ghi một vài chú ý nhanh chóng trên tờ danh sách, rồi chộp lấy bộ thẻ chương trình của tôi và sau đó nói với tôi hãy đi theo ông ấy.

Tôi được đưa vào phòng đánh chữ và ngồi vào một máy điện báo đánh chữ còn bỏ trống. Rồi từng bước một, ông ấy đã sửa lại những tấm thẻ bị lỗi, và thêm vào đó một hoặc hai tấm thẻ khác. Ông giải thích nhanh cho tôi những gì ông làm, nhưng tất cả đều nhanh như chớp.

Ông cầm lấy bộ thẻ mới vào phòng máy tính và gõ cửa. Ông nói với một trong những người vận hành một vài từ kỳ lạ, và sau đó đi vào trong phòng. Ông ra hiệu cho tôi đi theo. Người vận hành cài đặt các ổ băng từ và nạp bộ thẻ mới vào, trong khi chúng tôi đang quan sát. Các cuộn băng từ này bắt đầu quay, rồi máy in hoạt động và sau đó dừng lại. Chương trình của tôi đã chạy được.

Ngày hôm sau người phụ trách tôi đã nói lời cảm ơn vì sự giúp đỡ của tôi, và chấm dứt công việc của tôi. Rõ ràng ASC đã cảm thấy họ không có thời gian để đào tạo một thanh niên 17 tuổi như tôi.

Nhưng mối liên hệ của tôi với ASC khó mà chấm dứt được. Vài tháng sau tôi nhận được một công việc toàn thời gian vào ca 2 tại ASC, công việc vận hành những máy in offline. Những máy in này đã in những thư rác từ các tấm ảnh được lưu trên băng từ. Công việc của tôi là nạp giấy vào máy in, nạp băng từ vào các ổ điều khiển, xử lý các lỗi kẹt giấy, và công việc còn lại là nhìn những chiếc máy này hoạt động.

Năm đó là năm 1970. Trường đại học không phải là một sự lựa chọn của tôi, và nó cũng không có bất cứ một điều gì hấp dẫn cả. Vào thời điểm đó, chiến tranh Việt Nam vẫn còn đang ác liệt, và khuôn viên các trường học đều trong tình trạng hỗn loạn[4]. Tôi phải tiếp tục nghiền ngẫm các cuốn sách về COBOL, Fortran, PL/1, PDP-8, và IBM 360 Assembler. Ý định của tôi là bỏ qua chương trình học ở trường đại học và nỗ lực hết sức để có được một công việc lập trình.

Mười hai tháng sau tôi đã đạt được mục tiêu. Tôi được thăng chức thành một lập trình viên toàn thời gian tại ASC. Tôi và hai người bạn tốt là Richard và Tim, lúc đó cũng 19 tuổi, đã lập thành một nhóm với ba lập trình viên khác để viết một hệ thống kế toán thời gian thực cho liên đoàn các tài xế xe tải. Cỗ máy này được gọi là Varian 620i. Nó là một máy tính mini có cấu trúc tương tự như PDP-8 ngoại trừ là nó một word[5] 16-bit và có hai register[6]. Ngôn ngữ được chúng tôi sử dụng là assembly[7].

Chúng tôi đã viết tất cả các dòng code của hệ thống đó. Tôi muốn nhấn mạnh là tất cả. Chúng tôi đã viết hệ điều hành, các interrupt head[8], các trình điều khiển vào ra, hệ thống tệp tin cho các ổ đĩa, và ngay cả bộ relocatable linker[9]. Tôi còn chưa nói đến là tất cả code của ứng dụng. Chúng tôi đã viết tất cả trong 8 tháng ròng rã, làm việc từ 70 đến 80 giờ mỗi tuần để có thể kịp được deadline quái ác này. Lương của tôi khi đó là 7.200$ một năm.

Chúng tôi đã bàn giao hệ thống đó. Và sau đó chúng tôi nghỉ việc.

Chúng tôi đã đột ngột nghỉ việc với một sự bất mãn. Bạn biết không, sau tất cả những việc mà chúng tôi đã làm, khi bàn giao thành công hệ thống đó cho khách hàng xong, công ty chỉ tăng lương cho chúng tôi 2%. Chúng tôi cảm thấy bị lừa gạt và bị bóc lột. Vài người trong số chúng tôi đã tìm một công việc khác và một số đơn giản là từ chức.

Tuy nhiên rất không may là tôi lại đi theo một hướng khác. Tôi và một người bạn lao thẳng vào phòng làm việc của ông sếp và cùng nghỉ việc khá to tiếng. Đó là một cảm giác rất thỏa mãn của tôi trong ngày đó.

Nhưng ngày tiếp theo đã tát thẳng vào mặt tôi rằng tôi đang thất nghiệp. Tôi đã 19 tuổi, thất nghiệp, không bằng cấp. Tôi đã phỏng vấn ở một vài vị trí lập trình, nhưng những cuộc phỏng vấn này đều không tốt. Vì vậy tôi đã làm việc trong một cửa hàng bán máy cắt cỏ của ông anh rể của mình trong bốn tháng. Không may tôi lại là một thợ sửa máy cắt cỏ vụng về. Và cuối cùng ông anh rể cũng phải buộc tôi phải ra đi. Tôi đã cảm thấy vô cùng hoang mang.

Mỗi tối tôi thức đến 3 giờ sáng, ăn bánh pizza và xem các bộ phim quái vật trên chiếc TV tai thỏ, đen trắng cũ kỹ của bố mẹ tôi. Rồi tôi ngủ đến 1 giờ chiều bởi tôi không muốn đối diện với những tháng ngày thê lương này. Tôi đã học một khóa toán học tại một trường đại học cộng đồng địa phương nhưng cũng thi trượt. Tôi cảm thấy mình là một kẻ thất bại.

Mẹ tôi đã ở bên cạnh tôi và nói với tôi rằng cuộc đời của tôi thật là lộn xộn, và rằng tôi đúng là một thằng ngốc vì nghỉ việc mà chưa có được một công việc mới, vì nghỉ việc mà quá cảm tính, và vì nghỉ việc cùng với người bạn của mình. Bà đã nói với tôi rằng con không được nghỉ việc khi mà chưa kiếm được một công việc mới, và con phải luôn luôn nghỉ việc một cách bình tĩnh, ôn hòa và chỉ được phép nghỉ một mình. Bà đã nói với tôi rằng tôi nên gọi điện cho ông sếp cũ và xin để được đi làm trở lại. Bà đã nói “Con cần phải ăn một ít chiếc bánh nhún nhường.”

Những thanh niên mười chín tuổi thường không mấy mặn mà với “chiếc bánh nhún nhường”, và tôi cũng không phải là ngoại lệ. Nhưng hoàn cảnh này đã đánh bại lòng kiêu hãnh của tôi. Cuối cùng tôi đã gọi cho ông sếp và được gặm một miếng “bánh nhún nhường” lớn đó. Ông ấy đã rất vui mừng khi thuê lại tôi với mức lương 6.800$ một năm, và tôi cũng rất hạnh phúc khi có lại được công việc đó.

Tôi đã dành mười tám tháng tiếp theo làm việc tại đó, cẩn trọng với cách cư xử của mình và cố gắng trở thành một nhân viên có giá trị nhất trong công ty mà tôi có thể. Và tôi đã được tưởng thưởng xứng đáng bằng việc được thăng chức, tăng lương, và được nhận lương đều đặn. Cuộc đời thật là tốt đẹp. Khi tôi rời khỏi công ty đó, tâm trạng của tôi rất tốt với một lời đề nghị cho một công việc tốt hơn trong tay.

Bạn có thể nghĩ rằng tôi đã học được bài học của mình; nhờ đó mà bây giờ tôi đã trở thành một người chuyên nghiệp. Hơn nữa, đó cũng chỉ là bài học đầu tiên trong số rất nhiều bài học mà tôi cần phải học. Trong những năm tiếp theo, tôi sẽ bị đuổi việc do thiếu cẩn thận để nhỡ một ngày hẹn quan trọng, và suýt bị đuổi việc do vô tình làm rò rỉ thông tin mật cho một khách hàng. Tôi sẽ làm trưởng nhóm một dự án sắp thất bại và lèo lái nó trở về mặt đất mà không cần cầu viện sự trợ giúp nào. Tôi sẽ kiên quyết bảo vệ cho những quyết định kỹ thuật của tôi mặc dù chúng có thể mâu thuẫn với yêu cầu của khách hàng. Tôi sẽ thuê một người hoàn toàn không có trình độ, dồn ông chủ của mình phải gánh chịu một nguy cơ lớn. Và tệ hơn hết, tôi sẽ làm cho hai người khác bị đuổi việc bởi vì sự thiếu khả năng lãnh đạo của tôi.

Vì vậy các bạn có thể xem quyển sách này như là một quyển catalog các lỗi của chính tôi, thấm đẫm những tội lỗi của chính tôi và là tập hợp các hướng dẫn giúp bạn tránh đi theo vết xe đổ của tôi trước đây.


[1] Easycoder là ngôn ngữ assembly của chiếc máy tính Honeywell H200, nó cũng tương tự như Autocoder của máy tính IBM 1401.

[2] record: bản ghi.

[3] subroutine: hàm, đoạn chương trình ngắn để thực hiện một nhiệm vụ nào đó.

[4] Nguyên nhân là do các phong trào biểu tình phản chiến của sinh viên các trường đại học ở Mỹ khi đó.

[5] word: đơn vị bộ nhớ nhỏ nhất có thể gán địa chỉ, kích thước word biểu thị số bit mà CPU xử lý được tại một thời điểm.

[6] register: thanh ghi.

[7] assembly: hợp ngữ, loại ngôn ngữ lập trình gần sát với ngôn ngữ máy.

[8] interrupt head: đoạn chương trình được thực thi khi bộ vi xử lý nhận được các tín hiệu ngắt.

[9] relocatable linker: bộ liên kết tái định vị lại địa chỉ các mã lệnh, dữ liệu của một chương trình.

Trả lời

Email của bạn sẽ không được hiển thị công khai.