Lưu Vĩnh Toàn, K40, CNTT ĐHBK Hà nội. (Nguồn từ SOICT)

Image for post

Khi viết được một chương trình làm được một việc gì đó hay có trong tay tấm bằng kỹ sư Công nghệ thông tin Bách Khoa, liệu bạn có tự hào mình đã là một kỹ sư phần mềm (Software Engineer) không?

Chúc mừng bạn, bạn ít nhất đã ở level 1 của một Software Engineer!

Level 1: Runable program

Bạn viết một chương trình bằng một ngôn ngữ lập trình và nó chạy được, cho dữ liệu vào nó hiện được kết quả ra. Bạn đã hoàn thành level 1.

Level 2: Test, code convention, IDE

Chương trình của bạn chạy được không có nghĩa là nó sẽ chạy được mãi và chạy được mọi trường hợp. Chính vì thế bạn phải biết viết các unit test, integration test để đảm bảo nó vẫn chạy đúng, không bị phát sinh lỗi khi bạn thay đổi code hay có các trường hợp đặc biệt đầu vào xảy ra. Ví dụ 1 đoạn chương trình cực đơn giản là thêm 1 phần tử vào một dãy, bạn đã kiểm tra trường hợp phần tử đó có đúng kiểu không? Nếu nó là null thì sao? Nếu dãy đó là null hay đã quá giới hạn chỉ số thì sao? Có đúng khi bạn thêm 1 phần tử thì độ dài của dãy tăng lên 1 không? Đừng tiếc một vài phút viết một cái test vì có thể tương lai bạn/ đồng nghiệp bạn sẽ mất một ngày để debug một chương trình khi nó có lỗi. Chính vì việc test có vai trò rất quan trọng trong việc đảm bảo chất lượng chương trình nên mới ra đời khái niệm Test- Driven-Development: bạn định nghĩa các test cases trước cả khi phát triển chương trình.

Khi viết chương trình các dòng code của bạn đã theo các quy chuẩn về viết code chưa hay bạn lên xuống dòng tuỳ hứng, dùng lần lượt ký tự từ a-z đặt tên biến? Khi đặt tên hàm, tên thủ tục, tên chương trình bạn nên đặt thế nào? Mỗi khối chương trình nên có tối đa bao nhiêu vòng lặp hay if-then? Có rất nhiều tool để giúp bạn tuân theo các convention đó. Bạn nên mastering một IDE (integrated development environment) cho ngôn ngữ lập trình của bạn. Hãy bớt chút thời gian đặt setting cho IDE, tìm hiểu code convention để viết được những đoạn code dễ đọc, dễ hiểu, dễ kế thừa và phát triển.

Level 3: Data structure, algorithm

Để tiết kiệm thời gian và ngại suy nghĩ, bạn viết một chương trình đơn giản, chạy lấy được và nghĩ là: giờ bộ nhớ nhiều, tốc độ xử lý nhanh, vài ms hay tiết kiệm vài byte bộ nhớ đáng mấy. Ví dụ kiểm tra 1 phần tử có thuộc 1 dãy cho trước hay không, bạn cứ dùng for-loop kiểm tra lần lượt từng giá trị. Tuy nhiên biết đâu có một ngày đoạn code của bạn là một phần của hệ thống có 100, rồi 1’000, rồi 1’000’000 người sử dụng, dữ liệu của bạn trước có 1000 giờ có hàng triệu, trăm triệu items. 1ms xử lý chậm giờ có thể là 1h, 1byte bộ nhớ giờ có thể là 1M. Toàn bộ hệ thống có thể sập và không thể scale được nữa.

Nên đừng quên những bài học cơ bản về cấu trúc dữ liệu và giải thuật khi viết một dòng code. Nếu có dùng 1 thư viện, cấu trúc dữ liệu sẵn có cũng nên đọc cẩn thận xem nó được thiết kế thế nào. Thi tuyển vào các công ty công nghệ hàng đầu thế giới như Google, Facebook, Microsoft dù bạn có 0 hay 10 năm kinh nghiệm, dùng dữ liệu và giải thuật hợp lý để giải quyết 1 vấn đề sẽ luôn có trong bài phỏng vấn.

Level 4: Software design and deployment

Bạn viết được một đoạn code chạy tối ưu, test đầy đủ, đúng code convention. Tuy nhiên đó là một phần hoàn hảo trong hệ thống chứ không có nghĩa bạn có một hệ thống hoàn hảo. Bạn đã biết thiết kế và triển khai một hệ thống phần mềm chưa? Hệ thống của bạn cần những thành phần nào? Các thành phần của hệ thống sẽ tương tác với nhau ra sao, mở rộng, thừa kế thế nào? Bạn hiểu thế nào là Design pattern? Nếu đoạn code của bạn được gọi đến bởi hàng loạt yêu cầu đồng thời bạn phải thiết kế ra sao? Tại sao viết một chương trình để nhận một truy vấn, đọc dữ liệu từ DB và hiện thị kết quả cho user bạn cần kiến trúc MVC (Model-View-Controller)? Từ lúc viết những dòng code đầu tiên đến lúc có người dùng nó bạn cần những bước gì?

Hãy thực hành cách thiết kế và triển khai một hệ thống thực tế hoàn chỉnh để bạn lên một level về software engineer nữa.

Level 5: Technology adaptation

Bạn theo đuổi một ngành công nghệ mà công nghệ thì liên tục thay đổi, phát triển. Sẽ rất lãng phí thời gian nếu bạn cứ mê mải với hàng nghìn dòng code dù bạn rất tâm huyết viết ra để giải quyết một vấn đề mà không biết có những thư viện, framework, platform đã làm được những điều tương tự. Bạn lập trình Java hàng ngày, đâu là khác biệt giữa Java 7 và Java 8 hay bạn vẫn nghĩ cuối cùng ngôn ngữ lập trình cũng chỉ là những câu lệnh if, else, for? Tại sao bạn cứ lo mua hay setup một server để chạy hệ thống của bạn dù chưa biết nó thành công hay không, trong khi có rất nhiều cloud platform giúp bạn có một loạt server chạy thử trong vài click chuột?

Hãy thường xuyên cập nhật những công nghệ mới trong lĩnh vực của bạn, của thế giới và áp dụng nó, nhưng hãy giữ cho mình một sự ham mê tìm tòi, thử nghiệm, để hiểu rõ xem công nghệ đó nó giải quyết vấn đề gì, có cần phải dùng nó bây giờ hay không? Thậm trí phải xem cả source code và sửa đổi nó để làm được đúng việc bạn cần. Còn nếu chỉ copy-paste một thư viện hay dùng một framework, bạn dễ bị coi là code monkey chứ không phải là một chuyên gia công nghệ.

Level 6: Collaboration

Bạn viết được những đoạn code tối ưu, thiết kế hệ thống hoàn hảo và dùng những công nghệ mới nhất là bạn tự tin có thể tự mình xây dựng một hệ thống tuyệt vời phục vụ hàng triệu người dùng trong thời gian dài? Ngoài Nguyễn Hà Đông với sự thành công ngắn ngủi của FlappyBird, mình không thấy nhiều người may mắn như vậy. Chắc chắn bạn sẽ làm việc với một team để làm ra một hệ thống lớn.

Khi phải làm một dự án chia sẻ code nhiểu người, bạn có biết github, một platform version control and source code management? Bạn đã thành thạo các thao tác branch, checkout, commit, push, merge, rebase, chery-pick, code review.. chưa? Bạn học kinh nghiệm từ người lâu năm hay truyền kinh nghiệm cho người mới vào nhóm thế nào? Bạn chuyên làm về backend thì khi trao đổi với đồng nghiệp làm frontend hay một product manager bạn cần những kỹ năng gì? Trong một team meeting cách bạn nghe và đóng góp ý kiến với người trong team ra sao? Khi pair-programing với một đồng nghiệp bạn vừa thấy tăng hiệu suất vừa học hỏi được nhiều điều hay thấy khó chịu vì thằng đấy cứ tròng trọc nhìn màn hình làm mình không tập trung được?

Đừng nghĩ làm việc nhóm là kỹ năng “mềm”. Nếu bạn không “cứng” về chuyên môn làm việc nhóm cũng rất khó. Luyện được những kỹ năng giúp bạn cộng tác, làm việc nhóm hiệu quả là bạn đã nhân lên được sự thành công của bạn.

Level 7: Monitoring and analytics

Hệ thống của bạn đã chạy không có nghĩa là bạn xong việc. Nếu ổ đĩa hết, bộ nhớ hết, mạng bị nghẽn, server down, người sử dụng không có được kết quả mong muốn, làm sao bạn biết và xử lý thế nào? Dùng các công cụ logging, profiling, monitoring, alerting là những thứ bạn phải biết để trang bị cho hệ thống. Bạn có thể chỉ mất 1h hay mất cả 1 tuần để phát hiện và xử lý một vấn đề của hệ thống chính là nhờ những công cụ này.

Bạn có biết khái niệm A/B testing không? Có biết rule 20/80 không? Làm sao bạn chứng minh được những gì bạn vừa làm, công nghệ bạn vừa áp dụng giúp cải tiến hệ thống hay làm nó tệ đi? Biết đâu khi phân tích một đống dữ liệu thu nhận được từ việc theo dõi hệ thống, theo dõi hành vi người dùng, bạn sẽ nghĩ ra một tính năng mới hay giúp hệ thống của bạn xử lý tối ưu hơn trước nhiều lần.

Kỹ năng đánh giá, phân tích kết quả, phân tích dữ liệu là kỹ năng rất cần thiết để bạn có cách tiếp cận data-driven, thuyết phục mọi người hay đưa ra quyết định bằng những con số chứ không phải cảm tính.

Level 8: Business impact

Làm một kỹ sư phần mềm không có nghĩa là bạn sẽ mãi mãi làm theo những gì projet manager, product manager hay sếp của bạn yêu cầu. Nhiệm vụ chính của bạn là xây dựng một hệ thống tốt để mang lại giá trị nhiều nhất cho công ty, cho xã hội. Nói yes/no là cả một nghệ thuật nếu bạn không tích luỹ đủ những kỹ năng từ các level trước.

Nếu phần lớn các việc được giao bạn đều từ chối dĩ nhiên bạn chẳng xây dựng được cái gì. Nếu việc gì bạn cũng nhận làm bạn sẽ bị overload, không hoàn thành công việc, ảnh hưởng tiến độ triển khai sản phẩm. Cũng có thể bạn sẽ quyết định chấp nhận lùi một bước, từ chối làm 1 tính năng để cập nhật một công nghệ mới cho hệ thống, nền tảng của 10 tính năng mới khác. Cũng có thể một chức năng mới, một cải tiến mới của hệ thống mang lại giá trị lớn cho công ty lại đến từ việc bạn phân tích một loạt dữ liệu của hệ thống chứ không phải từ đề xuất của một product manager.

Khi biết đánh giá các priority, proactive đưa ra những quyết định, sáng kiến để phát triển hệ thống phần mềm có ảnh hưởng lớn đến giá trị công ty tức là bạn đã tiến thêm một level nữa cho sự nghiệp.

Level 9: Contributing and sharing at international level

Level cao nhất chỉ có thể đạt được nếu bạn đã sẵn sàng dùng kiến thức, kinh nghiệm của bạn để đóng góp, chia sẻ và được cộng đồng công nhận. Bạn đạt được level này khi bạn có những thư viện được dùng, download bởi hàng trăm, hàng nghìn kỹ sư khác. Hay bạn tham gia đóng góp code của bạn vào những dự án mã nguồn mở để thêm tính năng, khắc phục lỗi cho cộng đồng các nhà phát triển. Hoặc bạn có những bài trình bày, chia sẻ kinh nghiệm tại các hội thảo quốc tế của các nhà phát triển phần mềm.

Khi thành công trong công việc, trong sự nghiệp, hãy nhớ tới những lúc bạn bị bế tắc bởi một vấn đề và giải quyết được nó nhờ ai đó chia sẻ kinh nghiệm hay từ vài dòng code, thư viện bạn search được từ đâu đó trên internet!

Lời kết

Để đạt được 9 level trên có thể bạn chỉ mất 1 năm kể từ khi ra trường nếu bạn quyết tâm đó là con đường giúp bạn đi đến mọi cái đích trong tương lai và bạn đã tích luỹ một số điều ngay từ khi còn ngồi trên ghế nhà trường, hay cũng có thể bạn phải cần đến 10 năm vì bạn thấy đâu đã cần nó. Cũng có thể bạn đã thành công về tiền tài, danh vọng dù bạn chẳng cần level nào trong những gì mình liệt kê nữa. Tuy nhiên, mình tin là để ngành CNTT của Việt nam cạnh tranh được với thế giới, để chúng ta có những startup giá trị triệu đô hay tạo ra những hệ thống phần mềm hàng chục triệu người Việt dùng, chúng ta cần có những người kỹ sư có level như vậy.

Cách đây 2 năm khi tham gia một hội thảo các nhà phát triển liên quan lĩnh vực Big Data tại châu Âu, một hình ảnh trong keynote của hội nghị khiến mình vẫn nhớ: Đó là tấm bản đồ thế giới với mỗi điểm đỏ là vị trí những người tham gia đóng góp vào các dự án mã nguồn mở Apache, một cộng đồng cung cấp rất nhiều các công nghệ phần mềm cho thế giới. Khi những chấm đỏ dày đặc ở châu Âu, châu Mỹ và thậm trí ở xuất hiện ở Thái, Singapore, Malaysia, thì trên bản đồ quen thuộc hình chữ S nước Việt Nam chưa có một điểm đỏ nào…

Written by

Be Curious!| ☕️+✍🏼=❤️ | buihuycuong.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store