Kiến thức nền tảng trong lĩnh vực phần mềm là gì?

Cho em hỏi là em hay nghe mọi người nói về việc đại học dạy những thứ căn bản quan trọng để làm nền tảng phát triển xa hơn trong lĩnh vực PHẦN MỀM.
Vậy cho em hỏi những kiến thức đó là gì vậy ạ.

code nhiều dự án vào, code càng nhiều càng tốt, đọc nhiều sách về code và clean code. Cuộc chơi PHẦN MỀM đúng với quy tắc 10000h ^

4 Likes

những kiến thức đó nếu có thể vài câu chữ nói ra thì đã không cần học đh nữa rồi

6 Likes

Kiến trúc máy tính
Hệ điều hành
Cấu trúc dữ liệu và Giải thuật
Nguyên lý ngôn ngữ lập trình
Mạng máy tính

1 Like

Bổ sung thêm 4 cái này nữa:

  • OOP
  • Phân tích thiết kế hệ thống
  • Database
  • Quy trình phát triển phần mềm
2 Likes

phần mềm KHÔNG cần thiết có : giao diện, database, kết nối mạng, CTDLGT,. OOP, kiến trúc máy tính bla bla, ví dụ phần mềm tính diện tích hình chữ nhật cũng là một phần mềm . . . . chỉ cần bạn Code Mã Bảo Trì Được là được , cái này cần code nhiều chứ không phải học xong các môn trên là trùm

Bạn có vẻ thần thánh hóa cái clean code nhỉ.

Nói đi cũng nói lại, chỉ có clean code mà không có nền tảng thì vẫn mãi là “thợ code” thôi.

2 Likes

Quyển sách nguyên lý lập trình này có thể hữu ích với bạn

3 Likes

Thực ra, đây là câu hỏi hay, dù nó khó có thể được trả lời một cách trọn vẹn :smile: Cơ mà, tớ sẽ thử trả lời giúp cậu. Tớ rất hi vọng sẽ có các bạn khác bổ sung thêm vào câu trả lời này.

Để cho dễ hiểu, cậu cần biết một vài fact này trước khi đi vào câu trả lời.

  1. “Lĩnh vực phần mềm” tương đối rộng, cơ mà có thể chia thành 2 nhánh chính về mặt công việc và vai trò trong 1 tổ chức. Cậu sẽ trở thành:
    • Engineer. Tất cả các thuật ngữ như lập trình viên, coder, developer… thuộc chỉ người thuộc nhánh này. Các công việc như data engineer, AI engineer, web developer… cũng là nhánh này.
      Công việc của nhánh này là “engineering”, tức là thiết kế, xây dựng, triển khai, bảo trì hệ thống phần mềm. Đây là công việc mang tính thực tiễn.
    • Scientist. Data scientist, computer scientist, machine learning researcher, etc. thuộc vào nhánh này.
      Công việc của họ là nghiên cứu, xây dựng, phát triển các lý thuyết về khoa học máy tính. Lý thuyết này có thể được áp dụng vào thực tiễn, có thể không khả thi, và engineer là người ứng dụng các lý thuyết đó trong thực tiễn.
  2. Viết code chỉ là 1 công đoạn nhỏ khi cậu làm hay nghiên cứu phần mềm.
    Tớ sẽ giải thích rõ hơn ở dưới.
  3. “Kiến thức nền tảng” là các kiến thức cơ sở, thường ở mức khái niệm, có thể được áp dụng ở bất cứ thời đại nào, dù công nghệ có tiến bộ tới đâu. Chỉ biết kiến thức nền tảng không thôi không giúp cậu trở thành kỹ sư hay nhà khoa học, mà cậu vẫn cần nghiên cứu, rèn luyện thêm rất nhiều để có kỹ năng và kiến thức đầy đủ cho một công việc.

Như cậu đã biết, đại học dạy các kiến thức nền tảng, để cậu có thể lựa chọn theo bất cứ nhánh nào mà cậu muốn về sau. Tất nhiên có rất nhiều trường đào tạo chủ yếu nhánh engineer, nhưng concept vẫn giống vậy, khi họ cần dạy cậu nền tảng để chọn bất cứ nhánh hẹp hơn nào.
Cậu có thể thấy rõ, điểm chung giữa 2 nhánh trên là gì. Đấy là khoa học máy tính. Dù cậu làm ngành hẹp nào, nền tảng đầu tiên cậu phải học là những nguyên lý, lý thuyết cơ bản về máy tính. Nó thường bao gồm:

  • Toán học. Toán là ngôn ngữ của khoa học, nên hẳn nhiên, để hiểu khoa học, cậu cần học toán.
    Tất cả các tài liệu khoa học đều có phần sử dụng công thức toán để giải thích/chứng minh điều gì đó.
    Ngoài ra, toán rời rạc, đại số bool… rất quan trọng để cậu có thể hiểu các lý thuyết khoa học cao cấp hơn, thậm chí, ảnh hưởng trực tiếp tới các quyết định kỹ thuật khi cậu cài đặt hệ thống.
  • Các môn về hệ thống máy tính và kiến trúc máy tính. Chẳng hạn, cậu cần biết rõ cách hệ điều hành hoạt động ra sao, kiến trúc máy tính thông thường như thế nào, cách một chương trình hoạt động từ giai đoạn compile tới giai đoạn runtime…
    Những kiến thức khoa học đó giúp cậu hiểu được rõ chuyện gì xảy ra khi cậu build và run 1 chương trình, giải quyết được các vấn đề phức tạp hơn liên quan tới máy tính. Tớ đã từng chứng kiến lập trình viên 8 năm kinh nghiệm khăng khăng đổ lỗi của 1 bash script chạy sai là do lệnh echo, đơn giản vì người này không đủ kiến thức cơ bản để giải thích cách hoạt động của lệnh đó. Kết cục là người đó tốn rất nhiều thời gian vào một thứ không phải vấn đề, và lờ đi các nguyên nhân có thể xảy ra khác.
    Nếu cậu không muốn kém cỏi như vậy, cậu nên có hiểu biết rõ ràng về máy tính.
  • Cấu trúc dữ liệu và giải thuật. Cậu cần phải biết rõ các cấu trúc dữ liệu và giải thuật cơ bản. Tất cả các phần mềm đều có cài đặt những cấu trúc dữ liệu và giải thuật cơ bản. Nếu cậu không có hiểu biết về nó, cậu sẽ chỉ hiểu bề mặt của tất cả mọi thứ, và không biết cách giải quyết các vấn đề yêu cầu phải xây dựng các cấu trúc dữ liệu phức tạp, hay sử dụng giải thuật phù hợp nhất với vấn đề của cậu.
    Cậu biết nó kết thúc như thế nào rồi đó :smile:
    Nếu cậu có tìm hiểu về quy trình phỏng vấn của các công ty hàng đầu thế giới như MAANG (và các công ty copy quy trình đó), cấu trúc dữ liệu giải thuật là thứ được hỏi rất kỹ lưỡng. Dù quy trình đó vẫn có vấn đề, cơ mà tớ vẫn muốn lấy nó để cho cậu thấy tầm quan trọng của việc học cấu trúc dữ liệu và giải thuật.
  • Network và các môn học về lý thuyết truyền tin, tín hiệu số, mã hóa.
    Trừ khi cậu chỉ muốn trọn đời làm các tool không cần kết nối mạng, kiến thức nền tảng ở phần này vô cùng quan trọng.
  • Các môn học về ngôn ngữ lập trình, chương trình dịch.
    Tớ chỉ có thể nói, nếu cậu biết rõ ngôn ngữ lập trình được xây dựng ra sao, chương trình dịch được xây dựng và hoạt động ra sao, cậu sẽ có nền tảng học các ngôn ngữ khác ở mức cơ bản vô cùng nhanh :smile:

Ngoài các lý thuyết cơ bản về computer science kể trên, với các chuyên ngành hẹp hơn, cậu cũng cần các kiến thức cơ bản về nó. Chẳng hạn, nếu cậu học theo nhánh kỹ sư, chuyên ngành hẹp hơn là công nghệ phần mềm (tớ đoán cậu muốn biết về điều này), cậu sẽ cần các kiến thức nền tảng về cách tiếp cận và giải quyết vấn đề trong quá trình xây dựng phần mềm, cũng như các “best practice” ở mức general như này:

  • Quy trình phát triển phần mềm thông thường.
    Cậu cần biết điều này ở mức cơ bản (thậm chí nâng cao). Dù cậu theo chuyên ngành hẹp nào, cậu cũng sẽ phải làm việc với nhiều người, sẽ phải viết phần mềm, hay làm gì đó liên quan tới quy trình phát triển phần mềm.
    Lý do cậu nên biết kiến thức này, vì trong thực tế, engineering luôn là công việc cần sự phối hợp của nhiều người. Việc biết một quy trình phát triển phần mềm chuyên nghiệp sẽ giúp cậu rất nhiều để bắt kịp quy trình thực tế.
    Mặc dù quy trình cậu học thường là quy trình cơ bản, và đôi khi nó tương đối lạc hậu, nhưng về mặt khái niệm, cậu hoàn toàn có thể catch up các quy trình phát triển phần mềm hiện đại hơn nhờ hiểu biết cơ bản này.
  • Các kiến thức liên quan tới phương pháp phát triển phần mềm, thiết kế phần mềm. Những kiến thức về OOP, design pattern, thiết kế database, thiết kế giao diện tương tác giữa người - máy tính,… là những kiến thức vô cùng cơ bản, nhưng quan trọng.
    Công việc thiết kế ở đây là cách tiếp cận để xây dựng giải pháp cho một vấn đề. Cậu cũng được học practice để xây dựng một phần mềm tốt, dễ bảo trì và mở rộng. Không có kiến thức/kỹ năng này, cậu khó có thể tự xử lý bất cứ vấn đề phức tạp nào trong sự nghiệp.
  • Etc.

Những phần trên chỉ là nỗ lực tóm tắt và phân loại các kiến thức chuyên ngành một cách vô cùng thô sơ của tớ. Tớ hi vọng, từ phần giải thích ở trên, cậu có thể hình dung phần nào thứ được gọi là “kiến thức nền tảng”.
Cậu cũng có thể nhận ra, các kiến thức này hỗ trợ rất nhiều khi cậu chọn chuyên ngành hẹp của cậu. Tất nhiên, cậu vẫn cần luyện tập rất nhiều bên cạnh việc nắm các kiến thức cơ bản này, để có thể làm việc, nhất là khi cậu muốn trở thành kỹ sư, một nghề vô cùng thực tiễn và cần luyện tập rất nhiều để thành thạo.

Một điều nữa tớ muốn nói với cậu: Kỹ sư phần mềm/nhà khoa học máy tính không phải công việc chỉ ngồi viết code. Viết code, dù rất quan trọng, nhưng thực tế chỉ là 1 phần rất nhỏ trong công việc của 1 kỹ sư/nhà khoa học, khi cậu viết ra chỉ dẫn cho máy tính để xử lý một công việc nào đó, hay nói cách khác, là giải pháp cho vấn đề.
Cậu sẽ tốn nhiều thời gian và công sức hơn ở việc xây dựng giải pháp. Những kiến thức nền tảng ở đại học giúp cậu rất nhiều trong quá trình làm việc đó. Điều đó cũng đồng nghĩa với việc, code thực ra là công việc dễ nhất trong ngành công nghiệp phần mềm :smile: Ai cũng có thể học cách viết code, nhưng giải quyết các vấn đề, đặc biệt là vấn đề phức tạp, đỏi hỏi hiểu biết nền tảng chắc chắn hơn. Đó là thứ mà trường đại học hướng tới.
Vậy nên, đừng đánh giá thấp kiến thức đó nhé! :smile:

9 Likes

Cảm ơn anh với những chia sẻ này , bản thân em học CNTT nhưng không phải là chuyên ngành công nghệ phần mềm mà là chuyên ngành hệ thống thông tin do không đủ điểm đậu nhưng em vì thích làm về phần mềm nên cũng muốn tìm hiểu những thức căn bản để giúp thực hiện mong muốn , câu trả lời của anh em nó sẽ giúp ít em rất nhiều.

2 Likes

Học phần mềm đương nhiên bạn phải giỏi ít nhất một ngôn ngữ nào đó. Để biết ngôn ngữ nào mang tính thời sự thì lên mấy trang tìm việc, xem cái này tuyển nhiều nhất thì học thôi. Cái này tùy vào thị trường, nên ko thể nói cái nào tốt hơn cái nào.

Ngoài vấn đề kỹ thuật, 2 cái cần học là:

  1. Tiếng Anh, ít nhất phải đọc hiểu tài liệu.
  2. Google! Nghe thì buồn cười vì ai cũng nghĩ mình biết “search”. Nhưng thực tế là cùng 1 vấn đề nhưng có người “search” cái là ra, có người search miệt mài nhưng vẫn ko có kết quả!
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?