Hi there,
Đầu tiên, tớ rất ấn tượng với cách cậu đưa ra câu hỏi rất thực tiễn này. Đây chính xác là tinh thần mà một kỹ sư nên có: luôn tự hỏi mình đang làm để giải quyết điều gì.
vì chả hiểu sao này mình dùng nó CỤ THỂ để giải quyết cái gì! !?
Dù đây là câu hỏi hay và thực tiễn, cơ mà tớ không chắc có thể đưa cho cậu một câu trả lời trọn vẹn được. Hi vọng các bạn khác sẽ bổ sung cho cuộc thảo luận này.
Cơ mà, câu trả lời này sẽ tương đối dài đó. Khó để có thể nói ngắn gọn lắm Chịu khó đọc nhé cậu!
Về câu hỏi chính của cậu:
Em thắc mắc là những kiến thức “nền tảng” mà trường đại học đang giảng dạy giúp lập trình viên đi xa như thế nào khi mà hấu hết các vấn đề trong lập trình đều đã có sẵn các framework để giải quyết rồi ạ?
Đầu tiên, cậu cần hiểu các kiến thức “nền tảng” bao gồm những gì. Tớ chắc chắn cậu có thể google, hay đọc chương trình học của bọn cậu, để biết được chi tiết, vậy nên tớ chỉ tóm tắt như này:
- Kiến thức “khoa học thường thức”: các kiến thức nền tảng về khoa học máy tính, như toán rời rạc, đại số bool, cấu trúc dữ liệu và giải thuật, xác suất thống kê, etc.
- Kiến thức tổng quan về máy tính: tổng quan hệ thống máy tính, kiến trúc máy tính, hệ điều hành, etc.
- Kiến thức cơ bản về network: tổng quan về network, các lý thuyết về lập trình mạng, socket, etc
- Kiến thức cơ bản về hệ thống dữ liệu như database, và cách sử dụng, thiết kế mô hình dữ liệu, etc.
- Kiến thức cơ bản về ngôn ngữ lập trình, chương trình dịch.
- Quy trình phát triển phần mềm cổ điển.
- Hình như là còn nhiều nữa
Nếu cậu học chuyên sâu về công nghệ phần mềm, cậu sẽ cần học thêm nền tảng của software engineering:
- OOP
- Kiến trúc phần mềm cơ bản.
- Quy trình phât triển phần mềm: tất cả các bước của quy trình phát triển phần mềm, cách quản lý dự án, etc.
- Các phương pháp phát triển phần mềm.
- Các phương pháp mô hình hóa dữ liệu
- AI nhập môn, kỹ nghệ tri thức, etc
- Lý thuyết về tương tác người, máy.
- Hình như là còn nhiều nữa
Những kiến thức kể trên đa số đều rất tổng quát và cơ bản, dù nó khá nhiều. Và tớ đồng ý là cậu có rất nhiều lý thuyết ở đây, cơ mà, nó không “suông”
Tất cả những kiến thức kể trên đều là “building block” cho cậu để học các kiến thức khác. Cậu có thể nhìn thấy điều tương tự từ các ngành nghề khác, như bác sĩ, kỹ sư cơ khí, ca sĩ, vận động viên thể thao, etc. Không có nó, cậu sẽ mất rất nhiều công sức để có thể hiểu tường tận bất cứ khái niệm mới nào trong ngành này.
Chẳng hạn, ngay từ thắc mắc của cậu, “hầu hết các vấn đề trong lập trình đều đã có sẵn các framework để giải quyết”, nên kiến thức ở đại học có cần thiết không. Đúng là các framework đã giải quyết rất nhiều vấn đề cơ bản trong lập trình, nhưng:
- Framework bao giờ cũng đưa ra giải pháp generic, cậu phải cài đặt cụ thể cậu sẽ giải quyết như thế nào.
Nếu cậu không có kiến thức nền tảng, cậu khó có thể hiểu được tài liệu của framework đó (họ bao giờ cũng viết cho những người đã được đào tạo nhất định rồi, không ai sẽ giải thích từng khái niệm cơ bản cho cậu ở đó). Cậu chỉ có thể đọc một tutorial từ các bạn Ấn Độ nào đó, copy paste code từ stackoverflow, và không thể giải thích được tại sao cậu cần viết như vậy.
Cậu có thể thắc mắc “cần gì phải hiểu? Nó chạy là được”, đó là vấn đề. Kỹ sư lập trình không chỉ viết code, họ còn maintain, troubleshoot/debug để tìm lỗi. Nếu cậu không hiểu code (dù chỉ một vài dòng), cậu sẽ luôn luôn bỏ sót thứ gì đó, và đi sai hướng rất nhiều lần khi tìm kiếm nguyên nhân gây ra lỗi. Cậu cũng sẽ trở thành kiểu kỹ sư có xu hướng đổ lỗi cho công nghệ, cú pháp lập trình, etc… (tớ đã gặp rất nhiều kỹ sư kiểu này, điểm chung là họ luôn sử dụng công nghệ sai cách, do thiếu đi sự lý giải cơ bản về công nghệ đó - symptom của việc kiến thức nền tảng kém)
- Cậu đã bao giờ gặp kỹ sư muốn dùng nodeJS cho tất cả các kiểu hệ thống, bởi theo quảng cáo nó “non blocking IO” nên tối ưu hóa sử dụng CPU chưa?
Mọi công nghệ đều chỉ giải quyết một tập các vấn đề mà nó được thiết kế. Luôn có trade-off khi sử dụng một công nghệ để giải quyết vấn đề, mà cậu buộc phải hiểu rõ điều đó để có thể chọn công nghệ phù hợp với vấn đề của cậu. Cậu có cái búa, không có nghĩa tất cả mọi thứ là cái đinh
Không có kiến thức nền tảng và rất nhiều thử nghiệm, cậu khó có thể hiểu rõ được trade off của công nghệ mà cậu cân nhắc. Từ đó, gần như cậu sẽ là kiểu kỹ sư sử dụng 1 stack để giải quyết tất cả các vấn đề.
- Cậu cũng sẽ mất rất nhiều thời gian để học một công nghệ nếu không có nền tảng.
Việc học là việc “connect the dots”. Khi cậu học kiến thức mới (giới thiệu “new dot”), nếu cậu có thể kết nối với các kiến thức cũ, để có hiểu biết vững chắc hơn. Đấy là lý do một người càng có nhiều kiến thức (nhiều “dot” sẵn có) càng học nhanh hơn.
Nếu cậu không có những “dot” nền tảng, bất cứ “dot” mới nào cũng sẽ chỉ là một “dot” rời rạc trong hệ thống kiến thức của cậu. Đó là lý do cậu khó có thể có bức tranh toàn cảnh của bất cứ kiến thức nào cậu có thể học.
Cậu có thể thấy rất nhiều lớp học cấp tốc vài tháng để trở thành lập trình viên hiện nay. Tớ hi vọng cậu không bị “fool” vì những điều đó. Tất cả các bạn xuất phát từ lớp đó, có thể viết code, nhưng sẽ sớm “đâm đầu vào tường” trong vòng 2 tới 3 năm đầu sự nghiệp. Cuối cùng, bằng cách này hay cách khác, họ cũng phải quay lại kiến thức nền tảng
Đó là lý do cậu nên học tốt ở đại học. Tất nhiên, chỉ biết kiến thức nền tảng chắc chắn sẽ không giúp cậu có việc. Cậu cũng cần hands on experience trong việc viết phần mềm, sử dụng công nghệ,… để trở thành một kỹ sư làm được việc.
Về câu hỏi tiếp theo của cậu:
Nếu đi theo hướng quản lý thì liệu những kiến thức như trên giúp gì khi mình leo lên vị trí senior ạ? Em thấy chỉ cần đủ kinh nghiệm làm việc, kĩ năng mềm là đủ rồi chứ ạ?
Có chứ cậu. Kiến thức nền tảng này chắc chắn cần để cậu lên mức senior.
Đầu tiên, cậu cần hiểu “đủ kinh nghiệm làm việc” là gì.
Bất cứ cậu nhóc mới tốt nghiệp nào cũng có thể trình bày rất rõ ràng tất cả các lý thuyết lập trình, quy trình dự án tiêu chuẩn, cách viết code dễ maintain, etc. Cơ mà, thường thì các bạn ấy không hiểu chính xác lý do cho từng lý thuyết lập trình, quy trình dự án, cách viết code, etc… đó.
Sự khác biệt nằm ở trải nghiệm ở mức độ chuyên nghiệp, với yêu cầu cao, với vô số sai lầm, rút kinh nghiệm, xây dựng phương pháp tiếp cận vấn đề riêng, etc. Cơ mà, để học được từ những trải nghiệm đó, cậu lại phải “connect the dot”
Có rất nhiều người làm cả chục năm, nhưng vẫn giải quyết vấn đề, hay hiểu biết như một junior engineer. Hoặc là, họ chỉ làm đi làm lại một công việc không có yêu cầu cao, từ đó không có nhiều cơ hội để học những điều mới, hoặc là, họ không đủ khả năng và nền tảng để học hỏi kiến thức mới, dẫn đến việc họ bị chững lại ở một mức trong thời gian dài. Tất nhiên, họ sẽ sớm bị outdate so với market, và bị thay thế bởi lớp trẻ.
Về soft skills, đó là những kỹ năng quan trọng, và đôi khi khó thiết lập hơn cả hard skills. Tớ đồng ý là nhiều khi, có những người có thể lên được vị trí cao tuy thiếu technical hoặc management hard skills, cơ mà bù lại, họ có các bộ kỹ năng tốt khác, như các soft skill liên quan tới xây dựng network và kết dính tổ chức, cùng với complex problem solving skill (tớ chỉ đề cập tới những tấm gương tốt thôi nha và hoàn toàn không vấn đề gì nếu cậu muốn theo cách đó, có rất nhiều cách để build career mà ). Cơ mà, nếu cậu muốn đi lên theo hướng engineering manager (hoặc manager ở một công ty công nghệ), cậu chắc chắn cần là một engineer tốt trước, và đó là nơi cậu cần kiến thức nền tảng.
Vậy nên, để có cả “kinh nghiệm” lẫn một bộ skill tốt nếu theo hướng engineering manager, cậu đều cần kiến thức nền tảng ở đại học.
Về point cuối của cậu:
- Em có hai dự định: Một là học vượt các môn ra trường sớm hoặc tạm hoãn kết quả học tập một năm để xin thực tập lấy trước kinh nghiệm rồi quay lại lấy bằng. Ngồi trên giảng đường chỉ có mỗi lý thuyết suông em chán kinh khủng .
Cậu có thể chọn cách phù hợp với mục tiêu của cậu. Cá nhân tớ thì thấy:
- Cậu có nhiều cách để lấy kinh nghiệm khi vẫn đang học đại học. Chẳng hạn, cậu nên tận dụng thời gian ở trường để đi thực tập, tham gia các lab, nghiên cứu công nghệ, xây dựng network, etc.
Ở thời gian này, cậu có cơ hội để mắc sai lầm mà không phải trả giá lớn. Cậu không có sự xa hoa đó khi đi làm đâu
Mắc càng nhiều sai lầm, kết hợp với việc áp dụng những thứ đã học ở trường trong giai đoạn này càng nhiều càng tốt. Đó có lẽ là sự kết hợp bền vững hơn cho cậu.
Tớ cũng muốn cảnh báo trước cho cậu, cậu có thể gặp khủng hoảng khi ra trường, nếu như cậu chưa chuẩn bị sẵn về mặt tinh thần.
- Hoãn 1 năm chỉ để đi thực tập cũng không phải lựa chọn tốt.
Tớ đoán cậu đang học năm nhất đại học. Việc đi thực tập quá sớm có thể hại cho cậu ở giai đoạn đầu của sự nghiệp, khi cậu thiếu thời gian hiểu các kiến thức nền tảng.
Thường thì, cậu nên đi thực tập khi đã có một chút kiến thức cơ bản (khoảng năm 3 cậu chắc chắn phải đi thực tập). Nếu không, cậu khó có thể tận dụng tốt thời gian thực tập cho việc học hỏi kinh nghiệm.
Cơ mà, nếu cậu thấy cậu cần 1 năm nghỉ ngơi, go ahead, take a gap year và làm điều cậu thích. Cậu là người duy nhất hiểu rõ cậu cần gì, cũng như muốn gì, và tớ cũng nghĩ đó là lựa chọn lành mạnh.
Hi vọng cậu có cái nhìn rõ ràng hơn về việc các kiến thức đại học giúp gì trong tương lai, qua câu trả lời rất dài này!