5 bài học từ những lập trình viên kỳ cựu

Tuổi trẻ có thể là điều mà bộ phận nhân sự muốn, nhưng viết code nhanh thì không ai bằng các chuyên gia lập trình lão luyện.
Ngành công nghiệp máy tính có sự đam mê kỳ lạ đến mức sùng tín với công nghệ mới, mô hình mới, và tất nhiên cả lập trình viên mới
Ngành công nghiệp máy tính có sự đam mê kỳ lạ đến mức sùng tín với công nghệ mới, mô hình mới, và tất nhiên cả lập trình viên mới

Một thách thức với các bộ phận nhân sự và tuyển dụng ở Silicon Valley: Họ không thể hỏi tuổi của ứng viên vì sẽ bị kiện phân biệt đối xử (nhiều công ty đã thua kiện trong những năm qua). Thay vì thế, họ dùng các thủ thuật như trao đổi qua lại ngầm liên hệ đến bộ phim hay tình huống hài hước nào đó để xem ứng viên có hưởng ứng trò đùa không, qua đó đánh giá ứng viên có phù hợp với văn hóa công ty hay không.

Ngành công nghiệp máy tính có sự đam mê kỳ lạ đến mức sùng tín với công nghệ mới, mô hình mới, và tất nhiên cả lập trình viên mới. Thực tế công nghệ cũ không bao giờ chết hẳn. Các phát minh cũ như mainframe (máy tính lớn) có thể không còn nổi đình nổi đám, nhưng chúng vẫn làm việc. Ở thời điểm trung tuần tháng 4/2016, trên trang web việc làm Dice số nhu cầu tuyển dụng với từ khóa "Cobol" (522) nhiều hơn gấp năm lần "OCaml" (11), "Erlang" (52) và "Haskell" (27) gộp lại.

Việc phân biệt tuổi tác khá phổ biến, có những lý do của nó. Cái đầu của các lập trình viên trẻ không bị lấp đầy những ý tưởng cũ, do đó họ học nhanh hơn. Những người non nớt tập trung và siêng năng hơn. Họ không bị những việc khác làm sao lãng, như gia đình, hoặc ít nhất thú tiêu khiển của họ gắn với PC và smartphone. Điều này có thể đúng nhưng cũng có thể không (tìm bằng chứng không khó).

Tuy nhiên những lập trình viên kỳ cựu lại có sự thông thái, điều mà không thể đạt được chỉ bằng cách đơn giản xem một bài thuyết trình của TED (Technology – Entertainment - Design) trên YouTube hoặc lướt qua một khóa học trực tuyến (MOOC). Họ hiểu rõ hơn về cách máy tính làm việc vì từng làm việc với các máy tính dùng bảng công tắc. Thời đó không có môi trường phát triển tích hợp (IDE) và trình biên dịch giúp tiết kiệm công sức. Nếu không xây dựng ứng dụng đúng ngay từ đầu, nó sẽ không làm việc. “Bọn trẻ” phải mất nhiều năm mới biết điều này.

Dưới đây là 5 bài học có giá trị trường tồn từ các “già làng” lập trình.

Hợp ngữ (Assembler)

Hầu hết những người tuổi dưới 50 không biết câu lệnh như “mov ah, 09h” hoặc “cmp eax, ebx”. Nhiều người cho rằng máy tính mặc nhiên đòi hỏi nhiều dấu ngoặc nhọn ( { ) vì các ngôn ngữ lập trình phổ biến sử dụng chúng để phân định các khối mã lệnh. Ngay cả những người hiểu rằng các ngôn ngữ như Java hay C phải được dịch sang mã nhị phân cũng thường ít có kinh nghiệm thực hiện.

Nhiều lập trình viên lớn tuổi đã trải qua những ngày viết mã ‘assembly’ (tên được đặt cho phiên bản mã máy nhị phân người-có-thể-đọc-được). Một số người có thể chuyển mã ‘assembly’ bằng tay và biến nó thành số Hex (thập lục phân) để có thể bật các công tắc trên bảng điều khiển lập trình máy tính.

Việc viết mã ‘assembly’ chẳng cao siêu gì và cũng không thật sự cần thiết. Đó là công việc nặng nhọc, mất thời gian, lặp đi lặp lại và rất dễ mắc lỗi. Các trình biên dịch hiện nay đủ khả năng nhận biết các cú pháp phức tạp; thậm chí một số nhà viết trình biên dịch còn khoe có thể tạo ra mã tốt hơn người.

Điều đó có thể đúng, nhưng lợi ích của việc học hợp ngữ (dù chỉ chút ít) đó là bạn hiểu cách thức máy tính làm việc. Các ngôn ngữ bậc cao có thể cung cấp rất nhiều các ‘con đường tắt’ nhanh chóng cho các tác vụ thông thường, chẳng hạn như ghép chuỗi, nhưng chúng có thể là một cái bẫy khiến các lập trình viên nghĩ rằng phép toán cộng (+) cần thời lượng như nhau cho dù cộng hai số nguyên hay ghép hai chuỗi. Không phải vậy, thời gian khác biệt đáng kể, và những người biết mã ‘assembly’ và cách tác vụ JMP (jump – lệnh nhảy) hoạt động sẽ có quyết định đúng đắn.

Hiểu được cách các đối tượng được đưa vào bộ nhớ và được nạp vào CPU (bộ xử lý) khi cần thiết giúp ích rất nhiều trong việc giảm thiểu việc sao chép và tính toán quá mức làm chậm chương trình. Những người lớn lên cùng hợp ngữ có thể không nhớ nhiều về cách viết mã x86, nhưng họ có bản năng nhắc nhở khi làm điều gì đó mất thời gian. Những người trẻ tuổi không có được bản năng đó, trừ khi họ tự đào tạo đúc kết kinh nghiệm.

Âm thanh và đèn hiệu

Những người bắt đầu nghề lập trình với máy tính cá nhân người dùng đơn như Altair hay Sol 20 mỗi lúc chỉ chạy một khối mã có thể lúc đầu ghét Unix. Lý do? "Máy tính Unix khởi chạy một cái gì đó bất cứ lúc nào. Bạn thấy những chiếc đĩa mềm khởi động nhưng không biết tại sao".

Điều này khiến lập trình viên khó chịu vì mất đi khả năng hiểu biết máy tính đang làm gì. Không ai thực sự biết những gì đang xảy ra trong chiếc máy tính hiện đại. Có vô số phần mềm chạy trên 4 hoặc 8 lõi vi xử lý. Virus và sâu có thể bám trụ mãi trong máy mà người sử dụng không hề nhận thấy sự trì trệ.

Các lập trình viên kỳ cựu biết cách quan sát các manh mối thị giác và thính giác để gỡ lỗi chương trình. Họ theo dõi đèn hiệu ở các jack cắm Ethernet RJ-45 nhấp nháy khi dữ liệu đang truyền. Họ lắng nghe đĩa cứng và biết khi nào đĩa bắt đầu đổi rãnh, một dấu hiệu cho thấy có cái gì đó đọc hoặc ghi lên đĩa. Những người thực sự giỏi có thể nhận biết sự khác biệt giữa việc ghi tạm lên đĩa xảy ra khi bộ nhớ đầy và việc đọc ghi liên tục của tác vụ lập chỉ mục.

Giá trị của các manh mối này đang mờ dần khi đĩa cứng bị thay bằng ổ đĩa trạng thái rắn (SSD) và dữ liệu truyền không dây ngày càng nhiều thay vì thông qua các router với đèn nhấp nháy. Nhưng miễn là điện thoại thông minh có chỉ báo hiển thị khi dữ liệu đang truyền thì những kỹ năng như thế vẫn có đất dụng võ.

Thao tác trên bit

Ngày xưa, các lập trình viên gom 8 giá trị boolean (0 hay 1) khác nhau thành một byte. Họ thao tác từng bit một vì không muốn lãng phí.

Các cấu trúc dữ liệu hiện đại thì ngược lại, hết sức lãng phí. XML chứa đầy các thẻ có tên dài, mỗi thẻ lại có một thẻ đóng có thêm một dấu gạch chéo. Trong các tập tin XML hiện đại thường hơn 90% là những thứ thêm vào để đáp ứng các quy tắc phân tích cú pháp thẻ phức tạp.

JSON được xem là một cải tiến vì nó nhỏ hơn một chút, chỉ đơn giản dùng dấu ngoặc nhọn thay thẻ đóng. Nhưng hiện vẫn còn quá nhiều dấu nháy kép trong các thẻ và chuỗi.

Tin tốt là các thuật toán nén hiện đại có thể thu gọn khá tốt các cấu trúc dữ liệu. Nhưng chúng không bao giờ có thể xử lý được hết tất cả. Các tay lão làng biết cách tránh đưa vào những thứ trên ngay từ đầu. Đó là lý do chương trình như MS-DOS 3.0 có thể chạy nhanh nhẹ trong phân vùng không quá 32MB. Đó là những năm đầu thập niên 1980, khi mà máy tính cá nhân đã phổ biến và cuộc cách mạng máy tính cũng đã qua giai đoạn trứng nước. Trước đó nữa, chương trình ở thập niên 1970 thậm chí còn nhỏ hơn. Chương trình ở thập niên 1960 thì nhỏ đến đáng kinh ngạc.

Phép toán nhị phân

Các tác vụ kiểm tra và bật tắt bit cần thiết đối với lập trình viên thời kỳ đầu. Một số tác vụ chậm đến nỗi lập trình viên đã phải xoay xở đủ mọi cách để xử lý. Và cách tốt nhất là biết phép chia hai tương đương với việc dịch chuyển một số nhị phân sang phải, giống như việc chia cho 10 là dịch chuyển một số thập phân sang phải.

Việc dịch chuyển các bit là tác vụ thông thường trên CPU (bộ xử lý), và nó thường nhanh hơn hẳn so với phép chia cơ bản. Và các lập trình viên giỏi tận dụng điều đó để viết chương trình chạy nhanh hơn, dùng phép dịch chuyển bit thay cho phép nhân và chia.

Tích góp kinh nghiệm

Trên nhiều bộ xử lý đời đầu, một số tác vụ mất nhiều thời gian hơn nhiều so với tác vụ khác. Trên CPU 8086, phép chia một số mất khoảng 80-190 chu kỳ xung đồng hồ, trong khi phép cộng hai số chỉ mất 3 chu kỳ. Ngay cả khi CPU chạy ở nhịp xung 5MHz thì điều đó vẫn tạo nên một sự khác biệt lớn khi thực hiện các tác vụ lặp đi lặp lại.

Các lập trình viên lớn tuổi biết rằng không phải tất cả các câu lệnh thực hiện trong cùng một khoảng thời gian như nhau. Họ hiểu rằng tính toán không phải là miễn phí, và không phải mọi câu lệnh tương đương nhau. Chọn sai tác vụ và máy tính sẽ chạy chậm ngay.

Mọi người quên rằng việc lựa chọn sai kiểu dữ liệu cũng có thể gây hậu quả. Sử dụng biến “long” (32 bit) hoặc “double” (64 bit) có thể xử lý chậm hơn. Sử dụng cấu trúc dữ liệu sai có thể khiến chương trình chạy ì ạch.

Nhiều bạn trẻ nghĩ rằng việc tính toán là tức thời và CPU có thể thực hiện số lượng vô hạn phép tính trong chớp mắt. người lớn tuổi nhớ việc công trừ nhân chia sẽ khiến CPU lăng xăng chậm chạp. Tất cả những điều nho nhỏ đó thu thập dần qua nhiều năm tìm tòi, gỡ lỗi và chỉnh sửa code. Cách duy nhất để có được kiến thức này là trải nghiệm với thời gian. Theo PC World