Chào anh, em không có nền tảng chuyên toán hay tin.
Hồi bé em thích đọc những cuốn như Lược sử thời gian của Stephen Hawking, Vũ trụ của Carl Sagan, hay Giai điệu bí ẩn và Khát vọng tới cái vô hạn của nhà thiên văn học nổi tiếng người Việt là Trịnh Xuân Thuận. Nên nếu gia đình khá giả, thì em sẽ cố gắng theo Vật lý lý thuyết / Toán ứng dụng.
Đồng thời, tới cấp 3, khi đọc tiểu sử của Grigori Perelman - người được mệnh danh là nhà toán học vĩ đại nhất thế kỷ 21 của Nga, thấy tác giả có phán 1 câu là: “Những nhà toán học hụt thì thường trở thành lập trình viên”. Thế là em bắt đầu nghĩ đến ngành lập trình, phát triển phần mềm từ đó.
Em có tính hiếu kì rất cao nhưng cũng lan man, cũng là một nhược điểm lớn khi thích cái gì là dễ rằng tâm trí chỉ còn mỗi cái đó, nhưng nó chỉ kéo dài trong vài tiếng tới vài ngày. Nhiều lúc tâm trí em cũng nhảy nhót từ chủ đề này sang chủ đề khác rất nhanh một cách thiếu kiểm soát, trong Đạo Phật gọi là tâm con vượn.
Về thuật toán thì năm 1 năm 2 Đại học em cũng tìm hiểu, và cày code trên Hackerrank, LeetCode và thi thoảng ghé thăm Codeforces, tích lũy đủ để khi gặp vấn đề về thuật toán, em có thể tự tra cứu và biết cấu trúc dữ liệu nào hay giải thuật nào giúp được mình.
Sau khi học về Structured Programming, OOP, Functional Programming, … Nhận thấy hiện tại OOP đang là phong cách phổ biến nhất. Rõ ràng, OOP mô hình hóa các đối tượng một cách dễ hiểu, trực quan và hầu hết mọi người tán thành, nghiên cứu và dần dần phát triển những kỹ thuật và khái niệm dựa trên OOP. Tuy OOP có tính trừu tượng cao nên hiệu suất sẽ chỉ bằng 40 - 60% lập trình hướng thủ tục, nhưng phần cứng ngày nay đủ mạnh để lập trình viên không cần phải bận tâm đến hiệu suất khi chọn công nghệ trong phần lớn trường hợp, hoặc ít nhất, nó không phải yếu tố quyết định khi so với kinh phí, độ lớn của cộng đồng, xu hướng của team mình, … Thế nhưng, chúng ta đã quên mất công cụ mạnh mẽ để mô hình hóa, có hàng nghìn năm lịch sử khi so với OOP, đó là toán học.
Functional Programming có sự liên hệ mật thiết với toán học hơn, rất có tiềm năng, và em muốn tìm hiểu những nền tảng toán học đằng sau Khoa học máy tính như Lambda calculus, automata theory, number theory, …
Mục đích là vì niềm yêu thích của bản thân và muốn xây dựng những kỹ thuật lập trình chặt chẽ hơn dựa trên toán học, muốn tìm những kỹ thuật mô hình hóa các thực thể ngoài đời sống vào phần mềm bằng những phương pháp có thể chứng minh được, do đó, tin cậy hơn quy trình code - test - code tiếp - test truyền thống. Nếu không có toán học thì lập trình viên sẽ vẫn loay hoay trong các vấn đề code, fix bug, hacking vấn đề, thiết kế sai lầm, refactor, … Và dùng vòng lặp để tính tổng \left(\sum_{i=1}^n i\right) thay vì dùng công thức \frac{(n+1)n}{2}.
Tất nhiên, khát vọng của em là hạn chế những sai lầm bằng những kỹ thuật mới, chứ không loại bỏ hoàn toàn được ạ.
Học toán ở phổ thông em cũng không thực sự hiểu giải tích là gì, số học khác gì đại số, lớn hơn chút thì tưởng giải tích chỉ gồm 2 phần là giải tích vi phân và giải tích vi phân, nhưng thực ra giải thích là một hệ thống tính toán và còn rất nhiều nhánh nhỏ nữa.
Em không chắc không thứ mà em cần học sẽ được phân loại là lĩnh vực toán thuần túy hay toán ứng dụng. Hay cần đến một mô hình / nhánh riêng của toán học. Tuy nhiên, bước đầu em có thể xác định là cần liên quan tới lambda calculus, automata theory, algebraic topology
Sau đây là quan điểm cá nhân khi em tìm hiểu được về công nghiệp phần mềm, trích từ bài viết của mình:
Công nghiệp phần mềm cũng thật khác biệt với những ngành công nghiệp khác, từ một lĩnh vực mà chỉ những nhà toán học mới có thể hiểu và thực thi, thì giờ đây nó đã được phát triển (theo khía cạnh tích cực) hoặc biến chất (theo khía cạnh tiêu cực).
Chúng ta đang coi nhẹ sự khác biệt của kỹ thuật phần mềm, điển hình là việc sử dụng các thuật ngữ một cách lạm dụng, có thể kể đến như:
𝟏. “𝐊ỹ 𝐭𝐡𝐮ậ𝐭 𝐩𝐡ầ𝐧 𝐦ề𝐦” - Vận dụng kiến thức khoa học để tạo ra những giải pháp công nghệ phục vụ cho công việc, đời sống:
Vấn đề ở đây là lập trình có nền tảng phát triển, chứng minh từ toán học, nhưng nó phát triển nhanh đến mức bật khỏi cái nền tảng toán học của nó để phù hợp với đại chúng. Cho nên, câu hỏi “Lập trình viên có cần giỏi toán ?” nếu đặt ở thời điểm hiện tại, thì câu trả lời chắc chắn là “không”.
Nó dẫn đến một điều tàn nhẫn rằng bạn và mình không thể lập trình, vì chúng ta muốn lập trình ra những giải pháp đáp ứng yêu cầu đề ra, nhưng không bao giờ chứng minh được nó. Cụ thể hơn, chúng ta có thể thấy sự hiện diện của lỗi trong chương trình, nhưng không bao giờ chứng minh được sự biến mất của chúng. Mọi chương trình đều có lỗi tiềm ẩn.
𝟐. “𝐁ả𝐨 𝐭𝐫ì 𝐩𝐡ầ𝐧 𝐦ề𝐦”: Phần mềm không bị mòn như các thiết bị cơ giới, nó có thể cần nâng cấp, cải tiến để phù hợp với nền công nghệ liên tục phát triển và phù hợp hơn với yêu cầu người dùng, khiến nó có cảm giác bị “mòn”. Nhưng rõ ràng, phần mềm là khác biệt để có thể sử dụng từ “bảo trì” một cách hiển nhiên và đặt ngoài ngoặc kép.
𝟑. “𝐁𝐮𝐠”: Một lỗi trong lập trình rất dễ phá hỏng cả chương trình, khi so sánh với một lỗi lầm trong sản xuất thuộc lĩnh vực khác. Việc coi lỗi là một con bọ (bug) len lỏi vào chương trình trong khi các lập trình viên không để ý, thay vì thừa nhận rằng lỗi là do lập trình viên tạo ra là một che đậy thiếu trung thực về mặt trí tuệ.
Hay một cách cảm thông hơn, vì chính những nhu cầu thị trường và thị hiếu kéo theo mệnh đề rằng “chúng ta không thể lập trình được” do không chứng minh được tính đúng đắn của chương trình, việc thừa nhận rằng lập trình là rất khó, chúng ta tạo ra những phương pháp, công nghệ và quy trình để giảm thiểu lỗi và phạm vi ảnh hưởng của chúng, là cần thiết để đáp ứng được nhu cầu thực tế.
Công nghệ lập trình đang phát triển rất nhanh, đó là điều đáng mừng, nhưng hơi đáng tiếc ở chỗ nó được phát triển điều hướng theo nhu cầu gia công tối ưu, giá rẻ của doanh nghiệp, điều hướng theo thị hiếu đám đông, cố gắng làm giảm sự liên quan với những chủ đề mang tính hàn lâm nhưng ý nghĩa lại.
Đơn cử như package manager npm của Node Js, nó được chính tác giả của JS Runtime này thừa nhận cơ chế của npm là một điểm trừ lớn của Node Js, nhưng được cộng đồng thúc đẩy quá nhanh đến mức không kiềm hãm được. Hay như PHP, một ngôn ngữ được thiết kế tạm bợ, nhưng có sức phổ biến kinh khủng.