Học gì để thành lập trình viên?

Có ba câu hỏi căn bản thường bám đuổi một người đi học: “Học thế nào?”,“Học cái gì?” và “Học để làm gì?”. Trong bài viết “Học lập trình cần bao nhiêu thời gian ?”1, tôi có dịp nêu lại quan điểm của các nhà tâm lí học cũng như các lập trình viên mẫu mực về việc phải tích lũy đủ thời gian rèn luyện và cải tiến liên tục để lập trình viên có thể đi từ học việc tới mức độ chuyên gia trong nghề. Đó là một phần câu trả lời cho câu hỏi “Học thế nào?”. Trong khi đó, với lượng kiến thức đồ sộ cùng với sự thay đổi nhanh chóng của bản thân ngành phần mềm, những người học nghề lập trình ngày nay rất dễ bị ngợp và có thể gặp khó khăn với câu hỏi “Học cái gì ?”. Bài viết này sẽ nỗ lực cung cấp những gợi ý cơ bản.


Hiện nay có rất nhiều kiểu lập trình viên khác nhau, có kiểu chỉ cần vài tháng học việc, có kiểu lại cần bỏ ra tới vài năm.

Trong bài “Học lập trình trong 10 năm” rất có ảnh hưởng, Perter Norvig khuyên lập trình viên: “Hãy học ít nhất khoảng nửa tá ngôn ngữ lập trình, bao gồm: Một ngôn ngữ hỗ trợ việc tạo các lớp trừu tượng (Java hoặc C++), một ngôn ngữ lập trình hàm (Lisp hoặc ML), một ngôn ngữ cú pháp (Lisp), một ngôn ngữ hỗ trợ khai báo định danh (Prolog hoặc C++ templates), một ngôn ngữ hỗ trợ coroutine (Icon hay Scheme), một ngôn ngữ hỗ trợ song song (Sisal)”. Thực tế là một sinh viên thường chỉ học được một nửa trong số đó sau khi hoàn tất một chương trình đại học về kĩ thuật phần mềm (software engineering). Liệu Norvig có yêu cầu cao quá không? Thực ra, đó là lời khuyên dành cho chặng đường 10 năm. Một người học việc có thể chỉ quan tâm tới những gì là “vừa đủ để bắt đầu làm việc”. Khi được hỏi “đâu là bộ kĩ năng tối thiểu mà một lập trình viên cần có?”, Norvig trả lời trong cuốn sách “Lập trình viên nói về công việc”2 rằng: “chỉ cần đủ để nhìn ra được một sự tiến bộ nào đó, và biết cách cải thiện dần”. Điều Norvig nói hàm ý khả năng tự học liên tục. Tuy câu trả lời rất sâu sắc, nhưng rõ ràng là chưa đi thẳng vào vấn đề, chưa đủ cụ thể.

Kì thực, cụm từ “lập trình viên” có thể khiến chúng ta mất phương hướng khi tìm hiểu. Hiện nay có rất nhiều kiểu lập trình viên khác nhau, có kiểu chỉ cần vài tháng học việc, có kiểu lại cần bỏ ra tới vài năm. Mỗi kiểu công việc đó lại đòi hỏi những bộ kĩ năng không hoàn toàn giống nhau. Nói cách khác, đối với việc học lập trình, trước khi tìm hiểu “học cái gì” thì phải tìm hiểu về đầu ra của việc học. Yêu cầu công việc thế nào thì học thế ấy. Người học việc có thể tự học hoàn toàn, tham gia một trung tâm đào tạo lập trình viên chuyên nghiệp, tham gia một chương trình học tập trực tuyến, hoặc học ở trường đại học. Bất kì con đường nào đều có thể dẫn đến cái đích lập trình viên, nhưng chính yêu cầu công việc mà người học việc lựa chọn sẽ quyết định họ cần phải học tối thiểu những gì.

Có một dạng lập trình viên dường như cần ít thời gian học hơn cả là “web front-end developer” (lập trình viên giao diện web, gọi tắt là front-end developer). Tất cả những gì tối thiểu họ cần học là hiểu biết sâu sắc về HTML, CSS, JavaScript, UI/UX và sử dụng một số công cụ cũng như framework cần thiết để thuần thục trong việc thao tác với phần nổi của một hệ thống web, là phần mà chúng ta nhìn thấy khi vào một trang web. Quá trình học tập này có thể chỉ kéo dài vài tháng.

Hiện nay, nhu cầu công việc cho front-end developer không phải là ít. Nhiều nhóm phát triển sản phẩm cần front-end developer để làm đẹp cho giao diện của ứng dụng, hoặc thiết kế trải nghiệm người dùng thật ưu việt. Ngược lại, có những startup lại tập trung làm thuê hoặc làm sẵn những themes, templates (các mẫu giao diện) để đem bán cho các nhà phát triển phần mềm khác. Ngay ở Việt Nam thôi, có startup kiếm tiền triệu đô bằng việc tập trung vào phân khúc này.

Ngược lại với các front-end developer, các lập trình viên back-end (back-end developer) chuyên viết mã lệnh để thực hiện những nghiệp vụ ở phía sau cho một hệ thống phần mềm. Một trang web bán hàng trực tuyến có thể chỉ có một vài trang hiển thị thông tin sản phẩm, vài trang khác để hướng dẫn người dùng mua hàng. Nhưng ở đằng sau, hàng tá chương trình khác được viết ra để thực hiện việc truy xuất thông tin từ cơ sở dữ liệu, gửi thông tin qua mạng, tổ hợp thông tin hiển thị, và thực hiện việc giao dịch trực tuyến với các hệ thống khác của ngân hàng. Nếu hệ thống ứng dụng web là một ngôi nhà, thì phần back-end chính là phần thô của ngôi nhà đã xây xong, còn front-end chính là nội thất và phần decor của ngôi nhà đó. Trong nhiều loại phần mềm hiện nay, phần chìm back-end chiếm phần lớn nỗ lực phát triển.

Quá trình học tập để trở thành back-end developer thường mất công hơn nhiều so với các front-end developer. Họ phải học một trong các ngôn ngữ lập trình chủ đạo như PHP, Ruby, Python, Java, C#…, cùng với các công cụ và thư viện sẵn có để biết cách xử lí nghiệp vụ; học cách sử dụng thành thạo một hoặc vài cơ sở dữ liệu để lưu trữ, truy vấn và xử lí dữ liệu; thành thạo thao tác với các máy chủ web; có hiểu biết về hệ thống đa lớp, bảo mật, lập trình phân tán và mạng, cũng như hiểu biết sâu sắc hơn về quy trình và phương pháp luận phát triển phần mềm (Agile, Scrum, XP, CMMI…) với các nhóm làm việc có quy mô khác nhau. Tùy từng quy mô và yêu cầu mà những lập trình viên back-end cũng sẽ phải thành thạo nhiều hơn các công cụ cộng tác, các công cụ quản trị dự án, các công cụ quản lí mã nguồn và cấu hình, các công cụ và quy trình tự động hóa để gia tăng chất lượng và năng suất. Ở một số lĩnh vực, lập trình viên còn phải hiểu sâu sắc nghiệp vụ của lĩnh vực ấy (domain knowledge) mới có thể làm việc được. Một lộ trình học tập như vậy thường đòi hỏi thời gian gấp đôi hoặc hơn thế so với các lập trình viên front-end.

Kể từ khi các nền tảng điện toán di động lên ngôi, lực lượng lập trình viên ứng dụng di động (mobile app developer) cũng bắt đầu tăng dần. Đây là những người chuyên kiến tạo các ứng dụng nhỏ xinh chạy trên các điện thoại thông minh như chạy hệ điều hành iOS của Apple, Android của Google, Windows Mobile của Microsoft, Tizen của Samsung… Quá trình học việc của các lập trình viên ứng dụng di động gần giống với các lập trình viên back-end, nhưng thường tập trung hơn vào một nền tảng công nghệ (ví dụ lập trình viên iOS thì tập trung phát triển ứng dụng trên hệ điều hành iOS, sử dụng các công cụ và ngôn ngữ lập trình chủ yếu do Apple cung cấp, như Objective-C, Swift, XCode; trong khi lập trình viên Android thì sử dụng các công cụ do Google cung cấp, chủ yếu dùng ngôn ngữ Java để làm ra ứng dụng cho các điện thoại thông minh chạy hệ điều hành Android, v.v.).

Bốn – năm năm trở lại đây, cụm từ “full-stack developer” (tạm dịch: “lập trình viên toàn năng”) cũng hay xuất hiện trên các bản tin tuyển dụng. Thông thường, nó đề cập tới những lập trình viên có khả năng làm được cả phần front-end, back-end và thậm chí là cả mobile app nữa. Những lập trình viên kiểu này thường có hạng (rank) cao hơn, được trả lương cao hơn, và đòi hỏi không chỉ bộ kĩ năng rộng hơn, mà cả kinh nghiệm nhiều hơn. Nhiều startup, do điều kiện đặc thù, đòi hỏi các lập trình viên của mình là full-stack để có thể làm được nhiều việc hơn, phản hồi nhanh hơn với các trục trặc của hệ thống, và sáng tạo hơn trong việc đề xuất các giải pháp mới. Như chúng ta có thể đoán ra, việc trở thành full-stack developer khó khăn hơn, mất thì giờ hơn nhiều so với các loại lập trình viên đã kể ở trên.

Ngoài ra, chúng ta có thể bắt gặp thêm các lập trình viên hệ thống (system programmer) chuyên viết phần mềm hệ thống (hệ điều hành, phần mềm bảo mật…), lập trình viên ứng dụng (application developer) chuyên viết các phần mềm chạy độc lập trên các máy tính cá nhân, lập trình viên nhúng (embedded system developer) chuyên viết mã lệnh để nhúng trực tiếp vào các thiết bị không phải là máy tính (như tủ lạnh, điều hòa, ô tô, hay hàng loạt những thiết bị IoT đang ra đời…), lập trình viên game (chuyên viên lập trình trong các dự án sản xuất trò chơi máy tính), v.v. Thông thường, lộ trình học tập của những lập trình viên này có thể dài tương đương với các full-stack developer hoặc hơn.

Như chúng ta thấy, bài này đã cung cấp một lát cắt về những lộ trình học tập khác nhau liên quan đến một số loại hình lập trình viên phổ biến. Đó tất nhiên chưa phải là toàn bộ những công việc mà các lập trình viên trên thế giới đang làm. Ngành phần mềm luôn chuyển động rất nhanh, liên tục sinh ra những kiểu công việc chưa từng có. Đôi khi các công việc này đòi hỏi những người cần ít năng lực hơn, nhưng cũng có khi đòi hỏi nhiều năng lực hơn. Tuy vậy, có một vài thứ mà các lập trình viên mọi thể loại đều phải biết qua hoặc thành thục. Thông thường, đó là những phần “nền tảng” trong các chương trình đào tạo lập trình chính quy. Có thể kể đến: cơ sở toán học (logic và toán rời rạc), ngôn ngữ lập trình, hệ điều hành, quy trình phát triển phần mềm, phân tích nghiệp vụ, thiết kế và kiến trúc, kiểm thử phần mềm, thiết kế tương tác, cấu trúc dữ liệu và giải thuật, đạo đức nghề nghiệp. Ngoài ra, người học việc cũng phải tích lũy đủ những kĩ năng mềm căn bản như kĩ năng giao tiếp, cộng tác và làm việc nhóm, kĩ năng phản biện và đặc biệt là năng lực tự học suốt đời. Việc trang bị những kiến thức nền này sẽ giúp lập trình viên có thể đi xa hơn trên con đường nghề nghiệp đầy thử thách nhưng hết sức thú vị.
———
* Tác giả là cố vấn Phát triển nghề nghiệp tại CodeGym.
1 http://tiasang.com.vn/-giao-duc/Hoc-lap-trinh-can-bao-nhieu-thoi-gian—10643
2 Peter Seilbel, Coders at work: Reflections on the craft of programming, 2009, NXB Apress
3 https://www.quora.com/During-Facebook’s-startup-did-Mark-Zuckerberg-write-all-the-code-in-one-language-or-did-he-know-most-of-the-languages-at-that-time-which-are-being-used-today

 

 

Tác giả