Trong bài viết này, tôi sẽ chia sẻ về những gì tôi đã được học, và hy vọng rằng nó sẽ giúp mọi người đưa ra quyết định sáng suốt nhất khi lựa chọn con đường sự nghiệp để theo đuổi.
Chú ý: Bài viết này được viết từ những gì tôi nhớ được về các lớp học trước đây của tôi và từ quan điểm của một mobile developer. Rất nhiều môn học trong số được kể đến dưới đây sẽ rất cần thiết cho nghề nghiệp sau này, thế nên tất cả chúng đều quan trọng (cho bất kỳ ai). Tôi viết bài này trên quan điểm của chính mình và từ quan điểm của một người chọn làm mobile developer.
Programming I, II
Đây là môn học quan trọng nhất trong những môn tôi học được và đã đưa tôi đến với thế giới lập trình. Trước khi tôi tham gia các lớp học này, tôi không biết một chút gì về lập trình cả. Tôi đã cố gắng để có một khởi đầu tốt đẹp nhưng kết quả chỉ là các loop.
Khi bắt đầu khóa học này, tôi được yêu cầu tạo một file trống và compile nó trong một IDE ( tôi đã dùng Code::Blocks). Những người tham gia lớp học đều âm thầm cạnh tranh với nhau và đều làm hết mình. Bây giờ nhìn lại những dòng code tôi đã viết khi đó, tôi cảm thấy xấu hổ vô cùng. Tính ra tôi đã đi được một chặng đường dài kể từ hồi đó rồi.
Vậy tôi đã học được những gì? Những lớp học đó cực kỳ có ích và đã giúp tôi học được ít nhất 70% kiến thức cần thiết để làm việc như một lập trình viên chuyên nghiệp. Tôi đã học các câu lệnh if, loops, boolean logic, xây dựng class, struct, interfaces, polymorphism, inheritance,… Bên cạnh đó, tôi còn học sử dụng các cấu trúc dữ liệu cơ bản như arrays và vectors.
Cấu trúc rời rạc (Discrete Structures) trong Khoa học Máy tính
Lớp học này nhằm giúp cho mọi người làm quen với boolean logic, phần này chúng tôi đã hiểu được trong 2 tuần đầu. Éo le thay, chỉ là chúng tôi “nghĩ là mình đã hiểu”, vì nó còn mông lung và khó nhằn hơn thế nhiều. Một số bài học trong lớp này là: logic, thiết lập các operation, các phương pháp chứng minh, đệ quy, toán học tổ hợp và lý thuyết đồ thị.
Hiện nay, những thứ đó là rất cần thiết và nên học. Nhưng vấn đề là chúng tôi được khuyến khích tham gia lớp học này rất sớm (thường là cùng lúc với lớp Programming I và II) mà đây còn là những môn học nâng cao. Cho nên tới tận bây giờ, tôi vẫn vật lộn rất nhiều khi sử dụng các phương pháp toán học chứng minh. Ngoài ra, tôi chỉ cần search google là ra toán học tổ hợp là gì nên rõ ràng là tôi không sử dụng chúng thường xuyên.
Vào thời điểm tôi tham gia khóa học, rất nhiều thứ được dạy trong lớp học này không áp dụng nhiều cho công việc được. Bây giờ, dù tôi biết rằng logic, thiết lập các operations, đệ quy và lý thuyết đồ thị là rất cần thiết, nhưng đó lại là nhận thức muộn màng của tôi sau vài năm làm lập trình viên.
Tôi áp dụng logic và thiết lập các operation vào công việc hiện tại hàng ngày, còn đệ quy và lý thuyết đồ thị chỉ dùng cho các cuộc phỏng vấn. Nhưng hãy nhớ rằng tôi là một mobile developer, thế nên một backend developer có thể cần lý thuyết đồ thị này trong công việc của mình.
Data Structures
Lớp học này cực kỳ bổ ích. Data structure được sử dụng trên tất cả các chương trình máy tính và là xương sống của hầu hết các code. Chúng cho phép ta lưu trữ data một cách có hiệu quả cho các chương trình. Không chỉ vậy, kỹ năng đọc data và biết cách lưu trữ data theo thời gian và hiệu suất không gian sao cho tốt nhất là một kỹ năng rất hữu ích cần có.
Tôi đã học về arrays, stacks, các linked list, doubly linked các list, trees, graphs, heaps và tất cả những yếu tố khác nhau của data structures (ví dụ như các seft-balancing tree). Lớp học này không chỉ giúp tôi hiểu về data structure mà còn giúp tôi tổ chức data đang được lưu trữ một cách tốt hơn.
Một điều thú vị hơn là C được dùng trong lớp học này. C có thể rất khó sử dụng nhưng là một ngôn ngữ rất mạnh nếu biết sử dụng đúng cách. Tôi đã phải rất cẩn thận khi phân bổ và dọn dẹp bộ nhớ, và việc này giúp tôi rèn luyện khả năng quản lý bộ nhớ.
Còn rất nhiều thứ hữu ích trong lớp này mà tôi khó có thể kể hết. Không những vậy, data structure còn là một phần kiến thức trọng tâm khi phỏng vấn ngành công nghệ. Nếu bạn cảm thấy lo sợ về data structures thì hãy bắt đầu tìm hiểu những kiến thức cơ bản ngay đi vì chúng rất quan trọng.
Phân tích thuật toán
Lớp học này cũng khá hữu ích. Thuật toán tạo ra những phần mềm tốt nhất trên thế giới và luôn cập nhật những xu hướng mới nhất để phù hợp với thế giới hiện đại. Nhưng lớp học này lại có một số vấn đề.
Big O notation là phần hữu ích nhất trong lớp học này. Nó cho phép bạn đánh giá code và biết code sẽ hoạt động như thế nào theo cả thời gian và không gian. Nói chung là, nếu bạn muốn đo hiệu suất code, bạn sẽ cần một timer để track thời gian giữa các tương tác. Ngoài ra, nó còn cho phép bạn xem phần mềm của bạn hoạt động tốt như thế nào, và đòi hỏi bạn phải viết code rồi đánh giá kết quả sau đó.
Big O notation cho phép bạn thực hiện các đánh giá về hiệu suất code chỉ bằng việc nhìn vào code. Tôi sẽ không nói sâu về cái này nữa, nhưng nếu bạn muốn tìm hiểu thêm về Big O notation, hãy đọc bài viết này: https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
Thực ra các thuật toán chúng tôi từng sử dụng không hữu ích lắm. Tất cả những gì tôi nhớ là vấn đề cái ba lô và người nhân viên bán hàng du lịch. Tôi cũng đã phải viết code về những thứ này trong một nhóm không tuyệt lắm vì có một người trong nhóm luôn làm nhiều hơn những gì anh ta được giao. Và nó có nghĩa là tôi phải viết code ít hơn tôi muốn.
Bạn nên hiểu những cái cơ bản về những thuật toán phổ biến, mục đích của chúng và cách chúng được thực hiện (chủ yếu dùng để phỏng vấn). Big O notation rất hữu ích trong công việc và phỏng vấn.
Web Development
Lớp học này có hầu hết các kỹ năng áp dụng trực tiếp trong lĩnh vực công nghệ. Tôi đã học về HTML, CSS, JQuery, JavaScript, PHP và JSON. Tôi được học cách một request gửi từ một website frontend tới một backend, cách nó được xử lý ở backend rồi sau đó gửi ngược lại frontend với một response. Tôi đã học cách tạo UI và cách tương tác với một data layer và network.
Vào cuối lớp học này, tôi đã build được website riêng của mình rồi từ đó tự tìm hiểu về Angular. Tôi sử dụng Angular để làm cho website của mình trông thật xịn và điều này giúp tôi có được chỗ thực tập đầu tiên.
Tôi học được cách học một ngôn ngữ, framework, data format mới và cách làm việc với nó một cách nhanh chóng. Tôi đã search google rất nhiều để xem các ví dụ cụ thể về chúng. Bên cạnh đó, tôi còn học cách sử dụng documentation và cách tìm kiếm online để hiểu rõ hơn về concept cần được áp dụng trực tiếp trong một short time frame. Đây là một kỹ năng quan trọng để trở thành một lập trình viên lão làng.
Giới thiệu về Databases
Tôi chủ yếu chỉ học SQL trong lớp này. Tôi chắc rằng đã được cho xem qua một số khái niệm như sharding và clustering nhưng mà không thể nhớ nổi. Đôi khi tôi dùng SQL để chạy các data queries cho các event tôi đang đảm nhiệm. Nhưng điều thú vị là, SQL là một ngôn ngữ mà hoặc không thể thiếu trong công việc của bạn hoặc sẽ không bao giờ được sử dụng đến. Nếu bạn cần thì hãy học và trở thành chuyên gia về nó, nếu không thì đừng quan tâm quá nhiều.
Software Engineering I, II
Đây lại là một lớp học mà tôi không thể nào quên. Chúng tôi đã đi qua rất nhiều concept trong lớp học này. Những việc chúng tôi đã làm là thực hiện các phương pháp quản lý dự án Scrum và Waterfall, test tất cả các loại testing khác nhau, thực hiện một số concept khả năng sử dụng và khả năng tiếp cận.
Do lớp học này không chuyên sâu nên tôi không hiểu bất kỳ concept nào quá tốt. Có một cái nhìn tổng quan cơ bản về các concept cũng được thôi nhưng tôi ước gì tôi có nhiều thời gian hơn để tìm hiểu về các bài học quan trọng như testing.
Kiến trúc máy tính & hợp ngữ
Đây là một lớp học rất thú vị. Nó dạy cho chúng tôi cách một máy tính hoạt động hay làm thế nào để machine instruction được gửi đi xung quanh và xử lý bởi máy tính. Chúng tôi cũng phải viết một số code trong MASM nơi một hợp ngữ tương tác rất chặt chẽ với machine code.
Hầu hết các ngôn ngữ lập trình mà tôi sử dụng để tham gia lớp học này là các ngôn ngữ cấp cao. Ngôn ngữ cấp cao có xu hướng gần với ngôn ngữ của người hơn là machine code. Mà MASM lại gần giống với machine code, có nghĩa là nó gần với ngôn ngữ máy hơn là ngôn ngữ con người.
Phần quan trọng nhất của lớp học này là biết cái gì đang xảy ra với code của bạn khi nó được compile. Hiểu được các logical units khác nhau trong máy tính và cách code của bạn được xử lý bởi chúng cũng rất thú vị.
Tuy nhiên trong thực tế, lớp học này không giúp ích gì nhiều cho công việc của tôi. Tôi rất hiếm khi sử dụng những kiến thức có được từ lớp học này để áp dụng trong công việc.
Các hệ điều hành
Thành thật mà nói, rất khó để nhớ được mình đã học gì trong lớp học này. Điều duy nhất tôi nhớ được là build một chương trình nhắn tin sử dụng lập trình socket trong C để giao tiếp. Tôi cũng được học về cách mở file và thao tác các folder sử dụng các script.
Tôi ít khi sử dụng kiến thức trong lớp học này trong công việc của mình.
Giới thiệu về Computer Networks
Lớp học này cực kỳ hữu ích. Chúng tôi được dạy về cách các computer network hoạt động, bao gồm các network protocol như HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH và DNS. Tôi còn tìm hiểu về từng protocol được sử dụng cho mục đích gì, cách chúng được thực hiện và tại sao chúng được tạo ra.
Các networking protocol tôi đề cập ở trên được sử dụng cho các function quan trọng của software hiện đại. Điều này bao gồm xử lý email (POP3 & IMAP), gửi các network request giữa client và server (HTTP, HTTPS) và xử lý các thiết bị một cách an toàn thông qua network (SSH). Việc này thực sự giúp bạn hiểu được cách thức hoạt động của Internet và cách các thiết bị trên toàn thế giới tương tác với nhau.
Những gì tôi học được từ lớp này không chỉ thú vị mà còn rất hữu ích. Tôi dùng chúng để debug các vấn đề đến từ network. Ngoài ra, chúng giúp tôi xác định chính xác các vấn đề đang gặp phải và giúp các backend dev tìm ra bug ở end.
Giới thiệu về Usability Engineering
Lớp học này bao gồm cách tạo một app trực quan cũng như cách tạo một app hoặc website có thể truy cập được. Khả năng truy cập được ở đây liên quan đến việc tạo ra một phần mềm mà ai cũng sử dụng được, kể cả những người khuyết tật. Điều này bào gồm việc sử dụng lời nói để tạo văn bản và sử dụng các yếu tố âm thanh để thiết kế phần mềm
Các bài học được đề cập sẽ rất hữu ích nếu bạn chưa bao giờ nghe về khả năng tiếp cận. Ít ra nó khiến bạn cân nhắc về những điều này khi bạn thiết kế software. Nó cũng khiến tôi thực sự bắt đầu suy nghĩ về trải nghiệm của người dùng và tầm quan trọng của nó. Nếu không ai sử dụng chức năng chính của app vì nó khó hiểu, thì sớm muộn gì app của bạn cũng sẽ mất tất cả user.
Mặc dù kiến thức về topic này rất thú vị, nhưng việc triển khai cụ thể khi tạo ra một phần mềm có thể sử dụng và có thể truy cập được còn tùy thuộc vào platform. Ví dụ: Apple có riêng bộ hướng dẫn giao diện người dùng mô tả các nguyên tắc thiết kế chung và các chi tiết cụ thể về cách thiết kế phần mềm sẽ chạy trên bất kỳ platform nào của Apple.
Bởi vì mỗi platform cần những thông tin cụ thể riêng nên tôi không chắc lớp học này có ích hay không. Cuối cùng tôi đã phải học bộ hướng dẫn giao diện của Apple vì nó bao gồm tất cả bài học trong lớp học này.
Phát triển Mobile và Cloud Software
Tôi sẽ nói ngắn gọn về cái này thôi. Khi tôi tham gia lớp học này, tôi đã là một mobile engineer. Tôi đã build một mobile app tào lao trong vài giờ chỉ để hoàn thành cái bằng cấp càng sớm càng tốt. Lúc đó, tôi đã thực hiện được mục tiêu của mình là trở thành một mobile engineer nhưng vẫn cần bằng cấp này vì dù sao cũng gần xong rồi. Tôi không có tâm trạng để học vào thời điểm đó.
Dù nói vậy nhưng tôi vẫn nghĩ rằng lớp học này không tốt lắm vì cách thiết kế các bài học của nó không ổn tí nào. Trong lớp học này, họ khuyến khích mọi người viết code cho ứng dụng điện thoại Windows, và nhu cầu công việc cho mảng này không cao như những mảng khác. Điều tốt nhất ở lớp học này là môi trường dễ thiết lập, code có thể được viết bằng JavaScript và tương tự như phát triển web.
Ngoài ra, rõ ràng là giảng viên lớp này không biết tất cả các mobile app platform. Chúng tôi được yêu cầu viết một phần backend nhỏ nhưng mà tôi không muốn tí nào. Cuối cùng tôi đã giả một web request bằng cách đọc từ disk và trả lại một canned response chỉ sau vài giây. Việc này có hiệu quả vì tôi chỉ cần gửi bản demo và source code, và tôi có cảm giác là người chấm điểm chỉ nhìn vào bản demo.
Nhìn chung là, lớp này chỉ dạy những công nghệ lỗi thời và không sử dụng nữa, không được đánh giá đúng và không cung cấp nhiều hướng dẫn.
Dự án phần mềm Capstone
Nói về công nghệ lạc hậu, project này yêu cầu chúng tôi build một GUI để truy cập database bằng các curses. Chúng tôi không được chọn project capstone của mình, và mọi người phải làm một project giống nhau. Chúng tôi được chia theo nhóm 3 người, và bạn chỉ thực hiện một phần nhỏ của project. Lớp này thực sự tệ.
Hầu như không có sự tương tác với giảng viên với học sinh. Tôi không có một chút hứng thú nào với project này và những gì chúng tôi đang học có vẻ rất vô dụng. Để tạo hứng thú của học sinh về một môn học, bạn phải để cho họ tự do chọn những gì họ muốn học. Thật là ngớ ngẩn khi không được chọn lựa trong project capstone của bạn. Project này hoàn toàn vô dụng đối với con đường sự nghiệp của các dev và bắt mọi người học có có nghĩa gì hết.
Lớp học này sẽ tốt hơn gấp 100 lần nếu để cho sinh viên tự ước tính sơ bộ về thời gian họ hoàn thành từng phần nhỏ của project. Vì khi làm vậy, nó không chỉ giúp mọi người thực hành ước tính công việc của mình mà còn cho phép họ làm những gì họ thích.
Kết luận
Tôi không phải là người học giỏi mọi môn học nhưng tôi vẫn có thể trở thành software engineer. Nhưng bỏ lỡ một vài lớp học ở trên có thể tạo ra lỗ hổng lớn trong kho kiến thức của developer. Các môn học mà tôi nghĩ mỗi software engineer cần tham gia là Data Structures và Thuật toán.
Các lớp học khác phụ thuộc vào con đường nghề nghiệp mà bạn chọn. Nếu bạn quyết định đi theo nghề embedded development, bạn nên tìm hiểu về computer architecture. Còn nếu bạn muốn làm frontend engineer, bạn nên học về computer network.
Điểm mấu chốt ở đây là một engineer giỏi không ngừng học hỏi. Nếu bạn bỏ lỡ một số kiến thức mà sẽ hữu ích và có thể áp dụng trong công việc của bạn, thì hãy đi học ngay đi. Đó là cách bạn viết code tốt hơn. Hãy nhớ học hỏi học ngừng.
Via Freecodecamp