Clean Coder – Chương 14 – Đào Tạo, Học Việc, Và Nhà Nghề

Tôi luôn bị thất vọng về chất lượng của ngành đào tạo CS[1]. Không phải là những người tốt nghiệp không sáng dạ hoặc tài năng, mà đó là việc họ không được dạy lập trình thực sự là cái gì.

Chứng chỉ của thất bại

Một lần tôi phỏng vấn một cô gái trẻ đang lấy bằng thạc sỹ về khoa học máy tính của một trường đại học lớn. Cô ấy ứng tuyển vào vị trí thực tập sinh mùa hè. Tôi đã đề nghị cô ấy viết một ít code cho tôi xem, và cô ấy đã nói rằng “Tôi không thực sự viết code.”

Vui lòng đọc lại đoạn trước lần nữa, và sau đó bỏ qua đoạn này để sang đoạn tiếp.

Tôi hỏi cô ấy khóa học lập trình nào mà cô đã tham gia để theo đuổi tấm bằng thạc sỹ. Cô ấy đã nói rằng mình không tham gia khóa học nào cả.

Có lẽ bạn sẽ muốn bắt đầu lại từ đầu chương này chỉ để chắc rằng bạn không phải đang rơi vào một vũ trụ nào khác hoặc chỉ là để thức dậy từ một con ác mộng.

Vào lúc đó tôi tự hỏi bản thân làm sao một sinh viên trong một chương trình thạc sỹ khoa học máy tính mà lại có thể tránh được một khóa học lập trình. Tôi băn khoăn như vậy vào thời điểm đó. Và đến bây giờ tôi vẫn đang băn khoăn, chưa có câu trả lời.

Dĩ nhiên, đó là trường hợp thất vọng cùng cực trong một chuỗi các thất vọng mà tôi có khi phỏng vấn những sinh viên tốt nghiệp. Không phải tất cả những sinh viên tốt nghiệp CS đều gây thất vọng – hãy còn xa! Tuy nhiên, tôi chú ý thấy rằng những người không gây thất vọng đều có một điểm chung: Gần như tất cả bọn họ đều tự học lập trình trước khi họ vào đại học và tiếp tục tự học khi đang còn học trong trường.

Bây giờ đừng hiểu sai ý tôi. Tôi nghĩ là có thể có được một nền giáo dục hoàn hảo tại một ngôi trường đại học. Chỉ có điều tôi cũng nghĩ là hoàn toàn có thể ung dung học hết hệ thống này và ra ngoài với một tấm bằng, và không có gì khác.

Và ở đó cũng có một vấn đề khác. Ngay cả chương trình cấp chứng chỉ CS tốt nhất thường cũng không chuẩn bị cho những sinh viên tốt nghiệp trẻ tuổi về những thứ họ sẽ gặp thực tế trong ngành công nghiệp này. Đây không phải là một bảng cáo trạng cho các chương trình cấp chứng chỉ này bởi vì nó là thực tế của gần như tất các ngành. Cái bạn học trong nhà trường và cái bạn thấy thực tế trong công việc thường là những thứ rất khác nhau.

Đào tạo

Chúng ta học cách lập trình như thế nào? Hãy để tôi kể cho bạn câu chuyện của tôi về cách tôi được đào tạo.

Digi-Comp I, chiếc máy tính đầu tiên của tôi

Vào năm 1964, mẹ tôi đưa cho tôi một chiếc máy tính bằng nhựa nhỏ cho lần sinh nhật thứ 12 của tôi. Nó được gọi là Digi-Comp I[2]. Nó có 3 flip-flop[3] và 6 cổng and[4] bằng nhựa. Bạn có thể kết nối đầu ra của flip-flop với đầu vào của cổng and. Bạn cũng có thể kết nối đầu ra của các cổng and với đầu vào của flip-flop. Nói ngắn gọn thì nó cho phép bạn tạo ra một chiếc máy trạng thái hữu hạn 3-bit.

Bộ thiết bị này đi kèm với một bản hướng dẫn cho phép bạn chạy được vài chương trình. Bạn lập trình chiếc máy này bằng cách đẩy những ống nhỏ (những đoạn ngắn của các ống hút soda) vào những chốt nhỏ nhô lên khỏi các flip-flop. Bản hướng dẫn này nói cho bạn chính xác nơi nào đặt từng chiếc ống, mà không nói là những ống đấy dùng để làm gì. Tôi thấy điều này rất bực mình!

Tôi nhìn vào chiếc máy đó hàng giờ liền và quyết tâm xem cách thức mà nó làm việc ở cấp độ thấp nhất; nhưng tôi không thể, trong cả cuộc đời của tôi, hình dung ra làm thế nào mà nó thực hiện được những gì tôi muốn nó thực hiện. Trang cuối trong bản hướng dẫn đó có nói với tôi rằng gửi cho họ 1 đô-la và họ sẽ gửi lại một bản hướng dẫn nói cho tôi cách để lập trình chiếc máy đó.[5]

Tôi đã gửi cho họ đồng đô-la của tôi và chờ đợi họ với một sự thiếu kiên nhẫn của một đứa bé tuổi 12. Ngày mà bản hướng dẫn được gửi đến, tôi đã ngấu nghiến nó. Nó chỉ là một bản lý thuyết đơn giản về đại số boole, bao gồm những kiến thức cơ bản của các phương trình boole, các định luật kết hợp và phân tán, và lý thuyết của DeMorgan. Bản hướng dẫn đó chỉ cách biểu diễn một vấn đề thành một chuỗi các phương trình boole. Nó cũng mô tả cách để tối giản những phương trình đó sao cho vừa với 6 cổng and.

Tôi đã nhận thức được chương trình đầu tiên của mình. Tôi vẫn nhớ cái tên: Cổng Điều Khiển Bằng Máy Tính của Mr Patternson. Tôi đã viết các phương trình, cắt giảm chúng, và ánh xạ chúng thành những ống và chốt của chiếc máy. Và nó hoạt động được!

Khi đang viết những từ này, nó vẫn khiến tôi bây giờ cảm thấy phấn khích. Sự phấn khích mà tôi đã trải qua vào năm 12 tuổi gần nửa thế kỷ trước. Tôi đã bị cắn câu. Cuộc đời tôi nếu không có ngày hôm đó thì có lẽ đã không như bây giờ.

Bạn có nhớ thời điểm chương trình đầu tiên của bạn làm việc không? Nó có thay đổi cuộc đời bạn hay đặt bạn vào một tiến trình mà bạn không thể quay lưng lại không?

Tôi đã không phải tự mình tìm hiểu được hết. Tôi đã được đào tạo. Một vài người rất tốt bụng và rất giỏi (tôi nợ những người này một món nợ lớn lòng biết ơn) đã dành thời gian để viết một bản lý thuyết về đại số boole mà một đứa trẻ 12 tuổi có thể hiểu được. Họ đã kết nối lý thuyết toán học với một chiếc máy vi tính bằng nhựa nhỏ bé và trao cho tôi quyền khiến cho chiếc máy tính đó thực hiện theo những điều mà tôi muốn nó phải làm.

Tôi vừa lôi xuống bản copy của bản hướng dẫn định mệnh đó. Tôi giữ nó trong một túi khóa zip. Vậy mà, năm tháng cũng đã làm cho những trang giấy trở nên vàng ố và dễ rách. Nhưng sức mạnh của những câu từ ghi trong đó đối với tôi vẫn tỏa sáng. Lời mô tả súc tích về đại số boole của họ chỉ chiếm ba trang giấy. Lời hướng dẫn từng bước một về các phương trình của mỗi chương trình gốc vẫn đầy lôi cuốn. Nó là sản phẩm của một bậc thầy điêu luyện. Nó là sản phẩm đã thay đổi cuộc đời của ít nhất một chàng trai trẻ. Tôi chỉ tiếc một điều là có lẽ tôi sẽ không bao giờ biết được tên của những tác giả của bản hướng dẫn đó.

Chiếc máy tính ECP-18 tại trường trung học

Ở tuổi 15, là một học sinh năm thứ nhất tại trường trung học, tôi thích loanh quanh ở khoa toán. (Hình dung xem!) Một ngày nọ họ chuyển tới một chiếc máy có kích thước của một chiếc bàn cưa. Nó là một chiếc máy tính dạy học được chế tạo cho các trường trung học, được gọi là ECP-18.Trường của chúng tôi có được 2 tuần để dùng demo nó.

Tôi đứng đằng sau khi các giáo viên và các kỹ thuật viên nói chuyện. Chiếc máy này có 15-bit word (word là cái gì nhỉ?) và một bộ nhớ trống 1024-word. (lúc đó tôi đã biết bộ nhớ trống là gì, nhưng chỉ biết khái niệm).

Khi họ bật chiếc máy lên, nó tạo ra một tiếng rít làm gợi nhớ đến tiếng của một chiếc máy bay phản lực hạ cánh. Tôi đã đoán tiếng đó là do chiếc trống đang quay. Một khi đã đủ tốc độ rồi, thì nó lại tương đối yên lặng.

Chiếc máy này thật đáng yêu. Nó về cơ bản là một chiếc bàn văn phòng với một bảng điều khiển kỳ diệu nổi ở phía trên trông giống như chiếc cầu của một chiến hạm. Bảng điều khiển này được tô điểm bởi những dãy đèn mà đó cũng chính là những nút nhấn. Ngồi tại chiếc bàn đó cũng giống như đang ngồi ở chiếc ghế của thuyền trưởng Kirk[6] vậy.

Khi tôi nhìn những kỹ thuật viên nhấn những chiếc nút đó, tôi đã chú ý thấy chúng sáng lên khi được nhấn, và bạn có thể nhấn chúng lại lần nữa để tắt. Tôi cũng chú ý thấy có những nút nhấn khác mà họ đang nhấn; những nút có tên như gửi chạy.

Những nút trong mỗi hàng được nhóm thành năm cụm, mỗi cụm ba nút. Chiếc máy Digi Comp đồ chơi của tôi cũng có 3 bit, vì vậy tôi có thể đọc được số octal[7] khi nó thể hiện dưới dạng nhị phân. Đó không phải việc gì quá khó để nhận ra rằng nó chỉ gồm 5 số octal.

Khi các kỹ thuật viên nhấn nút tôi còn có thể nghe thấy họ lẩm bẩm. Họ nhấn 1, 5, 2, 0, 4 trong hàng bộ nhớ đệm trong khi lẩm bẩm “lưu ở 204”. Họ nhấn 1, 0, 2, 1, 3 và lẩm bẩm “nạp 213 vào bộ tổng tích lũy”. Ở đó có một hàng nút tên là bộ tổng tích lũy!

Mười phút trôi qua và nó khá rõ ràng đối với đầu óc của một cậu thiếu niên 15 tuổi như tôi rằng 15 nghĩa là lưu và 10 nghĩa là nạp, bộ tổng tích lũy là thứ được lưu hay nạp, và các con số khác là các số của một trong 1024 word trên trống. (Vậy đó là thứ gọi là một word!)

Tâm trí háo hức của tôi gắn từng bit một (đây không phải là tôi đang chơi chữ) vào các mã lệnh và khái niệm. Cho đến khi các kỹ thuật viên rời đi, tôi đã biết cơ bản cỗ máy đó hoạt động như thế nào.

Buổi chiều hôm đó, trong suốt giờ học trên giảng đường, tôi rón rén đi vào phòng thí nghiệm toán học và bắt đầu nghịch chiếc máy tính đó. Tôi đã học được từ lâu rằng tốt nhất là xin tha lỗi còn hơn là xin phép! Tôi bật một chương trình nhỏ để nhân bộ cộng tích lũy với 2 và cộng 1. Tôi bật 6 vào bộ cộng tích lũy, chạy chương trình này và thấy con số 13 trong bộ cộng tích lũy! Nó đã hoạt động!

Tôi đã bật vài chương trình đơn giản khác giống như thế và tất cả chúng đều hoạt động như ý muốn. Tôi đúng là chủ nhân của vũ trụ này!

Những ngày sau đó tôi đã nhận ra tôi đã ngu ngốc và may mắn như thế nào. Tôi tìm thấy một tờ hướng dẫn nằm đâu đó trong phòng thí nghiệm toán học. Nó chỉ ra tất cả các câu lệnh và các op-code[8] khác nhau, bao gồm nhiều cái tôi chưa học được khi quan sát các kỹ thuật viên. Tôi hài lòng với việc tôi đã dịch được những thứ tôi đã biết một cách chính xác và vui thích với những cái khác mới mẻ. Tuy nghiên, một trong những câu lệnh mới là HLT. Tờ hướng dẫn đã chỉ ra rằng câu lệnh halt (dừng)là một word gồm tất cả đều là 0. Và nó cũng chỉ ra rằng tôi có thể đặt một word có tất cả đều là 0 vào cuối mỗi chương trình để tôi có thể nạp nó vào bộ cộng tích lũy để xóa nó đi. Khái niệm về từ “halt” đơn giản là tôi không có. Tôi chỉ biết được chương trình sẽ dừng khi nó hoàn thành!

Tôi nhớ có lúc tôi ngồi trong phòng thí nghiệm toán quan sát một trong những giáo viên cố gắng làm cho một chương trình hoạt động. Ông ấy đang cố gắng gõ 2 số nguyên trên bàn phím gắn kèm, và sau đó in ra tổng. Bất cứ ai cố gắng viết một chương trình giống như vậy bằng ngôn ngữ máy trên một máy tính mini đều biết rằng nó không phải là chuyện tầm thường. Bạn phải đọc các ký tự, chuyển chúng thành số, sau đó chuyển sang dạng nhị phân, cộng chúng lại, chuyển trở lại số nguyên và mã hóa nó trở lại thành các ký tự. Và, hãy tin tôi, sẽ tệ hơn nhiều nếu bạn nhập chương trình nhị phân thông qua bảng điều khiển máy!

Tôi đã xem ông ấy đặt một lệnh “halt” trong chương trình của ông ấy và sau đó chạy cho đến khi nó dừng lại. (Ồ! Đó là một ý tưởng hay!) Kiểu breakpoint nguyên thủy này cho phép ông ấy kiểm tra được nội dung của các thanh ghi để xem xem chương trình đã làm được những gì. Tôi nhớ ông ấy đã lẩm nhẩm “Wow, nhanh thật đấy!” Anh bạn, tôi có tin tức cho anh đây!

Tôi không hiểu thuật toán của ông ấy như thế nào. Dạng lập trình đó vẫn là một phép màu đối với tôi. Và ông ấy không bao giờ nói gì với tôi trong khi tôi quan sát qua vai của ông ấy. Quả thực là không ai nói với tôi về chiếc máy tính này. Tôi nghĩ họ xem tôi như mối phiền toái không đáng quan tâm, lăng xăng quanh phòng thí nghiệm như một con ngài. Điều đó đủ để có thể nói rằng cả học sinh và giáo viên đều không được phát triển kỹ năng xã hội ở mức độ cao.

Cuối cùng ông ấy cũng làm cho chương trình của mình hoạt động được. Trông nó thật đáng kinh ngạc. Ông ấy gõ chậm 2 con số bởi vì, theo như quả quyết ban đầu của ông ấy, chiếc máy tính đó không chạy nhanh (hãy liên tưởng tới việc đọc các word liên tục từ một trống quay vào năm 1967). Khi ông ấy gõ “return” sau con số thứ hai, chiếc máy tính nhấp nháy nhanh một lúc và sau đó bắt đầu in kết quả. Nó mất khoảng 1 giây mỗi chữ số. Nó đã in được tất cả nhưng với chữ số cuối cùng thì nó nhấp nháy thậm chí còn nhiều hơn trong 5 giây, và sau đó mới in ra chữ số cuối cùng và dừng lại.

Tại sao chữ số cuối cùng lại bị tạm dừng một lúc? Tôi không bao giờ tìm được lý do. Nhưng nó làm tôi nhận ra rằng cách tiếp cận một vấn đề có thể có hiệu quả sâu sắc tới người dùng. Mặc dù chương trình tạo ra câu trả lời đúng, nhưng nó vẫn có cái gì đó sai sai.

Đây chính là quá trình đào tạo. Chắc chắn đây không phải là kiểu đào tạo mà tôi mong muốn. Sẽ thật tuyệt vời nếu một trong những giáo viên này dìu dắt tôi và làm việc với tôi. Nhưng cũng không quan trọng lắm, bởi vì tôi đã quan sát được họ và học hỏi được với những bước tiến nhanh chóng.

Đào tạo không chính quy

Tôi kể với bạn về hai câu truyện này bởi vì chúng mô tả hai dạng rất khác nhau của việc đào tạo, cả hai đều không phải là kiểu mà từ “đào tạo” thường ngụ ý. Trong trường hợp đầu tiên, tôi đã học từ được từ những tác giả của một bản hướng dẫn viết rất tuyệt vời. Trong trường hợp thứ hai, tôi đã học được bằng cách quan sát người ta khi mà họ đã cố tình phớt lờ mình đi. Trong cả hai trường hợp những kiến thức thu được đều sâu sắc và làm nền tảng cho tôi sau này.

Dĩ nhiên, tôi cũng có những kiểu đào tạo khác nữa. Đó là những hàng xóm tốt bụng làm việc tại Teletype, họ đã mang cho tôi một hộp 30 cái rơ-le điện thoại để nghịch. Để tôi cho bạn biết điều này, hãy đưa cho một chàng trai vài chiếc rơ-le và một biến áp tàu điện và anh ấy có thể chinh phục thế giới!

Đó là người hàng xóm tốt bụng, anh ấy là một người vận hành vô tuyến điện nghiệp dư đã chỉ cho tôi cách dùng máy đo vạn năng (cái mà tôi đã nhanh chóng làm hỏng). Đó là một chủ cửa hiệu văn phòng phẩm đã cho phép tôi tới và “chơi” với chiếc máy tính lập trình được rất đắt tiền của anh ấy. Đó là văn phòng kinh doanh của tập đoàn Digital Equipment Corporation đã cho phép tôi tới và “chơi” với những chiếc máy PDP-8 và PDP-10 của họ.

Rồi đó là Jim Carlin lớn, một lập trình viên BAL người đã cứu tôi khỏi bị đuổi việc trong công việc lập trình đầu tiên của tôi bằng cách giúp đỡ tôi debug một chương trình Cobol vượt quá khả năng của tôi khi đó. Anh ấy đã dạy tôi cách đọc kết xuất bộ nhớ (core dump), và cách để định dạng code với những dòng trống, những dòng ngôi sao, và bình luận thích hợp. Anh ấy đã trao cho tôi những bước đi đầu tiên để trở thành một chuyên gia. Tôi lấy làm tiếc là tôi đã không thể trả ơn khi ông chủ không hài lòng về anh ấy một năm sau đó.

Nhưng thành thực mà nói, quan trọng nhất vẫn là bản thân tôi. Vào những năm đầu thập niên 70 thì không có quá nhiều các lập trình viên lâu năm. Ở mọi nơi khác mà tôi đã từng làm việc, tôi đều đã trở thành kỳ cựu. Không ai giúp tôi hình dung ra công việc lập trình chuyên nghiệp thực sự là cái gì. Không có hình mẫu nào dạy tôi cách ứng xử hay tạo giá trị cái gì. Những thứ này tôi phải tự học hỏi lấy, và nó không hề dễ dàng chút nào.

Kiến thức thực tế

Như tôi đã nói với bạn trước đây, thực tế, tôi đã bị sa thải khỏi công việc tự động hóa nhà máy vào năm 1976. Mặc dù tôi có trình độ về mặt kỹ thuật, nhưng tôi đã không được học cách quan tâm tới doanh nghiệp hoặc các mục tiêu của doanh nghiệp. Ngày tháng và các deadline không có ý nghĩa gì với tôi. Tôi đã quên một buổi demo quan trọng vào sáng thứ Hai, để cho hệ thống bị hỏng vào thứ Sáu, và còn đi làm muộn vào thứ Hai, khiến mọi người nhìn tôi chằm chằm giận dữ.

Sếp tôi đã gửi một lá thư cảnh cáo tôi rằng tôi phải thay đổi ngay lập tức hoặc sẽ bị đuổi việc. Đây là một lời thức tỉnh lớn lao đối với tôi. Tôi đã đánh giá lại cuộc đời và sự nghiệp của mình và bắt đầu tạo ra những thay đổi lớn trong hành vi của mình – một vài thứ mà bạn đang đọc trong cuốn sách này. Nhưng nó quá nhỏ bé, quá muộn màng. Khi mà tất cả đang theo đà lệch hướng thì những thứ nhỏ nhặt trước đây lại trở nên nghiêm trọng. Vì vậy, mặc dù tôi đã cố gắng rất nhiều, cuối cùng họ vẫn tống cổ tôi ra khỏi công ty đó.

Không cần phải nói, việc mang cái tin đó về nhà cho người vợ đang bầu và một bé gái hai tuổi không hề vui chút nào. Nhưng tôi đã đứng dậy và mang bài học cuộc đời lớn lao đó sang công việc tiếp theo của tôi – công việc mà tôi đã làm trong 15 năm và nó đã hình thành nên nền tảng thực sự cho sự nghiệp hiện tại của tôi.

Cuối cùng, tôi đã tồn tại và phát triển. Nhưng chắc chắn là phải có cách tốt hơn. Tôi sẽ tốt hơn nhiều nếu tôi có một người thầy thực sự, một ai đó dạy tôi các cách vào và các cách ra. Một ai đó tôi có thể quan sát trong khi tôi giúp đỡ những công việc nhỏ, và một ai đó soát lại và hướng dẫn công việc ban đầu của tôi. Một ai đó đóng vai trò là một hình mẫu và dạy tôi những giá trị và cách phản ứng một cách phù hợp. Một người thầy. Một bậc thầy. Một người cố vấn.

Học việc

Những bác sỹ làm gì? Bạn có nghĩ các bệnh viện thuê những sinh viên y khoa mới ra trường và ném họ ngay vào phòng phẫu thuật để thực hiện một ca phẫu thuật tim vào ngày đầu tiên làm việc của họ không? Dĩ nhiên là không.
Ngành y đã phát triển một kỷ luật được hướng dẫn kỹ lưỡng về nghi thức và được bôi trơn bằng truyền thống của ngành. Ngành y giám sát các trường đại học và đảm bảo rằng các sinh viên ra trường được đào tạo tốt nhất có thể. Quá trình đào tạo đó bao gồm khoảng thời gian gần như ngang nhau giữa việc học trên lớp và các hoạt động điều trị thực tế tại các bệnh viện và được làm việc với những người chuyên nghiệp.

Khi tốt nghiệp, và trước khi họ có thể lấy được bằng, các bác sỹ tương lai được yêu cầu phải dành một năm thực hành và luyện tập dưới sự giám sát mà còn được gọi là thực tập sinh. Đây là quá trình đào tạo bằng công việc thực tế khắc nghiệt. Xung quanh những thực tập sinh đó là những người hình mẫu của công việc và các giáo viên.

Một khi hoàn thành thời gian thực tập, mỗi chuyên ngành y khoa lại đòi hỏi từ 3 tới 5 năm nữa để thực tập và rèn luyện có giám sát nhiều hơn nữa và nó được gọi là nội trú. Người nội trú có được sự tự tin bằng cách nhận những trách nhiệm lớn hơn trong khi vẫn được giám sát xung quanh bởi các bác sỹ kỳ cựu.

Nhiều chuyên ngành còn đòi hỏi từ 1 tới 3 năm nghiên cứu nữa trong đó sinh viên tiếp tục có các khóa đào tạo đặc biệt và thực hành dưới sự giám sát.

sau đó họ mới đủ tư cách để làm các bài thi của họ và được hội đồng giám khảo chứng nhận.

Những mô tả về ngành y này phần nào đã được lý tưởng hóa, và có thể không chính xác hoàn toàn. Nhưng thực tế vẫn còn nguyên là khi nhu cầu tăng cao, chúng ta đã không đưa những sinh viên mới tốt nghiệp vào phòng, thỉnh thoảng ném miếng thịt vào, và hy vọng những điều tốt đẹp sẽ xuất hiện. Vậy thì tại sao chúng ta lại làm điều này với phần mềm?

Sự thực là có tương đối ít người bị chết vì các bug phần mềm. Nhưng đã có những tổn thất về tiền bạc rất lớn. Nhiều công ty đã mất những khoản tiền khổng lồ bởi việc thiếu đào tạo những lập trình viên phần mềm của họ.

Không hiểu vì sao ngành công nghiệp phát triển phần mềm này lại suy nghĩ rằng lập trình viên là lập trình viên, và một khi bạn đã tốt nghiệp thì bạn cũng có thể code. Quả thực là không phải tất cả các công ty đều thuê những đứa trẻ mới ra trường, tập hợp chúng thành “những nhóm”, và đề nghị chúng xây dựng những hệ thống quan trọng nhất. Điều đó thật điên rồ!

Các thợ sơn không làm vậy. Các thợ nước cũng không. Các thợ điện cũng không. Quỷ thật, tôi thậm chí không nghĩ các đầu bếp đồ ăn nhanh cư xử theo cách này! Đối với tôi, các công ty thuê những sinh viên tốt nghiệp khoa học máy tính có thể phải đầu tư đào tạo họ nhiều hơn là việc McDonald đầu tư vào hệ thống máy chủ của họ.

Bạn đừng tự đùa rằng điều này không quan trọng. Có rất nhiều thứ nguy hiểm. Nền văn minh của chúng ta đang chạy trên phần mềm. Phần mềm là thứ di chuyển và xử lý thông tin tràn ngập cuộc sống của chúng ta. Phần mềm điều khiển động cơ, hộp số, và phanh trên ô-tô. Nó duy trì số dư ngân hàng của chúng ta, gửi cho chúng ta hóa đơn, và chấp nhận sự thanh toán của chúng ta. Phần mềm giặt quần áo của chúng ta và cho chúng ta biết thời gian. Nó đưa hình ảnh lên TV, gửi tin nhắn của chúng ta, cho phép chúng ta gọi điện thoại, và giúp chúng ta giải trí khi chúng ta thấy buồn chán. Phần mềm ở mọi nơi.

Với việc chúng ta giao phó cho các lập trình viên phần mềm tất cả các khía cạnh của cuộc sống chúng ta, từ những điều vặt vãnh cho tới những điều quan trọng, thì việc tôi đề nghị một khoảng thời gian hợp lý để đào tạo và thực hành có giám sát cho các lập trình viên không phải là không hợp lý.

Học việc phần mềm

Vậy ngành phần mềm cần phải dẫn dắt những sinh viên trẻ mới tốt nghiệp tiến vào cấp độ chuyên nghiệp như thế nào? Họ cần phải tuân theo những bước nào? Họ cần phải gặp những thử thách nào? Họ cần phải đạt được những mục tiêu nào? Chúng ta hãy làm việc ngược lại.

Bậc thầy

Đó là những lập trình viên đảm nhận vai trò trưởng nhóm của nhiều hơn một dự án phần mềm lớn. Thông thường họ sẽ có trên 10 năm kinh nghiệm và đã từng làm việc với nhiều loại hệ thống, ngôn ngữ, và hệ điều hành khác nhau. Họ biết cách để dẫn dắt và điều phối nhiều nhóm, họ là những kiến trúc sư và thiết kế tài giỏi, và có thể code xoay quanh mọi người khác mà không đổ một giọt mồ hôi. Họ đã được mời các chức vụ quản lý, nhưng hoặc là họ từ chối, hoặc là quay trở lại sau khi chấp nhận, hoặc tích hợp vai trò quản lý với vai trò kỹ thuật chính của họ. Họ giữ vững được vai trò kỹ thuật bằng cách đọc, học tập, rèn luyện, làm việc, và chỉ bảo. Đó là một người thầy mà công ty sẽ giao trách nhiệm kỹ thuật đối với một dự án.

Người thạo việc

Những lập trình viên này được đào tạo, có trình độ, và nhiệt huyết. Trong quãng thời gian này của sự nghiệp, họ sẽ học cách làm việc tốt trong một nhóm và trở thành những trưởng nhóm. Họ có kiến thức về những công nghệ hiện tại nhưng thường thiếu kinh nghiệm với nhiều kiểu hệ thống khác nhau. Họ có khuynh hướng biết một ngôn ngữ, một hệ thống, một nền tảng; nhưng họ vẫn đang học tiếp. Mức kinh nghiệm của họ thay đổi nhiều tùy theo cấp bậc của họ, nhưng thường thì khoảng 5 năm. Ở phía xa mức trung bình, chúng ta có những bậc thầy; ở phía gần chúng ta có những người học việc.

Những người thạo việc được giám sát bởi những bậc thầy, hoặc những người thạo việc kỳ cựu hơn. Những người thạo việc trẻ hiếm khi được cho phép tự hoạt động. Công việc của họ được giám sát chặt chẽ. Code của họ được xem xét kỹ lưỡng. Khi họ có kinh nghiệm, thì quyền tự chủ của họ sẽ lớn dần. Sự giám sát sẽ trở nên ít trực tiếp và tinh tế hơn. Cuối cùng thì nó chuyển thành đánh giá ngang hàng.

Người học việc/Thực tập sinh

Những sinh viên mới ra trường bắt đầu sự nghiệp của họ là những người học việc. Những người học việc không có quyền tự chủ. Họ được giám sát rất chặt bởi những người thạo việc. Đầu tiên, họ chưa nhận một nhiệm vụ nào cả, họ chỉ đơn giản hỗ trợ cho những người thạo việc. Đây là khoảng thời gian lập trình ghép đôi rất khắc nghiệt. Đây là khi họ học được và trau dồi các kỷ luật làm việc. Đây là khi nền tảng của các giá trị được tạo ra.

Những người thạo việc là những giáo viên. Họ đảm bảo rằng người học việc biết được các nguyên lý thiết kế, design pattern, kỷ luật, và các cách thức. Những người thạo việc dạy TDD, cách refactor, ước lượng.v.v. Họ giao nghiệm vụ đọc, các bài tập và bài thực hành cho những người học việc; họ đánh giá tiến triển của những người học việc.

Vị trí học việc có thể mất một năm. Trong thời gian đó, nếu những người thạo việc sẵn sàng chấp nhận người học việc ở cấp bậc của họ, họ sẽ đưa đề xuất cho các bậc thầy. Các bậc thầy sẽ kiểm tra người học việc bởi cả việc phỏng vấn và việc đánh giá những thành quả của họ. Nếu các bậy thầy đồng ý, thì những người học việc sẽ trở thành những người thạo việc.

Thực tế

Một lần nữa, tất cả những điều này chỉ là lý tưởng và có tính giả thuyết. Tuy nhiên, nếu bạn thay đổi những cách gọi này và nhìn chằm chằm vào những từ đó thì bạn sẽ nhận ra nó không khác so với cách mà bây giờ chúng ta mong muốn mọi người làm việc. Những sinh viên mới ra trường được giám sát bởi những trưởng nhóm trẻ tuổi, người này lại được giám sát bởi các trưởng dự án.v.v. Vấn đề là, trong phần lớn các trường hợp, vai trò giám sát không phải là về kỹ thuật! Phần lớn các công ty đều hoàn toàn không có vị trí giám sát kỹ thuật. Các lập trình viên phát triển và cuối cùng được thăng chức bởi vì đó là cách làm của bạn với những lập trình viên.

Sự khác biệt giữa cái chúng ta đang làm hôm nay và chương trình học việc lý tưởng của tôi là sự tập trung vào việc dạy, đào tạo, giám sát, và đánh giá về kỹ thuật. Sự khác biệt này rất rõ ràng rằng những giá trị chuyên nghiệp và nhạy bén kỹ thuật bắt buộc phải được dạy dỗ, được nuôi dưỡng, được ấp ủ, được nâng niu và được chăm bón. Điều thiếu sót trong cách tiếp cận của chúng ta hiện nay đó là trách nhiệm của những người thâm niên phải dạy dỗ cho thế hệ trẻ.

Tính nhà nghề

Bây giờ chúng ta tới vị trí để định nghĩa từ này: tính nhà nghề. Nó là cái gì nhỉ? Để hiểu được, chúng ta hãy nhìn vào từ người nhà nghề. Từ này trong tâm trí chúng ta gắn liền với kỹ năng và chất lượng. Nó gợi liên tưởng về một người đầy kinh nghiệm và năng lực. Một người nhà nghề là người có thể làm việc nhanh chóng, mà không vội vàng, là người đưa ra những ước lượng hợp lý và giữ đúng cam kết. Một người nhà nghề biết khi nào nói không, nhưng cũng rất nỗ lực để nói có. Một người nhà nghề là một người chuyên nghiệp.

Tính nhà nghề chính là tư duy của những người nhà nghề. Tính nhà nghề là một khái niệm bao gồm tất cả các giá trị, kỷ luật, kỹ thuật, thái độ và các câu trả lời.

Tính nhà nghề được truyền từ người này sang người khác. Nó được những người thâm niên dạy lại cho những người trẻ. Nó là sự trao đổi giữa những người ngang cấp. Nó cũng được quan sát và học hỏi ngược lại, như khi những người thâm niên quan sát học hỏi những người trẻ. Tính nhà nghề có khả năng lây truyền, nó là một dạng của virus tinh thần. Bạn nắm bắt được nó bằng cách quan sát những người khác và để cho bạn nắm giữ được quan niệm đó.

Thuyết phục người khác

Bạn không thể thuyết phục người khác trở thành những người nhà nghề được. Bạn không thể thuyết phục họ chấp nhận tính nhà nghề được. Những lý luận không hiệu quả. Dữ liệu không hợp lý. Trường hợp thực tiễn không có ý nghĩa gì cả. Việc chấp nhận một quan niệm thường không phải là quyết định dựa trên lý trí mà chủ yếu dựa trên cảm xúc. Đây là một điều rất bình thường của một con người.

Vậy làm cách nào bạn khiến người khác áp dụng tính nhà nghề? Hãy nhớ rằng mọi quan niệm có tính lây truyền, nhưng chỉ khi nó có thể quan sát được. Vì vậy bạn hãy làm quan niệm đó quan sát được. Bạn hãy cư xử như một tấm gương. Bạn hãy trở thành một người nhà nghề trước, và để tính nhà nghề của bạn được thể hiện. Sau đó chỉ để cho quan niệm đó làm nốt phần việc còn lại.

Kết luận

Trường học có thể dạy về lý thuyết lập trình máy tính. Nhưng trường học không, và không thể dạy kỷ luật, thực tiễn, và kỹ năng để trở thành một người nhà nghề. Những điều này sẽ được đúc kết qua nhiều năm bản thân bạn được kèm cặp và dạy bảo. Đã đến lúc những người trong ngành công nghiệp phần mềm phải đối mặt với thực tế rằng việc hướng dẫn một khóa lập trình viên phần mềm tiếp theo để họ trưởng thành sẽ là trách nhiệm của chúng ta, không phải thuộc về các trường đại học. Đã đến lúc chúng ta áp dụng một chương trình dài hạn của những người học việc, thực tập sinh, và những người dẫn hướng.


[1] CS: Computer Science – Khoa Học Máy Tính.

[2] Vẫn còn có nhiều website cung cấp các chương trình mô phỏng loại máy tính này.

[3] flip-flop: là một thiết bị điện tử có thể lưu trữ thông tin trạng thái 1-bit.

[4] cổng and (and-gate) là loại thiết bị điện tử thực hiện phép logic AND với hai hoặc nhiều đầu vào.

[5] Tôi vẫn còn giữ bản hướng dẫn này. Nó nằm ở một vị trí danh dự trên một trong những giá sách của tôi.

[6] Thuyền trưởng Kirk là một nhân vật trong phim Star Trek.

[7] octal: hệ bát phân.

[8] op-code: các mã lệnh của hợp ngữ assembly.

Trả lời

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