Có rất nhiều bạn hỏi mình là “Cần phải học những gì để trở thành một Android developer giỏi?“, “Lập trình viên Android cần học những gì“… Nếu cách đây vài năm thì yêu cầu với một Android Developer rất đơn giản, chỉ cần biết ít kiến thức về Java, Android SDK, Layout… là có thể được nhà tuyển dụng đồng ý rồi.
Nhưng hiện tại thì đã khác, thị trường lao động đã yêu cầu cao hơn rất nhiều. Đặc biệt là ngành IT, sự cạnh tranh lại càng khốc liệt. Nhà tuyển dụng không chỉ cần một Android developer mà chỉ biết mỗi Java, Kotlin. Họ còn cần nhiều hơn thế nữa.
Bài viết này mình sẽ chia sẻ với các bạn những kỹ năng mà nhà tuyển dụng cần ở một Android developer nhé. Và cũng để trả lời cho câu hỏi: Lập trình viên Android cần học những gì?
Nội dung chính của bài viết
Bạn vẫn chưa biết tạo một ứng dụng Android đơn giản
Nếu bạn đang suy nghĩ làm thế nào để trở thành một Android developer giỏi, nhưng bạn vẫn chưa biết tạo một ứng dụng Android đơn giản, dù là chỉ là hello world. Thế thì quá sớm để bạn đọc bài viết này.
Lời khuyên chân thành của mình là bạn nên đọc series hướng dẫn lập trình android này trước đã: Tự học lập trình Android trong 24 giờ.
Hãy đọc loạt series trên đã nhé. Sau đó trở lại bài viết này khi bạn đã tích lũy được một số kiến thức cần thiết.
Junior Android developers có 0-2 năm kinh nghiệm
Android là một hệ kiến trúc phức tạp, nó bao gồm nhiều tầng nhiều lớp từ phần nhân Linux tới tầng Application. Tuy nhiên, điều khiến Google tự hào nhất khi tạo ra Android OS đó chỉnh là Android Framework.
Khi bạn nghĩ tới việc bước chân vào sự nghiệp lập trình Android chuyên nghiệp. Chuyên nghiệp ở đây là bạn có thể kiếm tiền từ chính công việc viết ứng dụng. Là sự hiểu biết sâu sắc về từng dòng code mà mình viết ra. Đây là lúc bạn nên tìm hiểu về Android framework.
Bỏ qua một bên chuyện chọn Java hay Kotlin, bỏ qua các thư viện 3rd chia sẻ nhan nhản trên Github… Bạn nên tập trung vào các khái niệm cốt lõi, tìm hiểu thật kỹ Android framework.
Tuy nhiên, nếu nói là phải biết hết tất cả Android Framework thì hơi quá. Mình xin đưa ra một số chủ đề để trả lời cho câu hỏi: Lập trình viên Android cần học những gì?
Android Memory Management và Process Death
Một trong những vấn đề phức tạp nhất khi phát triển ứng dụng Android là làm cho ứng dụng hoạt động ổn định và tin cậy. Trong cả trường hợp khi tài nguyên bị cạn kiệt, hệ thống phải can thiệp.
Có một use case như thế này: Khi tài nguyên bị cạn kiệt, ứng dụng của bạn đang chạy ngầm hoặc ở trạng thái inactive, và bị hệ thống kill để lấy tài nguyên. Nhưng khi người dùng mở lại ứng dụng của bạn. Họ hy vọng nó sẽ hoạt động như chưa bao giờ bị kill vậy.
Đây là một skill mà nếu bạn có kinh nghiệm xử lý thì quá tuyệt vời. Trong tương lai gần, nếu mọi người ủng hộ, mình ra viết riêng một bài viết riêng về chủ đề.
Lifecycles
Nếu ai đó hỏi: đâu là gốc rễ của sự phức tạp khi phát triển ứng dụng Android?
Mình sẽ không cần phải suy nghĩ, mà hét lên rằng: “lifecycles“.
Application, Activity, Fragment, Service, BroadcastReceiver, ContentProvider… đều có vòng đời riêng và cũng phức tạp không kém. Vẫn chưa đủ, Google lại rất hay chịu khó cập nhật các thư viện và frameworks có những vòng đời phức tạp không thua ai. Có thể kể đến như Loader, ViewModel and LiveData.
Có một điều thú vị là chúng ta sử dụng và làm việc với các vòng đời (phổ biến như Activity, Fragment…). Nhưng lại chưa có một thuật ngữ địng nghĩa về vòng đời. Chúng ta cứ sử dụng như một thói quen. Hoặc có thể hiểu rõ về nó, nhưng bảo định nghĩa nó đi thì lại chịu, không biết.
Vòng đời của một component là một abstract Final State Machine. Abstract ở đây có nghĩa là một trạng thái được xác định trước, cũng như điều kiện chuyển đổi giữa chúng. Nhưng nó vẫn chưa đầy đủ, và ứng dụng của bạn có thể phải điền vào các phần còn thiếu để nó hoạt động đầy đủ.
Nghe có trừu tượng nhỉ, thế lấy ví dụ như vòng đời của Activity. Khi bạn tạo một class và kế thừa Activity, bạn sẽ cần phải override lại các callback như onCreate()
, onStop()
… Trong đó, bạn sẽ cần khởi tạo view, hay lưu dữ liệu mỗi khi ứng dụng bị tạm dừng. Đó chính cái ý là phải bổ sung phần còn thiếu để ứng dụng hoạt động đầy đủ.
Bây giờ, có thể bạn không cần phải hiểu một cách đầy đủ về vòng đời. Nhưng bạn phải nắm được cách ý nghĩa và cách sử dụng chúng một cách thuần thục.
Nếu không, ứng dụng của bạn sẽ trở thành một mớ hỗn độn, và tiềm ẩn rất nhiều lỗi nghiêm trọng. Nếu có thể, mời bạn đọc bài viết này: Vòng đời của Activity – Tìm hiểu và thực hành
Context
Context là một thành không thể thiếu của mọi ứng dụng Android. Nếu không có Context, bạn sẽ không thể truy cập vào được các tài nguyên của hệ thống.
Cũng giống như lifecycles, thật khó để giải thích một cách thấu đáo về Context. Bởi vì Context là một God Classes, chịu rất nhiều trách nhiệm trong hệ thống. Do đó, không thể mô tả Context chỉ trong một vài câu được. Nếu bạn muốn tìm hiểu kỹ thì mời bạn đọc bài này của mình: Context trong Android là gì? Bạn đã hiểu đúng về nó chưa?
User Interface (UI) Thread
Mỗi ứng dụng Android có một thread đặc biệt, đó là UI thread. Thread này có trách nhiệm vẽ giao diện ứng dụng lên màn hình thiết bị.
Nếu bạn xử lý sai, hoặc ôm đồn quá nhiều tác vụ trên thread này có thể khiến cho mã nguồn trở nên rối rắm, ứng dụng có nguy cơ bị treo (lỗi ANR).
Vì vậy, bạn phải hiểu rõ cơ chế của UI thread. Bạn biết các cách để hạn chế xử lý trên UI thread. Ví dụ như dùng AsyncTask…
Senior Android developers với 2-4 năm kinh nghiệm
Đến giai đoạn thì bạn được coi là senior developer rồi, đã tích lũy được kha khá kinh nghiệm. Lúc này này bạn đã bắt đầu có thể linh hội, có khả năng tìm hiểu sâu hơn về Android Framework, để có thể thực hiện bất kỳ tính năng đặc thù. Ngay cả tính năng đó liên quan đến một số nghiên cứu.
Theo quan điểm của mình thì với kinh nghiệm bạn tích lũy được, bạn sẽ dễ dàng tìm hiểu sâu hơn Android framework.
Dưới đây là những kỹ năng phát triển phần mềm chung, không hẳn giới hạn trong phạm vi Android.
Dependency Injection
Dependency Injection (DI) là một pattern thể hiện nguyên tắc cố gắng tách biệt các thành phần trong ứng dụng.
Mục tiêu của DI là tách biệt hai thành phần:
- Các chức năng cốt lõi của ứng dụng.
- Sự kết nối giữa các thành phần thực hiện các chức năng cốt lõi đó.
Ở một khía cạnh nào đó, nếu mã nguồn ứng dụng được viết theo đúng nguyên tắc DI thì nó giống như chiếc PC vậy. Tức là các chức năng cốt lõi hoạt động như bo mạch chủ. Trong khi các thành phần chức năng hoạt động độc lập như CPU, RAM, HDD…
Khi nguyên tắc DI được thực hiện đúng, nó cho phép bạn thêm các tính năng mới mà ít ảnh hưởng tới các thành phần khác nhất.
Mình cũng có một bài viết về chủ đề này, bạn có thể tham khảo thêm: Clean Code Android
Làm chủ các mô hình MVP – MVVM
Khi bạn ở level này rồi thì bạn sẽ tự nhiên nhận ra việc thực hiện quá nhiều logic ở UI là một điều tệ hại. Lúc này, bạn sẽ tự đi tìm hiểu cách quy hoạch lại mã nguồn. Bạn sẽ không đơn giản là người mà code chỉ để chương trình chạy là được.
Đây là lúc bạn tự hỏi: “Làm sao code không chỉ chạy đúng mà code còn sạch đẹp thơm tho nữa“.
Với các dự án Android, có khá nhiều mô hình giúp bạn viết code quy củ. Giúp bạn tách biệt hoàn toàn business logic của ứng dụng ra khỏi UI. Có thể kể tên như: MVP, MVVM…
Trên VNTALKING, mình cũng chia sẻ khá nhiều về các mô hình này, mời bạn đọc nhé:
- Kiến trúc MVP trong Android với Dagger2 ,Retrofit
- Triển khai mô hình MVP cho lập trình ứng dụng Android
- Cách tạo Presenter trong MVP độc lập với Android Class
Multithreading (Xử lý đa luồng)
Các bạn android developer có kinh nghiệm nên hiểu rõ về concept của multithreading trong Android. Bạn cần hiểu cách chúng ảnh hưởng tới ứng dụng của bạn. Mình thấy các nhà tuyển dụng rất hay hỏi về vấn đề này. Nếu bạn lơ mơ thì họ đánh giá bạn rất thấp đấy.
Có thể bạn đọc đến đoạn này, bạn bật lại rằng: tôi làm thành thạo về AsyncTask, RxJava, Coroutines…
Không hẳn. Như mình nói trước rồi, sử dụng multithreading framework không có nghĩa là bạn hiểu rõ về nó.
Để mình dẫn chứng nhé: có nhiều bạn android developer có kinh nghiệm hẳn hỏi, họ tin rằng việc sử dụng AsyncTask sẽ dẫn tới memory leak. Vấn đề này còn được phản ảnh trong cả tài liệu chính thức của AsyncTask, và cả trong các rule warning của Lint trong Android Studio.
Khi bạn nghe người khác nói nhiều về vấn đề, nói nhiều đến nỗi người khác mặc định là nó đúng.
Nhưng thực tế thì điều này không đúng. Mình đã thực hiện rất nhiều kiểm chứng. Do bài viết này dài quá, nên mình sẽ trình bày ở một bài viết khác, các bạn chờ nhé.
Automated Testing
Theo kinh nghiệm của mình thì hầu hết các dự án Android đều không sử dụng bất kỳ loại testing tự động nào cả. Với các dự án trọng điểm thì việc test tự động chủ yếu được thực hiện bởi đội QA, sử dụng các tool như Appium.
Với các nhà tuyển dụng, ngay cả khi công ty họ không hề ứng dụng bất kỳ công cụ test tự động nào thì việc bạn có kỹ năng test tự động đã ghi điểm rất lớn rồi.
Do đó, mặc dù kỹ năng này không bắt buộc nhưng việc một lập trình viên Android nói riêng, lập trình phần mềm nói chung, có kỹ năng thực hiện test tự động là rất cần thiết.
Cá nhân mình thì thích thực hiện unit test hơn là test giao diện. Nhưng nhiều bạn thì lại ngược lại. Cái này thì tùy sở thích của bạn mà chọn cho mình một kỹ năng.
Tạm kết
Trên đây mình mới liệt kê được một vài kỹ năng mà một Android developer dưới 5 năm kinh nghiệm cần phải có.
Với các bạn có kinh nghiệm trên 5 năm thì lúc đó bạn quá biết mình cần phải có gì rồi 🙂
Mình hi vọng, qua bài viết này, các bạn sẽ có cái nhìn thấu đáo hơn về chặng đường phía trước. Chuẩn bị chinh phục mục tiêu trở thành chuyên gia Android. Và cũng tự trả lời được câu hỏi: Lập trình viên Android cần học những gì?
Xin chào, tôi muốn biết giá của bạn.
Một năm biết hết thì có tính senior không ạ ?
Có chứ, tài không đợi tuổi mà bạn 🙂
Senior lý thuyết nha bạn 😀