Làm thế nào để học về lập trình nhúng và thành 1 kĩ sư hệ thống nhúng?

E đang là sinh viên năm 2. Hiện tại e đang muốn theo học lập trình hệ thống nhúng (thiết kế và lập trình cho phần cứng ) nhưng hiện tại em vẫn chưa có hướng đi cụ thể để học tập sao cho hiệu quả nhất vấn đề e đã nêu ạ. Mong anh chị và các bạn tư vấn giúp em và tư vấn cho em trong quá trình học đó em cần thực hành với các board ( từ cơ bản đến nâng cao ) gì ạ? Em cần trang bị những ngôn ngữ lập trình nào ngoài C/C++, python và về phần vi mạch em cần trang bị kiến thức của những môn gì ạ?(như lý thuyết mạch điện và các môn j nữa ạ ?)
Ở đây có ac nào làm về lĩnh vực này thì cho em hỏi cơ hội việc làm của ngành này ạ?
Em cảm ơn ạ! Mong mọi người tư vấn giúp em ạ.

3 Likes

Chưa biết làm gì thì học C/C++ đi đã.

5 Likes

Bạn đang học theo chương trình kỹ thuật điện của viện Điện phải không.

Có bạn đã từng hỏi như bạn rồi nè, bạn tham khảo qua nha. :slight_smile:

3 Likes

vâng em cảm ơn a :grin::grin::grin::grin::grin:

đúng r cậu ơi. C cũng học BKHN à?

Hi bạn,
Mình thấy câu hỏi của bạn là câu hỏi khá là phổ biến mà hầu hết nhiều bạn học điện đều thắc mắc. Mình xin chia sẻ một số kinh nghiệm cá nhân khi mình học điện (chuyên ngành mình là “điều khiển và tự động hóa” và mình không học BKHN nên có khác nhau gì không. Coi như bạn đọc tham khảo nha).

Mình sẽ chia sẻ bằng cách trả lời câu hỏi của bạn.

"Hiện tại e đang muốn theo học lập trình hệ thống nhúng (thiết kế và lập trình cho phần cứng)"

  • Theo kinh nghiệm mình biết, lập trình hệ thống nhúng có thể là học lập trình vi điều khiển, lập trình driver cho các chạy được Linux, lập trình ứng dụng trên các board nhúng (chạy Linux), lập trình các thuật toán điều khiển, tối ưu (vd: thuật toán điều khiển động cơ chẳng hạn), các thuật toán xử lý ảnh, các thuật toán xử lý số tín hiệu (tín hiệu liên tục - âm thanh, giọng nói; tín hiệu rời rạc - hình ảnh),… Nó khá là nhiều mảng, vậy bạn nên xác định là bạn thích làm liên quan đến phần cứng hay liên quan đến ứng dụng.
  • Nếu là thiết kế phần cứng thì có các hướng như thiết kế các board công suất (board nguồn buck/boost/xung,… các kiểu), thiết mạch chạy tần số thấp (ví dụ các mạch đọc cảm biến, điều khiển động cơ hay tín hiệu điều khiển có tần số khoảng vài MHz) hay thiết kế mạch tần số cao (ví dụ thiết kế board nhiều lớp, có HDMI, RAM các kiểu). Bạn cũng nên xác định là thấy mình hợp hướng nào thì theo đuổi vì liên quan đến mạch điện thì toán, lý, trường điện từ, mạch điện,… phải giỏi thì thiết kế mạch mới chất lượng.

"Em cần thực hành với các board (từ cơ bản đến nâng cao) gì ạ?"

  • Mình không biết bạn chọn theo hướng nào nên mình sẽ chia sẻ con đường mình đã học điện tử như thế nào?
  • Đầu tiên, mình học lập trình C cơ bản vì C là ngôn ngữ thông dụng trong lập trình vi điều khiển, driver.
  • Sau đó, mình học lập trình vi điều khiển vi điều khiển 16-bits (MSP430G2553). Con vi điều khiển này không được thông dụng như các dòng khác. Nhưng bài học mình rút ra được là: mình phải học các dòng vđk 8/16 bits trước vì nó đơn giản và mình học lập trình từng thanh ghi một sẽ hiểu được cấu trúc vi điều khiển, các thức vi điều khiển hoạt động như thế nào (gia đoạn này mình không dùng thư viện có sẵn); thứ hai, mình học như vậy thì mình nắm được cách hoạt động của các vđk khác là như nhau nên học một con mà bạn có thể code nhiều con vì cách hoạt động nền tảng là giống nhau.
  • Tiếp theo, mình làm các ứng dụng cần vđk mạnh hơn thì chuyển sang dùng các dòng ARM Cortex-M4. Lúc này mình đã dùng thư viện vì mình đã hiểu cách cấu hình thanh ghi như thế nào rồi và các con này cũng cấu hình phức tạp hơn nên dùng thư viện an toàn hơn. Mình có làm việc trên 2 con TIVA C123 (TM4C123GH6PMI) và STM32F407VG.
  • Khi mà code bắt đầu phức tạp hơn và cần một cái gì đó để quản lý code mình thì tôi học thêm RTOS. Mình cũng tìm hiểu sơ cách RTOS hoạt động thì hiểu được cơ bản hệ điều hành có gì và cơ chế switch task với 1 core khi chạy multi-thread.
  • Mình dừng việc học vi điều khiển ở đó và mình chuyển sang học thêm nhiều cái khác. Bài học rút ra là: bạn bắt đầu bằng vi điều khiển nào không quan trọng, bạn biết code bao nhiêu con không quan trọng, quan trọng là bạn hiểu sâu nó như thế nào? Mình sẽ chia sẻ kinh nghiệm khi đi làm nhúng của mình sau :slight_smile:.

  • Sau khi học lập trình vi điều khiển, mình chuyển sang học lập trình trên board nhúng. Ở đây, mình chủ yếu là học cách build một hệ điều hành trên board Beagle Bone Green, lập trình xử lý ảnh cho robot hay xe tự lái,… Mình khá là thích viết driver cho board Linux mà chưa có cơ hội học.
  • Sau này có duyên, mình chuyển sang tìm hiểu về robotics.

"Em cần trang bị những ngôn ngữ lập trình nào ngoài C/C++, python?"

  • Cá nhân mình là tùy định hướng của bạn là gì? Nếu bạn học lập trình vi điều khiển thuần túy thì học C (vì C là ngôn ngữ hướng cấu trúc), C++ khi bạn muốn học lập trình ứng dụng (C++ vừa là ngôn ngữ hướng cấu trúc, vừa là ngôn ngữ hướng đối tượng) (thật ra C++ code vi điều khiển cũng được nếu có compiler hỗ trợ thôi), Python khi bạn học các môn về xử lý dữ liệu, học thuật toán về Computer Science (ví dụ như Machine Learning, Deep Learning các kiểu).

"Về phần vi mạch em cần trang bị kiến thức của những môn gì ạ?"

  • Mình không biết các bạn nghĩ như thế nào, chứ theo cá nhân mình thì học ở trường tốt là bạn sẽ có đủ kiến thức nền tảng và khá là vững nếu bạn học hành đàng hoàng, tử tế. Các bạn sinh viên thường không thích các môn học trong trường vì nó khá vô dụng do không thấy nó ứng dụng trong cuộc sống hay công việc. Thực ra trường đang dạy bạn một kiến thức nền tảng vững chắc để sau này từ kiến thức nền tảng đó bạn xây dựng những kiến thức sau này. Chưa kể, bạn đang học một trường có danh tiếng và thuộc hàng chất lượng quốc gia nên kiến thức bạn học là không thừa. Và các bạn đừng mong mỏi trường dạy ra là bạn có thể đi làm ngay mà bạn phải tự tìm tòi học hỏi thêm để bạn có thể được những kinh nghiệm thực tế và thường sinh viên mới ra trường sẽ được đào tạo lại để đáp ứng như cầu của công ty (công ty thường các bạn mới ra trường ở nền tảng kiến thức cơ bản, tư duy giải quyết vấn đề, khả năng học hỏi kiến thức mới, khả năng thích ứng công việc, bla bla …).

  • Vì thế, bài học rút ra của mình là: nếu trường đã dạy cho bạn thì chắc chắn môn đó có ích (mình hay nói các bạn: cứ học đi, không bổ bề ngang cũng bổ bề dọc).

  • Ngoài các kỹ năng cứng như đề cập phía trên, bạn nên chuẩn bị cho mình các kỹ năng mềm và các công cụ phụ trợ:

  • Cách lập trình như thế nào là tốt, coding style, học về git để biết cách quản lý code,…
  • Kỹ năng giao tiếp, kỹ năng thuyết trình, kỹ năng truyền đạt vấn đề,…
  • Khả năng giải quyết vần đề, khả năng thích nghi môi trường mới, khả năng tiếp nhận kiến thức mới, kỹ năng giải quyết mâu thuẫn với con người, kỹ năng quản lý con người,…
  • Kỹ năng quản lý thời gian cá nhân, kỹ năng quản lý công việc,…
  • Cách cân bằng sức khỏe, công việc và các mối quan hệ cá nhân.

Cũng dài rồi, hy vọng là các bạn đọc đến đây và cảm ơn các bạn đã đọc.
Chốt: Nếu chưa biết gì mình thích gì thì cứ kiếm gì đó mà làm, làm nhiều thì biết nhiều chứ có sao đâu.

14 Likes

Một bài chia sẻ đầy đủ và chất lượng.
Cảm ơn bạn !

3 Likes

ngành này khá rộng, nếu bạn đang là sinh viên thì nên tập trung học các môn chuyên ngành trên trường để có nền tảng kiến thức. Học về phần cứng, không cần quá giỏi nhưng cần phải hiểu về các thiết bị mình thiết kế hoạt động thế nào. Về phần mềm, bạn cần nắm vững ngôn ngữ C đầu tiên, nó rất quan trọng cho công việc sau này, các hệ thống nhúng thường được viết bởi ngôn ngữ C, nếu bạn đã nắm được các kiến thức cơ bản về ngôn ngữ C thì học tiếp thêm C++ hoặc Python nếu có thời gian. Bạn có thể bắt đầu bằng việc mua kit arduino và Stm32f103c8t6( có bán tại các cửa hàng bán linh kiện như Minh Hà), nếu bạn chưa có căn bản có thể bắt đầu học lập trình arduino, học cách sử dụng thanh ghi, tạo ra các thư viện như các thư viện của arduino, sau đó làm quen dần với STM32,…Còn về định hướng cụ thể mình không thể chia sẻ cho bạn được, vì mỗi một công ty sẽ phát triển theo mỗi hướng khác nhau, mỗi công nghệ khác nhau, nên rất khó nói. Điều đầu tiên bạn cần làm là nắm vững các kiến thức căn bản trước đã.

3 Likes

Nếu đang học, né xa những cái được hỗ trợ, ăn sẵn.

4 Likes

e cảm ơn câu trả lời của a ạ! A cho e hỏi là cơ hội việc làm của lĩnh vực này đc ko ạ?

e cảm ơn ạ! a có thể cho e hỏi là cơ hội việc làm và các nhu cầu của các doanh nghiệp về kỹ thuật hệ thống nhúng này đc ko ạ?

Hi bạn,
Mình nói trước là mình chỉ có kinh nghiệm làm việc khoảng trên một năm nên chia sẻ của mình có thể hơi thiên hướng cá nhân và chưa đầy đủ, chính xác. Hy vọng có anh/chị/em nào có kinh nghiệm thì chia sẻ.

Ngày trước, mình làm dev cho một công ty outsource về dự án nhúng cho xe hơi (cho bạn biết vị trí công việc của mình).

"Cơ hội việc làm?"

  • Thật ra theo quan điểm cá nhân của mình, nếu bạn học BKHN thì không thiếu việc cho bạn làm. Chỉ có điều là công việc có đúng chuyên ngành hay không và mức lương bạn nhận được là bao nhiêu. Chứ mình nghĩ không thiếu việc làm, chỉ sợ nhiều bạn chê công việc lương thấp rồi không làm thôi.

"Cơ hội việc làm của lĩnh vực này?"

  • Theo quan điểm cá nhân và cái nhìn hơi chủ quan của mình, công việc lập trình nhúng hiện tại không hot nhưng thị trường lao động rất cần. Nhưng thường các công ty không tuyển được nhân viên chất lượng vì số lượng theo lập trình nhúng có trình độ chuyên môn không nhiều và nhiều bạn trẻ sẽ dễ chuyển hướng để có công việc thoải mái hoặc lương cao hơn. Bạn cứ giỏi là có việc làm thôi.
  • Theo kiến thức của mình hiện tại, kỹ sư lập trình nhúng có thể làm việc ở những chỗ sau:
    Các công start-up/công ty nhỏ: thường thì các bạn sẽ học được rất nhiều kiến thứ từ các công ty này vì bạn phải cày rất nhiều, nhưng mặt bằng chung thì lương không cao.
    Các công ty outsource: việc làm bao nhiều nhưng theo mình đánh giá là công việc khởi đầu hơi chán và bạn phải có định hướng rõ ràng khi vào các công ty này. Vì vấn đề mình không tiện đề cập, nhưng các công ty nước ngoài mướn công ty việc VN thì thường sẽ không giao các module cốt lõi hay quan trọng nên mình sẽ khó có cơ hội tiếp nhận các công nghệ tiên tiến của thế giới. Thường có 2 loại công việc: dev và test. Theo tiêu chuẩn thế giới thì định hướng cho dev và test là khác nhau nhưng ở VN thì hơi khác.
    ++ Đối với mình, công việc test thì hơi chán vì phải lập đi lập lại một công việc nhưng bù lại, nếu bạn có cơ hội test white box của các công ty lớn thì bạn học được cách lập trình của họ.
    ++ Để được làm dev thì bạn phải có kiến thức giỏi và có chút ít kinh nghiệm. Thường thì bạn sẽ chỉ làm một phần nhỏ trong hệ thống và bạn ít có cơ hội nhìn được tổng quan hệ thống vì lý do bảo mật công ty (thường team lead và project manager sẽ nắm rõ).
    ++ Làm ở các công ty outsource lớn thì cơ bản bạn sẽ học được cách làm việc có quy trình; cách quản lý dự án, code cũng có tiêu chuẩn; tập cho mình một ý thức làm việc công nghiệp và chuyên nghiệp hơn.
    ++ Lương các công ty này thì mình đánh giá ở mức trung bình đối với sv mới ra trường.
    Các công ty lớn: thì thường khó vào được các vị trí dev vì các công việc đó thường đòi hỏi người có kinh nghiệm. Và thường cúng sẽ chỉ làm một phần nhỏ trong hệ thống lớn. Lương công ty thì cao hơn mặt bằng chung.

"Vậy bạn cần chuẩn bị gì?"

  • Hard-skill: nếu bạn theo nghiệp nhúng thì phải giỏi C/C++.
    – Vài câu hỏi mà mình thấy người ta hay hỏi như: biến volatile/static/register là gì và dùng khi nào? Có bao nhiêu loại vùng nhớ trong vi điều khiển? Quy trình build 1 chương trình C? Entry point là gì? blabla… Nói chung rất nhiều câu hỏi, và có thể là các câu hỏi về optimize code như dùng vòng lập for theo kiểu ++ hay – thì sẽ tốt hơn?..
    – Các kiến thức về vi điều khiển? Vd: điều quan trọng nhất khi lập trình vi điều khiển là gì?
    – Compiler, cross-comiler là gì?
    – Biến nào sẽ lưu ở vùng nhớ nào? Stack là gì? Heap là gì?
    – Tùy vào hướng công việc cụ thể, người có thể hỏi về RTOS, driver, device tree,…
    – Các tool đã dùng: đã dùng git hay svn chưa? git là gì?, có thể có cả câu hỏi thú vị là: git và github/gitlab khác nhau cái gì?..
    – Người sẽ có thể hỏi các dự án đã làm, các vđk đã lập trình,…
    Lưu ý: thường thì khi lập trình vđk cho các công ty lớn, người ta thường có chip riêng và chip chuyên dụng và ít khi dùng các board có sẵn trên thị thường (trừ trường hợp cần làm nhanh prototype hay theo yêu cầu của khách hàng). Những chip đó thì thường bạn sẽ biết nó là lõi gì (vd lõi ARM chẳng hạn), có datasheet và một vài manual của nhà sản xuất. Nên việc kiếm code mẫu trên mạng là chuyện hầu như không thể nên lúc này bạn phải hiểu cấu trúc/cách thức hoạt động của một con vi điều khiển như thể nào thì bạn mới biết cách config và code được.
  • Soft-skill:
    – Thì giống như bài trên, mình list ra một vài cái để bạn tham khảo. Làm sao để học cái này? Chỉ có một cách duy nhất là bạn phải thực hành. Nghe nhiều không có hiệu quả đâu. Bắt tay vào làm mới thấy nó khó. “Chỉ có những gì bạn trải qua thì đó mới là kinh nghiệm của bạn”.
    – Một điều quan trọng: tiếng anh. Một điều tối thiểu là bạn phải đọc được tiếng anh vì tài liệu chuyên ngành hầu hết là tiếng anh nên việc đọc hiểu tiếng anh được xem là hiển nhiên. Một điều khá quan trọng là bạn phải nên nói được tiếng anh giao tiếp thì công việc của bạn sẽ dễ dàng và tiến xa hơn. Nói chung phải giỏi tiếng anh, càng giỏi thì công đường sự nghiệp của bạn sẽ thuận lợi hơn người khác rồi.

"Định hướng sự nghiệp."

  • Theo quan điểm của mình, không thể ra bạn làm dev cả đời được nên khi đi làm bạn cần sẽ phải định hướng lâu dài và xác định mục tiêu mình phải đạt được.
  • Nếu có cơ hội, hãy đi làm các công ty nước ngoài ở nước ngoài, bạn sẽ thấy được những chân trời mới.
  • Lương? là cái mà nhiều bạn rất quan tâm. Mình chia sẻ quan điểm cá nhân của mình: bạn đi bán sức lao động cho công ty thì công ty trả tiền công cho bạn. Vậy khi bạn nhận một mức lương thì hãy suy nghĩ xem chất xám bạn bỏ ra và số tiền bạn nhận lại có công bằng hay chưa (đừng suy nghĩ rằng bạn kiếm được công ty 1M đô thì bạn nhận lại được 1M đô thì mới công bằng --> chuyện đó không có đâu nha)? Bởi vậy tại sao mình thấy nhiều bạn chê lương thấp và cứ than phiền. Cá nhân mình, nếu mới ra trường thì mình không có kinh nghiệm nên chấp nhận mức lương đủ sống thôi để mình học được nhiều thứ hơn, để mình giỏi hơn. Sau này deal lương thì mới có cái để nói thì mới thỏa thuận được lương chứ.
  • Môi trường làm việc khá quan trọng, nó sẽ ảnh hưởng rất nhiều đến con người bạn sau này. Nên chọn một môi trường mà mình phát triển được.
  • Mình thấy đại đa số các bạn mới ra trường sẽ có một khoảng thời gian hoang mang về bản thân. Vì lúc này phải tự lo bản thân, lo lắng cho sự nghiệp, cuộc đời không màu hồng như đã mơ khi gặp đồng nghiệp không tốt, xếp la bới, ép deadline các kiểu,… và nhiều bạn thấy kiến thức đi làm thì chả liên quan gì đến việc học, bla bla… Nói chung nhiều suy nghĩ đập vô mặt, nhưng sau đó hãy cố gắng bình tâm tìm con đường mình muốn đi là được. Quan trọng là bạn phải biết bạn là ai trong cuộc đời và bạn sẽ làm gì cho xã hội này.

Túm cái gì cần túm lại, việc làm thì mình nghĩ không thiếu, chọn chúng đúng hướng và đúng môi trường mới khó thôi. Nhưng nếu bạn quyết tâm thì sẽ đạt được một thành tựu nào đó thôi. Nếu bạn đang học thì cố gắng học thật giỏi, trao dồi nhiều kiến thức, tham gia nhiều hoạt động để bạn năng động hơn và đừng nghĩ nhiều về việc làm (vì bây giờ suy nghĩ thì bạn cũng có đi làm ngay liền đâu, suy nghĩ chi cho mất thời gian, chỉ cần có định hướng thôi, nếu bạn giỏi thì công việc không thiếu đâu). Chúc bạn học thật giỏi và đạt được công việc như mong muốn :wink:.

7 Likes

Việc làm nhúng ở Việt Nam so với những mảng khác như app, mobile, web… thì ít hơn khá nhiều.
Doanh nghiệp vẫn cần, công việc vẫn có nhưng lại không phải hot và lương cũng không cao. Nên nếu chỉ có khả năng về nhúng thì hơi khó khăn đấy.
Thường sẽ làm việc ở 3 chỗ sau:

1, Tự nghiên cứu phát triển. Cái này phụ thuộc sự nhanh nhạy và ý tưởng bản thân. Nếu thuận buồn xuôi gió thì việc và lương lậu cũng nhiều. Mình làm mình ăn cả mà.
2, Khu công nghiệp. Các công ty sản xuất nhất là những công ty lớn, nước ngoài luôn có nhu cầu tự động hoá sản xuất. Họ cần nhúng, PLC, … Nhu cầu ở đây chắc là nhiều nhất. Lương lậu ổn định nhưng không cao. Nếu có quan hệ tốt thì có khi lại giàu :smile:
3, Các công ty chuyên về nhúng. Chỗ này nhu cầu ít và thường đòi hỏi sự hiểu biết bài bản, chuyên sâu ở mức độ cao hơn 2 cái trên. Lương lậu thì mình không biết cụ thể. Nhưng chắc cũng tương đối.

6 Likes

em cảm ơn câu trả lời của anh ạ

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?