post-image

Học Gì Để Trở Thành Kỹ Sư Phần Mềm?

Tổng quan

Hể lô các bạn,

Mình là một cựu sinh viên ngành Kỹ thuật Điện tử và Truyền thông, tốt nghiệp năm 2013. Đây sẽ là 1 bài chia sẻ khá dài và chi tiết về hành trình học hành và theo đuổi nghiệp Kỹ sư Phần mềm cũng như cách chinh phục các nhà tuyển dụng của bản thân mình.

Suốt mấy năm Đại học, hầu như mình không có kế hoạch gì nhiều lắm cho tương lai và dành suốt cả mấy năm để tìm hiểu về robot, tham gia vài dự án nghiên cứu, các hoạt động ngoại khóa và ti tỉ thứ khác mà chẳng rõ ràng định hướng hay gì cả. Và cuối cùng, cái giá phải trả là khi ra trường, mình trở nên mông lung và quay cuồng trong mơ hồ thực sự. Mình không biết bản thân thích gì, muốn gì và cẩn chuẩn bị những gì để có thể đi làm và nuôi sống bản thân nữa. Nhưng lúc đó mình không có ý định học cao hơn nữa vì cũng chan chán việc học rồi và cũng muốn ra ngoài bươn chải để mà kiếm được miếng ăn và trải nghiệm cuộc sống thực tế.

Sau đó, mình cứ nộp CV bừa và may mắn có được 1 công việc trong ngành IT, cụ thể là Kỹ sư phần mềm. Lúc đó đây là một công việc khá được ưa chuộng, bạn bè mình làm cái này cũng nhiều. Hồi còn đi học thì mình học lập trình cũng khá tốt (May quá!). Sau một vài tháng trải nghiệm thì mình cũng đã quyết định sẽ theo đuổi sự nghiệp trở thành một KSPM một cách đàng hoàng tử tế. Thật sự là “nghề chọn người” luôn đấy (Vì người nào có chọn đi làm đâu…)

Để có được một công việc như hiện tại, mình cũng đã tham gia phỏng vấn và học hỏi khá nhiều. Dưới đây là danh sách một số điểm quan trọng mà mình nghĩ các bạn nên lưu tâm:

➖ Cấu trúc dữ liệu và giải thuật
➖ Các nguyên tắc cơ bản về Khoa học Máy tính
➖ Design Patterns
➖ Thiết kế hệ thống
➖ Nắm chắc ít nhất một ngôn ngữ lập trình
➖ Có kinh nghiệm liên quan là một lợi thế

Dưới đây là tổng hợp các tài nguyên mà mình đã sử dụng trong cả quá trình học và phỏng vấn mà cảm thấy hữu ích. Các bạn click từng hình để đọc nhé.

Cấu trúc dữ liệu và giải thuật

Cấu trúc dữ liệu và giải thuật là kỹ năng hàng đầu cần thiết trong mọi công ty phần mềm. Bạn càng tốt thuật toán bao nhiêu, khả năng bạn offer được một công việc với mức lương cao càng lớn. Tuy vậy, đây là một môn học mà mức độ khó không thay đổi nhiều theo số năm kinh nghiệm; vậy nên, hãy chăm chỉ củng cố CTDL&DT và kỹ năng giải quyết vấn đề của bạn càng sớm càng tốt.

May be an image of body of water and text that says 'DATA STRUCTURES AND ALGORITHMS'

Các topic cần lưu ý:

– Phân tích độ phức tạp: Big O là gì và tại sao Big O lại quan trọng? Big O là gì trong một số thuật toán sắp xếp và tìm kiếm phổ biến cũng như cách tính Big O cho các thuật toán khác nhau.
– Cấu trúc dữ liệu: Arrays, Linked List, Stack, Queue, Binary Tree, Binary Search Tree, Heaps, Hashing, Graphs, Advanced Data Structures (Trie, Segment Trees, Self-Balancing Trees)…
– Các thuật toán: Searching, Sorting, Divide and Conquer, Recursion, Backtracking, Greedy, Dynamic Programming, Union Find, Graph Algorithms, KMP algorithm…

Các nguồn học và thực hành:

1. GeeksforGeeks: quá nổi tiếng rồi. Trang web sẽ cung cấp cho bạn cái nhìn tổng quan về những chủ đề và loại câu hỏi được hỏi trong các cuộc phỏng vấn.
2. 4 cuốn sách huyền thoại để học Thuật toán: https://codelearn.io/sharing/4-tua-sach-huyen-thoai-de-hoc-thuat-toan
4. Các khóa học Coursera:
– Thuật toán 1: https://www.coursera.org/learn/algorithms-part1
– Thuật toán 2: https://www.coursera.org/learn/algorithms-part2
5. Kênh Youtube mình hay xem:
– Thuật toán: https://www.youtube.com/c/lcc0612
– Kỹ năng phỏng vấn:
+ Clément Mihailescu: https://www.youtube.com/channel/UCaO6VoaYJv4kS-TQO_M-N_g
+ Chris Jereza: https://www.youtube.com/watch?v=lDTKnzrX6qU&ab_channel=ChrisJereza
+ Gaurav Sen: https://www.youtube.com/playlist?list=PLMCXHnjXnTnuX59JRYLwyr6IFkuqTr0oa
….
8. Leetcode: thực hành, thực hành và thực hành.
9. tập luyện cho các cuộc phỏng vấn

Design Patterns

Design Patterns thường được đòi hỏi với các ứng viên có trên 2 năm kinh nghiệm. Mình đã từng gặp chủ đề này một lần khi phỏng vấn hồi 2015 (2 năm sau khi ra trường). Nhưng mình nghĩ đó là một chủ đề quan trọng để nghiên cứu. Về cái này mình k có nhiều kinh nghiệm lắm, nhưng có lẽ nguồn tài liệu dưới đây là khá đầy đủ:

Derek Banas: https://www.youtube.com/playlist?list=PLF206E906175C7E07

Thiết kế hệ thống

Thiết kế hệ thống thường được yêu cầu đối với các ứng viên khoảng 3-4 năm kinh nghiệm trở lên. Vì nó thường alf một câu hỏi mở khó đoán định đúng sai, độ sâu của câu trả lời thường sẽ tăng lên theo số năm kinh nghiệm. Đây cũng là chủ đề yêu thích của mình 

May be an image of text that says 'CV 日 System Design'
Các nguồn tham khảo:
– Gaurav Sen: https://www.youtube.com/playlist?list=PLMCXHnjXnTnvo6alSjVkgxV-VH6EPyvoX
– Narendra: https://www.youtube.com/c/TechDummiesNarendraL/playlists
– Tushar Roy: https://www.youtube.com/playlist?list=PLrmLmBdmIlps7GJJWW9I7N0P0rB0C3eY2
Yogita Sharma: https://www.youtube.com/playlist?list=PLTCrU9sGyburBw9wNOHebv9SjlE4Elv5a

Nắm chắc ít nhất một ngôn ngữ lập trình

Điều rất quan trọng là bạn phải có kiến thức vững chắc về ít nhất một ngôn ngữ lập trình. Một số công ty thậm chí có một vòng tuyển chọn dành riêng để kiểm tra kỹ năng sử dụng ngôn ngữ.

Mình thì sử dụng Java, và dưới đây là một số nguồn mình đã học:

– Javarevisted Blog dành cho CoreJava: https://javarevisited.blogspot.com/#axzz6gF5M9kK3
– Đa luồng trogn Java (Cave of Programming): https://www.youtube.com/playlist?list=PLBB24CFB073F1048E
– Quản lý bộ nhớ Java và kiến trúc JVM: Cái này anh em chịu khó search GG, mình tham khảo nhiều nguồn quá nên khó liệt kê được hết.

Có kinh nghiệm là một lợi thế

Đây hóa ra lại là cái khó khăn nhất với mình. Bắt đầu đi làm từ khi ra trường, lắm lúc mình cũng gặp đủ thứ tình huống dở khóc dở cười: Công ty nhỏ, học được nhiều thì đến khi muốn phát triển ở môi trường khác lại không được NTD đánh giá cao về danh tiếng (Ngớ ngẩn), vào được công ty lớn, danh tiếng lẫy lừng thì hóa ra lại chả học được gì nhiều, từ lúc tới làm đến khi nghỉ kiến thức thu lượm được gần như bằng 0.

May be an image of text

Sau một quãng thời gian làm việc, mình nhận ra rằng kinh nghiệm trong các dịch vụ RESTful là rất hữu ích. Vì vậy, ít nhất hãy tự xây dựng một dịch vụ web RESTful đầy đủ chức năng nếu bạn mới đang chập chững vào nghề. Nếu kinh nghiệm của bạn hơn 2 năm, bạn cũng phải có kiến thức vững chắc về ứng dụng bạn đang làm việc. Nếu được yêu cầu chuyển đổi công việc cho các dự án tốt hơn, đừng quên tìm hiểu càng nhiều càng tốt trong công việc, có thể là kỹ thuật hoặc kỹ năng mềm. Đừng để việc học của bạn bị đình trệ, đồng thời thu thập càng nhiều kiến thức khái niệm xung quanh nó càng tốt. Google mọi thứ bạn nghĩ đến và xây dựng kiến thức lý thuyết và thực hành song song. Các khái niệm như nguyên tắc thiết kế SOLID, khái niệm OOP, cơ sở dữ liệu ACID BASE nên được nghiên cứu hẳn hoi.

Ngoài ra bạn cũng có thể bổ sung một số khái niệm cơ bản về Phát triển Web, HTTP và Java Servlet của Sanjay Patel: https://www.udemy.com/course/web-application-and-java-servlet-concepts/

Kết luận

Tất cả các nguồn học này là chưa đủ, nhưng cứ đi rồi sẽ đến và bạn sẽ dần dần tìm thấy những thứ hữu ích và phù hợp với mình nhất. Nhưng BẠN phải làm việc chăm chỉ và đảm bảo rằng mục tiêu của bạn rõ ràng. Học-Thực hành-Học-Thực hành… cho đến khi bạn tự tin khoảng 80% về sự chuẩn bị của mình. Tại sao lại là 80%? Bởi vì bạn sẽ không bao giờ có thể chuẩn bị được 100% cả… Vì vậy, hãy sẵn sàng để thất bại, cũng đừng quá bi quan vì nó. Quan trọng là biết rút kinh nghiệm, biết mình sai ở đâu và không bỏ cuộc.

Chúc các bạn thành công!

Nguồn: https://codelearn.io/sharing/hoc-gi-de-tro-thanh-ky-su-phan-mem

Leave a Reply

Your email address will not be published.