Những điều bạn cần biết để phát triển phần mềm tốt hơn

Programming Tech Knowledge

Hướng dẫn dành cho những người mới bước chân vào lĩnh vực phần mềm, được tác giả Extreme Code chia sẻ trên yozmIT. Tác giả đã có kinh nghiệm làm việc trong nhiều công ty khác nhau và hiện đang là CTO của một doanh nghiệp startup.

Những nhà phát triển phần mềm xuất sắc vô cùng hiếm. Một trong số những lý do cho điều đó là để phát triển phần mềm tốt, nhà phát triển cần có rất nhiều kỹ năng và năng lực. Hơn nữa, tiêu chuẩn về một nhà phát triển xuất sắc có phần mơ hồ – liệu một nhà phát triển giúp doanh nghiệp startup thành công là nhà phát triển xuất sắc, hay người tạo ra kỹ thuật vượt trội là nhà phát triển xuất sắc, hay người tạo ra những sản phẩm hoặc dịch vụ có lợi nhuận cao mới là người xuất sắc; tuy nhiên, chúng ta hãy cùng tìm hiểu về những điều một nhà phát triển nhất định cần biết để thực hiện tốt công việc phát triển phần mềm.

Nội dung dưới đây cũng chính là một trong những lý do người ta không để các sinh viên mới tốt nghiệp hay các nhà phát triển mới làm việc thực tế ngay lập tức, mà phải huấn luyện họ trong một thời gian dài. Ngay cả trong số những nhà phát triển có kinh nghiệm cũng có những người không được đào tạo bài bản về những kỹ năng này, hơn nữa vấn đề quan trọng trong suy nghĩ của mỗi người cũng là khác nhau, vậy nên xin lưu ý rằng, nội dung dưới đây được chia sẻ dựa trên kinh nghiệm và suy nghĩ của cá nhân tôi.

1. Ngôn ngữ lập trình và framework

Đây là điều vô cùng hiển nhiên. Có một số người nghĩ rằng ngôn ngữ lập trình chỉ là một công cụ nên không mấy quan trọng. Ngôn ngữ lập trình đúng là công cụ, nhưng chắc chắn phải có sự khác biệt lớn giữa người sử dụng thành thạo công cụ và người không thành thạo. Thường ngày, sự khác biệt này không thể hiện ra, nhưng khi đối mặt với một vấn đề khó, khoảng cách ấy chắc chắn sẽ trở nên rõ ràng.

Lấy ví dụ, trong số những nhà phát triển Android thường xuyên sử dụng Java, liệu có bao nhiêu người biết đến khái niệm reflection? Có lẽ là không nhiều. Đương nhiên, bạn có thể tìm đọc và sử dụng nó mỗi khi cần, nhưng nếu không biết những khái niệm như thế này, bạn sẽ bị lép vế so với những người biết chúng trong trường hợp cần sử dụng chúng để giải quyết vấn đề. Hơn nữa, nếu bạn nắm chắc những kiến thức được gọi là “kỹ thuật cao cấp” của từng ngôn ngữ và thành thạo cách sử dụng chúng, bạn cũng có thể áp dụng các mẹo để nâng cao hiệu suất phát triển của mình. Chính những điều này là thứ tạo ra sự khác biệt giữa thù lao của các nhà phát triển. 

Kiến thức về framework và library bản thân đang sử dụng cũng rất quan trọng. Có rất nhiều nhà phát triển gặp khó khăn khi cần thêm mới hoặc chỉnh sửa tính năng, vì họ chỉ sử dụng framework và library mà không tìm hiểu sâu về chúng. Hơn nữa, có nhiều trường hợp trong thư viện mã nguồn mở vẫn còn tồn đọng nhiều lỗi, bạn cần hiểu chúng đến mức có thể tìm và giải quyết được các lỗi này. Việc hiểu những kiến thức liên quan đến bảo mật hay cách xử lý song song trong ngôn ngữ lập trình và framework bản thân đang sử dụng thật sự rất quan trọng.

2. Lập trình hướng đối tượng (OOP) và Design Pattern

Thật ra, tôi cũng cảm thấy không chắc chắn khi nói chuyện về OOP trong thời đại ngày nay, khi chúng ta đang ngập trong rất nhiều phương pháp luận lập trình khác. Tuy nhiên, theo suy nghĩ của cá nhân tôi, sức sống của OOP vẫn còn rất dài. Hơn nữa, lập trình hướng đối tượng rất hiệu quả trong những dự án quy mô lớn. Đây cũng là một phần mà những người mới làm việc trong ngành còn thiếu sót: mặc dù là kiến thức đã học ở trường, không nhiều người có thể sử dụng nó một cách hiệu quả. Design Pattern cũng vậy, chắc hẳn sẽ có những người thích và không thích chúng, nhưng trong những dự án phát triển dịch vụ có quy mô lớn ở một mức nhất định, tôi nghĩ rằng có sự khác biệt lớn giữa người không biết với người biết và áp dụng được những kiến thức này. 

3. Cấu trúc dữ liệu và Thuật toán

Thật ra cấu trúc dữ liệu và thuật toán đối với các nhà phát triển đa phần chỉ là việc sử dụng thư viện, vì lý do thời gian. Họ cũng ít khi cần phải xem xét và làm việc với cấu trúc bên trong của một thuật toán nào đó. Tuy nhiên, khi cần giải quyết một vấn đề mới hay một nhiệm vụ mà mọi người thường không làm, kiến thức liên quan đến cấu trúc dữ liệu và thuật toán là vô cùng quan trọng trong việc tiếp cận vấn đề, suy nghĩ đa chiều và tìm ra hướng giải quyết. 

Tôi nghĩ rằng đó chính là một trong những lý do các công ty thường tổ chức vòng kiểm tra lập trình trong quá trình phỏng vấn. (Đương nhiên, tính hiệu quả của vòng kiểm tra lập trình trong không khí căng thẳng của cuộc phỏng vấn lại là một vấn đề cần bàn luận khác.) Dù sao thì, việc tìm ra thuật toán tối ưu nhất để đáp ứng các hạn chế về thời gian và không gian bộ nhớ là luôn luôn quan trọng. Việc tối ưu bằng thuật toán lúc nào cũng là vấn đề quan trọng trong phát triển phần mềm.

Đọc thêm: Việc học thuật toán liệu có quan trọng đối với nhà phát triển front-end?

4. Linux / Unix

Khi là một nhà phát triển, môi trường mà bạn chắc chắn sẽ gặp phải chính là Linux. Không phải là bạn cần sử dụng tốt Linux hay Ubuntu, mà là bạn cần phải thành thạo shell và CLI, cho dù là làm việc trên Linux hay MacOS. Môi trường CLI của Linux / Unix có thể đã trở nên lỗi thời, nhưng dù sao thì vẫn còn nhiều chương trình chỉ hỗ trợ CLI, và hiểu biết về hệ thống Linux / Unix cũng rất quan trọng trong việc nâng cao hiệu suất cho nhà phát triển. 

5. Test (Test Driven Development – TDD)

Kiểm thử (test) là một kỹ năng khác mà những nhà phát triển mới còn thiếu. Có lẽ không phải ai cũng nắm vững các kiến thức về TDD, đặc biệt là khi cần phát triển sản phẩm trong thời gian có hạn, nhưng chắc chắn có lý do khiến các nhà phát triển xuất sắc nhấn mạnh tầm quan trọng của nó.

Đương nhiên, phần lớn các nhà phát triển đều biết rằng những kỹ năng như unit test hay regression test đều hữu ích trong việc nâng cao hiệu suất, nhưng trong thực tế không nhiều người có thể trực tiếp viết testcase, áp dụng chúng vào dự án và thúc đẩy nâng cao hiệu suất thành công.

Đối với những nhà phát triển mới, rất hiếm người viết cả testcase cho những dự án ở trường học, do đó có thể nói đây là một trong những điểm khác biệt lớn giữa trường học và doanh nghiệp. Vậy nên, bạn cần luyện tập thói quen viết testcase ngay từ những bước đầu của dự án.

6. Hệ thống quản lý phiên bản – Version Control System (VCS)

Các hệ thống quản lý phiên bản phổ biến trước đây là CVS và SVN, nhưng hiện nay tất cả mọi người đều dùng git. Chắc chắn có lý do khiến các hệ thống VCS cơ bản biến mất và git thống trị thiên hạ. Nếu bạn sử dụng đúng cách, git sẽ rất hiệu quả. Thật ra có thể nói rằng gần như không có nhà phát triển nào không biết git, nhưng có lẽ không có nhiều nhà phát triển có thể sử dụng git đúng cách.

Một trong những lý do gây ra điều đó vẫn là sự khác biệt giữa trường học và doanh nghiệp. Ưu điểm của git là quản lý các phiên bản phân tán, nhờ đó người dùng có thể phát triển các chiến lược hợp nhất (merging) và phân nhánh (branching) đa dạng tùy theo nhu cầu. Ở các doanh nghiệp thường có nhiều dự án hợp tác với quy mô lớn, nhưng ở trường học thì gần như là không. Do đó, nhiều nhà phát triển sử dụng git hệt như SVN, cũng có trường hợp sử dụng luôn SVN. Vậy nên nếu là một nhà phát triển mới, bạn nên tham gia những dự án hợp tác có quy mô tương đối lớn, hoặc các dự án phát triển thư viện mã nguồn mở. Sau khi đóng góp mã nguồn một vài lần, bạn sẽ dần quen với git và hiểu được lý do tại sao git là một VCS xuất sắc.

Đọc thêm: Xây dựng chiến lược phân nhánh mã nguồn với lời khuyên từ các chuyên gia

7. Style guide

Style guide cũng là một vấn đề quan trọng khác mà các nhà phát triển mới không nắm chắc. Đây có thể bị xem là một vấn đề nhỏ, nhưng thật ra lại là một trong những yếu tố cực kỳ quan trọng khi làm việc trong các dự án cộng tác có quy mô lớn. 

Ngày xưa, khi quy mô của chương trình còn nhỏ, mã nguồn của số ít những lập trình viên thiên tài như John D. Carmack được cho là xuất sắc. Đương nhiên là bây giờ mã nguồn của lập trình viên thiên tài vẫn rất tuyệt. Tuy nhiên, khi mức độ phức tạp của các chương trình ngày càng tăng lên, không phải mã nguồn thể hiện cá tính của nhà phát triển mà mã nguồn có thể nâng cao năng suất và hiệu suất, đồng thời tối ưu và giảm thiểu tối đa các lỗi phát sinh mới là xu thế ngày nay.

Chẳng phải tự nhiên mà các doanh nghiệp khổng lồ ở Thung lũng Silicon như Google và Airbnb tạo ra các style guide. Khi đọc những style guide này, bạn có thể cảm nhận rằng họ đã nỗ lực rất nhiều trong việc hỗ trợ các nhà phát triển tạo ra mã nguồn ít lỗi và nâng cao hiệu suất, năng suất làm việc. Đương nhiên, không có đáp án đúng nào cho quy tắc viết mã nguồn cả. Tuy nhiên, các nhóm và công ty cần tạo ra bộ quy tắc của riêng mình và đưa vào trong đó những yêu cầu phù hợp với mục đích. Đây là một việc rất quan trọng. 

8. Hợp tác (CI, CD, Documentation)

Trong phần trên tôi đã vài lần nhắc đến việc hợp tác. Việc tổng hợp tất cả những điều đó, tạo ra một môi trường CI, CD và chuẩn hóa tài liệu cũng rất quan trọng. Những kỹ năng này không thể có được nếu nhà phát triển chưa từng tham gia một dự án thực tế có quy mô tương đối, nên đây cũng là một trong những phần mà các nhà phát triển mới cần học hỏi.

Nếu là một nhà phát triển mới, bạn nên cố gắng thực hiện các công đoạn như sử dụng công cụ CI trong chiến lược phân nhánh, kiểm tra các testcase và style guide khi commit, viết test report hay deploy tự động khi commit và các công đoạn giúp nâng cao hiệu suất thực hiện dự án khác.

Về tài liệu, việc soạn thảo tài liệu có thể bị xem là lãng phí thời gian nên hiện vẫn tồn tại các ý kiến trái chiều xung quanh vấn đề này. Tuy nhiên, tôi nghĩ rằng không có một đáp án chính xác nào cả. Bạn nên thực hiện theo hướng có thể tối ưu hóa hiệu suất công việc, tùy theo các điều kiện cụ thể của dự án hay công ty. 

Có điều, rất nhiều nhà phát triển mới không có một chút kinh nghiệm nào liên quan đến việc này, do đó tôi đề xuất họ tham gia một dự án mã nguồn mở có tài liệu tốt và cố gắng thích nghi với dự án. Khi cần nộp portfolio, bạn sẽ gây ấn tượng tốt nếu portfolio được soạn và trình bày một cách rõ ràng, càng tuyệt hơn nữa nếu bạn từng có kinh nghiệm viết một tài liệu như api documentation.

9. Ngoài ra

Kiến thức về domain có thể là điều quan trọng nhất để phát triển một phần mềm tốt. Phần mềm xuất sắc là phần mềm được người dùng cuối sử dụng và yêu thích, do đó để tìm ra cách phát triển một phần mềm tốt, bạn cần có cả kiến thức về domain. 

Năng lực giao tiếp cũng rất quan trọng. Ngày nay, việc phát triển độc lập không hề dễ dàng và bạn sẽ thường phải hợp tác. Do đó, bạn cần giao tiếp tốt với người khác, cho dù là với nhà phát triển khác hay đồng nghiệp ở vị trí khác.

Khả năng học tập cũng rất quan trọng. Khi nhà tuyển dụng tuyển chọn các nhà phát triển mới, họ sẽ đánh giá tiềm năng của ứng viên. Lúc này, yếu tố quyết định sẽ là liệu khả năng học tập của ứng viên xuất sắc đến mức nào. Hơn nữa, các kỹ thuật ngày nay luôn thay đổi nhanh chóng, nên việc nhấn mạnh khả năng học tập không bao giờ là thừa thãi.

Kiến thức toán học và kỹ năng tiếng Anh cũng có thể đóng vai trò quan trọng. Kiến thức toán cần thiết khi làm nghiên cứu, còn tiếng Anh luôn quan trọng, vì bạn sẽ cần tìm đọc luận văn hoặc các vấn đề được đăng tải trực tuyến trên các blog kỹ thuật như StackOverflow hay github.

Kết

Trên đây, tôi đã đề cập đến nhiều vấn đề. Tuy nhiên, tầm quan trọng của các yếu tố phụ thuộc vào việc bạn đang làm việc trong lĩnh vực nào, ở công ty nào. Cũng có rất nhiều những yếu tố khác quan trọng không kém nhưng tôi chưa đề cập ở đây. 

Bạn nên lưu ý rằng chúng ta không cần phải thành thạo tất cả những điều này, và cũng không thể làm được như vậy nếu không phải một thiên tài. Tôi cũng gặp khó khăn trong việc giao tiếp, cũng có những lúc tự trách mình thiếu sót khi không thể hiểu nổi một vấn đề nào đó. Nếu tôi thành thạo hết tất cả những thứ ở trên thì tôi đã ở Google hay Facebook rồi chứ nhỉ. Haha. Tôi chỉ luôn nỗ lực để trở thành một nhà phát triển tốt hơn mà thôi.

Vậy nên, những người đang mơ ước trở thành một nhà phát triển phần mềm xin đừng cảm thấy áp lực khi có quá nhiều thứ cần phải học. Bạn chỉ cần nỗ lực và trải nghiệm dần dần, rồi trở nên tốt hơn từng chút một.


The original article: SW 개발을 개발을 잘하기 위해서 필요한 것들
The translated article above belongs to the author Extreme Code and yozmIT (요즘IT). Metacoders commits not to use this content for any commercial purpose.