
Công nghệ thông tin là một lĩnh vực rất rộng, không ai có thể giỏi tất cả, vì vậy việc chọn cho mình một ngôn ngữ, nền tảng hay chuyên ngành riêng nào đó rất quan trọng.
Câu hỏi thường gặp nhất sẽ là: Tôi nên học gì để sau này có việc làm? Thật sự công việc trong ngành này rất nhiều, và sẽ càng ngày càng nhiều, nhất là trong bối cảnh các xu hướng làm việc từ xa, dữ liệu lớn, AI, IoT… đang trở nên phổ biến hơn bao giờ hết. Nhưng tôi chắc chắn bạn chưa bao giờ tìm được một đáp án thỏa mãn, bởi đơn giản chỉ bạn mới có thể trả lời chính xác mà thôi.
Câu trả lời của tôi luôn là: Bạn hãy học những gì bạn thích nhất!
Tôi xin chia sẻ với bạn những lĩnh vực yêu thích nhất của tôi, “yêu thích nhất” có nghĩa là nếu nhìn thấy một cuốn sách về nó trên giá, tôi sẽ không thể kìm được việc mở ra đọc, và khi đã đọc tôi sẽ quên hết mọi thứ và không thể dứt ra được (tất nhiên trừ khi viết dở ).
1.HỆ ĐIỀU HÀNH (và kiến trúc máy tính)Đây là môn học nói về việc thiết kế ra các hệ điều hành, một trong những loại phần mềm phức tạp nhất thế giới, bởi yêu cầu rất cao về tính ổn định, hiệu năng được đo đếm bằng nano giây, các thao tác trên dữ liệu phải tính toán từng bit một, và debug thì ôi thôi khó kinh khủng.Trong môn học này, các bạn sẽ được được học về những thứ như sau:
– Bộ nhớ trong máy tính được tổ chức thế nào, và HĐH dùng các kỹ thuật gì để quản lý chúng, vì sao chúng ta gặp phải các lỗi Out of memory, Stack overflow, phân vùng swapping/page file với bộ nhớ hoạt động ra làm sao và ảnh hưởng ra sao tới hiệu năng hệ thống…
– Cách các CPU được chia sẻ giữa các chương trình, mã máy thực chất là gì, chúng được tải vào vào thực thi thế nào (hiểu rõ 2 phần này là bạn có thể hiểu được cách các mã độc/virus xâm nhập vào bộ nhớ).
– Các thiết bị được quản lý theo cách nào, làm sao HĐH có thể làm việc được với đủ loại thiết bị có trên đời, kể cả các thiết bị chưa từng được biết đến khi người ta tạo ra hệ điều hành đó.
– Làm thế nào người ta tách biệt các tiến trình với nhau, giúp chúng không gây ảnh hưởng lẫn nhau khi một trong số đó bị lỗi.
– …
Khi học cách người ta thiết kế ra hệ điều hành, bạn sẽ học được rất nhiều thứ, nhất là khi áp dụng vào phân tích thiết kế. Bạn cũng sẽ hiểu tại sao Unix, một HĐH “cũ rích” lại được ưa chuộng như vậy, làm thế nào để một thứ được thiết kế ra cách đây nửa thế kỷ cùng các hậu duệ của nó lại chiếm lĩnh (chắc là một nửa
) thế giới.
Tôi đã từng kể với bạn trước đây về việc tôi làm việc trong một dự án logistics, một trong những module quan trọng nhất của hệ thống là một phần mềm kết nối và trao đổi dữ liệu. Các bạn có thể tưởng tượng khi gửi một gói hàng bằng dịch vụ của Giao hàng tiết kiệm đến một khách hàng ở vùng xa, bởi GHTK không có chi nhánh ở đó nên họ sẽ phải chuyển cho một đối tác giao hàng khác là Viettel, rồi có thể Viettel lại giao tiếp cho VnPost… Ba nhà cung cấp dịch vụ này sử dụng 3 hệ thống quản lý khác nhau (ơn trời chúng tôi cũng cung cấp cả hệ thống quản lý
), tuy nhiên họ vẫn có thể truyền thông tin các đơn hàng với nhau một cách thông suốt, thậm chí có thể tính theo đơn vị giây nhờ sử dụng một cổng trung gian (là hệ thống của chúng tôi). Dù rằng cấu trúc thông tin của 3 dịch vụ này có thể khác nhau, cách thức kết nối cũng khác nhau. Đó là chưa kể đến các dịch vụ khác cũng kết nối vào hệ thống và cung cấp các dịch vụ liên quan: hóa đơn, báo cáo, tin nhắn…(tất nhiên họ cũng có thể tự kết nối với nhau, nhưng chắc chắn sẽ không thể tiện lợi bằng việc sử dụng một hệ thống sẵn có, vừa tiết kiệm chi phí phát triển, vận hành và quan trọng nhất là có kết nối ngay đến nhiều đối tác khác cũng đang sử dụng).
Một hệ thống chạy 24/7 như vậy rất khó để thay đổi, khi có thêm một khách hàng mới hay phương thức kết nối mới, bạn không thể đơn giản viết thêm phần code cho nó, biên dịch rồi copy lên server cho chạy. Với ai từng quản lý server hay DevOps, chỉ riêng việc copy code mới lên là đủ hổi hộp rồi, chứ chưa nói tới việc code này có làm ảnh hưởng đến code cũ hay không, và việc code cũ “đột nhiên” lỗi còn nghiêm trọng hơn nhiều so với việc code mới không chạy
.
Và ở đây chúng tôi áp dụng rất nhiều nguyên tắc được người ta sử dụng trong thiết kế Unix: tất cả các kết nối đều đơn giản hóa thành các luồng I/O, các định dạng dữ liệu đều được xử lý thông qua các module riêng biệt (tương tự các driver), bản thân các module này cũng chỉ làm với các luồng I/O mà không quan tâm dữ liệu đó đến từ đâu và đi về đâu. Các phương thức kết nối cũng được xây dựng như các module và chúng chỉ lấy dữ liệu bỏ vào các luồng I/O đó. Các tài nguyên như module, khách hàng, kêt nối… lại được đăng ký lên một cây thông tin và có thể kết nối với nhau để tạo nên một luồng dữ liệu thông suốt từ vào đến ra. Một thiết kế đơn-giản-hóa-mọi-thứ như vậy đã giúp hệ thống vận hành hàng chục năm qua, tuổi đời của nó còn già hơn nhiều công nghệ mà các bạn đang học, thậm chí có thể còn già hơn chính bạn
.
Hệ điều hành là môn học mà tôi luôn khuyến khích các bạn tìm hiểu, bởi trong đó không chỉ các kiến thức về hệ thống, nó còn bao gồm rất nhiều thiết kế, ý tưởng giúp tầm nhìn của bạn rộng lớn hơn rất nhiều.