- Nhìn lại hành trình lập trình suốt 25 năm bắt đầu từ thời đại học, tập trung vào con người, các mối quan hệ và trải nghiệm hơn là bản thân công nghệ
- 10 phút xem mã nguồn HTML được học tình cờ trong phòng máy đại học đã trở thành điểm khởi đầu cho quãng thời gian dài tự tạo và duy trì website cá nhân
- Một thử nghiệm nhỏ nhảy tới vector reset của bộ xử lý 8086 để khởi động lại hệ thống đã khiến một người bạn khắc ghi thái độ học hỏi bắt đầu từ sự tò mò
- Những vòng lặp thử sai và trưởng thành tiếp diễn qua gỡ lỗi mã spaghetti, thất bại thực tế của hoạt ảnh trên set-top box, thành tích cao trong cuộc thi CTF
- Theo thời gian, tác giả cảm nhận rõ sự thay đổi khi năng lực giải quyết vấn đề không còn được xem là tài năng mà là kết quả của kinh nghiệm, và kết lại rằng điều còn lại sau cùng là chuyên môn, đạo đức và cách đối xử với con người
Khởi đầu của web: xem mã nguồn (Viewing the Source)
- Ngay sau khi vào đại học năm 2001, trong lúc lướt web tại phòng máy vào buổi tối, tác giả lần đầu thực sự tiếp xúc với web khi gõ
susam.com vào thanh địa chỉ
- Một đàn anh đứng xem từ phía sau đã mở menu View > Source của Internet Explorer và giải thích rằng website thực chất là văn bản được viết bằng HTML
- Anh ấy mở Notepad, trực tiếp viết một đoạn HTML đơn giản như
<BODY><FONT COLOR="RED">HELLO</FONT></BODY>, rồi trình diễn cách nó hiển thị trong trình duyệt
- Khi đó, thẻ
FONT vẫn được dùng rộng rãi và việc viết thẻ HTML bằng chữ in hoa là thông lệ phổ biến
- Anh tiếp tục giới thiệu ngắn gọn cách web hoạt động thông qua việc thay đổi cỡ chữ, màu sắc, căn giữa và màu nền
- Chỉ là phần giải thích chừng 10 phút, nhưng World Wide Web bỗng trở nên bớt bí ẩn và thú vị hơn rất nhiều
- Sau khi giải thích xong, người đàn anh không trả lại chỗ ngồi mà tiếp tục dùng web, còn tác giả phải quay về ký túc xá vì không còn ghế trống
- Tên miền
susam.com đã được một doanh nghiệp liên quan tới ẩm thực Thổ Nhĩ Kỳ sử dụng nên không thể đăng ký, vì vậy sau đó tác giả chọn tên miền .net
- Cuộc gặp ngắn ngủi này đã trở thành điểm khởi đầu cho hành trình dài tạo lập và duy trì website cá nhân về sau
Vector reset (The Reset Vector)
- Câu chuyện xảy ra khi tác giả còn học đại học, đang viết chương trình điều khiển thang máy bằng hợp ngữ trên máy MS-DOS chạy Intel 8086 trong phòng máy
- Tác giả nhớ lại kiến thức được học trên lớp rằng khi 8086 reset, CS:IP sẽ được đặt thành FFFF:0000
- Tò mò không biết điều gì sẽ xảy ra nếu nhảy tới địa chỉ đó trong
DEBUG.EXE, tác giả đã tự mình thử
- Ngay sau khi chạy lệnh
C:\>DEBUG -G =FFFF:0000, hệ thống lập tức khởi động lại
- Một người bạn luôn đứng đầu lớp mỗi học kỳ, ngồi chứng kiến việc đó, đã vô cùng ngạc nhiên và hỏi vì sao tác giả lại nghĩ ra cách ấy
- Một tuần sau, người bạn tới ký túc xá và thú nhận rằng dù luôn đứng hạng nhất, anh ấy không có sự tò mò để nhớ lại một chi tiết nhỏ rồi tự mình kiểm chứng
- Anh tuyên bố sẽ không còn nhắm tới vị trí thủ khoa nữa, mà sẽ học theo cách khám phá, thử nghiệm và tận hưởng những gì đã học
- Sau đó anh vẫn duy trì thành tích nhóm đầu, nhưng thực sự không bao giờ đứng số một nữa
- Một lần thử nghiệm nhảy tới điểm vào reset của bộ xử lý đã trở thành bước ngoặt khiến thái độ học tập của một người chuyển từ cạnh tranh sang khám phá
Tấn công trung gian và công việc kỹ sư đầu tiên (Man in the Middle)
- Sau khi tốt nghiệp đại học, ở công việc đầu tiên tác giả được phân vào đội hỗ trợ kỹ thuật cho sản phẩm e-banking, phụ trách chạy bộ cài đặt để triển khai một số thành phần cụ thể
- Bộ cài viết bằng Python thường xuyên thất bại vì các giả định về môi trường mục tiêu quá mong manh; trong tuần đầu tiên, tác giả đã ổn định bộ cài và viết hướng dẫn người dùng theo từng bước
- Phản hồi dành cho tài liệu hướng dẫn còn tích cực hơn cả việc cải thiện mã
- Cảm thấy công việc hỗ trợ lặp đi lặp lại có giới hạn và muốn làm phát triển phần mềm bài bản hơn, tác giả nhiều lần xin chuyển nhóm
- Cuối cùng, tác giả được giới thiệu cơ hội phỏng vấn với nhóm Archie (kiến trúc) ở một thành phố khác
- Nhóm Archie phụ trách framework web và các thành phần kiến trúc cốt lõi nâng đỡ toàn bộ sản phẩm e-banking
- Tự triển khai định tuyến API, xác thực, phân quyền, quản lý cookie... bằng Java Servlet và JSP
- Đây là cấu trúc được xây dựng trước khi các framework mã nguồn mở như Spring hay Django xuất hiện
- Vì được dùng trong môi trường ngân hàng, hệ thống phải trải qua kiểm thử bảo mật nghiêm ngặt và các đợt kiểm toán định kỳ
- Trong cuộc phỏng vấn qua điện thoại năm 2006, tác giả trả lời được các câu hỏi bảo mật như SQL injection hay cách xử lý XSS, nhưng thừa nhận chưa từng nghe thuật ngữ MITM (tấn công trung gian)
- Người phỏng vấn giải thích: “Hãy nghiên cứu thật kỹ PKI và MITM. Chúng tôi sắp triển khai tính năng chữ ký số cho sản phẩm ngân hàng doanh nghiệp.”
- Trong vài tuần sau đó, tác giả tập trung học tài liệu RFC, hạ tầng khóa công khai (PKI) và các tiêu chuẩn mật mã khóa công khai
- Ban đầu cảm thấy khó và nặng nề, nhưng theo thời gian mọi thứ dần trở nên trực quan và là một hệ thống rất tinh vi
- Khoảng một tháng sau khi chuyển tới thành phố mới, tác giả đã hoàn thiện tính năng chữ ký số bằng thư viện mã nguồn mở Bouncy Castle
- Về sau, tác giả tiếp tục phát triển nhiều phần cốt lõi khác của sản phẩm, tích lũy trải nghiệm khi mã của mình được đưa vào một hệ thống trưởng thành đang phục vụ hàng trăm ngân hàng và hàng triệu người dùng
- Người quản lý là một người cố vấn xuất sắc, và sự ủng hộ của ông trở thành nền tảng cho sự tự tin của tác giả trong suốt thời gian dài
- Khoảng 20 năm sau, sản phẩm đó vẫn còn vận hành; đôi khi ở vai trò khách hàng, tác giả mở công cụ dành cho nhà phát triển trên trình duyệt và vẫn thấy dấu vết đoạn mã mình từng viết
Mã spaghetti (Spaghetti Code)
- Vào khoảng 2007~2008, tác giả tham gia một dự án proof of concept (PoC) để phát triển widget cho set-top box OpenTV
- Trong lúc viết mã bằng C trong một môi trường cực kỳ bị cắt giảm, widget gặp lỗi crash ngắt quãng
- Vì logic rối rắm đan xen và các phép toán con trỏ bừa bãi, mã đã rơi vào trạng thái mã spaghetti đến mức ngay cả tác giả cũng khó hiểu nổi chính đoạn mã mình viết
- Tác giả gửi toàn bộ mã dưới dạng tarball cho kiến trúc sư, đồng thời là trưởng nhóm bốn người
- Vấn đề mà tác giả không giải được suốt nhiều giờ đã được vị kiến trúc sư chỉ ra chính xác là lỗi con trỏ trong một file cụ thể chỉ sau đúng 5 phút kể từ lúc nhận mã
- Sau khi sửa dòng đó, lỗi crash biến mất ngay lập tức
- Trải nghiệm này khiến tác giả nhận ra rằng dù từng tin mình đã khá giỏi, con đường để trở thành một lập trình viên phần mềm thực sự giỏi vẫn còn rất dài
- Qua nhiều năm tiếp tục trưởng thành, hiện tác giả đã có năng lực xử lý độ phức tạp phần mềm vượt xa so với thời điểm đó
Widget truyền hình có hoạt ảnh (Animated Television Widgets)
- Trong một dự án khác cùng giai đoạn, tác giả phụ trách phát triển widget cho nền tảng set-top box dựa trên Java ME (Micro Edition)
- Dự án được triển khai theo mô hình phối hợp giữa ba bên
- Công ty của tác giả: vai trò nhà cung cấp phần mềm
- Một tập đoàn viễn thông lớn: sở hữu thương hiệu dịch vụ truyền hình DTH
- Nhà sản xuất set-top box: cung cấp phần cứng và nền tảng
- Phía công ty viễn thông hỏi liệu có thể áp dụng hiệu ứng hoạt ảnh như trượt vào/trượt ra cho widget hay không
- Trong cuộc họp với đối tác, nhà sản xuất set-top box khẳng định dứt khoát rằng thiết bị đó không hỗ trợ hoạt ảnh và không thể làm được
- Tác giả cho rằng nếu đã có thể vẽ widget, thì cũng có thể tạo hoạt ảnh bằng cách thay đổi vị trí từng chút một rồi vẽ lại lặp đi lặp lại
- Dựa trên nguyên lý này, tác giả đã làm ra một bản demo chạy tốt trên trình giả lập
- Khi chia sẻ demo ở cuộc họp tiếp theo, phía nhà sản xuất set-top box phản ứng gay gắt và yêu cầu dừng công việc ngay lập tức
- Lý do là điều đó mâu thuẫn với tuyên bố chính thức trước đó rằng tính năng ấy là bất khả thi
- Đại diện công ty viễn thông can thiệp, trách rằng: “Các anh nói là không thể, nhưng họ đang làm ra nó đấy,” rồi chất vấn mạnh mẽ rằng
chẳng lẽ chính nhà sản xuất lại không hiểu hiệu năng sản phẩm của mình đến mức đó sao
- Tuy nhiên, khi thử nghiệm trên phần cứng thực, hoạt ảnh vốn mượt trong trình giả lập lại xuất hiện giật rất rõ trên màn hình TV
- Trong nhiều tuần, nhóm thử điều chỉnh tốc độ khung hình, thay đổi cách buffering và tối ưu vòng lặp render
- Cuối cùng bộc lộ giới hạn là hiệu năng phần cứng nhúng không đủ gánh phần tính toán và render
- Sau cùng, công ty viễn thông quyết định rằng thà không có còn hơn có hoạt ảnh nửa vời, nên bỏ hẳn tính năng này
- Kết quả là nhận định của nhà sản xuất set-top box hóa ra đúng về mặt thực tế
Những phúc lành tốt đẹp (Good Blessings)
- Năm 2009, sau khoảng một năm làm việc tại RSA Security, tác giả muốn tìm công việc mang tính trí tuệ hơn, thiên về toán học và thuật toán
- Tiến sĩ Burt Kaliski, nhà khoa học trưởng của RSA Laboratories, đã trực tiếp đề nghị một buổi trao đổi và đưa ra lời khuyên về định hướng sự nghiệp
- Dựa trên lời khuyên đó, tác giả gia nhập một nhóm mới và làm việc ở đó trong 6 năm tiếp theo
- Trình sinh parser, đặc tả và hiện thực ngôn ngữ hình thức
- Phát triển công cụ đánh chỉ mục và engine truy vấn cho cơ sở dữ liệu quy mô petabyte
- Gần như ngày nào cũng học được điều mới và trải qua giai đoạn vui nhất trong sự nghiệp
- Nhiều năm sau, tác giả nhận ra buổi trao đổi ngắn ngủi ấy đã thay đổi quỹ đạo sự nghiệp của mình và gửi email cảm ơn
- Trong thư hồi đáp của Dr. Kaliski có đoạn như sau
- Mục tiêu của ông là khích lệ những người đang trưởng thành, giống như cách người khác từng đầu tư vào sự nghiệp của ông
- Trao truyền những phúc lành tốt đẹp từ thế hệ này sang thế hệ khác
Bảng xếp hạng CTF (The CTF Scoreboard)
- Vào năm 2019, tác giả không còn là kỹ sư mới ra trường ở đầu tuổi 20 nữa mà đã là một staff engineer tầm trung, với nhiều năm phát triển các hệ thống mạng và cơ sở dữ liệu mức thấp bằng C/C++
- Sự nghiệp bước sang giai đoạn mới khi chuyển sang dẫn dắt việc phát triển microservice bằng Go và Python
- Nhờ đã dùng Python và Go trong các dự án cá nhân từ trước, quá trình chuyển đổi diễn ra tương đối tự nhiên
- Nhân Tháng nâng cao nhận thức an ninh mạng vào tháng 10, công ty tổ chức một cuộc thi CTF (Capture the Flag) nội bộ
- Cuộc thi gồm nhiều dạng câu đố kỹ thuật như SQL injection, mật mã yếu, đảo ngược nhị phân, khai thác stack overflow...
- Dù thấy áp lực với hình thức giải bài có tính cạnh tranh và giới hạn thời gian, tác giả vẫn tham gia và sau khoảng 8 tiếng đã giải được khoảng 90% số bài, đứng hạng nhất
- Trong lúc cuộc thi diễn ra, đồng nghiệp thường xuyên ghé qua chỗ ngồi để xem tiến độ và bày tỏ sự kinh ngạc, khiến đây trở thành câu chuyện được nhắc nhiều trong văn phòng
- Tác giả tình cờ nghe được cuộc trò chuyện giữa hai đồng nghiệp kỹ sư trẻ mà mình rất kính trọng về thành tích đó
- Khi một người khen ngợi kết quả, người kia đáp: “Tất nhiên rồi, anh ấy làm C hơn 10 năm rồi mà.”
- Khi còn trẻ, khả năng giải các bài kiểu này thường được xem là dấu hiệu của ‘sự thông minh’, nhưng giờ đây tác giả cảm nhận rõ rằng nó tự nhiên được hiểu là kết quả của kinh nghiệm
- Dù thành tựu kỹ thuật có được nhìn nhận là nhờ kinh nghiệm, tác giả vẫn muốn trong tương lai để lại ấn tượng tốt bằng chuyên môn, đạo đức và cách đối xử với đồng nghiệp
Tổng kết
- Hành trình 25 năm với máy tính là một dòng chảy bắt đầu từ tò mò, đi qua thử nghiệm, hợp tác, biết ơn và suy ngẫm
- So với những thành tựu kỹ thuật dễ thấy, các mối quan hệ với con người và việc học hỏi hình thành trong quá trình đó còn ở lại lâu hơn
- Trải nghiệm ở từng giai đoạn nối tiếp nhau và tích lũy thành sự trưởng thành liên tục cùng thái độ khiêm nhường
- Cốt lõi của sự nghiệp phát triển phần mềm, suy cho cùng, không nằm ở bản thân dòng mã mà là câu chuyện về những con người đã cùng học hỏi và làm việc với nhau
1 bình luận
Ý kiến trên Hacker News
Trước đây, người ta từng có niềm tin rằng khi giao việc cho ai đó thì họ sẽ tự biết cách làm tốt
Nhưng dạo này lại đòi kỹ sư junior phải thiết kế hệ thống cỡ Twitter, rồi bắt học thuộc cách giải bài Leetcode
Mấy thứ này ngày xưa là thủ tục vô dụng, và hy vọng rằng LLM sẽ xóa bỏ kiểu văn hóa đó
Tôi cũng khởi đầu theo cách khá giống vậy
Năm lớp 3 tiểu học, tôi nhìn thấy cuốn “Make Your Own Web Page! A Guide for Kids” ở hội chợ sách của trường và xin mẹ mua cho
Khi đó tôi cứ nghĩ Internet như thể chỉ dành cho doanh nghiệp, nhưng rồi biết rằng mình cũng có thể tự tạo trang web, và tôi hoàn toàn bị cuốn vào đó
Khi học HTML, tôi có cảm giác như mình đã trở thành hacker, đến mức giáo viên quá ngạc nhiên nên còn gọi điện cho bố mẹ tôi
Sau đó tôi học lập trình qua “Sams Teach Yourself C in 24 Hours”, sách ActionScript cho Flash MX 2004, rồi cả sách C++
Nhờ vậy mà giờ tôi đã xây dựng được một sự nghiệp khá ổn, và gần đây tôi mua lại cuốn sách đó trên eBay, đọc lại rồi mỉm cười
Tôi đã bật cười ở đoạn nhân viên nhà mạng nói với người phụ trách set-top box rằng “Cứ im đi”
Toàn bộ tình huống đó là một cảnh vừa lố bịch vừa buồn cười. Mọi người thường bám chấp vào những thứ vô bổ rồi tự đẩy mình vào thế khó
Tự nhiên lại khiến mình trông như kẻ ngốc. Dù sao thì đây vẫn là một bài viết rất vui
Tôi rất đồng cảm với đoạn nói rằng trình cài đặt viết bằng Python luôn cần can thiệp thủ công vì giả định sai về môi trường
Tôi cũng từng mất nửa ngày để thiết lập môi trường phát triển SDR. Địa ngục phụ thuộc vẫn còn nguyên
Cuối cùng thì nó cũng chạy được, nhưng thật sự là rất bừa bộn
Nó ổn khi kiểm soát được môi trường bằng container như ở phía server-side, còn ngoài ra thì tôi không bao giờ muốn dùng
Mọi thứ là một mớ trộn lẫn giữa phần mềm thương mại lỗi thời và các dự án OSS bị bỏ bê, rồi cứ vài tháng lại hỏng ngẫu nhiên khiến việc phát triển bị đình trệ
Cuối cùng có công ty còn chọn cách dựng instance EC2 dựa trên AMI riêng cho từng lập trình viên, nhưng ngay cả CLI để quản lý nó cũng hay hỏng
Đúng là một thời kỳ “thú vị”
Tôi cũng đã bước vào năm thứ 20 trong sự nghiệp, nhưng vì toàn làm web nên có vẻ không có nhiều giai thoại thú vị lắm
Càng lớn tuổi thì dù có giải được vấn đề kỹ thuật, mọi người cũng không còn ngạc nhiên nữa
Nhưng biết đâu một ngày nào đó, nếu tôi vẫn còn code khi đã là ông già, thì lúc đó lại trở nên ấn tượng
Ở câu “đã nhảy đến điểm reset của bộ xử lý”, tôi thấy không chỉ CPU mà cả thái độ học hỏi của con người cũng như bị reset luôn
Nếu quan tâm đến DevOps, tôi khuyên đọc "Tales from the Machine Room" của Davide Bianchi
Có nói rằng trước đây không mua được domain “susam.com”, nhưng giờ nó đang được rao bán
Có khi còn mua được rẻ hơn giá niêm yết. Tất nhiên .net cũng ổn, nhưng nếu có sự gắn bó về mặt cảm xúc thì cũng đáng thử
Cảm ơn vì đã chia sẻ những câu chuyện hay
Trải nghiệm làm việc trong ngành phần mềm trước thời LLM là thứ chỉ có thể hiểu nếu đã tự mình trải qua