Home Blog Page 48

Phân biệt giữa Java ME, Java SE và Java EE

Phân biệt giữa Java ME, Java SE và Java EE

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Java ME/SE/EE là ba phiên bản khác nhau được xây dựng dựa trên nền tảng Java.

Phân biệt giữa Java ME, Java SE và Java EE

Java SE(Java Platform, Standard Edition)

Java SE còn được gọi là Java Core, đây là phiên bản chuẩn và cơ bản của Java, được dùng làm nền tảng cho các phiên bản khác.

  • Chứa các API chung (như java.lang, java.util...) và nhiều các API đặc biệt khác.
  • Bao gồm tất cả các tính năng, đặc trưng cơ bản của ngôn ngữ Java như biến, kiểu dữ liệu nguyên thủy, Arrays, Streams, Strings, Java Database Connectivity (JDBC)…
  • Tính năng nổi tiếng nhất của Java là JVM cũng chỉ được xây dựng cho phiên bản này.
  • Java SE được sử dụng với mục đích chính là để để tạo các ứng dụng cho môi trường Desktop.

  Top 10 câu hỏi phỏng vấn Java Developer thường gặp

  Internationalization và Localization trong Java

Java ME(Java Platform, Micro Edition)

Java ME – Đây là phiên bản được sử dụng cho việc tạo các ứng dụng chạy trên các hệ thống nhúng như thiết bị mobile và các thiết bị nhỏ.

  • Các thiết bị sử dụng Java ME thường có các hạn chế như giới hạn về khả năng xử lý, giới hạn về nguồn điện (pin), màn hình hiển thị nhỏ…
  • Java ME còn hỗ trợ trong việc sử dụng công nghệ nén web, giúp giảm dụng lượng sử dụng (network usage) và cải thiện khả năng truy cập internet giá rẻ.
  • Java ME sử dụng nhiều thư viện và API của Java SE và nhiều thư viện, API của riêng nó.

Tham khảo việc làm Fresher Java mới nhất trên TopDev

Java EE(Java Platform, Enterprise Edition)

Java EE là phiên bản Enterprise của Java, được sử dụng để phát triển  các ứng dụng web.

  • Java EE chứa các Enterprise APIs như JMS, EJB, JSPs/Servlets, JNDI
  • Java EE sử dụng nhiều thành phần của Java SE và có thêm nhiều tính năng của riêng nó như Servlet, JavaBeans…
  • Java EE sử dụng HTML, CSS, JavaScript… để tạo trang web và web service.
  • Nhiều ngôn ngữ khác cũng được dùng để phát triển ứng dụng web giống như Java EE (.Net, PHP..) nhưng Java EE được sử dụng nhiều bởi tính năng hoạt, khả năng bảo mật, khả chuyển…

Bài viết gốc được đăng tải tại stackjava.com

Có thể bạn quan tâm:

Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev

Tại sao Web Developer nên học về Digital Marketing?

Tại sao Web Developer nên học về Digital Marketing?

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Có phải bạn đang cảm thấy hiếu kì về bài viết này? Vì digital marketing thì liên quan gì tới sự nghiệp làm dev của bạn? Trong bài viết này, bạn sẽ có câu trả lời.

Đối với các lập trình viên, đa số trong các bạn quan tâm rất nhiều về kĩ năng mềm (non-tech skill) để hổ trợ cho công việc. Nhưng đối với một doanh nghiệp, các kĩ năng mềm không giúp họ nhiều bằng kĩ năng digital marketing.

Chia sẻ thêm, ngoài marketing, Tiếng Anh cũng là một kĩ năng cực kì cực kì quan trong. Không chỉ đối với developer mà còn tất cả mọi người. Khi bạn biết một trong hai kĩ năng này. Bạn sẽ không phải lo thất nghiệp trong thế giới phẳng 4.0 ngày nay.

#1 Kỹ năng coding thì liên quan gì tới Digital Marketing?

Một câu trả lời ngắn gọn: Không! Đúng vậy, coding chẳng liên quan gì tới digital marketing.

Nhưng nếu bạn là một developer biết digital marketing, và bạn biết cách phối hợp chúng lại với nhau. Bạn sẽ có được được một trong những kĩ năng có ích nhất cho sự nghiệp của mình. Dù bạn là người đang có một công việc full-time hoặc kinh doanh tự do (freelancing business).

#2 Vậy, Digital Marketing là gì?

Giải thích một cách ngắn gọn, digital marketing là việc quảng bá, marketing cho các sản phẩm, dịch vụ sử dụng các thiết bị điện tử hiện đại (điện thoại, laptop,…). Và hình thức phổ biến nhất và có lẽ bạn cũng quen thuộc nhất của digital marketing là online marketing.

Online marketing hiện hữu mọi lúc mọi nơi trong cuộc sống của bạn ở thời điểm hiện tại, mình chắc chắn như vậy.

Trước khi đi xa hơn, điều quan trọng là bạn cần phải hiểu chính xác những thứ có trong digital marketing. Sau đây là một danh sách rút gọn:

  •  SEO: là những quy trình tối ưu website để có được vị trí cao trong các công cụ tìm kiếm như Google, Bing.
  •  Analytics: lien quan đến việc phân tích dữ liệu ví dụ, phân tích hành vi người dùng.
  •  AdWords: đây là nền tảng hiển thị quảng cáo trả tiền trên Google hoặc các công cụ tìm kiếm khác. Bạn muốn hiển thị quảng cáo, bạn phải trả tiền cho Google chẳng hạn.
  •  Social Media: mạng xã hội hiện đang phổ biến trên toàn thế giới, việc sử dụng mạng xã hội cho marketing là một điều cực kì dễ hiểu.
  •  Email Marketing: sử dụng các nền tảng email để marketing. Bạn sẽ thường thấy những email quảng cáo sản phẩm hay dịch vụ nào đó trong hòm thư. Đó chính là email marketing.
  •  Content Marketing: mọi thứ liên quan đến những nội dung hay, nổi bật, nhằm tạo sự khác biệt và thu hút khách hàng chính là Content Marketing.
  •  Online Advertisements: bất kì quảng cáo nào liên quan tới các nền tảng và thiết bị trực tuyến đều là online Advertisements. Như quảng cáo trên TV, youtube hay để cả AdWords.
  •  Conversion Rate Optimization: Quá trình tìm hiểu những gì hoạt động và những gì không hoạt động của sản phẩm, dịch vụ để chuyển đổi khách hàng, thử nghiệm và cải thiện để đạt được kết quả tốt nhất.

Và nếu bạn có thêm về kĩ năng design, sẽ là một điểm cộng rất lớn. Cho thấy bạn là một người có đầu óc sáng tạo.

Tiếp theo sẽ đến phần rất quan trọng và cốt lõi của bài viết! Việc học digital marketing sẽ đem lại lợi ích gì cho developer?

  Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

  Top 10 câu hỏi phỏng vấn Web Developer và cách trả lời hay nhất

#3 Trở thành một ứng viên hoặc một nhân viên đặc biệt

Bạn là một developer có thể tạo ra một website hoạt động đúng với requirement (đúng yêu cầu của khách hàng). Nhưng với các kĩ năng digital tuyệt vời, bạn biết cách làm thế nào để tăng traffic (lưu lượng truy cập của người dùng) website lên. Hay tối ưu hóa những dòng code để có một website tối ưu SEO tốt hơn (SEO on page). Hiểu về digital marketing để xây dựng những hệ thống hổ trợ digital marketing. Và còn rất nhiều lợi thế nữa, và đó là cách để bạn gây ấn tượng mạnh đến khách hàng và nhà tuyển dụng.

Hoặc là bạn có thể đề xuất với xếp hoặc manager về những ý tưởng, idea để cải thiện sản phẩm, website, hay dịch vụ. Và đề xuất luôn rằng bạn có thể đảm nhận những công việc về marketing.

Nếu bạn là một freelance web developer, với kĩ năng marketing, bạn có thể tiếp cận được nhiều khách hàng hơn. Kiếm về được nhiều hợp đồng, và đặc biệt bạn biết cách để có thể cung cấp thêm các dịch vụ đi kèm. Nhằm mang lại giá trị cho bạn và kiếm nhiều tiền hơn.

Ví dụ khi bạn thiết kế một website cho khách hàng, bạn có thể cung cấp thêm các dịch vụ như trình quản lý AdWords. Hay các dịch vụ về content marketing, design hoặc SEO. Hoặc bạn có thể lên kế hoặc tư vấn, coaching cho khách hàng của mình về những chiến lượt marketing mà họ cần.

It is digital marketing

Tóm gọn lại, hãy trở thành một người sáng tạo. Hiểu biết rộng hơn không chỉ là kĩ năng chính của bạn. Tăng giá trị của bạn lên, vì chính bạn là người trả lương cho bạn.

Tham khảo việc làm Web Developer hấp dẫn trên TopDev

#4 Tăng thu nhập

Như mình để cập trong phần #1, khi giá trị của bạn tăng lên. Chắc chắn lương, thu nhập của bạn cũng sẽ tăng lên dù bạn có đang làm cho một công ty hay là freelancer.

Có thể bạn chưa nhận ra, việc bạn đang làm hiện tại, chính là kinh doanh đấy!

Hãy để mình giải thích. Kinh doanh hiểu đơn giản chính là việc mua bán. Nếu bạn đang đi làm full-time, bạn đang bán sức lao động của mình. Còn nếu bạn làm tự do, bạn đang bán cả sức lao động và sản phẩm của mình. Vậy tại sao bạn không bán với giá cao hơn.

Khi bạn có hiểu biết về digital marketing, khi bạn biết xây dựng một thương hiệu cá nhận. Thì việc “kinh doanh mua bán” sẽ dễ dàng hơn đối với bạn.

Chính vì lý do đó, việc tăng giá trị bản thân là một điều cực kì quan trọng để có được thu nhập cao hơn.

#5 Xây dựng thương hiệu cá nhân

Dưới đây, mình sẽ đưa ra hai bối cảnh và bạn hãy trả lời mình câu hỏi. Bạn muốn bạn ở bối cảnh nào và thật sự là bạn đang ở bối cảnh nào?

Bối cảnh 1: Bạn đang làm freelancer, bạn luôn đi tìm khách hàng của mình mỗi tháng để nhằm tăng doanh thu. Hoặc, bạn đang gửi đơn đi xin việc khắp nơi để có một việc làm tốt hơn nếu bạn đang muốn có một công việc full-time.

Bối cảnh 2: Khách hàng luôn tìm đến bạn vì muốn có được sản phẩm của bạn. Các nhà tuyển dụng luôn muốn tuyển bạn vì năng lực của bạn.

Có phải bạn muốn mình ở trong bối cảnh 2, nhưng thật sự bạn đang ở bối cảnh 1!

Trong thực tế, bối cảnh 2 rất khỏ xảy ra, nhưng khó chứ không phải là không thể xảy ra.

Và để bối cảnh 2 có thể xảy ra trong cuộc đời bạn. Hãy phát triển một thương hiệu cá nhân cho chính bạn. Bạn có thể bắt đầu với một blog hoặc bất kì một nền tảng nào. Để chia sẻ kiến thức kinh nghiệm trong lĩnh vực, thế mạnh của bạn cho mọi người. Và dần dần theo thời gian, giá trị, thương hiệu của bạn sẽ ngày càng tăng và được nhiều người biết tới. Cho đi luôn luôn được nhận lại, hãy ghi nhớ điều này!

Và có một điều mình muốn nhấn mạnh một điều. Khi bạn chia sẻ cho người khác kiến thức của mình. Thì là lúc kiến thức của bạn được tăng thêm và củng cố vững chắc một lần nữa.

Xây dựng thương hiệu cá nhân

Hãy nhìn những developer của Việt Nam: Lê Trần Đạt (founder của daynhauhoc.com – stackoverflow của Việt Nam), Thạch Phạm (CEO tại Azdigi, founder của thachpham.com – website về lập trình, wordpress, SEO lớn nhất Việt Nam), Nguyễn Hồng Phúc (boss tại HVA online), Nguyễn Mạnh Tuấn (boss tại J2Team). Ngoài ra còn rất rất nhiều những developer khác như: Tôi đi code dạo, Kteam,… Họ là những người cực kì giỏi trong lĩnh vực chính của mình là developer. Ngoài ra họ còn có những kĩ năng về digital marketing để bạn có thể biết đến họ và nhận được những giá trị từ họ.

Ngày nay, người người nhà nhà sử dụng internet, smartphone, máy tính bảng, laptop,… Nên việc xây dựng thương hiệu cá nhân không phải là một điều gì hàn lâm, cao siêu cả. Điều quan trọng là ở chính bạn, sự kiên trì và đam mê của bạn.

# Kết

Khi bạn đã là một developer giỏi, hãy trở thành một developer tuyệt vời! Digital marketing sẽ giúp bạn làm điều đó. Không phải ai cũng muốn và làm được điều này. Nhưng khi bạn đã làm được rồi thì hãy nhìn xem những thành quả mà nó mang lại.

Bài viết gốc được đăng tải tại lenhatthanh.com

Xem thêm:

Xem thêm các việc làm Developer hấp dẫn tại TopDev

Substr trong php là gì? Ví dụ về substr

Substr trong php là gì? Ví dụ về substr

Anh em làm việc hoặc có một thời gian tìm hiểu về ngôn ngữ lập trình php chắc không còn lạ gì với các phương thức trong php, tuy nhiên với những anh em mới bắt đầu thì phương thức nào cũng có ví dụ, có người giải thích sẽ dễ hiểu hơn, bài viết này giải thích cụ thể và đem tới nhiều ví dụ về substr trong php.

substr trong php
Php còn nhiều điều hay ho lắm, anh em cứ chờ đón từ từ. =)))
Substr là phương thức trong ngỗn ngữ lập trình php. Cụ thể về cú pháp cũng như các ví dụ sử dụng như thế nào. Tất cả sẽ có trong bài viết này.

1. Substr trong php là gì?

Đầu tiên như phía trên đã có nói qua với anh em, substr là phương thức, tức là một hàm được cung cấp sẵn trong các version của ngôn ngữ php.

Chia thành 2 phần nhỏ, đầu tiên là sub, sub ở đây hiểu la một phần nhỏ của một cái gì đó lớn. Str là viết tắt của String, là chuỗi dài.

Vậy substr trong php là chuỗi con ngắn trong chuỗi con dài lấy được. Giống y chang như định nghĩa luôn nha.

The substr() function returns a part of a string.

Hàm substr trả về một phần của chuỗi.

  Hướng dẫn viết code PHP chuẩn – PSR tiêu chuẩn khi lập trình PHP

  Chuẩn coding convention trong PHP với PSR

2. Cú pháp và giải thích ví dụ

Về cú pháp thì substr trong php tương đối rõ ràng và dễ sử dụng về mặt cú pháp.

substr(string,start,length)

Giải thích các parameter cho function này như sau:

Đầu tiên là string: cái này là bắt buộc, tìm chuỗi con của một chuỗi mà không có chuỗi đầu vào thì quăng. Vậy cái này là required (bắt buộc).

Thứ hai là start: cái này cũng bắt buộc. Cái này là vị trí bắt đầu lấy của chuỗi con

Cuối cùng là length: cái này không bắt buộc. Là độ dài mong muốn của chuỗi anh em cần lấy, mặc định sẽ lấy tới cuối cùng của chuỗi.

Phương thức nào cũng có ví dụ, có người giải thích sẽ dễ hiểu hơn, bài viết này giải thích cụ thể và đem tới nhiều ví dụ về substr trong php.

Trong start thì riêng với ngôn ngữ lập trình php lại có một số điểm khác hơn như sau:

  • Số dương – Vị trí bắt đầu lấy cho chuỗi con (vị trí cố định)
  • Số âm – Ví trí cố định bắt đầu từ cuối của chuỗi
  • 0 – Bắt đầu từ chữ cái đầu tiên của chuỗi

Xem thêm các việc làm PHP lương cao trên TopDev

3. Một số lưu ý

Ngoài lưu ý về start phía trên đã có đề cập thì substr trong php còn có một số điểm lưu ý sau:

  • substr là function chỉ được hỗ trợ từ phiên bản php 4 trở lên
  • Ở phiên bản php 7.0, nếu string = start (lúc này chuỗi trả về sẽ là empty). Ở các phiên bản khác sẽ trả về FALSE.
  • Hai phiên bản này PHP 5.2.2 – 5.2.6 sẽ trả về false nếu start được điền vào là số âm.

4. Ví dụ

Sau khi đã nắm rõ cú pháp, các lưu ý về substr trong php thì giờ là lúc đi vào ví dụ cụ thể.

<?php
echo substr("Hello world",0,10)."<br>";
echo substr("Hello world",1,8)."<br>";
echo substr("Hello world",0,5)."<br>";
echo substr("Hello world",6,6)."<br>";

echo substr("Hello world",0,-1)."<br>";
echo substr("Hello world",-10,-2)."<br>";
echo substr("Hello world",0,-6)."<br>";
?>

Anh em lưu ý 3 hàm substr trong php cuối cùng sẽ có giá trị âm ở cả start và length. Lúc này giá trị sẽ cắt từ phía cuối chuỗi đi lên. Kết quả in ra màn hình lần lượt cho 3 hàm đó như sau.

Hello worl (bỏ đi chữ cuối cùng) 
ello wor
Hello (bỏ đi 6 kí tự sau)

5. Tham khảo thêm substr trong php

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn 

Có thể bạn quan tâm:

Bộ câu hỏi phỏng vấn Embedded Developer chinh phục nhà tuyển dụng

Bộ câu hỏi phỏng vấn Embedded Developer & cách trả lời hay nhất

Embedded hay Embedded System được gọi là hệ thống nhúng, là một hệ thống có khả năng tự trị được nhúng vào một môi trường hay hệ thống mẹ. Đó chứa cả phần cứng và phần mềm nhằm phục vụ cho các bài toán chuyên dụng trong nhiều lĩnh vực đặc biệt là công nghiệp tự động hóa. Với sự phát triển của AI, IoT và cuộc cách mạng công nghiệp 4.0 hiện nay; lập trình viên nhúng đang là vị trí được nhiều công ty săn đón. Hôm nay chúng ta cùng nhau tìm hiểu top 10 câu hỏi phỏng vấn cho vị trí Embedded Developer thường gặp nhất nhé. 

Câu 1: Nêu những thành phần cơ bản của hệ thống nhúng

Một hệ thống nhúng thông thường gồm những thành phần cơ bản là:

  • ROM: Nơi chứa chương trình và dữ liệu cố định dùng để nạp và sử dụng khi chạy chương trình
  • RAM: Chứa chương trình thực thi và các biến tạm
  • MCU: Bộ xử lý tính toán trung tâm
  • Các bộ phận khác: gồm các thiết bị ngoại vi như ADC, DAC hay các khối giao tiếp như UART, I2C,…

Embedded System

Câu 2: Liệt kê một số hệ thống nhúng trong các lĩnh vực thực tế

  • Hệ thống định vị vệ tinh, tên lửa, dẫn đường,…
  • Hệ thống viễn thông, di động
  • Thiết bị kết nối mạng như Gateway, Router,…
  • Thiết bị y tế như máy chụp X-quang, máy điều hòa nhịp tim,…
  • Thiết bị điện tử dân dụng như Tivi, tủ lạnh, điều hòa,…
  • Ngành sản xuất ô tô, chế tạo robot, các dây chuyền sản xuất công nghiệp,…

Hệ thống nhúng hiện nay có mặt gần như ở tất cả các lĩnh vực từ trong cuộc sống hàng ngày đến sản xuất công nghiệp và kỹ thuật cao.

  Embedded Developer là gì? Cần học gì để trở thành Embedded Developer

  Cơ bản về Embedded và ứng dụng

Câu 3: So sánh công việc của Embedded hardware và Embedded software 

Embedded hardware là những công việc liên quan đến phần cứng như thiết kế board mạch, thiết kế PCB, test board mạch. Những công việc này cần đòi hỏi kiến thức chuyên môn liên quan đến mạch, điện tử cũng như phần cứng của hệ thống, thiết bị,… Ngược lại với Embedded software là những công việc liên quan đến phần mềm, là những lập trình viên thực hiện việc xây dựng và phát triển phần mềm cho các sản phẩm nhúng như driver, hệ điều hành, firmware, phần mềm ứng dụng, …

Một dự án phát triển hệ thống nhúng luôn đòi hỏi sự hợp tác chặt chẽ của 2 phần hardware và software; vì thế các lập trình viên trong ngành này thường cũng có kinh nghiệm về phần cứng nhất định.

Tuyển dụng kỹ sư lập trình nhúng đãi ngộ hấp dẫn tại đây!

Câu 4: Ngôn ngữ nào được sử dụng phổ biến nhất trong lập trình nhúng

C và C++

Trong lập trình nhúng, C và C++ vẫn là những ngôn ngữ phổ biến và được hỗ trợ rộng rãi nhất. C hay C++ là những ngôn ngữ gần với phần cứng, giúp tối ưu phần mềm, không đòi hỏi nhiều thư viện, vì thế giúp chương trình nhẹ nhàng và phù hợp với các hệ thống nhúng giới hạn về phần cứng. 95% mã nguồn hệ thống nhúng hiện nay đang được viết bằng C/C++.

Ngoài C/C++ thì hiện nay Python cũng đang là ngôn ngữ được nhiều hệ thống nhúng sử dụng; nó đang là ngôn ngữ có tốc độ phát triển người dùng nhanh nhất. Ưu điểm của Python là khả năng ghi, giảm lỗi và dễ đọc, các thư viện mã nguồn mở phong phú giúp các lập trình viên giảm thời gian viết code. Mặc dù vậy Python chỉ được dùng cho những hệ thống mà có cấu hình tốt về phần cứng.

Tham khảo tuyển dụng embedded Hà Nội lương cao trên TopDev

Câu 5: Giải thích từ khóa Volatile trong lập trình nhúng

Trong lập trình nhúng, trình compiler có sẵn tính năng optimization (tối ưu) sẽ thực hiện việc lược bỏ những phần code mà nó nghĩ là không cần thiết (ví dụ như biến không sử dụng). Trong một số trường hợp biến của bạn được khai báo nhưng để sử dụng ở 1 vị trí khác (biến global) hoặc map vào vùng nhớ ngoại vi khác dẫn đến việc thực chất là biến “có ích” và có nhiệm vụ của nó nhưng tính năng tối ưu sẽ vẫn đánh dấu nó là không cần thiết.

Để tránh việc tự động này, từ khóa Volatile đặt trước biến để báo cho trình optimization rằng không cần quan tâm đến nó. Trong thực tế, có 3 trường hợp bạn hay sử dụng từ khóa này:

  • Thanh ghi ngoại vi có ánh xạ đến ô nhớ
  • Biến toàn cục được truy xuất từ các tiến trình con xử lý ngắt
  • Biến toàn cục được truy xuất từ nhiều tác vụ trong một ứng dụng đa luồng

Câu 6: Phân biệt Little Endian và Big Endian

Little Endian và Big Endian là hai cơ chế lưu trữ dữ liệu theo việc sắp xếp các byte dữ liệu. Little endian xuất phát từ little-end nghĩa là kết thúc nhỏ – tức là byte cuối cùng trong biểu diễn nhị phân sẽ được ghi trước; và ngược lại Big endian hay big-end là cơ chế ghi dữ liệu mà byte đầu tiên sẽ ghi đầu tiên. Lưu ý là BE hay LE chỉ khác ở thứ tự các byte chứ không ảnh hưởng đến thứ tự các bit trong byte.

Big Endian sẽ phổ biến và thuận tự nhiên cho chúng ta đọc hơn. Đối với máy tính, không có sự khác biệt nào về tốc độ trong việc đọc ghi thứ tự các byte theo 2 cách trên. Dù vậy có 1 số trường hợp mà BE và LE thể hiện sự khác biệt, ví dụ:

  • Nếu chúng ta ép kiểu từ int (4 bytes) sang big int (8 bytes), với LE chúng ta không cần thay đổi địa chỉ bộ nhớ, chỉ cần ghi tiếp các byte lớn hơn mà thôi. BE sẽ phải làm bước dịch địa chỉ bộ nhớ hiện tại thêm 4 bytes thì mới có không gian lưu trữ.
  • Tuy vậy nếu khi cần đọc byte đầu tiên để xác định xem giá trị đó là số âm hay số dương (được quy định bởi byte lớn nhất) thì BE sẽ tỏ ra lợi thế hơn so với LE.

Câu 7: Sự khác nhau giữa Inline Function và Macro

Macro là những hàm được viết ở phần Preprocessor, một loại lệnh mở rộng tại thời điểm gọi của nó. Inline Function (hàm nội tuyến) cũng là một loại lệnh mở rộng tại thời điểm gọi của nó, nhưng nó được mở rộng trong quá trình biên dịch.

Hàm nội tuyến sử dụng từ khóa inline để đề nghị trình biên dịch (compiler) thực hiện inline expansion (khai triển nội tuyến) – chèn code của hàm đó tại địa chỉ mà nó được gọi. Sử dụng inline functions không khác nhiều so với hàm thông thường, tuy vậy khi thực thi nó sẽ chạy nhanh hơn, tiết kiệm chi phí gọi hàm.

Macro định nghĩa một cách chuyển văn bản code đầu vào nào đó thành văn bản code đầu ra theo ý mình muốn sử dụng từ khóa define. Macro giúp chúng ta tiết kiệm thời gian viết những đoạn code lặp lại trong chương trình.

Inline Function và Macro
Nguồn ảnh: https://stackoverflow.com/questions/70103669/difference-between-a-macro-and-function-outside-c

Câu 8: So sánh các giao thức UART, SPI và I2C

UART, SPI và I2C là 3 chuẩn truyền thông nối tiếp cơ bản nhất với MCU, trong đó:

  • UART là một chuẩn nối tiếp không đồng bộ, còn SPI và I2C là 2 chuẩn nối tiếp đồng bộ nên chúng có đường clock còn UART thì không.
  • SPI hỗ trợ tốc độ truyền lớn nhất nhưng các kết nối của nó phức tạp nhất.
  • UART có thể truyền đi với khoảng cách xa hơn, SPI và I2C chỉ truyền trên bo mạch.

Tham khảo tuyển dụng embedded fresher lương cao trên TopDev

Câu 9: Hãy giải thích về Interrupt (ngắt) và trình phục vụ ngắt ISR

Ngắt (Interrupt) là một sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện chương trình hiện tại, phục vụ ngay lập tức nhiệm vụ mà ngắt yêu cầu. Quá trình ngắt xảy ra như sau:

  • Khi có một thiết bị bất kỳ cần được phục vụ => nó sẽ báo cho bộ vi điều khiển bằng cách gửi 1 tín hiệu ngắt.
  • Khi nhận được tín hiệu ngắt => bộ vi điều khiển ngừng tất cả những gì nó đang thực hiện để chuyển sang phục vụ thiết bị gọi ngắt đồng thời lưu lại địa chỉ của lệnh kế tiếp.
  • Sau khi phục vụ ngắt xong => bộ vi điều khiển quay trở lại điểm bị ngắt trước đó; lấy lại địa chỉ lệnh kế tiếp và tiếp tục thực hiện công việc.

Chương trình ngắt trên được gọi là trình phục vụ ngắt ISR viết tắt của Interrupt Service Routine

Câu 10: Bạn nghĩ sao về triển vọng của ngành hệ thống nhúng và IoT

IoT hay Internet of Things là một trong 4 trụ cột của cách mạng công nghiệp 4.0, có tính ứng dụng cao, đóng vai trò quan trọng trong sự phát triển của nền kinh tế, vì vậy chuyên ngành này hứa hẹn sẽ có tốc độ phát triển rất mạnh ở cả trên thế giới lẫn Việt Nam.

IoT sẽ cần phải xây dựng, thiết kế và tạo ra các thiết bị, cỗ máy thông minh có kết nối với Internet phục vụ cho nhiều lĩnh vực khác nhau; và để làm được điều này thì cũng đồng nghĩa với việc xây dựng nhiều các hệ thống nhúng gồm cả phần cứng và phần mềm. Nói cách khác thì 2 ngành này đi liền với nhau, muốn làm IoT thì phải có các hệ thống nhúng. Vì thế trong tương lai, nhu cầu về tuyển dụng ngành hệ thống nhúng sẽ ngày càng lớn hơn.

Kết bài

Trên đây là list 10 câu hỏi bạn sẽ thường gặp phải nhất khi đi phỏng vấn vị trí lập trình viên Nhúng – Embedded System Developer. Hy vọng bài viết này sẽ giúp bạn phần nào đó hoàn thành tốt những câu hỏi đến từ nhà tuyển dụng. Cảm ơn các bạn đã đọc bài và hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Tham khảo việc làm IT lương cao tại TopDev

Đừng lãng phí khoảng thời gian học đại học của bạn!!

Đừng lãng phí khoảng thời gian học đại học của bạn!!

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Từ trước đến nay, IT luôn là một nghề không dễ dàng và rất khô cứng đối với nhiều người. Không phải ai cũng có đủ dũng cảm để theo ngành này. Nhưng những năm gần đây, số lượng sinh viên thi vào ngành này là cực kì nhiều, bằng chứng là điểm đầu vào của các trường đại học tăng vọt (bạn có thể kiểm chứng điều này trên internet). Tại sao bạn lại lựa chọn học đại học ngành IT?

Mình cũng công nhận rằng lương IT khá cao so với mặt bằng chung. Cho nên nhiều sinh viên đổ xô vào học là điều không thể tránh khỏi. Nhiều bạn dấn thân vào ngành này vì yêu thích, đam mê. Nhiều bạn thì vì tiền, vì bạn bè rủ rê, bị cha mẹ bắt ép. Cũng có nhiều bạn chọn đại ngành này vì không biết chọn ngành gì.

Mình không biết lý do bạn chọn ngành này là gì. Nhưng nếu trong lòng bạn đã quyết tâm theo ngành này, thì bài viết này dành cho bạn. Và đừng quên, sự nghiệp của bạn có thành công hay không là hoàn toàn do bạn (chứ còn do ai nữa -_-).

#1 Những bất lợi khi bạn không có một IT background tốt

Mình sẽ kể cho bạn nghe vài mẫu chuyện mà mình là người trực tiếp chứng kiến. Mình từng có một vài người bạn, đồng nghiệp (đương nhiên là làm trong ngành IT). Một điều đặc biệt là, họ không học ngành IT ở đại học. Người thì học cơ khí, người thì học điện, có người thì học kinh tế. Nhưng dòng đời đưa đẩy cho họ đến với IT. Và bây giờ, công việc của họ cũng khá ổn định. Phải gọi là code như thánh!

Có một điều mình muốn khẳng định trước khi kể tiếp. Họ là những người giỏi và rất giỏi, và dĩ nhiên bây giờ họ code cũng rất giỏi. Nhưng cái chính mình muốn kể ở đây, chính là quá khứ của họ. Khoảng thời gian khi họ bắt đầu bước vào con đường IT.

Rất rất khó khăn! Đúng vậy, rất khó khăn khi họ bắt đầu làm việc trong ngành IT. Lý do là vì họ không có một background IT tốt, kiến thức IT của họ rất hạn chế. Họ đã phải “cày ngày cày đêm”, và nhiều khi phải làm OT (làm tăng ca) rất nhiều để có thể hoàn thành được công việc. Phải nói rằng, họ là những người rất kiên trì, chịu khó.

Mẫu chuyện trên mình kể rất ngắn gọn và đủ để cho bạn nắm được ý chính.

Một mẫu chuyện tiếp theo (lưu ý là những mẫu chuyện mình kể là xảy ra 100% trong đời thật của mình) cũng về một vài người bạn của mình. Họ cũng là những người không học trong ngành IT, hoặc là học trong ngành nhưng kiến thức không chắc. Và bây giờ, họ đã không còn làm IT nữa. Đơn giản là vì họ không thích hợp với ngành này, hoặc không chịu được “nhiệt” ở đây.

Trong 2 nhóm người trên, đều có chung một xuất phát điểm là background IT không tốt. Nhưng có người thì tồn tại được, có người thì không. Người tồn tại được thì đã phải trãi qua muôn vàng khó khăn thử thách, họ phải kiên trì chịu khó rất nhiều để được một chổ đứng trong ngành IT và vì muốn phát triển mạnh trong tương lai. Phần còn lại không còn trụ vững được nữa.

  [Tâm sự lâp trình – Phần 2] : Học đại học con đường trở thành lập trình viên

  Có còn nên học Công nghệ thông tin thời điểm hiện tại?

nhung-dieu-lam-tuong-khien-tan-sinh-vien-vo-mong-khi-buoc-vao-dai-hoc

Thông qua 2 mẫu chuyện trên, mình muốn nói với các bạn đọc rằng. Background IT là một điều cực kì quan trọng khi bạn muốn bước vào ngành. Nếu không có background IT tốt. Thì bạn phải kiền trì hơn người khác, chịu khó hơn người khác. Vì bạn chính là người xuất phát sau trong một cuộc đua. Cho nên khoảng thời gian ban đầu khi bước vào nghề sẽ có vô vàng khó khăn thử thách chờ đón bạn.

Các bạn đã nhìn thấy được khó khăn khi không có một background IT tốt chưa? Nói nhỏ cho bạn biết một điều, số người kiên trì trụ vững được để theo con đường IT là rất ít. Ít hơn rất nhiều so với những người bỏ cuộc.

Nếu bạn đang ngồi trên giảng đường đại học, hãy cũng cố vững chắc background IT của mình. Còn nếu bạn không học đại học, hãy tìm cách để trở thành một ứng viên có background IT tốt (bằng nhiều cách, mình không đề xuất ở đây). Và hãy xem phần sau để biết nhiều hơn về background IT tốt.

Xem thêm tuyển dụng IT Intern hấp dẫn trên Topdev

#2 Xây dựng background IT ngay trên giảng đường đại học

Từ đầu bài viết tới gì mình nói về từ background IT rất nhiều. Và trong phần này, chúng ta sẽ cùng đi tìm nó.

chuyen-tam-cay-cuoc

Tư duy lập trình chính là thứ bạn phải có đầu tiên nếu muốn bước vào con đường lập trình. Tư duy lập trình chính là cái cách mà bạn suy nghĩ (logic) để giải quyết một bài toán từ những bài toán nhỏ nhất cho đến các bài toán phức tạp, project lớn. Tư duy lập trình được rèn luyện và tích lũy mọi lúc khi bạn đang suy nghĩ để giải quyết một bài toán nào đó.

Cho nên, làm bài tập, project nhỏ, đồ án, luận văn, hay các project lớn hơn … tất cả những thứ này sẽ giúp cho bạn có được một tư duy lập trình tốt. Hãy rèn luyện nó từng ngày từng ngày một.

Nói nhỏ cho bạn một kiến thức này, tư duy lập trình của bạn liên quan mật thiết với sự liên kết của các nơron thần kinh trong não bộ của bạn. Hãy tìm hiểu thêm về vấn đề này nhé.

Lập trình hướng đối tượng (OOP) là một kiến thức tối quan trọng trong thế giới IT. Và nó sẽ đi theo bạn đến hết quảng đời của một lập trình viên. Trường đại học cũng sẽ dạy cho bạn hướng đối tượng, nhưng nó chưa đủ và bạn sẽ dần dần nắm rõ và ứng dụng được OOP trong quá trình làm việc.

Ở trong trường đại học, bạn hãy có gắng nắm rõ và hiểu được hướng đối tượng nhiều nhất có thể. Để có thể ứng dụng được trong một vài project nhỏ. Nếu có thể bạn hãy nghiên cứu thêm các project thực tế của các doanh nghiệp để có thể nắm vững hướng đối tượng và có thể ứng dụng được.

Database, tất cả các hệ thống hiện nay đều phải có một database để quản lý dữ liệu. Bạn hãy có gắng để nắm vững được cách sử dụng, thiết kế và thực thi một database. Nếu tốt hơn, bạn có thể tìm hiểu về cách tối ưu cho database, tìm hiểu thêm về SQL và NOSQL.

Ngoài ra, một số kiến thức quan trọng khác như: kiến trúc hệ thống, cấu trúc dữ liệu và giải thuật, security, testing, kiến thức về các mô hình mạng (network), mô hình client-server, … Tiếp sau đó là clean code (làm sao để viết code cho người đọc) và SOLID (các nguyên lý viết code để tối ưu hệ thống và dễ maintenance).

Tất cả các kiến thức trên, bạn sẽ được rèn luyện trong trường đại học và hãy cố gắng rèn luyện nó hết mức có thể để có một background IT tốt nhất.

Trong quá trình rèn luyện, bạn sẽ từ từ tìm ra được cách để học một công nghệ mới, kiến thức mới. Hoặc bạn có thể tham khảo bài viết này. Cách để học một thứ gì đó mới trong IT phản ánh tương đối trình độ của bạn. Hãy ghi nhớ điều này.

Lời khuyên cuối: Bạn hãy kiên trì và cố gắng hết mức có thể để lấy một background IT tốt!

# Kết

Bài viết đã đủ dài rồi, ở trong phần kết này mình muốn nói một điều ngắn gọn
“Dù bạn có là người xuất phát trước hay sau, bạn vẫn có thể về đích trước nếu bạn cố gắng hơn tất cả phần còn lại“.

Bài viết gốc được đăng tải tại lenhatthanh.com

Có thể bạn quan tâm:

Xem thêm Jobs Developer hấp dẫn trên TopDev

Bí kíp vượt qua 7 câu hỏi phỏng vấn UI/UX Designer thường gặp

Bạn muốn trở thành một UI/UX Designer và đang chuẩn bị cho buổi phỏng vấn tuyển dụng? Chắc hẳn bạn đã hiểu rằng, phỏng vấn là bước quan trọng để có thể đạt được mục tiêu nghề nghiệp của mình. Tuy nhiên, để vượt qua được buổi phỏng vấn UI/UX Designer, bạn cần có những kinh nghiệm và kiến thức vững chắc về lĩnh vực này. Để giúp bạn chuẩn bị tốt hơn cho buổi phỏng vấn, bài viết này sẽ cung cấp cho bạn những gợi ý trả lời cho các câu hỏi phỏng vấn UI/UX Designer thường gặp nhất, giúp bạn nâng cao cơ hội được nhận vào vị trí mình mơ ước.

1. UX Design khác với UI Design như thế nào?

Các thuật ngữ về UX, UI thường đi chung với nhau nhưng chúng lại thể hiện một vai trò riêng biệt. Câu hỏi này sẽ giúp nhà tuyển dụng đánh giá được kiến thức chuyên môn của bạn về UX UI. Bạn có thể trả lời câu hỏi trên theo cách này:

UX và UI có sự khác biệt cơ bản về nguyên lý thiết kế và phương thức hoạt động. Cụ thể, UX sẽ tập trung vào trải nghiệm của người dùng, giải quyết các vấn đề mà người dùng gặp phải khi trải nghiệm sản phẩm của doanh nghiệp. Còn UI sẽ tập trung vào thiết kế giao diện người dùng, nói cách khác chính là tạo ra yếu tố thị giác, hiện thực hóa UX qua mặt hình ảnh. Vì vậy, UI và UX liên quan mật thiết đến nhau trong việc tạo ra một sản phẩm với trải nghiệm người dùng tốt nhất.

>>> Xem thêm: UI UX là gì? Công việc của một UX/UI designer

UX Design khác với UI Design như thế nào?

2. Theo bạn, làm thiết kế UI UX khác gì với thiết kế website?

Bạn có thể trả lời câu hỏi này như sau: Theo quan điểm của tôi, thiết kế UI/UX và thiết kế website là hai khái niệm khác nhau, tuy nhiên chúng có sự liên quan mật thiết đến nhau. Thiết kế website tập trung vào việc xây dựng một trang web, trong khi thiết kế UI/UX tập trung vào trải nghiệm người dùng trên trang web đó. Nếu chỉ tập trung vào việc thiết kế trang web mà không quan tâm đến trải nghiệm người dùng, thì trang web đó có thể sẽ không hấp dẫn được khách hàng hoặc khách hàng sẽ không thực hiện được một số hành động trên trang web đó.

  Một số nguyên tắc thiết kế UI/UX website

3. Bạn có thể cho chúng tôi biết về quá trình thiết kế sản phẩm của bạn từ khâu nghiên cứu đến khâu triển khai?

thiết kế UI/UX

Để trả lời câu hỏi này, bạn có thể đưa ra một quy trình thiết kế cụ thể mà bạn đã thực hiện trên một dự án. Bao gồm các bước chính như nghiên cứu thị trường và đối thủ cạnh tranh, tìm hiểu nhu cầu của người dùng, xác định mục tiêu của sản phẩm, thiết kế wireframe và mockup, thử nghiệm, kiểm thử sản phẩm, và triển khai sản phẩm. Bạn nên đề cập đến các công cụ và phương pháp mà bạn đã sử dụng trong quá trình thiết kế, cũng như những thách thức và giải pháp mà bạn đã đối mặt khi làm việc trên dự án đó. Cuối cùng, hãy kết thúc bằng việc nêu ra các kết quả và thành tựu mà bạn đã đạt được từ dự án này.

  Lập trình viên có cần biết về UI/UX?

4. Làm thế nào để bạn thu thập thông tin từ khách hàng hoặc người dùng để tạo ra trải nghiệm tốt hơn cho họ?

Để trả lời câu hỏi này, bạn có thể đưa ra một ví dụ cụ thể về việc bạn đã sử dụng dữ liệu người dùng để cải thiện trải nghiệm người dùng trong một sản phẩm. Ví dụ, bạn có thể đề cập đến việc phân tích các dữ liệu người dùng như phản hồi từ khảo sát, phản hồi từ phản hồi người dùng, hoặc phân tích hành vi người dùng để hiểu được những khó khăn và thách thức mà họ đang gặp phải trong quá trình sử dụng sản phẩm của bạn. Bằng cách đó, bạn đã sử dụng dữ liệu để đưa ra những cải tiến và cải thiện trải nghiệm người dùng, đảm bảo rằng sản phẩm của bạn đáp ứng tốt hơn nhu cầu và mong muốn của người dùng.

Tham khảo việc làm UI/UX hấp dẫn trên TopDev

5. Bạn thường tìm kiếm cảm hứng thiết kế từ đâu?

cảm hứng thiết kế

Khi nhà tuyển dụng hỏi bạn câu này, họ đang muốn biết cách bạn lấy ý tưởng và bạn có thực sự hứng thú tiếp tục học hỏi hay không. Bạn có thể đề cập đến một số nguồn cảm hứng thiết kế như từ thiết kế của các sản phẩm khác, tham gia các cộng đồng thiết kế, từ các tạp chí hay trang web về thiết kế hoặc từ trong chính cuộc sống hàng ngày.

6. Làm thế nào để bạn đảm bảo rằng giao diện người dùng của bạn thân thiện với người dùng và dễ sử dụng?

Để trả lời câu hỏi này, bạn có thể nêu rõ những kỹ năng quan trọng và cần thiết nhất trong công việc UX/UI. Một số kỹ năng có thể bao gồm:

  • Năng lực phân tích và đánh giá dữ liệu: Để hiểu rõ nhu cầu và mong muốn của người dùng, bạn cần có khả năng phân tích và đánh giá các dữ liệu liên quan đến họ.
  • Kỹ năng thiết kế: Để tạo ra giao diện người dùng tốt, bạn cần có khả năng thiết kế đồ họa và sáng tạo, đảm bảo rằng sản phẩm của mình hấp dẫn và dễ sử dụng.
  • Kỹ năng làm việc nhóm: UI/UX là một quá trình phức tạp, đòi hỏi sự hợp tác giữa các bên khác nhau như bộ phận thiết kế, bộ phận phát triển sản phẩm, bộ phận quản lý dự án. Vì vậy, kỹ năng làm việc nhóm và trao đổi thông tin cũng rất quan trọng.
  • Khả năng phát triển sản phẩm: Để thiết kế sản phẩm tốt, bạn cần hiểu rõ quá trình phát triển sản phẩm để đảm bảo rằng sản phẩm của bạn có thể triển khai và hoạt động một cách hiệu quả.

7. Làm thế nào để bạn quyết định thêm/loại bỏ một tính năng nào đó?

Câu hỏi phỏng vấn UI UX này được coi là một thử thách đối với các ứng viên chưa có nhiều kinh nghiệm. Nó được sử dụng để đánh giá khả năng xử lý tình huống của ứng viên. Vì vậy, việc trả lời câu hỏi này đòi hỏi sự khéo léo và tinh ý để có thể tạo ra một câu trả lời thuyết phục và chính xác.

Bạn có thể trình bày rằng, để có thể đưa ra quyết định thêm hay loại bỏ một tính năng bạn cần xem xét các yếu tố như:

  • Nhu cầu người dùng: Tính năng đó có đáp ứng được nhu cầu của người dùng hay không? Nếu tính năng đó không cần thiết hoặc không giải quyết được vấn đề của người dùng thì có thể loại bỏ.
  • Hiệu quả: Tính năng đó có giúp tăng hiệu quả sử dụng sản phẩm hay không? Nếu tính năng đó không mang lại lợi ích cho người dùng hoặc khó sử dụng, có thể xem xét loại bỏ.
  • Khả thi kỹ thuật: Tính năng đó có khả thi để triển khai hay không? Nếu tính năng đó yêu cầu quá nhiều tài nguyên hoặc không khả thi để triển khai, thì có thể xem xét loại bỏ.
  • Thị trường: Tính năng đó có cạnh tranh với các sản phẩm khác trên thị trường hay không? Nếu tính năng đó không cạnh tranh được hoặc không đáp ứng nhu cầu của thị trường, thì có thể xem xét loại bỏ.

Tổng hợp các câu hỏi phỏng vấn UI/UX Designer trên đây cung cấp cho bạn một cái nhìn tổng quan về những câu hỏi thường gặp trong quá trình tuyển dụng. Tuy nhiên, không phải câu trả lời nào cũng phù hợp với tất cả các trường hợp, và bạn cần phải thể hiện được sự tự tin, khả năng xử lý tình huống, tư duy logic và khả năng tương tác với nhà tuyển dụng trong quá trình phỏng vấn. Hy vọng rằng những gợi ý trên sẽ giúp bạn nâng cao cơ hội được tuyển vào vị trí UI/UX Designer mình mong muốn.

TopDev tổng hợp

Xem thêm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Virtualbox Headless Frontend là gì?

Virtualbox Headless Frontend là gì?

Nhắc đến phần mềm tạo máy ảo thì chúng ta thường nghĩ ngay đến Virtualbox, một trong số những phần mềm tốt nhất giúp bạn tạo được máy ảo để chạy và sử dụng nhiều hệ điều hành cùng lúc trên một máy tính, hơn nữa nó được cung cấp hoàn toàn miễn phí từ Oracle. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về Virtualbox là gì và những tính năng mà Virtualbox Headless Frontend mang lại nhé.

Máy ảo là gì?

Máy ảo là những phần mềm giúp bạn cài đặt và chạy một hay nhiều hệ điều hành giống như một ứng dụng trên máy tính một cách song song với hệ điều hành hiện tại, không hoặc ít can thiệp và làm ảnh hưởng đến phần cứng và thiết lập phần cứng của máy tính hiện tại.

Máy ảo là gì?

2 phần mềm phổ biến được đánh giá tốt nhất hiện nay trên PC là VMWare và Virtualbox. Ưu điểm của Virtualbox chính là việc nó được cung cấp miễn phí, nhờ vậy mà nhiều phần mềm máy ảo khác cũng sử dụng nền tảng này để tạo ra những ứng dụng giả lập của riêng mình.

Ứng tuyển ngay các vị trí tuyển dụng Frontend trên TopDev

Virtualbox là gì?

Virtualbox là một công cụ GUI và dòng lệnh cho phép chúng ta triển khai máy chủ, máy tính để bàn và hệ điều hành nhúng dưới dạng máy ảo. Virtualbox cung cấp nhiều tính năng hữu ích dành cho bạn như:

  • Khả năng tương thích: tương thích hầu hết với các hệ điều hành chạy 32 hay 64 bit hiện nay, các máy ảo được tạo ra có tính năng giống hệt như một hệ điều hành trên một máy thật.
  • Hỗ trợ đa nền tảng: Virtualbox có phiên bản dành cho hầu hết các hệ điều hành trên PC hay server, từ Window, Linux hay MacOS,…
  • Khả năng tái sử dụng cao: bạn có thể tạo máy ảo trên hệ điều hành Linux, sau đó copy thư mục đã cài và import để chạy trên hệ điều hành Window hoặc MacOS một cách bình thường.
  • Khai thác tối đa tài nguyên máy tính: việc sử dụng Virtualbox giúp bạn tận dụng được tài nguyên phần cứng như CPU, RAM, ổ cứng của thiết bị một cách tối đa.
  • Tiết kiệm thời gian và không gian: nhờ việc chạy song song các hệ điều hành, cùng với việc có khả năng chia sẻ file nhanh chóng giữa các máy ảo giúp bạn tiết kiệm được nhiều thời gian và không gian thao tác.

  Hướng dẫn cài đặt VirtualBox trên Ubuntu chi tiết nhất

  Bí mật của Virtual Method và Override

Virtualbox Headless Frontend là gì?

Virtualbox Headless Frontend hay trạng thái headless của Virtualbox sẽ không hiển thị giao diện (GUI) của Virtualbox, vẫn khởi động máy ảo và thực hiện chạy các hệ điều hành một cách bình thường. VirtualBox Manager cung cấp sẵn cho chúng ta chế độ chạy này trong ứng dụng của nó.

Virtualbox Headless Frontend

Virtualbox hoạt động như một dịch vụ chạy ở nền (background) như một dịch vụ hệ thống hay daemon, vì vậy chúng ta không cần giao diện để sử dụng nó. Tất cả các thực thể (instances) của Virtualbox đều có thể chạy ở chế độ headless. Chương trình Virtualbox Manager mà chúng ta cài đặt và sử dụng chỉ là một công cụ giúp người dùng thao tác dễ dàng hơn với các instance tạo ra thôi. Thực tế các instance máy ảo trong Virtualbox sẽ có những file cấu hình (config) riêng và có thể sửa đổi bằng bất kỳ trình editor text nào. Khi bạn thực hiện lời gọi start các instance, dựa theo file cấu hình đã lưu mà những instance máy ảo trên sẽ nạp dữ liệu và hoạt động.

Tham khảo việc làm Mobile Developer hấp dẫn trên TopDev

VirtualBox Remote Display Protocol (VRDP)

Virtualbox cung cấp các tùy chọn đặc biệt để quản lý máy ảo bằng dòng lệnh bằng tiện ích VboxManage. Chúng ta có thể sử dụng chế độ Headless để khởi động máy ảo từ dòng lệnh mà không cần thông qua Virtualbox GUI, phương thức này gọi là VRDP.

Để sử dụng được VRDP, VirtualBox cung cấp một extension miễn phí có tên “Oracle VM VirtualBox Extension Pack”. Sau khi cài đặt xong thì chúng ta sử dụng các lệnh để thao tác với các máy ảo:

  • Hiển thị danh sách máy ảo: “VBoxManage list vms”
  • Khởi động máy ảo: “VBoxHeadless -s <tên-máy-ảo>”
  • Khởi động ở chế độ headless: “VBoxManage startvm <tên-máy-ảo> –type headless

Ngoài ra chế độ này cũng cho phép chúng ta thao tác với các máy ảo từ xa bằng cách ssh hay remote vào server chứa các instance của máy ảo.

VirtualBox Remote Display Protocol

Kết bài

Virtualbox là một phần mềm tạo máy ảo hữu ích, đồng thời cũng là phần nhân cho nhiều phần mềm tạo máy ảo, giả lập mà anh em lập trình viên sử dụng. Hy vọng bài viết hôm nay đã mang lại cho các bạn những kiến thức hữu ích về Virtualbox Headless Frontend, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Có thể bạn quan tâm:

[Update] Low Code là gì? Hướng đi nào cho Low Code 2024

Low code là gì? Hướng đi nào cho Low Code 2023

Trong kỷ nguyên số hiện tại, các công ty, các chính phủ và bản thân các lập trình viên đều chạy đua với nhau để vượt trội hơn về mặt công nghệ, một trong các công nghệ nổi bật lên là Low Code.

Bài viết này hân hạnh giới thiệu với anh em khái niệm về Low-Code. Nếu anh em có đọc ở đâu, hoặc nhìn thấy Low-Code ở đâu thì cũng đừng vội lướt qua. Biết đâu cách giải thích của tui hay hơn thì sao.

Nội dung truyền đạt trong bài viết này chắc là sẽ phù hợp với cả những nhân vật cấp cao như giám đốc đơn vị, quản lý dự án, CTO,…

Không để anh em phải đợi lâu, nhảy luôn vô định nghĩa. Phải chăng Low-Code là ngồi xuống thấp thấp mà code?

Low Code là gì?

1. Low Code là gì?

Đầu tiên low ở đây không phải là ngồi xuống thấp thấp mà code nha anh em. Low ở đây được hiểu là ít code lại.

Low Code là một phương pháp phát triển phần mềm yêu cầu ít hoặc không cần viết code để xây dựng các ứng dụng và quy trình. Thay vì anh em phải sử dụng ngôn ngữ lập trình phức tạp. Theo mô hình Low-Code, anh em có thể sử dụng các giao diện trực quan với các logic ở mức bình thường để phát triển ứng dụng.

Tuyệt vời hơn nữa anh em có thể kéo thả (giao diện trực quan) để xây dựng ứng dụng. Giúp tiết kiệm thời gian, công sức và tiền bạc.

Lại là chỉ nghe thôi cũng thấy hấp dẫn, nhưng có thật sự là Low-Code giúp anh em không phải code nữa mà chỉ cần các thao tác trực quan là đã có ứng dụng? Hay tất cả chỉ là cú lừa?

  Digital Twins – xu hướng công nghệ cho ngành IoT

  Công nghệ Blockchain là gì? Tiềm năng & ứng dụng thực tế 

2. Sự thật về low code và tương lai

Công bằng mà nói thì Low Code là cho người sử dụng nền tảng (platform). Còn bản thân lập trình viên vẫn phải là người tạo ra các component, các model có thể trên platform. Nên nếu nói Low-Code là không code hoặc ít code thì thực chất đó là dành cho người sử dụng. Không phải các lập trình viên tạo nên các platform Low-Code. Anh em nhớ nha!.

Sự phát triển của Low-Code các năm gần đây được xem như một hiện tượng, khi mà số hoá và chuyển đổi số đi sâu vào từng ngõ ngách trong cuộc sống:

  • Theo như báo cáo mới nhất của Gartner, Inc’s thì thị trường toàn cầu cho các công ty phát triển Low Code sẽ đạt khoảng 26.9 tỷ đô vào năm 2023 (tăng 19.6% so với năm 2022).
  • Trong tương lai thị trường sẽ đạt khoảng 65 tỷ Biden vào năm 2027 và 187 tỷ Biden vào năm 2030.
  • Thực tế mà nói thị trường Low-Code đã tăng 30% từ năm 2020 cho tới năm 2023 và tạo ra 5,8 tỷ Biden năm 2022.

Thị trường rộng mở ha anh em, tương lai sáng ngời và chói lọi.

Tham khảo việc làm Back-end hấp dẫn

Sự thật về low code và tương lai

3. Lợi ích đem lại cho business owner

Rõ ràng là Low Code sẽ đem lại kết quả nhanh chóng và nhìn thấy được cho các chủ doanh nghiệp. Quá trình phát triển cũng trở nên cực kì nhanh chóng.

Đầu tiên tất nhiên phải nói tới tính nhanh chóng.

3.1 Increased agility (Tăng độ nhanh nhạy)

Với Low-Code, các component, model, thậm chí tới các flow phức tạp đều đã được dựng lên từ trước. Việc này giúp việc triển khai trở nên cực kì nhanh chóng. Anh em không cần phải có kiến thức sâu rộng về lập trình để tạo ra sản phẩm.

Việc này cực kì hữu ích khi mô hình kinh doanh thay đổi nhanh chóng (vô cùng phổ biến ở thời điểm này). Các doanh nghiệp có lợi thế khi họ có thể nhanh chóng thay đổi theo.

3.2 Reduced costs (Giảm giá thành)

Tất nhiên là việc sử dụng Low Code platform sẽ tạo ưu thế cạnh tranh về giá thành. Anh em cũng biết là chi phí phát triển phần mềm từ trước tới nay chưa bao giờ là rẻ.

Với các platform đã phát triển Low-Code thì ngược lại. Công sức chỉ bỏ ra một lần ban đầu và tái sử dụng nhiều lần sau đó. Việc này giúp doanh nghiệp giảm được chi phí ở mức tối đa.

3.3 Faster time to market (Xuất hiện nhanh chóng)

Ở cái thời đại mà ý tưởng chỉ vừa với ra đầu môi thì đã có ngay ứng dụng trên store thì Low-Code giúp doanh nghiệp triển khai ý tưởng nhanh chóng. Thời gian phát triển giảm xuống đồng nghĩa với việc business xuất hiện trên thị trường nhanh hơn. Tạo ưu thế cạnh tranh so với đối thủ.

4. Tính năng của Low Code

Sau khi đã hiểu rõ về lợi thế, ưu điểm của Low-Code thì giờ là lúc lướt qua một số tính năng nổi bật của nó. Đầu tiên không thể không nhắc tới Visual Modeling Tools.

4.1 Visual Modeling Tools

Visual Modeling Tools ở đây được hiểu là trực quan hoá các mô hình. Các mô hình phổ biến sẽ được xây dựng sẵn. Các mô hình này sẽ được xây dựng cực kì trực quan, giúp người sử dụng dễ nắm bắt.

Ngoài ra, người sử dụng Visual Modeling Tools cũng không cần hiểu biết nhiều về công nghệ. Dễ dàng hơn cho các doanh nghiệp.

4.2 Out-of-the-Box Functionality

Out-of-the-Box Functionality

OOTB, viết tắt của (out-of-the-box) là tính năng được phát triển bởi các công ty phát triển hàng đầu cho Low-Code. Bản thân nó giúp người sử dụng có thể bỏ qua các khởi tạo ban đầu khi bắt đầu sử dụng Low Code.

Ví dụ anh em làm application cần có DB, OOTB sẽ xử các phần đó cho anh em.

4.3 Drag-and-Drop Interface

Kế tiếp là feature về Drag và Drop, anh em suy luận một chút thì hiểu ngay tính năng này quan trọng thế nào với Low-Code. Các model, component có sẵn tất nhiên chỉ cần kéo thả vào là hoạt động. Độc lập là ok rồi, giờ chỉ cần kéo thả đặt vào đúng chỗ nữa là được thôi.

4.4 Security (bảo mật)

Cái này là tính năng sống còn của Low-Code, anh em lập trình code xong review tới review lui mà còn có bug về bảo mật. Chưa kể ứng dụng đôi khi còn bị tấn công liên tục bởi các hacker thì security là yếu tố quan trọng cần quan tâm.

4.5 Scalability (mở rộng)

Cuối cùng là tính năng mở rộng. Này là điểm thường được đem ra so sánh giữa Low-Code và cái code cắm đầu. Ở mặt này, hiện tại Low-Code đang có phần kém hoặc chưa thể bằng với cách phát triển phần mềm truyền thống do tính chất phức tạp về mặt kiến trúc (architecture). Tuy nhiên tương lai thì khó nói nha. Vượt lên lúc nào không hay

5. Tham khảo

Cảm ơn anh em đã đọc bài – Chúc anh em một ngày ít code – Nhưng code là đam mê – Happy coding!

Tác giả: Kiên Nguyễn

Có thể bạn quan tâm:

Tìm kiếm việc làm IT mới nhất tại TopDev!

Thái cực trong lập trình – Functional Programming

Thái cực trong lập trình - Functional Programming

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Trong thế giới kiếm hiệp Kim Dung, Trương Tam Phong là nhân vật có võ công cao nhất (theo Kim Dung). Bởi vì ông sở hữu bộ võ công Thái Cực Quyền và Thái Cực Kiếm. Tinh hoa võ công khác hẵn hoàn toàn với thế giới võ công đương đại. Lấy nhu khắc cương.

Thế giới lập trình cũng vậy. Lập trình hướng đối tượng (OOP) luôn được xem là tinh hoa của võ công.

Các bạn tiếp cận với OOP rất sớm, ngay lúc mới bắt đầu học lập trình.

Có rất nhiều người cho rằng OOP là mô hình để thiết kế phần mềm tốt nhất. Và mình xin nhắc lại, OOP là mô hình lấy đối tượng (object) làm gốc.

Mình ví OOP như là thế giới võ công đương đại trong Kim Dung. Vậy Thái Cực Quyền trong thế giới lập trình là gì?

Bạn đã bao giờ nghe về functional programming chưa? Lập trình theo phong cách lấy hàm (function) là trung tâm.

Bây giờ, hãy cùng đi vào thế giới hoàn toàn khác với những gì chúng ta thường biết với OOP.

#1 Thái cực bắt nguồn từ đâu

Ngày xửa ngày xưa, có hai cao thủ võ lâm. Alan Turing và Alonzo Church.

Alan Turing tinh thông môn võ Turing Machine. Còn Alonzo Church thì nổi danh với Lambda Calculus.

Cả hai đều là võ lâm cao thủ thời bấy giờ. Đã trãi qua nhiều trận đấu long trời lở đất. Nhưng đều không phân biệt thắng thua.

Sau đó, cả hai mới thống nhất với nhau một bản hiệp ước Church – Turing.

Khẩu quyết của Turing Machine chính là việc nắm giữ các trạng thái của tiến trình và state machine.

Còn linh hồn của Lambda Calculus tập trung cho việc xây dựng các tính chất của các hàm toán học.

Sau này, chính Turing Machine đã đặt nền móng cho sự ra đời của lập trình hướng đối tượng (OOP). Còn Lambda Calculus là nguồn gốc ra đời của Functional Programming (FP).

Lưu ý rằng, hai trường phái này chỉ là hai trong số nhiều trường phái trong võ lâm lúc bấy giờ. Nhưng đây là hai trường phái lớn nhất!

Lịch sử trôi qua, có vẻ OOP chiếm ưu thế hơn rất nhiều so với FP. Bạn thử nhìn xung quanh để kiểm chứng. Các buổi phỏng vấn, ngay trong trường đại học. Bạn tiếp xúc với OOP rất nhiều.

Nhưng ở một thế giới khác, FP vẫn luôn âm thầm phát triển từng ngày một. Hãy nhìn những Lisp, F#, Haskell, Clojure, Erlang, … là những ngôn ngữ đại diện cho trường phái FP.

Trong 1 thập kỉ trở lại đây. FP đang trở lại! Người ta bắt đầu phàn nàn về OOP.

Đã có những bài viết trình bày rất rõ về FP. Họ là những tín đồ, fan cuồng của FP. Ví dụ như bài viết “So You Want to be a Functional Programmer” của Charles Scalfani.Thậm chí, Scalfani còn đề cao Functional Programming như nấc thang tiến hóa trong lịch sử lập trình. Anh ấy còn có một bài viết khác gây tranh cãi rất nhiều! Goodbye, Object Oriented Programming.

functional-programming

Trên thực tế! FP hay OOP là hai trường phái tu luyện khác nhau. Phần nào cũng có cái lợi thế hay bất lợi riêng. Chúng ta không nên so sánh bên nào ngon hơn!

  Functional Programming là gì? Tại sao nên sử dụng?

  Paper Review: Why Functional Programming Matters

#2 Những khẩu quyết của Functional Programming

Trong phần này, chúng ta sẽ đi vào những thứ cơ bản nhất của FP. Bước đầu dấn thân vào thái cực!

Mình có một lưu ý: FP là một con đường dài. Nếu muốn giác ngộ, bạn phải kiên trì! Và trong bài viết này, mình không thể đi hết các khẩu quyết (concept) của FP. Vì đơn giản là không đủ!

Functional Programming là phương pháp lập trình lấy function làm đơn vị thao tác cơ bản.

Về lý tưởng, FP chỉ có function với function. Không có lệnh gán, không có vòng lặp, không có trạng thái toàn cục. Trong FP, chúng ta sẽ kết hợp các function lại với nhau và nhảy múa với chúng!

Phải nói rằng FP đang dần dần trở lại thế giới lập trình ở hiện đại. Bằng chứng là các bản cập nhật của các ngôn ngữ, framework mới. Đang dần hướng về FP (như Javascript, Python, Golang, …).Bạn hãy nhìn vào ReacJS, một framework với 70% FP và 30% OOP (có thể nói rằng như thế).

Các lập trình viên hiện đại thường kết hợp sự linh hoạt của OOP và FP lại với nhau. Mục đích cuối cùng là để có được một chương trình đúng, nhanh, gọn, đẹp.

Và để có thể bước vào thế giới Functional Programming. Bạn phải học một số khẩu quyết quan trọng sau!

Xem thêm nhiều việc làm ASP.NET Core hấp dẫn trên TopDev

Immutability hay tính bất biến

Khẩu quyết thứ nhất của functional programing là: Những gì đã được khai báo trước đó thì không được thay đổi nữa!

Nghĩa là những thứ đã được khai báo trước đó. Sẽ không bao giờ được thay đổi trong quá trình chạy chương trình!Bạn có thấy điều này lạ không? Khác hẵn với những gì ta đã học trong OOP. Những tư duy lập trình cũ. Nhưng nó chính là khẩu quyết đầu tiên của FP – tính bất biến.

Chúng ta cùng lấy một ví dụ về tính bất biến và không bất biến:

/* Đoạn code dưới đây không phải là bất biến vì giá trị biến bị thay đổi */
var immutabilityVar = "lenhatthanh.com";
immutabilityVar = "coderdocs.info";
/* Còn đoạn code dưới đây thoả mãn tính bất biến của FP */
var immutabilityVar = "lenhatthanh.com";
var immutabilityVar2 = "coderdocs.info";

Bất biến là khẩu quyết tối quan trọng trong FP. Nếu viết code theo phong cách FP, bạn cần hạn chế tối đa việc thay đổi giá trị biến hay object. Tốt nhất là không nên thay đổi, mọi thứ trong FP nên là const.

Khi ES6 release, đã cho ra 2 cách khai báo mới là const và let. Người ta khuyên rằng nên dùng const và dùng let chỉ khi nào cần thiết.

Bạn có nhớ tới vòng lặp forwhile không? Những vòng lặp này hay dùng một biến index duyệt vòng lặp. Và vì tính bất biến, nên FP đã loại bỏ vòng lặp!

Vậy thì bạn sẽ hỏi là, chúng ta sẽ dùng gì để thay thế cho vòng lặp?

Đệ quy (recursive), cao hơn chúng ta dùng một số function khác. Tùy vào độ support của ngôn ngữ! Quay lại, đệ quy sẽ thay thế cho vòng lặp. Có nhiều bạn có lẽ không quen với tư duy của đệ quy. Nhưng nếu bạn đã bước vào FP, thì hãy luyện đệ quy.

/**
* Bài toán ở đây là tính giai thừa của n (n!) 
* Chúng ta sẽ giải quyết bài toán theo vòng lặp và đệ quy
**/
// Chúng ta viết theo vòng lặp cực kì đơn giản
result = 1;
for (i = 1; i <= n; i++) {
    result *= i;
}
// Còn nếu chúng ta viết với đệ quy thì sao?
function factorialOfNumber (n) {
    if (n === 1) {
        return n;
    }
    return n * factorialOfNumber(n - 1);
}

Vậy lợi ích của tính bất biến là gì?

Bạn cũng biết chúng ta hay gặp bug khi thay đổi giá trị của biến mà chúng ta không kiểm soát được. Hoặc các trạng thái bị thay đổi một cách bất ngờ. Vì bất biến, nên việc thay đổi là không xảy ra. Nên rủi ro gặp bug (do các biến gây ra) là nhỏ hơn và chương trình dễ debug hơn. Chúng ta dễ dàng kiểm soát được giá trị các biến. Và tránh được những thay đổi không mong muốn trong chương trình.

Purity

Purity là sự thật khiết, trinh trắng!

Khẩu quyết thứ 2 trong FP là.

Tất cả các function đều phải là Pure function. Nghĩa là những function này không được thay đổi bất cứ thứ gì bên ngoài nó. Không được thay đổi tham số đầu vào. Không có hiệu ứng phụ (side effect).

Chúng ta cùng lấy một ví dụ về function có hiệu ứng phụ.

function handleX (n) {
    const returnVal = n * n + n * 2 + 1;
    makeAjaxCall(returnVal);
    return returnVal;
}

Rõ ràng trong function handleX còn gọi thêm Ajax, và không biết sẽ xử lý gì trong đó. Nên đây được gọi là hiệu ứng phụ. Và function này không phải là Pure function.

Javascript hay những ngôn ngữ như khác thường có rất nhiều hiệu ứng phụ side effect. Rõ ràng là chương trình chúng ta viết không thể nào thiếu những hiệu ứng phụ quan trong như Ajax, giao tiếp database,… FP sẽ làm một nhiệm vụ là cô lập và tách biết các hiệu ứng phụ ra. Nhằm mục đích giúp cho code của chúng ta rõ ràng. Và đặc biệt là dễ kiểm soát. Vì hiệu ứng phụ sẽ làm thay đổi giá trị biến hay cái gì đó bất cứ lúc nào.

Trên đây là hai tính chất, khẩu quyết đầu tiên trong Functional Programming. Đây là những tính chất cơ bản nhất. Và chắc chắn bắt buộc đối với những ai muốn dấn thân vào con đường này.

Higher-Order Function

Higher-order function (HOF) là một function có ít nhất một trong hai đặc điểm sau:

  • Tham số đầu vào là một hoặc nhiều function
  • Return một function

Nảy giờ chúng ta đã lấy ví dụ về Javascript nhiều rồi. Bây giờ là ví dụ PHP về Higher-order function.

<?php
/* Hàm twice có tham số đầu vào là một function và return một function */  
$twice = function($add, $number) { 
   return $add($add($number)); 
};  
$add = function($number) { 
   return $number + 1; 
}; 
echo($twice($add, 5));

Function twice vừa có tham số đầu vào là một function vừa return một function. Cho nên hàm này thừa sức để làm một Higher-order function.

Khẩu quyết thứ ba này rất đơn giản và dễ hiểu. Nhưng có một câu hỏi được đặt ra. Tại sao phải dùng Higher-order function?

FP như giới thiệu ban đầu! Là một kiểu lập trình theo phong cách nhảy múa cùng với function. Higher-order function giúp cho chúng ta dễ dàng làm được việc này. Mọi flow, ngóc ngách, mọi dòng chảy code, chúng ta dễ dàng control chúng với HOF.

Giới thiệu về Functional Programming tới đây thôi. Vì như mình đã nói từ đầu bài. FP là một con đường dài.

FP còn rất nhiều khẩu quyết phía sau như: Function Composition, Currying function, Object Composition, không có new/this, class citizens,…

#3 Functional Programming và OOP

Functional programming OOP
Lấy function là đơn vị thao tác cơ bản Thao tác dựa trên các concept của object
Sử dụng Immutable data Sử dụng Mutable data
Theo mô hình declarative programming Theo mô hình imperative programming
Hổ trợ Parallel programming Không hổ trợ Parallel programming
Function không chưa side effects Method có chứa side effects
Flow control sử dụng việc gọi hàm hay sử dụng đệ quy Flow control sử dụng vòng lặp hay câu lệnh if
Thứ tự thực hiện các câu lệnh không quan trọng Thứ tự thực hiện các câu lệnh cực kì quan trọng
Hổ trợ cả “Abstraction over Data” và “Abstraction over Behavior”. Chỉ hổ trợ “Abstraction over Data”.

#Kết

Bài viết này, mình chỉ trình bày sơ bộ về functional programming. Và so sánh đôi chút nó với lập trình hướng đối tượng.

Đương nhiên chỉ với giới hạn một bài viết. Không thể cover hết tinh hoa của functional programming. Mình để những tinh hoa đó cho chúng ta cùng nhau research.

Functional programming đòi hỏi người luyện phải chuyên tâm, kiên trì. Không phải ngày một ngày hai mà có thể luyện thành.

Chúc các bạn thành công trên con đường tu luyện với Functional Programming!

Bài viết gốc được đăng tải tại lenhatthanh.com

Xem thêm:

Xem thêm tuyển dụng IT mới nhất tại TopDev

Top câu hỏi phỏng vấn Graphic Designer chinh phục nhà tuyển dụng

Câu hỏi phỏng vấn Graphic Designer chinh phục nhà tuyển dụng

Graphic Design là một trong những ngành đang được săn đón và có nhu cầu tuyển dụng cao. Nếu bạn muốn trở thành một Graphic Designer, việc chuẩn bị kỹ càng cho buổi phỏng vấn là rất quan trọng. Trong bài viết này, TopDev sẽ giúp bạn tìm hiểu các câu hỏi phỏng vấn Graphic Designer thường gặp cùng cách trả lời thông minh và hiệu quả nhất. Hãy cùng đọc và trau dồi kỹ năng để thành công trong buổi phỏng vấn sắp tới!

câu hỏi phỏng vấn Graphic Designer

Tại sao bạn muốn làm việc ở đây?

Trước khi tham gia phỏng vấn Graphic Designer, hãy đảm bảo rằng bạn đã tìm hiểu kỹ về công ty đó. Dù bạn đã tham gia nhiều buổi phỏng vấn ở nhiều công ty khác nhau nhưng nhà tuyển dụng không muốn bạn đề cập đến điều đó. Thay vào đó, họ muốn biết điều gì về thương hiệu hoặc sản phẩm của họ, văn hóa công ty hay những yếu tố khác làm cho bạn muốn làm việc với họ.

Nếu bạn có thể đề cập đến các thiết kế cụ thể trong câu trả lời này, đó là điều tuyệt vời, vì nó cho thấy bạn đã đầu tư thời gian để tìm hiểu về công ty của họ.

Bạn nghĩ xu hướng thiết kế tiếp theo sẽ là gì?

Đây là câu hỏi quan trọng giúp nhà tuyển dụng đánh giá mức độ đam mê và quan tâm của bạn đối với ngành thiết kế đồ họa. Các Graphic Designer hàng đầu thường rất nhạy bén với các xu hướng thiết kế mới và luôn đón nhận những thay đổi trong tương lai.

Để trả lời câu hỏi này thật tốt, bạn cần phải cập nhật những xu hướng thiết kế mới nhất, đọc nhiều sách và tạp chí chuyên ngành, và đặc biệt là luôn quan sát và tìm hiểu. Dù cho bạn mới bắt đầu nhưng đừng lo lắng, hãy chuẩn bị tâm lý và trả lời câu hỏi này một cách tự tin và sáng tạo nhất.

  Motion Graphics Design Là Gì? Cần Kỹ Năng Gì Để Trở Thành Motion Graphics Designer?

Nếu cần phải thay đổi thiết kế thương hiệu của chúng tôi, bạn sẽ thực hiện những thay đổi nào?

câu hỏi phỏng vấn Graphic Designer

Những câu hỏi như thế này giúp nhà tuyển dụng đánh giá khả năng sáng tạo và đổi mới của bạn, cũng như cách bạn đánh giá các thiết kế hiện có của công ty. Để trả lời tốt, bạn cần chuẩn bị trước bằng cách tìm hiểu về đối tượng khách hàng, sứ mệnh, giá trị và định hướng của công ty. Đặc biệt, bạn nên hỏi người phỏng vấn về các mục tiêu kinh doanh của công ty liên quan đến việc xây dựng thương hiệu để đưa ra câu trả lời phù hợp nhất. Hãy tự tin thể hiện khả năng của mình và cho thấy bạn là một Graphic Designer sáng tạo và có tầm nhìn.

Bạn sẽ xử lý phản hồi tiêu cực của khách hàng về thiết kế của mình như thế nào?

Nhà tuyển dụng muốn biết cách bạn xử lý và giải quyết tình huống này. Trong câu trả lời, hãy cho thấy sự kiên nhẫn và tôn trọng của bạn đối với quan điểm của khách hàng. Bạn cũng có thể đề cập đến kinh nghiệm của mình trong việc giải quyết các tình huống khó khăn và cách bạn sẽ tận dụng phản hồi để cải thiện kỹ năng của mình trong tương lai.

Ví dụ: Những phản hồi không tốt của khách hàng về sản phẩm khiến tôi phiền lòng, vì tôi luôn muốn mang lại những sản phẩm tốt nhất để thể hiện sự uy tín của công ty và làm hài lòng khách hàng. Trong những tình huống này, tôi sẽ sử dụng phản hồi của khách hàng làm động lực để cải tiến các dự án tiếp theo phù hợp hơn với những yêu cầu của họ.

  Interior Designer Là Gì? Cơ Hội Nghề Nghiệp Nào Cho Các Interior Designer?

Những phần mềm thiết kế nào bạn dùng cho công việc Graphic Designer?

Các Graphic Designer cần sử dụng thành thạo các phần mềm thiết kế để phục vụ cho công việc của mình. Câu hỏi trên để nhà tuyển dụng đánh giá các kỹ năng sử dụng công cụ của bạn có đáp ứng được công việc không.

Bạn có thể trả lời như sau: Tùy thuộc vào nhu cầu thiết kế của từng dự án, tôi sẽ sử dụng các phần mềm khác nhau. Tuy nhiên, những phần mềm thiết kế mà tôi thường sử dụng bao gồm Adobe Photoshop, Illustrator và InDesign. Với Photoshop, tôi có thể chỉnh sửa và xử lý hình ảnh; với Illustrator, tôi có thể tạo ra các vector graphics và sử dụng những đối tượng để thiết kế banner, poster; và với InDesign, tôi có thể thiết kế các tài liệu đa trang như sách, tạp chí hoặc brochure. Ngoài ra, tôi cũng có kinh nghiệm trong việc sử dụng các phần mềm thiết kế khác như Sketch và Figma để thiết kế giao diện người dùng cho ứng dụng và trang web.

Bạn có bao giờ phải làm việc với một dự án thử thách chưa và làm thế nào để bạn vượt qua được nó?

Câu hỏi này giúp để nhà tuyển dụng biết được khả năng làm việc của bạn và tư duy giải quyết vấn đề khi gặp các dự án khó nhằn. Bạn có thể tham khảo cách trả lời sau:

  • Đầu tiên, tôi sẽ đánh giá kỹ năng của mình để xác định những điểm yếu và mạnh của mình trong việc xử lý dự án này.
  • Tiếp theo, tôi sẽ tìm hiểu kỹ thông tin về dự án, yêu cầu của khách hàng, đối tượng khách hàng và thị trường liên quan đến dự án.
  • Sau đó, tôi sẽ tạo ra một kế hoạch làm việc chi tiết với các bước cụ thể và đặt ra các mục tiêu cho từng giai đoạn của dự án.
  • Tôi sẽ cố gắng thực hiện các bước trong kế hoạch một cách chính xác và hiệu quả, cùng với đó là việc trao đổi với khách hàng và các thành viên trong nhóm để đảm bảo rằng dự án đang diễn ra tốt nhất có thể.
  • Nếu tôi gặp phải bất kỳ thử thách nào trong quá trình làm việc, tôi sẽ tìm kiếm giải pháp phù hợp, bằng cách thảo luận với đồng nghiệp, tìm kiếm ý kiến từ khách hàng hoặc các chuyên gia trong lĩnh vực của tôi.
  • Cuối cùng, tôi sẽ đánh giá lại dự án sau khi hoàn thành để xem những điểm mạnh và yếu của mình, từ đó học hỏi và cải thiện kỹ năng của mình trong các dự án tiếp theo.

Tham khảo việc làm UX/UI Design hấp dẫn trên TopDev

Bạn thường làm gì để giúp kỹ năng thiết kế của mình được cải thiện?

câu hỏi phỏng vấn Graphic Designer

Những câu hỏi như thế này giúp nhà tuyển dụng đánh giá khả năng phát triển của bạn trong công việc. Để trả lời tốt, bạn cần đưa ra những cách để nâng cao kỹ năng thiết kế của mình. Hãy lưu ý rằng chỉ khi bạn đã thực sự thực hiện những cách này thì mới nên trình bày trước nhà tuyển dụng.

Dưới đây là một số cách để bạn nâng cao kỹ năng thiết kế của mình và trở thành một Graphic Designer tài năng hơn:

  • Tham gia các khóa học trực tuyến hoặc khóa học ngắn hạn để học các kỹ thuật và công nghệ mới nhất
  • Đọc các sách và tài liệu liên quan đến thiết kế, cũng như đọc các bài báo, tạp chí và blog chuyên ngành để cập nhật kiến thức và xu hướng thiết kế mới.
  • Cố gắng tìm kiếm các cơ hội thực hành thiết kế, bao gồm làm các dự án cá nhân hoặc tham gia các dự án tình nguyện để có thêm kinh nghiệm.
  • Thường xuyên đăng tải các thiết kế của mình lên các trang web và cộng đồng thiết kế để nhận được phản hồi và đánh giá từ những người có kinh nghiệm.
  • Luôn sẵn sàng tiếp thu phản hồi và ghi nhận các lỗi để cải thiện kỹ năng thiết kế của mình.

Một số câu hỏi Graphic Design khác

  • Bạn có thể nêu điểm mạnh, điểm yếu của bạn trong công việc không?
  • Bạn sẽ làm gì khi có mâu thuẫn với team Marketing về thiết kế của mình?
  • Bạn sẽ làm gì khi gặp deadline quá gấp?
  • Các thành phần của thiết kế đồ họa là gì?
  • Các nguyên tắc thiết kế đồ họa cốt lõi là gì?
  • Lý thuyết màu sắc là gì và tại sao nó lại quan trọng trong thiết kế đồ họa?
  • Tỷ lệ vàng trong bố cục thiết kế đồ họa là gì và tại sao nó lại quan trọng?
  • Làm thế nào để bạn đo lường sự thành công của các thiết kế của bạn?

Hy vọng những câu hỏi phỏng vấn Graphic Designer này sẽ giúp bạn chuẩn bị tốt hơn cho buổi phỏng vấn sắp tới. Đừng ngại nhờ đồng nghiệp hoặc bạn bè giúp bạn thực hiện các buổi phỏng vấn mô phỏng để cải thiện kỹ năng phỏng vấn của mình. Tự tin bước vào buổi phỏng vấn chính thức và chúc bạn may mắn!

TopDev tổng hợp

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

4 câu hỏi phỏng vấn Software Developer bạn cần biết trước khi phỏng vấn

4 câu hỏi phỏng vấn Software Developer

Lại là chuỗi bài câu hỏi phỏng vấn và lần này là bộ câu hỏi phỏng vấn Software Developer. Ở chuỗi bài viết này, xin phép anh em được tách ra thành 4 phần.

Nguyên nhân là vì Software Developer là vị trí đòi hỏi cực nhiều kiến thức, không chỉ đơn giản 1 phần mà đã nêu ra được hết toàn bộ kiến thức cần có. Ngoài kiến thức về mặt kỹ thuật, vị trí Software Developer còn đòi hỏi một lượng kiến thức khổng lồ về quy trình phát triển phần mềm, kinh nghiệm làm việc thực tế. Vân vân và mây mây.

Ở bài viết phần 1 này xin mạn phép viết trước cho anh em về mặt kỹ thuật. Tuy số lượng câu hỏi không nhiều, nhưng với các câu hỏi được nêu, mong rằng anh em sẽ hệ thống lại được kiến thức. Từ câu hỏi được nêu xem lại các phần kiến thức liên quan để chuẩn bị thật tốt cho buổi phỏng vấn.

phỏng vấn Software Developer
Không có thời gian mà thở chứ chả nói tới đùa. Software Engineer (Software Developer) đòi hỏi một lượng kiến thức cực khủng

1. Làm sao bind methods hoặc event trong JSX callbacks?

Okie, câu hỏi phỏng vấn Software Developer chắc chắn liên quan tới coding. Phần mềm về cơ bản được dựng lên bởi code. Nếu không code được chắc chắn không gọi là Software Developer.

Câu trả lời là có 3 cách để binding bao gồm:

  • Binding in Constructor: Ở constructor khi khởi tạo class là đã bind luôn method cần thiết

class User extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log("SingOut triggered");
  }
  render() {
    return <button onClick={this.handleClick}>SingOut</button>;
  }
}

  • Public class fields syntax: bind thẳng ở trong method

handleClick = () => {
  console.log("SingOut triggered", this);
};
<button onClick={this.handleClick}>SingOut</button>

  • Arrow functions in callbacks: Sử dụng luôn arrow function trực tiếp trong callbacks

handleClick() {
    console.log('SingOut triggered');
}
render() {
    return <button onClick={() => this.handleClick()}>SignOut</button>;
}

  Software Architecture – Tìm hiểu Layers Pattern
  Software Developer - Cơ hội nghề nghiệp và mức lương hấp dẫn

1.1 Cần xem thêm

Ở mục này, mong muốn anh em mạnh ngôn ngữ lập trình nào thì xem lại kỹ ngôn ngữ lập trình đó. Coi thật sâu, ví dụ Java thì xem lại JVM, String pool, kiến trúc của Java. Lật lại cuốn sách nổi tiếng về Java như kiểu Effective Java 3rd Edition để đọc lại.

Nếu anh em là Frontend, work với Reactjs, Vuejs. Làm ơn coi kĩ lại DOM, kiến trúc Reactjs, Vuejs. Rồi life cycle, các vấn đề optimization code, vân vân và mây mây.

Nói chung phỏng vấn Software Developer đầu tiên là xem lại code. Củng cố kỹ năng code của mình nha anh em.

phỏng vấn Software Developer

1.2 Topics dành cho anh em

  • Cấu trúc dữ liệu và giải thuật
  • Thuật toán
  • Design pattern
  • Sự khác biệt giữa các version
  • Các khái niệm chính về ngôn ngữ lập trình anh em mạnh

Tham khảo việc làm Software Developer hấp dẫn trên TopDev!

2. Sự khác biệt giữa SQL và NoSQL database?

Câu hỏi số hai phỏng vấn Software Developer là câu hỏi liên quan tới hệ cơ sở dữ liệu. Dưới đây tui nêu ra một số khác biệt giữa SQL và NoSQL. Có thể chưa nêu được hết nhưng lúc phỏng vấn anh em cứ nêu ý nổi bật là được ha:

SQL NoSQL
Là cấu trúc dữ liệu có thể truy vấn và có cấu trúc (Structural Query Language) Kiểu dữ liệu không có cấu trúc (Non Structual Query Language)
Thích hợp với dữ liệu có cấu trúc và các schema rõ ràng được định nghĩa từ trước Thích hợp cho dữ liệu không có cấu trúc
Dữ liệu lưu dạng dòng và cột (row, column) Dữ liệu lưu kiểu collection hoặc documents
Theo nguyên lý ACID (Atomicity, Consistency, Isolation, Durability) Không theo nguyên lý ACID
Hỗ trợ JOIN và các câu queries phức tạp Không hỗ trợ join

Nếu cần cứ nêu kinh nghiệm thực tế là tốt nhất. NoSQL là DB nào, SQL là DB nào. So sánh các kiểu

phỏng vấn Software Developer
Đôi khi sao phũ phàng tới lạ

2.1 Cần xem thêm

Câu hỏi này chỉ là câu hỏi ngẫu nhiên liên quan tới hệ cơ sở dữ liệu thôi nha anh em. Anh em làm với cái nào nhiều thì cần xem lại hết. Benefit, advantages (điểm mạnh), điểm yếu các kiểu của RDBMS đó. Suggest một số keywords cho anh em xem lại, nhưng mà có thể không đủ nha.

2.2 Topics cho anh em

  • Database Optimization
  • SQL optimization
  • Sự khác biệt giữa các loại DB (Postgres, MySQL, Oracle)
  • Advantages, disadvantages của DB
  • Các khái niệm về CAP theorem (nói chung là có liên quan tới DB)

3. Giải thích blackbox testing và whitebox testing

Câu hỏi số 3 phỏng vấn Software Developer là câu hỏi liên quan tới testing. Thực tế mà nói kỹ năng testing và kỹ năng cần có của Software Developer. Nếu không code được thì ít nhất là vị trí này nắm chắc kiến thức cơ bản của các loại testing.

Blackbox Testing Whitebox Testing
Test làm cấu trúc bên trong chương trình không được show ra. Chỉ có input và output, không cần biết code làm gì Người tester có kiến thức và hiểu biết về những gì xảy ra trong chương trình
Implement code không cần thiết cho blackbox Implement code quan trọng với Whitebox
Thường thực hiện bởi Tester Thường được thực hiện bởi Software Developer
Là bài kiểm tra dạng functional (chức năng) Là bài test hoặc kiểm tra dạng kiến trúc (structural testing)
Thường ít toàn diện hơn so với Whitebox test Tương đối toàn diện hơn so với Blackbox testing

phỏng vấn Software Developer

3.1 Cần xem thêm

Câu trả lời phía trên về blackbox hay whitebox có thể chưa đủ và chưa chi tiết. Tuy nhiên mục đích của câu hỏi này là nhấn mạnh với anh em vị trí Software Developer là một vị trí cần biết về testing chứ không phải chỉ đơn giản là code và code

3.2 Topics cho anh em

  • Automation Test
  • Liên quan tới Unit test coverage các kiểu
  • BDD và TDD
  • Các loại test (system test, integration test, …)
  •  

4. Tấn công XSS là gì?

Cross site scripting (XSS) is a common attack vector that injects malicious code into a vulnerable web application. XSS differs from other web attack vectors (e.g., SQL injections), in that it does not directly target the application itself. Instead, the users of the web application are the ones at risk.

Cross site scription là kiểu tấn công phổ biến nhằm đưa mã độc vào trong ứng dụng web dễ bị tấn công. XSS khác với các loại tấn công cơ bản khác như SQL Injection là nó không nhắm trực tiếp vào ứng dụng. Thay vào đó nó nhắm tới người dùng của web application.

phỏng vấn Software Developer

XSS đầu tiên nhắm tới các website có lỗ hổng, tiến hành viết các đoạn mã độc có thể thực thê trên web site đó. Sau khi đã có sẽ chèn vào website, thực thi mỗi lần có ai đó truy cập trang web (được cấp session cookies). Mỗi lần khi truy cập website, mã độc đều được thực thi để tấn công đánh cắp thông tin. Sở dĩ câu này là câu số 4 phỏng vấn Software Developer vì ở cái thời đại này, bảo mật là vấn đề được ưu tiên hàng đầu.

Một lập trình viên nếu không biết gì về bảo mật rất dễ dính tới các vấn đề về bảo mật lúc development.

4.1 Cần xem thêm

Chỉ là một câu hỏi đơn giản về một trong các loại hình tấn công. Anh em nên bỏ time thêm để xem lại các kiểu tấn công. Mà đã biết tấn công như nào thì cần có phương án phòng tránh. Có gợi ý cho anh em một số từ khoá, anh em có thể xem nhiều hơn nha

4.2 Topics cho anh em

  • Các lỗ hổng
  • Các phương thức tấn công (Injection, XSS, CSRF,…)
  • Cách phòng tránh
  • Các lỗ hổng thực tế đã biết lúc đi làm

5. Tham khảo thêm phỏng vấn Software Developer

Cảm ơn anh em đã đọc bài – Chúc anh em phỏng vấn tốt – Happy coding!

Tác giả: Kiên Nguyễn

Có thể bạn quan tâm:

Tìm việc làm IT mọi cấp độ tại TopDev

React Native Developer là gì? Kỹ năng và mô tả công việc React Native

React Native Developer là gì? Tổng quan về những kỹ năng cần có

React Native là một framework phát triển ứng dụng di động mã nguồn mở do Facebook tạo ra và ra mắt từ năm 2015, đến nay nó trở thành một lựa chọn phổ biến cho các nhà phát hành ứng dụng mobile khi muốn xây dựng và phát triển ứng dụng của mình. Trong bài viết hôm nay, chúng ta cùng tìm hiểu về React Native Developer là gì cũng như cần học gì để trở thành lập trình viên trong ngành này nhé.

React Native là gì?

React Native là một framework viết bằng JavaScript giúp chúng ta tạo ra được những ứng dụng di động chạy trên các nền tảng hệ điều hành Android hay iOS. 

React Native Developer

React Native là một cross platform (đa nền tảng) phát triển ứng dụng bằng cách viết một lần code và có thể build được ra nhiều ứng dụng trên các hệ điều hành khác nhau. Lợi ích lớn nhất của những cross platform như React Native là việc tiết kiệm thời gian cũng như chi phí phát triển, đồng thời khả năng tái sử dụng mã nguồn (source code) cao. Các ứng dụng nổi tiếng được phát triển từ React Native có thể kể đến như Facebook, Skype, Instagram, Airbnb,…

React Native Developer là gì?

React Native Developer hay lập trình viên React Native là những người sử dụng framework này tham gia vào quá trình thiết kế, xây dựng và phát triển các ứng dụng dành cho thiết bị di động. Công việc cụ thể của những lập trình viên này bao gồm:

  • Tham gia lên ý tưởng, thiết kế, xây dựng và phát triển các ứng dụng di động, chủ yếu là trên nền tảng Android và iOS
  • Đảm bảo việc hoạt động của ứng dụng một cách ổn định, hiệu quả bằng việc thường xuyên nâng cấp, chỉnh sửa ứng dụng nếu có lỗi hoặc khi cần thiết thay đổi
  • Phối hợp với các team khác cùng dự án như team Backend cho việc call API lấy dữ liệu và cập nhật dữ liệu
  • Hỗ trợ việc phát hành ứng dụng lên các nền tảng chợ ứng dụng như Google Play hay AppStore
  • Thực hiện việc chuyển đổi các ứng dụng chạy trên nền tảng Web (hybrid app) hoặc các nền tảng khác hiện có sang React Native
  • Tối ưu các native APIs mà các hệ điều hành Android, iOS cung cấp và cập nhật để áp dụng vào ứng dụng viết bằng React Native
  • Nghiên cứu, tìm hiểu các công nghệ mới liên quan đến lập trình mobile nói chung và React Native nói riêng

React Native Developer là gì?

Kỹ năng cần có để trở thành React Native Developer

React Native là một framework viết bằng JavaScript, vì vậy để học được React Native, bạn cần trang bị kiến thức về ngôn ngữ lập trình này. Bản thân JavaScript là một ngôn ngữ phổ biến và thông dụng, nhất là với việc làm Web, vì vậy React Native cũng được xem là một lựa chọn học thêm khi các lập trình viên Web muốn phát triển, xây dựng các ứng dụng dành cho mobile.

Một điều quan trọng nữa cùng cần trang bị để sẵn sàng học React Native là kiến thức về lập trình mobile, các đặc thù của ứng dụng chạy trên thiết bị di động. Hãy nắm được các kiến thức cơ bản cũng như thuật ngữ sử dụng trong ngành này:

  • Hệ điều hành: các thiết bị di động smartphone hiện nay chủ yếu chạy hệ điều hành Android của Google hoặc iOS của Apple.
  • Thiết bị phần cứng: thông thường bạn sẽ cần một thiết bị di động thật (iphone cho iOS và các điện thoại chạy Android của các hãng như Samsung, Xiaomi,…). Có một đặc thù dành cho các thiết bị iOS là bắt buộc phải chạy trên nền tảng Mac OS, chính vì thế mà lựa chọn sử dụng các thiết bị đến từ Apple như Macbook, Macmini,… sẽ giúp bạn có thể build và chạy thử ứng dụng của mình trên cả 2 nền tảng cùng một lúc.
  • SDK và IDE: Google trang bị Android SDK và IDE mặc định là Android Studio; với iOS thì chúng ta được cung cấp Xcode IDE cùng bộ iOS SDK dành cho việc phát triển. Mặc dù vậy cũng sẽ có những lựa chọn khác như việc tích hợp các extensions trên IDE Visual Studio Code.

Tham khảo việc làm React Native hấp dẫn trên TopDev

  • Market: Như đã nhắc ở phần trước, việc phát hành ứng dụng luôn phải thông qua các chợ ứng dụng của Google và Apple là Google Play và AppStore; vì thế bạn cũng cần tìm hiểu kĩ các chính sách và các bước để publish app lên store.

Kỹ năng cần có để trở thành React Native Developer

Sau khi chuẩn bị được các kiến thức cơ bản, hãy bắt đầu với React Native bằng việc setup môi trường phát triển, tạo dự án và chạy thử ứng dụng. React Native cung cấp cho chúng ta các thẻ View khá tương đồng với HTML tags, cách styling cũng giống như viết CSS; vì thế nếu có kiến thức nền tảng về HTML, CSS và JS thì việc bắt đầu viết code với React Native hoàn toàn không gặp quá nhiều vấn đề.

Concept cơ bản đằng sau React cũng như React Native là việc chia nhỏ ứng dụng của chúng ta thành các Component (thành phần) nhằm giúp tăng khả năng tái sử dụng cũng như mở rộng ứng dụng. Vì thế bạn hãy bắt đầu từ việc tạo ra những Component nhỏ cùng với những props (thuộc tính) và state (trạng thái) của chúng. Nắm được vòng đời của một component từ giai đoạn mouting đến updating và unmount sẽ giúp bạn tự tin trong việc quản lý các thành phần trong ứng dụng của mình.

Đến bước này chúng ta sẽ vào các bài toán tổng quan hơn với việc quản lý trạng thái của component và ứng dụng kết hợp với các thư viện sẵn có như Redux, MobX,… Cùng với đó là sử dụng các UIComponent từ các bộ thư viện hoặc tự mình xây dựng nên. Việc tham gia vào các dự án sẽ giúp các bạn củng cố kiến thức tốt hơn trong quá trình trở thành một React Native Developer.

Đọc thêm: Lộ trình học React Native từ cơ bản đến nâng cao

Mức lương của React Native Developer ra sao?

Mức lương của một React Native Developer cũng giống như những vị trí khác, cao hay thấp phụ thuộc vào level và kinh nghiệm. Dưới đây là một cái nhìn tổng quan về mức lương trung bình cho React Native Developer:

Khu vực Junior React Native Developer Mid-level React Native Developer Senior React Native Developer
Việt Nam 12 – 20 triệu VND/tháng 20 – 35 triệu VND/tháng 35 – 60 triệu VND/tháng
Hoa Kỳ 70,000 – 90,000 USD/năm 90,000 – 120,000 USD/năm 120,000 – 160,000 USD/năm
Châu Âu 30,000 – 50,000 EUR/năm 50,000 – 75,000 EUR/năm 75,000 – 100,000 EUR/năm
Ấn Độ 4 – 7 lakh INR/năm 7 – 15 lakh INR/năm 15 – 25 lakh INR/năm

>> Xem thêm: Kinh nghiệm phỏng vấn vị trí React Native 6 tháng kinh nghiệm

Mẫu JD lập trình React Native Developer

YÊU CẦU CÔNG VIỆC

  • Có kinh nghiệp lập trình Native App hoặc Hyprid App
  • Thành thạo React Native
  • Nắm vững các khái niệm lập trình OOP, mô hình MVC
  • Có kiến thức về Multithreading, Data structures, Algorithm và Design pattern
  • Hiểu biết về API REST
  • Có khả năng thiết kế và tối ưu cơ sở dữ liệu cho ứng dụng có lượng truy cập lớn
  • Có tinh thần học hỏi và nâng cao trình độ bản thân
  • Khả năng làm việc trong môi trường nhóm
  • Kỹ năng tư duy logic và thuật toán tốt, phân tích và giải quyết vấn đề

MÔ TẢ CÔNG VIỆC

  • Tham gia thiết kế, xây dựng và triển khai ứng dụng mobile với React Native
  • Xây dựng giao diện người dùng mượt mà, hoàn hảo về độ phân giải trên cả hai nền tảng di động
  • Tối ưu native APIs để tích hợp chắc chẽ với các nên tảng
  • Liên tục tối ưu và nâng cấp mã nguồn để đảm bảo hiệu quả, ổn định và an toàn
  • Chuyển các ứng dụng web React hiện có sang React Native
  • Hoàn thành các dự án đúng tiến độ, chủ động học hỏi, nghiên cứu, tìm kiếm các công nghệ mới
  • Hỗ trợ, phối hợp với các bộ phận khác.

React Native hiện nay vẫn đang là một lựa chọn tiềm năng nếu bạn muốn có một công việc lập trình với mức đãi ngộ cao nhờ nhu cầu tuyển dụng lớn của nó. Để thành thạo bất kỳ ngôn ngữ, thư viện hay framework nào, chúng ta đều cần có sự đầu tư học hỏi chuyên sâu vào nó. Hy vọng bài viết này đã mang lại chút kiến thức hữu ích dành cho những React Native Developer tương lai. Hẹn gặp lại các bạn vào những bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Đừng bỏ lỡ việc làm IT mới nhất trên TopDev!

Top 5 câu hỏi phỏng vấn Django hàng đầu

Top 5 câu hỏi phỏng vấn Django hàng đầu

Django nhanh như chóng chóng, dựng web với Django thì lẹ khỏi phải bàn, nhưng điều gì giúp cho Django trở nên mạnh và nhanh tới vậy? Đó là một trong vô vàn câu hỏi phỏng vấn Django.

Bài viết này tổng hợp chút kiến thức về Django Web Framework. Lướt qua đầy đủ từ kiến trúc, cache, các vấn đề bảo mật. Mong rằng nó sẽ có ích cho anh em trong các buổi phỏng vấn.

Ok, bắt đầu thôi anh em, từng câu từng câu một là chiến. Chiến xong tổng hợp kiến thức là tham gia interview thôi. Nhớ coi thêm các phần khác chứ không là bỏ sót nha.

câu hỏi phỏng vấn Django
Lạy chúa sao khác xa nhau vậy nè. Interview, lại là interview

1. Giải thích Django Architecture

Câu hỏi đầu tiên phỏng vấn Django là câu hỏi về kiến trúc. Tất nhiên là đã làm về Django anh em sẽ hiểu kiến trúc chính của Django

Như anh em đã biết, Django tuân theo kiến trúc MVT (Model, View và Template). Dành cho anh em nào chưa biết có thể tham khảo lại bài viết giới thiệu Django tại đây nha. Nhưng 3 thành phần đó trong kiến trúc của Django đã hoạt động như thế nào?

Khúc này cần nêu ra kiến trúc bắt đầu từ Client (mà client là template). Bản thân nó nằm ở phía Client side.

Django Architecture

Còn Model và View (cả model và view đều nằm ở phía server side nha). Anh em thường nhầm là view nằm ở phía client, nhưng không phải, view vẫn nằm ở phía server.

Để rõ hơn, anh em ta cùng bàn luận qua ví dụ thực tế này. Anh em tạo một website, mở ra phát là giao diện đăng nhập. Trước khi bàn tới template thì khi anh em access qua URL trên browser, một request sẽ gửi tới ngay server. Sau khi server phản hồi lại, anh em có form để điền thông tin. Điền thông tin xong, bấm đăng nhập. Lúc này data lại gửi tới view, view đi tới model để xác thực người dùng, ok thì đăng nhập.

  Django dễ hơn Flask
  Top 10 câu hỏi phỏng vấn Web Developer và cách trả lời hay nhất

2. Những điểm mạnh của Django?

Sau khi đã nắm rõ kiến trúc của Django và các mà các thành phần trong MVT giao tiếp với nhau. Câu hỏi phỏng vấn Django thứ hai muốn anh em trả lời được về điểm mạnh của frameworks này.

Tại sao lại là Django mà không phải những web development framework khác? Có thể nêu bật ra một số ưu điểm của Django như sau:

  • Đầu tiên về mặt tài liệu (document), Django cung cấp tài liệu cụ thể, chi tiết và dễ hiểu.
  • Phát triển nhanh chóng (được phát triển bởi các lập trình viên có kinh nghiệm, áp dụng KISS và DRY – Don’t repeat yourself).
  • Ngoài nhanh, Django còn tối ưu cho SEO, rất thích hợp với các website thương mại điện tử.
  • Bảo mật tốt và khả năng mở rộng cao.
  • Hỗ trợ kết nối với CDN và có hỗ trợ CMS (content management system).

phỏng vấn django

Tất nhiên đây chỉ là những ý chính. Còn thực tế sau khi đã có kinh nghiệm làm việc với Django anh em có thể nói rõ ra các ví dụ cụ thể. Cũng có thể đem ra với các framework khác cũng dùng để phát triển web như PHP Laravel,…

Tham khảo việc làm Django hấp dẫn trên TopDev

3. Giải thích về Django session

Câu hỏi số 3 phỏng vấn Django nhắm tới các lập trình viên đã có nhiều năm kinh nghiệm và hiểu rõ về Django.

Đầu tiên thì session trong Django được sử dụng để theo dõi trạng thái giữa web server và một trình duyệt cụ thể nào đó. Cái này nếu muốn hiểu rõ hơn anh em cần đọc thêm về stateful và stateless tại đây.

Mỗi khi session được cấp, nó sẽ gắn với một ID và ID này được đặt trong cookies. Anh em lưu ý là chỉ chứa ID của session đó chứ không phải dữ liệu của session. Chính vì thế nên tính bảo mật của session trong Django rất cao.

câu hỏi phỏng vấn Django

Ngoài ra Django còn hỗ trợ anonymous session (session ẩn danh). Session này dành cho các user không đăng nhập.

4. Django caching là gì?

Gọi là Django caching vậy thôi chứ caching là khái niệm cơ bản. Câu hỏi phỏng vấn Django này chủ yếu muốn anh em nêu rõ ra các lại cache. Lúc nào thì nên sử dụng loại cache nào.

Cũng cứ lướt qua tí là cache là việc lưu trữ lại kết quả đã có trước đó. Lúc nào cần cứ qua cache mà lấy, không cần phải thực hiện query hay tính toán lại.

Còn về các loại cache, anh em cần nêu ra được các lại cache trong Django.

Memcached Cái này thì cache trên bộ nhớ (nhanh và dễ sử dụng). Cache thẳng trên mem của server ha. Không cache được nhiều
Filesystem caching Django lưu trữ cache trong file, chia thành các file nhỏ khác nhau và nối tiếp nhau. Các file riêng biệt.
Local-memory caching Cái này thì mặc định trên Django, lưu ở mem trên browser.
Database caching Cuối cùng là database cache, cái này đúng như cái tên, lưu ở phía DB. Anh em nếu có DB và đánh index tốt thì database caching sẽ phát huy hiệu quả

câu hỏi phỏng vấn Django

5. Django có thực sự bảo mật?

Ở cái thời đại mà bảo mật được xem như vấn đề cốt lỗi của ứng dụng thì Django cũng không phải là ngoại lệ. Câu hỏi phỏng vấn Django này cần anh em có kiến thức về bảo mật.

Ngoài việc hiểu rõ từng vấn đề bảo mật, anh em cần nêu được Django đã support hoặc hỗ trợ giải quyết các vấn đề bảo mật nào. Cụ thể ở đây có thể nêu ra một số ưu điểm khi sử dụng Django.

Có 7 thứ giúp Django framework trở nên tốt hơn trong vấn đề bảo mật. Từ những phương thức tấn công được biết nhiều như XSS, SQL Injection. Django còn hỗ trợ bảo mật phiên (session security), CSRF,…

  • Cross-site scripting (XSS) protection
  • SQL injection protection
  • Cross-site request forgery (CSRF) protection
  • Enforcing SSL/HTTPS
  • Session security
  • Clickjacking protection
  • Host header validation

câu hỏi phỏng vấn Django

6. Tham khảo phỏng vấn Django

Anh em nhớ đọc lại documentation của Django nha. Rà lại kiến thức thêm lần nữa.

Cảm ơn anh em đã đọc bài – Chúc anh em phỏng vấn tốt – Happy coding!

Tác giả: Kiên Nguyễn

Xem thêm:

Xem thêm tuyển dụng nhân viên IT hấp dẫn trên TopDev

Ngành IT rất rộng, bạn đang ở đâu?

Ngành IT rất rộng, bạn đang ở đâu?

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Anh ơi, qua cài win cho em với! Anh ới, máy tính em bị màn hình xanh đỏ tím vàng rồi!
Máy tính em bị virus rồi, anh qua cứu em với, huhu! Hình như anh học ngành IT mà phải không?

Trong cuộc sống thường nhật của mình, mình rất rất hay bị nhờ những chuyện như vậy. Chỉ vì một thứ, mình là dân IT (Bạn chắc chắn cũng như thế, đúng chưa?)

Mấy ai hiểu nổi khổ của dân trong ngành IT. Trong khi mình là một thằng lập trình viên. Làm gì mà biết sửa máy tính, ống nước này nọ!

Thông qua câu chuyện trên, mình muốn nhắn nhủ một điều rất quan trọng. Dành cho những bạn ĐANG PHÂN VÂN. Không biết đi đâu về đâu trong thế giới IT. Chính là,… thế giới IT cực kì rộng, và bạn đang ở đâu? Nào là web, nhúng, mobile, data, AI, blockchain, IT helpdesk, Security, System admin, tester,…

Đây chắc chắn là một nỗi lo lắng, phân vân của hầu hết sinh viên ngành IT. Vì trong trường, bạn được dạy rất nhiều, bao quát hầu hết các ngành học. Nếu bạn là một người biết đầu tư cho tương lại. Bạn có thể đã tìm ra được hướng đi cho mình ngay trong trường. Nhưng bạn là số ít trong đó.

Đa số các bạn sinh viên chưa biết được mình sẽ làm gì khi ra trường. Thậm chí chưa biết ở ngoài các công ty họ làm gì. Đó là sự thật!

  [Thảo Luận] Ngành IT liệu có hết “HOT” trong vài năm tới?

  Ngành trí tuệ nhân tạo từ A - Z: Tiềm năng và cơ hội nghề nghiệp

#1 Mình sẽ phân loại một vài ngành chính hiện nay

À, trước khi đi vào các ngành chính, mình muốn giới thiệu bạn một tip nhỏ. Với mỗi chuyên ngành (cụ thể là công việc), bạn hãy dùng trang TopDev. Dùng trang này để làm gì? Tra cứu! Mình sẽ đưa cho các bạn một số từ khóa. Bạn lên đây tra cứu thông tin. Để biết các công ty ngoài kia TUYỂN GÌ, CẦN GÌ. Và biết được lượng công việc nhiều hay ít. Từ đó đưa ra những định hướng cho bản thân mình.

Lập trình Web

Lập trình web chưa bao giờ hết hot từ xưa đến nay trong ngành IT. Ngày nay, nhu cầu về web là cực kì cao. Các công ty, doanh nghiệp mọc lên như nấm. Họ chắc chắn cần một website phục vụ cho mình. Nào là marketing, quảng bá thương hiệu, sản phẩm… Kể cả các cá nhân (mình đây) cũng sở hữu riêng một website.

Cho nên lập trình web LUÔN LÀ NGÀNH HOT! Công việc ở đây cực kì nhiều. Lương ở đây cũng rất cao, nhưng tùy vào bạn. Thật tế bạn giỏi thì đi đâu cũng lương cao thôi (câu này ai cũng nói, mà đúng thật).

tro-thanh-web-developerTrở thành web developer

Lập trình web được chia ra làm 2 nhánh chính: Back-end và Front-end. Trước tiên, nếu bạn chưa hiểu một website hoạt động như thế nào. Thì hãy tìm hiểu thêm trên google (vì nó rất dễ hiểu).

Back-end là phần xử lý logic ở phía server. Các bạn có thể hay thấy các job kiểu như PHP, .NET, Java, NodeJS,… Hãy dùng những từ khoá này để search trên các trang tìm việc. Bạn sẽ thấy rất rõ ràng về Job Description (mô tả những thứ bạn sẽ làm ở công ty) và Job Requirement (những yêu cầu để bạn có thể đậu phỏng vấn).

Font-end là phần xử lý phía client, giao diện người dùng. Ngày nay việc làm front-end cũng cực kì đa dạng. Nào là React, Angular, VueJs, ….

Ngoài ra, nếu bạn có khả năng đảm nhận cả Front-end và Back-end. Vị trí của bạn lúc này là full-stack developer.

Lưu ý một lần nữa! Bạn hãy dùng những từ khoá mình đề cập đến trong bài để search trên các công cụ tìm kiếm việc làm.

Để bạn có thể bước vào ngành phát triển web. Bạn cần xác định mình muốn làm Font-End hay Back-End hay full-stack. Rồi tiếp đến là chọn cho mình một ngôn ngữ chính để luyện. Nhiều khi bạn đã định hướng là vào Back-End. Nhưng nhiều bạn còn phân vân chưa biết đi theo ngôn ngữ nào đâu. Người thì chọn .NET, người thì PHP, NodeJS, JAVA,…

Phải nói là có quá nhiều thứ trong lập trình web. Hãy cố gắng để có một background IT tốt nhất có thể nhé.

Tham khảo Intern IT Jobs hấp dẫn trên TopDev

Lập trình Mobile

Cũng giống như web, bạn nhìn thấy và sử dụng các ứng dụng mobile hằng ngày. Mọi ứng dụng trên điện thoại (android, IOS,…) đều là sản phẩm của lập trình mobile trong ngành IT. Bạn có thích tạo ra những mobile app như vậy? Nếu thích thì đến với lập trình mobile.

Về phương diện tiếp cận cũng khá giống bên web. Ban đầu khi tiếp cận cũng tương đối dễ, nhưng về sau để trở nên thành thạo thì cũng rất phức tạp.

tro-thanh-mobile-developerTrở thành mobile developer

Lập trình mobile thì được chia thành 2 hướng chính: Single Platform và Cross Platform.

Single Platform kiểu như bạn code chỉ cho mỗi Android hoặc IOS. Code cho thằng này thì không chạy cho thằng kia được. Bởi vậy mới sinh ra Cross Platform. Code một lần, chạy được trên nhiều nền tảng.

Vì sao lại như thế thì bạn có thể thử bước vào thế giới mobile.

Một số job bạn có thể lưu ý: Android dev, IOS dev, Hybrid Application, Native Application.

Lưu ý: Khi bạn tò mò một job nào đó. Search nó trên google hoặc web tìm việc. Bạn sẽ biết job đó như thế nào. Cần học NGÔN NGỮ, CÔNG CỤ gì.

Lập trình nhúng

Embedded hay còn gọi là lập trình nhúng, là một ngành IT đang rất hot ở thời điểm hiện tại (2019) và sẽ trở nên rất hot trong tương lai với IoT (Internet of Things).

TV thông minh, nhà thông minh, xe hơi thông minh, thành phố thông minh, vv. Tất cả những thứ này đều là sản phẩm của lập trình nhúng.

Mình nói đơn giản về nhúng, bạn sẽ phải viết code, sau đó “nạp code” và một phần cứng nào đó để phần cứng này có thể hoạt động được theo một yêu cầu nhất định. Ví dụ, bạn chắc chắn một lần đi thang máy, người ta đã viết một chương trình và nạp vào hệ thống điều khiển của thang máy, hệ thống này sẽ điều khiển mọi thứ mà bạn đã nhìn thấy khi thang máy hoạt động đấy. Hay một ví dụ khác là hệ thống quẹt thẻ khi bạn gửi xe, đó cũng là một ứng dụng của lập trình nhúng.

Bạn cứ hiểu đơn giản, nhúng là sự kết hợp giữa 2 thứ phần cứng và phần mềm.

Bây giờ bạn có thể tưởng tượng ra lập trình nhúng là như thế nào rồi, bạn có thấy thích hay tự tin khi bước vào thế giới này?

Lập trình nhúng khác với web hay mobile ở chổ. Bạn phải giao tiếp với phần cứng trực tiếp và một điểm quan trọng nữa. Ban đầu tiếp cận với lập trình nhúng tương đối phức tạp, hay mình muốn nói luôn là khó. Điều này trái ngược với web hay mobile. Và khi bạn đã có những bước đầu thành công với lập trình nhúng, con đường phía sau sẽ dễ dàng hơn một chút cho bạn.

tro-thanh-embedded-developerTrở thành embedded developer

Có rất nhiều nhận định nói rằng, ban đầu học lập trình web phải học rất nhiều thứ, rất nhiều ngôn ngữ, rất nhiều công nghệ, và bản thân ngành lập trình web thay đổi quá nhanh về công nghệ, nói chung là học web rất phức tạp và gian nan. Mình hoàn hoàn công nhận với điều này, nhưng theo quan điểm của mình, nhúng mới là ngành khó học và khó theo nhất, cũng như là ngành khô khan nhất trong 3 ngành. Và kiến thức phải học trong nhúng của rất rất nhiều không thua kém bên web và thậm chí nó còn khó và khô khan hơn nhiều. Để mình giải thích thêm về nhận định này.

Mình quen khá nhiều người làm về nhúng (vì mình xuất thân từ dân lập trình nhúng) và thông thường họ làm việc chủ yếu với testing C/C++, khi họ đã quen với công việc thì họ hay cho rằng mình đã giỏi về lập trình nhúng, tự tin đánh giá điểm rất cao khi được hỏi về nhúng. Nhưng thực tế, họ hoàn toàn chưa biết về thế giới lập trình nhúng, họ thậm chí chưa từng tiếp xúc với một con chip hay thậm chí chưa từng nghe về các khái niệm như SPI, I2C, Bootloader,….

Khi đọc đến đây, sẽ có nhiều bạn phản đối và cho rằng, embedded software có nhiều người họ không cần biết nhiều về phần cứng và vẫn làm việc được. Đúng là có rất nhiều embedded software biết rất ít về phần cứng ngoài kia. Nhưng chỉ với như thế bạn khó có thể phát triển và tồn tại trong thế giới nhúng được, trừ khi bạn làm công việc đó trong hết sự nghiệp lập trình viên của bạn. Và bạn thật sự là một lập trình viên với công việc của một công nhân, thay vì một lập trình viên với công việc và đầu óc của một kĩ sư.

Một người lập trình viên nhúng đúng nghĩa, thật sự họ rất tuyệt, họ am hiểu sâu về phần cứng, làm thế nào để tối ưu hóa, thậm chí họ tự thiết kế ra phần cứng đó sao cho tối ưu. Họ rất giỏi về điện tử nữa là đằng khác, và có những developer nhúng nhưng cực kì giỏi về web hay mobile. Họ tự thiết kế một hệ thống full-stack từ hardware đến software, application… Những người như thế mới được gọi là một lập trình viên embedded đúng nghĩa.

Một số job bạn có thể nghĩ tới: Embedded tester (C/C++), AUTOSAR, IOT, Thiết kế chip, Embedded developer, Embedded hardware, Embedded software.

Tester

Song song với lập trình viên (developer), đó chính là tester. Một số nơi gọi là QA, hay QC hay đơn giản là tester. Nói một cách đơn giản về công việc của một tester. Họ là người tìm bug trong sản phẩm.

Một cách hiểu đơn giản, trong quá trình phát triển sản phẩm. Sẽ chia ra thành hai phần chính. Phát triển (develop) và kiểm thử (test). Để cho sản phẩm khi đã tung ra thị trường (release) hạn chế lỗi nhất có thể.

Kể cả web, mobile, hay nhúng, chúng ta đều có tester trong mỗi khâu phát triển. Tùy thuộc vào sản phẩm chúng ta dùng mô hình phát triển nào. Agile/Scrum hay V-Model.

Các sản phẩm web, mobile với thời gian release ngắn thường dùng mô hình Agile/Scrum. Còn đối với nhúng, đặt biệt là AUTOSAR, họ dùng V-Model.

Test là một phần không thể thiếu trong quá trình phát triển. Cho nên một sản phẩm không thể thiếu tester. Ngày nay Automation Test phát triển rất mạnh. Nên các bạn đi theo hướng tester có thể học thêm. Để làm tăng giá trị cho bản thân mình.

Một số ngành khác

Như mình đã đề cập ở phía đầu bài. Chúng ta còn rất nhiều ngành khác nữa cũng là IT.

IT helpdesk hay IT support hay một số nơi gọi là IT thôi. Công việc của họ là xử lý các vấn đề trục trặc liên quan tới IT. Nói chung khi bạn có vấn đề gì liên quan tới máy móc, mạng,… thì hãy liên hệ với họ. Đôi khi học kiêm luôn vị trí của một System Admin hay một DevOops.

Security, là những người đảm bảo an toàn cho toàn bộ nhân viên, máy móc. Hay nói cách khác là toàn bộ công ty bạn khỏi các cuộc tấn công mạng. Một số team security thì chịu trách nhiệm thực hiện các cuộc tấn công đến chính sản phẩm của công ty mình nhằm tìm ra lỗ hỏng bảo mật (penetration testing).

Và còn nhiều nghề nghiệp liên quan tới IT nữa. Nhưng bài viết này đủ dài rồi. Bạn có thể tìm hiểu trên internet. Mình có thể đề xuất thêm như: hệ thống thông tin, database, thương mại điện tử. Hay thậm chí là Blockchain, trí tuệ nhân tạo (AI), phân tích dữ liệu (data analysis), data science,…

#2 Cái thứ mà bạn mong chờ – Roadmap

Trong phần trên, mình đơn giản chi là giới thiệu qua về các ngành nghề chính. Nhưng nó thực sự chưa chi tiết. Có lẽ các bạn đang cần một roadmap cho từng ngành cụ thể.

Roadmap sẽ chỉ cho các bạn TỪNG BƯỚC TỪNG BƯỚC một khi bạn chọn một ngành. Bạn sẽ nhìn thấy được bạn cần học gì, làm gì để chinh phục ngành đó. Hoặc đơn giản là sống tốt trong ngành đó.

#Kết

Thật sự là còn khá nhiều công việc liên quan tới ngành IT mình chưa kể hết ở đây. Chỉ cần bạn bước vào con đường IT. Bạn sẽ nhận ra nó rất rộng.

Và sau khi đi làm một vài năm, bạn sẽ có định hướng riêng cho mình. Người thì muốn làm một manager. Người thì thích làm một senior dev thuần. Có người thì muốn làm một technical lead hoặc software architecture.

Bạn đi đâu, về đâu, không ai có thể chỉ đường cho bạn được. Đường đi nằm ở trong con người bạn. Bài viết của mình nhằm mục đích. Cho bạn thấy những con đường có thể đi. Bạn đi đâu, tới đâu, là do sự lựa chọn của bạn. Nếu bạn đi đúng, sự nghiệp của bạn thành công rực rỡ. Nếu bạn đi sai… không biết chuyện tồi tệ gì sẽ xảy ra.

Nhưng cũng đừng sợ sai mà không dám bước. Phàm trên đời này ai cũng có những bước đi sai lầm. Quan trọng là bạn biết quay đầu và làm lại.

Chúc các bạn có một sự lựa chọn đúng nhất cho sự nghiệp của mình trong ngành IT khắc nghiệt này!

Bài viết gốc được đăng tải tại lenhatthanh.com

Xem thêm:

Xem thêm tuyển dụng IT mới nhất tại TopDev

Thiết kế hệ thống – Các hệ thống lớn như Facebook hoạt động như thế nào?

Thiết kế hệ thống - Các hệ thống lớn như Facebook hoạt động như thế nào?

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Có bao giờ bạn thắc mắc, một website hoạt động như thế nào không? Trong bài này, chúng ta sẽ cùng tìm hiểu về kiến trúc website. Từ những web nhỏ cho tới những web lớn và khổng lồ.

Hay nói một cách khác. Những kĩ sư, lập trình viên đã làm như thế nào để làm ra được một website.

Một website đơn giản (như web của mình) hay đến một kiến trúc website phức tạp (như google, facebook, amazone,…) sẽ có kiến trúc như thế nào? Đây cũng là một câu hỏi phỏng vấn cho các lập trình viên, kĩ sư.

#1 Cấu trúc của một website

Để biết và hiểu được kiến trúc phức tạp của các website lớn. Chúng ta nên bắt đầu từ cái nhỏ nhất! Tìm hiểu một website đơn giản. À, website của mình cũng thuộc dạng là một website đơn giản. Vì nó là đơn thuần là một blog site. Chỉ xử lý về text và hình ảnh chứ không xử lý nhiều về nghiệp vụ.

Kiến trúc

Một website đơn giản hay phức tạp đều sẽ có hai thành phần chính: Client và Server. Nhưng những website đơn giản thì đương nhiên phần client và server của nó cũng đơn giản.

Mình sẽ cố gắng dùng những ngôn từ BÌNH DÂN nhất để giải thích cặn kẽ cho các bạn.

Client là những thứ bạn nhìn thấy trên browser (trình duyệt web).

Còn server là những gì xử lý ở phía sau mà người dùng bình thường không thấy được. Server sẽ được đặt ở một nơi nào đó và gửi dữ liệu về phía client cho người dùng thấy.

Và một lưu ý nữa, server là một phần cứng nhé. Nó y chang cái máy tính của bạn vậy (thật ra nó khác chút). Nó có CPU, RAM, ổ cứng và những “phụ kiện” khác!

CẤU TRÚC CỦA MỘT WEBSITE
Cấu hình một server sẽ như thế này

Sau đây mình sẽ trình bày cụ thể hơn một chút về cách thức client và server hoạt động. Đương nhiên cũng ở mức cơ bản.

Khi bạn gõ Facebook.com thì chuyện gì xảy ra?

Bạn mở trình duyệt (Chrome chẳng hạn), gõ Facebook.com. Và bạn đơn thuần là… lướt Facebook. Chứ… ít khi bạn nghĩ về chuyện gì đã xảy ra để trang Facebook hiển thị ra cho bạn xem.

Nhưng ở trong bài viết này. Bạn sẽ phải tìm hiểu về điều đó.

Facebook.com được gọi là domain hay tên miền. Và phía sau domain này là một hệ thống server (khổng lồ). Khi bạn truy cập tới facebook.com. Nghĩa là bạn yêu cầu server của Facebook gửi cho bạn trang login để bạn đăng nhập. Và yêu cầu này được trình duyệt gửi tới Facebook server thông qua các gói tin.

Chúng ta gọi đây là một HTTP request giữa trình duyệt và Facebook server. Sau đó, server nhận được yêu cầu của bạn. Nó tiến hành đọc và phân tích gói tin HTTP này. Và server sẽ trả lại cho trình duyệt trang login cũng thông qua HTTP response. Nói tóm lại là phía client và phía server giao tiếp với nhau thông qua giao thức HTTP.

Thôi, nhìn hình dưới cái là hiểu liền!

HTTP request và HTTP response
HTTP request và HTTP response

Trên đây là cách hoạt động tổng quan của một website. Ở mức độ mà ai ai cũng có thể hiểu. Ở trong phần sau, chúng ta sẽ đi sâu hơn về kiến trúc của một kiến trúc website lớn. Bởi vì một website lớn, phục vụ cho hàng triệu người dùng thì kiến trúc sẽ rất phức tạp.

  API Gateway – Cần biết khi thiết kế hệ thống

  Thiết kế hệ thống URL Shortening giống Bit.ly chịu tải 6 tỷ click 1 tháng

#2 Mổ xẻ những thứ trong hệ thống website lớn

Như bạn cũng đã được học trong phần trên. Một hệ thống website sẽ có hai thành phần chính là client và server. Bạn cũng biết là ở dưới server sẽ lưu dữ liệu của website (để render ra cho phía client đó). Cho nên phần server chúng ta có thể tách ra làm 2 phần chính: webserver và database server.

Web server và database server
Web server và database server

Web server sẽ chịu trách nhiệm tiếp nhận những yêu cầu từ browser. Và nó sẽ lấy những dữ liệu cần thiết dưới database server để trả về cho browser. Vì nơi lưu trữ dữ liệu của website sẽ là database server. Kiểu như bạn (browser) cần gì thì mình (web server) sẽ xuống database lấy cho bạn. Hiểu đơn giản vậy đó.

Tham khảo Web Developer Jobs HOT tại TopDev

Vấn đề khi lượng user tăng lên đột biến?

Và trước tiên mình muốn nói đến các website nhỏ, phục vụ ít người dùng trước.

Một website đơn giản, phục vụ ít người dùng, chỉ xử lý những tác vụ đơn giản. Thì họ không cần phải có một server KHỦNG. Vì điều đó là không cần thiết, vì sẽ tốn chi phí xây dựng server mạnh (vì nó là phần cứng mà).

Phần server của một website như thế thường có cấu hình bình thường (phục vụ đủ nhu cầu). Nhiều khi cả database server và web server cùng một nơi. Họ không tách hai phần này ra.

Cho nên những website có server như thế chỉ phục vụ cho một lượng người dùng nhất định.

Mình lấy ví dụ trong chính website của mình luôn. Giả sử cấu hình của một kiến trúc website chỉ đủ phục vụ cho khoảng 10.000 người dùng trong một lúc. Vậy nếu trong một lúc, website của mình có khoảng 1 triệu hay 10 triệu người dùng thì sao?

Câu trả là là TẠCH! Vì server không chịu nổi một lượng request lớn như vậy.

Vậy thì mình sẽ làm cách gì để có thể đáp ứng được lượng truy cập lớn như vậy?

TĂNG CẤU HÌNH SERVER LÊN chứ còn gì! Ví dụ gắn thêm RAM, gắn thêm core CPU, thay ổ cứng mạnh hơn chẳng hạn. Những giải pháp này sẽ giúp cho hệ thống website của bạn tăng đáng kể khả năng chịu tải.

Nhưng có một điều quan trọng. Phần cứng luôn có giới hạn của nó, chắc chắn là như thế. Cho nên bạn chỉ có thể tăng tốc độ xử lý ở server lên tới một giới hạn nào đó thôi. Không thể tăng mãi được!

Vậy thì mới có một câu hỏi được đặt ra. Những hệ thống như Facebook, Goolge, Youtube, Tiki,… đã làm cách nào để xử lý hàng triệu, hay hàng tỉ user. Vì đơn thuần với những hệ thống vậy. Một server có cấu hình cực mạnh cũng không thể chịu nổi lượng request khổng lồ như thế được. Vậy họ đã làm như thế nào với hệ thống của họ?

Một hệ thống lớn trên thực tế?

Đây cũng là một dạng câu hỏi / yêu cầu tuyển dụng đối với một senior developer. Câu hỏi kiểu như: “Xử lý hàng triệu người dùng một lúc không phải là vấn đề của bạn”.

Có thể bài này sẽ dài vì mình muốn trình bày rõ ràng nhất có thể về kiến trúc thực tế của một hệ thống.

Kiến trúc website trên thực tế
Kiến trúc website trên thực tế

À, nhìn vào hình trên bạn hiểu không? Những senior developer có thể sẽ hiểu được toàn bộ bức hình trên. Nhưng mình muốn trình bày cho mọi developer đều hiểu về nó.

Ở phần đầu bài viết. Khi bạn gõ vào trình duyệt facebook.com, trình duyệt sẽ gửi yêu cầu của bạn tới server của Facebook. Bạn nhớ đoạn này chứ?

Vậy làm sao trình duyệt (browser) biết đường để tìm đến server của Facebook chỉ với tên miền facebook.com bạn đã cung cấp?
DNS server sẽ giúp trình duyệt… biết Facebook server nằm ở đâu.

DNS Server

Một server sẽ có một địa chỉ IP để định danh nó trên internet. Giống như địa chỉ nhà của bạn vậy.

Và Domain Name System (DNS) là một hệ thống phân giải tên miền. Giúp trình duyệt tìm ra được địa chỉ IP của một server thông qua tên miền.

Ở ví dụ trên, DNS sẽ giúp trình duyệt phân tích tên miền facebook.com. Và sau khi phân tích xong, DNS sẽ trả về cho trình duyệt IP của Facebook Server.

Tới đây thì trình duyệt đã biết sẽ gửi gói tin HTTP đến đâu rồi.

Tìm hiểu thêm DNS server ở đây.

Load Balancer

Chúng ta nhắc lại một chút về vấn đề lượng user request tăng lên đột ngột. Giải pháp ở đây là chúng ta sẽ phải mở rộng server (kiểu như nâng cấp).

Và cách nâng cấp ở trên, mình có đề cập đến chính là mở rộng thêm phần cứng cho một server. Và thuật ngữ của cách mở rộng này là vertical scaling (hay mở rộng theo chiều dọc). Cái này rõ ràng là có hạn chế vì phần cứng chỉ đạt đến một giới hạn nào đó thôi.

Và có một cách thứ hai để mở rộng server chính là horizontal scaling (hay mở rộng theo chiều ngang). Nghĩa là chúng ta mở rộng thêm nhiều server nữa song song với server hiện tại. Bây giờ server chúng ta không chỉ có một, mà có nhiều server chạy một lúc.

Rõ ràng là khi ta mở rộng server như vậy. Chúng ta có thể đẩy sức mạnh của server lên mức chúng ta mong muốn một cách dễ dàng (trên thực tế không dễ không ngen =]]] ). Vì đơn giản chúng ta chỉ việc lắp thêm những server khác song song thôi. “Một cây làm chẳng lên non, ba cây chụm lại nên hòn núi cao” mà.

Và việc mở rộng này nhằm mục đích chia sẻ tải giữa các server. Thậm chí khi có một server bị sự cố thì các server khác vẫn còn hoạt động.

Và lúc này vấn đề số lượng user tăng đã được giải quyết. Khi có cả triệu triệu request tới server, thì lượng request sẻ chia đều cho các server. Giúp server có thể đáp ứng được nhu cầu của người dùng. Nhìn hình bên dưới để hiểu nhé!

Một hệ thống load balancer trên thực tế
Một hệ thống load balancer trên thực tế

Và để phía server có thể làm được công việc chia sẻ tải này. Chúng ta có một công nghệ gọi là load balancer (cân bằng tải).

Khi client gửi request tới server, load balancer sẽ nhận request, rồi bắt đầu gửi request tới server nào thích hợp nhất.

Nói về lý thuyết thì rất là đơn giản. Những khi triển khai thực tế một hế thống server với load balancer là một điều CỰC KÌ KHÓ và phức tạp.

À ngoài ra chúng ta có thể lắp load balancer dự phòng nữa. Công nghệ này cực kì hay.

Load balancer dự phòng
Load balancer dự phòng

Web Server

Đây là phần server mà mình nói nảy giờ đó. Phần này là nơi xử lý logic (hay business logic). Các bạn backend-developer sẽ làm việc ở đây. Ở web server này, chúng ta hay dùng các ngôn ngữ như PHP, Nodejs, Java, .NET,… để xây dựng. Mình không nói nhiều về phần này nữa.

Database Servers

Phần này mình cũng đã từng nói rất cơ bản. Ở đây mình muốn mổ xẻ xâu hơn một xíu. Với một hệ thống lớn, phần database rất phức tạp.

Giả sử Facebook chỉ có một máy chủ để làm database server với hệ thống load balancer như trên. Rõ ràng hệ thống này cũng sẽ tạch. Như hình bên dưới!

Load balancer với một database server duy nhất
Load balancer với một database server duy nhất

Rõ ràng khi bạn nhìn vào bức hình trên, nó quá đẹp. Nhưng ở đây, database sẽ chịu không nổi số lượng request của các web server. Rõ ràng đó cũng là một vấn đề tương tự với web server.

Chúng ta bắt buộc phải mở rộng database server! Nhưng mở rộng nó như thế nào? Không lẽ cứ tăng phần cứng cho nó lên cực hạn. Đây cũng không phải là cách giải quyết hay.

Ở đây chúng ta có một cách để mở rộng database. Dùng kiến trúc master/slave.

Master slave architecture
Master slave architecture

Master là database chính với mục đích là để ghi. Database master này sẽ có vài con slave (đệ tử) để nó đồng bộ dữ liệu qua. Và khi với lượng request lớn, chúng ta có thể đọc ở từng con server như vậy. Để đáng kể tải ở master. Đây là một cách cực kì hay.

Nhưng nó chỉ thích hợp với các hệ thống đọc database nhiều, ghi thì ít hơn. Bởi vì khi chúng ta ghi nhiều vào database thì master server cũng sẽ tạch vì chịu không nổi. Ví dụ như Facebook, lượng request ghi vào database cực kì nhiều (like, comment, chat, …). Cho nên chúng ta sẽ sinh ra thêm một cách mở rộng database khác – Sharding Database.

Ví dụ Facebook đi! Facebook sẽ có nhiều database nằm ở các nước khác khác nhau. Ở Việt Nam cũng có. Và giả sử các user Việt Nam muốn truy cập và database, thì phía server sẽ điều hướng làm sao đó để lương request này tới database nằm ở Việt Nam. Chúng ta hiểu đơn giản vậy thôi. Hiện nay có rất nhiều công nghệ hổ trợ chúng ta xây dựng Sharding Database như vậy! Bạn tìm hiểu thêm trên Google nhé!

Trên thực tế thì việc mở rộng database rất là khó, đòi hỏi các kĩ sư rất giỏi. Còn lý thuyết thì đơn giản như vậy thôi =]]].

Caching

Caching là một phần gì đó không thể thiếu đối với hầu hết các website hiện tại. Nếu bạn muốn tăng tốc website thì bạn không thể không nghĩ tới caching.

Nghĩ đơn giản như vậy. Mỗi khi trình duyệt request đến server, là mỗi lần server lại xuống database để lấy dữ liệu. Như vậy sẽ làm chậm trãi nghiệm duyệt web của bạn (vì query database thường sẽ chậm). Lúc đó chúng ta cần đến kĩ thuật caching. Hay hiểu đơn giản là nó lưu tạm dữ liệu ở một nơi nào đó (thường là RAM hay ổ cứng).

Kĩ thuật caching
Kĩ thuật caching

Khi chúng ta request tới server, server không cần phải mất công xuống database nữa mà vào thẳng cache server để lấy dữ liệu ra. Dữ liệu ở cache sẽ được đọc nhanh gấp nhiều lần. Nên tăng tốc một cách khủng khiếp.

Hiện tại có 2 hệ thống lưu trữ phổ biến là Redis và Memcache. Website của mình dùng Memcache ha!

Job Queues và Servers

Hầu hết ứng dụng web đều cần làm một số công việc bất đồng bộ ở phía back-end mà không kết hợp trực tiếp vào dữ liệu trả về cho người dùng. Ví dụ, Google cần crawl và index toàn bộ internet để trả về kết quả tìm kiếm cho chúng ta. Nó không được làm mỗi lần bạn tìm kiếm. Thay vào đó, nó crawl các trang web một cách bất đồng bộ, và cập nhật index theo thời gian (schedule).

Mặc dù có nhiều kiến trúc khác nhau cho các công việc bất đồng bộ, nhưng phố biến nhất là kiến trúc job queue. Nó chứa 2 thành phần: một hàng đợi job cần được chạy, và một hoặc nhiều job server (hay còn lại là worker) để chạy job trong hàng đợi.

Job queue chứa một danh sách job cần được chạy bất đồng bộ. Hàng đợi đơn giản nhất là FIFO (first in first out) mặc dù hầu hết ứng dụng sẽ cần một vài hàng đợi có ưu tiên (theo priority). Mỗi khi ứng dụng cần chạy job thì nó chỉ cần thêm job đó vào hàng đợi.

Một vài xử lý tường sử dụng kĩ thuật này: encode video và ảnh, xử lý file CSV, thống kê người dùng, gửi mật khẩu reset email,…

Job server xử lý job. Chúng thăm dò job queue để xác định có job cần làm hay không, và nếu có thì chúng sẽ đẩy job vào hàng đợi và thực thi nó.

Full-text Search Service

Hiểu đơn giản của dịch vụ này. Hệ thống website sẽ cho bạn một khung search. Và khi bạn search một vấn đề nào đó ví dụ “programming”, thì server sẽ trả cho bạn những kết quả trong database có liên quan tới programming ha.

Nhưng cứ mỗi lần server chúng ta đều phải query xuống database thì hơi “cực”. Nên các công nghệ full-text search ra đời để giúp trải nghiệm search nhanh hơn rất nhiều.

Nền tảng full-text search phổ biến nhất hiện nay là Eltasticsearch, bên cạnh một số lựa chọn khác như Sphinx hoặc Apache Solr.

Services

Khi hệ thống của chúng ta lớn dần lớn dần. Có một số services sẽ được chia nhỏ ra để chạy như một ứng dụng riêng, Web app và các Service khác có thể tương tác đến chúng. Ví dụ: Content service dùng để lưu trữ lượng dữ liệu lớn về video, ảnh, file audio. Payment service cung cấp giao diện để trả phí qua thẻ tín dụng, …

Data

Ngày nay, các công ty tồn tại hay phá sản dựa trên việc họ khai thác dữ liệu như thế nào. Khi các app đạt đến trạng thái hoạt động ổn định, nó sử dụng quy trình xử lý dữ liệu để chắc chắn rằng dữ liệu được thu thập, lưu trữ, phân tích. Một quy trình xử lý dữ liệu điện hình có ba giai đoạn:

  • App gửi dữ liệu, thông qua tương tác user, đến data firehose để lưu trữ và xử lý dữ liệu. Thường thì dữ liệu gốc được biến đổi hoặc tăng thêm và chuyển đến cho firehose khác. AWS Kinesis và Kafka là hai công nghệ thường sử dụng cho mục đích này.
  • Dữ liệu gốc sau khi được biến đổi sẽ được lưu trữ trong cloud storage. AWS Kinesis cung cấp thiết lập được gọi là firehose để lưu trữ dữ liệu gốc vào cloud storage (S3).
  • Dữ liệu đã biến đổi được đưa vào trong kho dữ liệu để phân tích. Sử dụng AWS Redshift sẽ giải quyết được việc này.

Cloud Storage

Cloud storage là cách đơn giản để lưu trữ, truy cập và chia sẻ dữ liệu trên Internet thông qua các nền tảng cloud như: AWS. Bạn có thể dùng nó để lưu trữ và truy cập đến mọi thứ bạn đã lưu trữ trên hệ thống thông tin cục bộ. Và có thể tương tác đến chúng qua Restful API.

Amazon S3 hiện nay là cloud storage phổ biến nhất để lưu trữ video, ảnh, audio, file css, js, …

CND

CDN viết tắt bởi Content Delivery Network là mạng lưới gồm nhiều máy chủ lưu trữ đặt tại nhiều vị trí địa lý khác nhau, cùng làm việc chung để phân phối nội dung, truyền tải hình ảnh, CSS, Javascript, Video clip, Real-time media streaming, File download đến user.

Cơ chế hoạt động của CDN giúp cho user truy cập nhanh vào dữ liệu máy chủ web gần họ nhất thay vì phải truy cập vào dữ liệu máy chủ web tại trung tâm dữ liệu.

Các hệ thống lớn như Facebook, Google đều sử dụng CDN để tăng trải nghiệm của user.

#Kết

Trên đây là mình đã trình bày dường như tổng quan về kiến trúc website của một hệ thống lớn. Và các vấn đề phát sinh trong quá trình xây dựng hệ thống để đáp ứng với lượng user không lồ. Rõ ràng lý thuyết là vậy, nhưng để thực hiện được những điều này phải có một đội ngũ cực giỏi.

Mình không hi vọng bạn hiểu hết các vấn đề trên. Đến cả bản thân mình cũng chưa hoàn toàn hiểu hết. Vì đơn giản mình chưa trải nghiệm qua tất cả các giai đoạn / công nghệ trên.

Nhưng mình muốn một phần nào giúp bạn có một cái nhìn tổng qua. Cũng như cung cấp các keyword cần thiết để bạn có thể tìm hiểu thêm trên internet.

Bài viết gốc được đăng tải tại lenhatthanh.com

Có thể bạn quan tâm:

Xem thêm các việc làm CNTT hấp dẫn trên TopDev

Internationalization và Localization trong Java

Internationalization và Localization trong Java

Bài viết được sự cho phép của tác giả Lê Hồng Kỳ

Internationalization và Localization trong Java sẽ đề cập đến Internationalization và Localization.

Internationalization cũng có thể được viết tắt là i18n vì có 18 ký tự ở giữa I và N. Internationalization (quốc tế hoá) là một kỹ thuật cho phép chúng ta tạo ra các ứng dụng mà có thể thích ứng với nhiều ngôn ngữ và nhiều khu vực khác nhau.

Localization cũng có thể được viết tắt là l10n vì 10 ký tự ở giữa L và N. Localization (nội địa hoá) là kỹ thuật giúp tạo ra một ứng dụng có thể thích ứng với một ngôn ngữ và vùng miền cụ thể.

Như vậy, một ứng dụng hỗ trợ đa ngôn ngữ thì gọi là Internationalization (quốc tế hoá) và khi người dùng chọn một ngôn ngữ cụ thể để hiển thị thì gọi là Localization (nội địa hoá)

Internationalization và localization trong Java – Các thành phần trong ứng dụng cần được quốc tế hóa

Internationalization và localization
Internationalization và localization
Internationalization và localization

Internationalization và localization trong Java – Quốc tế hoá các thông điệp (Messages)

Chúng ta sẽ sử dụng lớp ResourceBundle để xử lý quốc tế hoá cho các message. Các message trong ứng dụng sẽ được khai báo trong tập tin properties thay vì viết trong code (hardcoded).

Tên của tập tin properties đặt theo qui tắc filename_languagecode_countrycode với filename là tên tập tin, languagecode là mã ngôn ngữ, countrycode là mã quốc gia. Bên dưới là bảng mô tả language code và country code theo từng quốc gia.

Country Language Code Country Code
English en EN
Germany de DE
China zh CN
Czech Republic cs CZ
Netherlands nl AN
France fr FR
Italy it IT
Japan ja JP
Korea ko KR
Russia ru RU
Spain es ES
Bulgaria bg BG
Canada ca CA
Croatia hr HR
Denmark da DK
Finland fi FI
Greece el GR
Hungary hu HU
Indonesia in ID
Latvia lv LV
Lithuania lt LT
Norway nb NO
Portugal pt PT
Romania ro RO
Serbia sr RS
Slovakia sk SK
Slovenia sl SI
Sweden sv SE
Thailand th TH
Turkey tr TR
Ukraine uk UA
Vietnam vi VN

  Lập trình game với Java cho người mới bắt đầu

  Các phần mềm giả lập Java dành cho máy tính tốt nhất

Ví dụ tạo chương trình hiển thị chuỗi “Hello World” và “Xin chào thế giới!” tuỳ thuộc vào lựa chọn của người dùng là tiếng Anh hay tiếng Việt. Các bước thực hiện như sau:

Bước 1: Tạo 2 tập tin properties tương ứng 2 ngôn ngữ muốn hiển thị

Tạo tập tin MessageBundle_en_US bằng cách chuột phải vào project hoặc package -> chọn New -> chọn Properties File -> nhập tên tập tin tại File Name -> chọn Finish

Nhập nội dung cho tập tin MessageBundle_en_US

#key = value
greeting = Hello World!

Tạo tập tin MessageBundle_vi_VN và nhập nội dung sau

greeting = Xin chào thế giới!

Lưu ý key trong các tập tin phải giống nhau, các tập tin này chỉ khác nhau về value. Mỗi value tương ứng cho một ngôn ngữ.

Hình bên dưới cho biết hai tập tin properties được lưu trong packge tên internationalization.message

Internationalization và localization

Bước 2: Tạo lớp I18NMessages và cài đặt xử lý

package internationalization.message;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class I18NMessages {
 public static void main(String[] args) {
   int lang;
   Scanner s = new Scanner(System.in);
   ResourceBundle bundle;
   do {
    System.out.println("1. English");
    System.out.println("2. Vietnamese");
    System.out.println("3. Exit program");
    System.out.print("Please choose your language: ");
    lang = s.nextInt();
    switch (lang) {
     case 1:
       //internationalization.message is package name
       //MessageBundle is properties file name
       bundle = ResourceBundle.getBundle("internationalization.message.MessageBundle", Locale.US);
       System.out.println("Message in " + Locale.US
                                + ": " + bundle.getString("greeting"));
       break;
     case 2:
       //changing the default locale to Vietnamese
       Locale.setDefault(new Locale("vi", "VN"));
       bundle = ResourceBundle.getBundle("internationalization.message.MessageBundle");
       System.out.println("Message in " + Locale.getDefault()
                                + ": " + bundle.getString("greeting"));
       break;
    }
   } while (lang != 3);
 }
}

Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau

Internationalization và localization

Tham khảo việc làm Java hấp dẫn trên TopDev

Internationalization và localization trong Java – Quốc tế hoá ngày (Date)

Chúng ta có thể quốc tế hoá ngày bằng cách sử dụng phương thức getDateInstance() của lớp DateFormat. Phương thức này nhận vào 2 tham số là style với các kiểu như DEFAULT, SHORT, LONG và locale.

Ví dụ sau đây sẽ hiển thị ngày hiện tại theo những vùng miền khác nhau như JP và VN

package internationalization;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class I18NDate {

 private static void printDate(Locale locale) {
   DateFormat formatter = DateFormat.getDateInstance(DateFormat.LONG,
                                                               locale);
   Date currentDate = new Date();
   String date = formatter.format(currentDate);
   System.out.println(locale + " : " + date);
 }

 public static void main(String[] args) {
   int region;
   Scanner s = new Scanner(System.in);
   do {
     System.out.println("1. Japan");
     System.out.println("2. Vietnam");
     System.out.println("3. Exit program");
     System.out.print("Please choose your region: ");
     region = s.nextInt();
     switch (region) {
       case 1:
          printDate(Locale.JAPAN);
          break;
       case 2:
          printDate(new Locale("vi", "VN"));
          break;
     }
   } while (region != 3);
 }
}

Khi chạy chương trình

Internationalization và localization

Internationalization và localization trong Java – Quốc tế hoá thời gian (Time)

Trong ví dụ này, chương trình sẽ hiển thị thời gian hiện tại dựa theo vùng miền được chỉ định.

package internationalization;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class I18NTime {
 static void printTime(Locale locale) {
   DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG, locale);
   Date currentDate = new Date();
   String time = formatter.format(currentDate);
   System.out.println(time + " in locale: " + locale);
 }
 public static void main(String[] args) {
   int region;
   Scanner s = new Scanner(System.in);
   do {
   System.out.println("1. England");
   System.out.println("2. Vietnam");
   System.out.println("3. Exit program");
   System.out.print("Please choose your region: ");
   region = s.nextInt();
   switch (region) {
    case 1:
      printTime(Locale.ENGLISH);
      break;
    case 2:
      printTime(new Locale("vi", "VN"));
      break;
   }
  } while (region != 3);
 }
}
package internationalization;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class I18NTime {

 static void printTime(Locale locale) {
   DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG, locale);
   Date currentDate = new Date();
   String time = formatter.format(currentDate);
   System.out.println(time + " in locale: " + locale);
 }

 public static void main(String[] args) {
   int region;
   Scanner s = new Scanner(System.in);
   do {
      System.out.println("1. England");
      System.out.println("2. Vietnam");
      System.out.println("3. Exit program");

     System.out.print("Please choose your region: ");
     region = s.nextInt();

     switch (region) {
     case 1:
       printTime(Locale.ENGLISH);
       break;
     case 2:
       printTime(new Locale("vi", "VN"));
       break;
    }
   } while (region != 3);
 }
}

Internationalization và localization trong Java – Quốc tế hoá số (Number)

Cài đặt ví dụ

package internationalization;
import static internationalization.I18NTime.printTime;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class I18NNumber {
 private static void printNumber(Locale locale) {
   double n = 10000.12345;
   NumberFormat formatter = NumberFormat.getNumberInstance(locale);
   String number = formatter.format(n);
   System.out.println(number + " for the locale " + locale);
 }

 public static void main(String[] args) {
   int region;
   Scanner s = new Scanner(System.in);
   do {
     System.out.println("1. England");
     System.out.println("2. Vietnam");
     System.out.println("3. Exit program");

     System.out.print("Please choose your region: ");
     region = s.nextInt();

     switch (region) {
       case 1:
         printNumber(Locale.ENGLISH);
         break;
       case 2:
         printNumber(new Locale("vi", "VN"));
         break;
     }
    } while (region != 3);
 }
}

Kết quả khi chạy chương trình

Internationalization và localization

Internationalization và localization trong Java – Quốc tế hoá tiền tệ (Currency)

package internationalization;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class I18NCurrency {

 private static void printCurrency(Locale locale) {
   float n = 10500.3245F;
   NumberFormat formatter = NumberFormat.getCurrencyInstance(locale);
   String currency = formatter.format(n);
   System.out.println(currency + " for the locale " + locale);
 }

 public static void main(String[] args) {
   int region;
   Scanner s = new Scanner(System.in);
   do {
     System.out.println("1. Japan");
     System.out.println("2. Vietnam");
     System.out.println("3. Exit program");

     System.out.print("Please choose your region: ");
     region = s.nextInt();

     switch (region) {
       case 1:
          printCurrency(Locale.JAPAN);
          break;
       case 2:
          printCurrency(new Locale("vi", "VN"));
          break;
     }
   } while (region != 3);
 }
}

Kết quả khi chạy chương trình

Internationalization và localization

Tổng kết Internationalization và localization trong Java

  • Quốc tế hoà và nội địa hoá
  • Quốc tế hoà thông điệp
  • Quốc tế hoá ngày, thời gian, số và tiền tệ

Bài viết gốc được đăng tải tại giasutinhoc.vn

Xem thêm:

Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev

Django là gì? Tất cả những điều cần biết về framework này

Django là gì? Tất cả những điều cần biết về framework này

Chưa kịp viết Django là gì thì độp ngay phát chị Google đã cho biết “Django: The web framework for perfectionists with deadlines”. Theo như cái tiêu đề giật tít hót hòn họt này thì Dỉ ản gô là web framework dành cho những người cầu toàn với deadlines.

À thế chưa gì là đã khoe, nhìn ngay ra cái ưu điểm đầu tiên của Django là development nhanh chóng, anh em nào chạy deadline sấp mặt có thể xem như một vị cứu tinh.

Django là gì

Rồi buồn cười cái nữa là search Django meme lại ra ông thần Leonardo DiCaprio vì có dính chút gì đó với tên ổng. Ôi cái framework này đích thị là thứ anh em mình cần tìm hiểu rồi.

Django là gì

Đùa tí cho vui để anh em có tinh thần khí thế tìm hiểu. Bắt đầu với Django ngay thôi nào!

1. Django là gì?

Luôn luôn là khái niệm, ngắn gọn mà súc tích. Cô đọng mà không cô đơn

Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of web development, so you can focus on writing your app without needing to reinvent the wheel. It’s free and open source.

Django là web framework base trên ngôn ngữ lập trình bậc cao Python, khuyến khích sự phát triển nhanh chóng, gọn gàng và thiết kế thực dụng. Được phát triển bởi những lập trình viên có kinh nghiệm, nó xử lý nhiều rắc rối trong quá trình phát triển web, vì vậy bạn có thể tập trung viết app của mình mà không cần tập trung vào phát triển bánh xe. Nó miễn phí và mã nguồn mở.

Rồi, có hai ý quan trọng, thứ nhất là Django là web framework và nó chú trọng vào việc phát triển nhanh web. Cái thứ hai là nó lo hết những thứ phụ trợ xung quanh, anh em chỉ cần tập trung vào viết code. Bánh xe hình tròn phát minh có từ hàng ngàn năm rồi, anh em không cần lo nghĩ nữa.

Má dùng từ đúng kiểu châm biếm. Nhưng thôi đang bận tìm hiểu bỏ qua, chứ gặp ông mà viết bài này chắc tẩn cho trận.

Django
Nhìn thôi là đã thấy xanh, không biết là xanh hy vọng hay là xanh cỏ

Rồi, đọc thôi là đã thấy nhanh rồi, nhưng cụ thể là nhanh như nào?

  Django dễ hơn Flask
  TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

2. Django hoạt động như thế nào?

Anh em nếu đã có kinh nghiệm hoặc có chút ít tìm hiểu về web framework chắc sẽ có ít thông tin về MVC, MVM,… Với Django, web framework này triển khai dựa trên mô hình MVT design pattern.

Anh em nào nếu chưa biết về mô hình này có thể tham khảo ở đây nha.

MVC vs MVT

Với mô hình này

  • M được hiểu là Model, là dữ liệu bạn muốn trình bày, thường là dữ liệu từ hệ cơ sở dữ liệu.
  • V ở đây được hiểu là View, là nơi xử lý các request và trả về các template kèm với nội dung (dựa trên yêu cầu của enduser).
  • Cuối cùng là T, được hiểu là Template. Template là tập các file html chứa bố cục trang web ta muốn xây dựng. Không chỉ đơn thuần data, tất nhiên chưa cả logic về quy cách hiển thị dữ liệu.

Tham khảo việc làm Django hấp dẫn trên TopDev

3. Tại sao Django lại luôn tự hào là nhanh?

Cần phải nói lại để anh em clear là nhanh ở đây nhanh trong quá trình development web nha. Chứ không phải nhanh cái khác đâu ha.

Đầu tiên phải nói tới Django luôn tuân thủ 2 nguyên tắc DRY và KISS. Dành cho anh em nào chưa biết thì DRY là (Don’t repeat yourself, nghĩa là cái gì đã có đã làm rồi thì đừng cố gắng làm lại cho mất nhiều thời gian).

KISS thì không phải hôn mà là Keep it short and simple), giữ cho nó ngắn gọn và đơn giản. Càng ngắn gọn và đơn giản càng tốt.

Chính vì focus vào phát triển và dựng sẵn những thứ đã có. Bản thân Django đã hỗ trợ rất nhiều những thứ anh em cần làm trong quá trình phát triển web. Tất cả đã có, chỉ cần sử dụng.

Django

Ngoài ra nếu những thứ này chưa có thì anh em có thể tìm kiếm hơn 4000 packages khác đã có, tuỳ cơ sử dụng. Từ testing, debugging tới profilling.

Ngoài ra nếu muốn deploy hoặc tích hợp deploy ở đâu đó, Django cũng sẽ hỗ trợ anh em hết sức nhiệt tình. Kiểu một nút lên là lên.

4. Django có an toàn và bảo mật không?

Hỏi này là hợp lý. Cái gì nhanh cũng sợ là ẩu, đi nhanh còn sợ ẩu nữa huống hồ là Django.

Bản thân Django đã hỗ trợ phòng tránh các lỗ hổng bảo mật thường gặp trong quá trình phát triển web. Một số anh em có thể kể tới như sau:

  • Cross site scripting (XSS) protection (Tấn công này cho phép đem các file từ phía client vào thực thi trên browser của người khác)
  • Cross site request forgery (CSRF) protection (lấy thông tin hoặc chứng chỉ xác thực từ người khác mà người đó không biết hoặc không đồng ý)
  • SQL injection protection (cái này quá phổ biến ha, anh em có thể tìm hiểu qua tại đây)
  • Clickjacking protection
  • SSL/HTTPS
  • Host header validation
  • Referrer policy

Còn nhiều nhiều nhiều thứ khác nữa anh em có thể ghé trang chủ để biết Django đã hỗ trợ và liên tục cập nhật để tránh các lỗ hổng trên web như thế nào nha.

Django
Cố gắng nhanh nhưng mà không ẩu. Vừa nhanh vừa an toàn và đảm bảo security

À bản thân Django cũng có những bản LTS (Long-term support), các bản này support người dùng dài dài. Tăng uy tín liền.

Django
Release roadmap kèm với thời gian support. Thời gian kéo dài nếu là LTS

5. Django có khả năng mở rộng không?

Đúng thiệt lắm chuyện. Vừa nhanh, vừa an toàn vừa bảo mật mà còn đòi hỏi phải có khả năng mở rộng tốt. Thiệt là đòi hỏi hết sức.

Tuy nhiên Django lại chiều anh em được vụ Scale này. Do phát triển web, biết đâu chừng business của anh em vụt lên trông thấy. Chính lúc đó ta cần khả năng scale nhanh chóng

Django hiện tại hỗ trợ cả Horizontal Scaling Vertical Scaling (scaling cả theo chiều ngang là chiều dọc). Cũng hỗ trợ cả database pooling trong trường hợp có nhiều kết nối tới hệ cơ sở dữ liệu.

Về scale thì nếu theo nhiều ngang (Horizontal), Django hỗ trợ Cache Backends (Memcache or Redis). Lưu dữ liệu ở các máy chủ khác nhau. Anh em cứ yên tâm khi lựa chọn Django để phát triển web mà yêu cầu scale nha.

Django

Theo như thông tin từ bài viết này thì Django còn có thể giải quyết tới 45 nghìn request trong mỗi giây.

6. Tham khảo thêm về Django

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

Xem thêm: 

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Monstache là gì? Đồng bộ mongodb sang Elasticsearch với Monstache

Monstache là gì? Đồng bộ mongodb sang Elasticsearch với Monstache

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Monstache là gì?

Monstache là một công  cụ, phần mềm thực hiện đồng bộ dữ liệu từ MongoDB sang Elasticsearch.

Monstache khá giống với Transporter tuy nhiên nó thực hiện đồng bộ dữ liệu một cách realtime, tức là khi có bất kỳ thay đổi dữ liệu nào trên MongoDB (thêm/sửa/xóa) nó sẽ tự động cập nhật tới Elasticsearch.

Việc sử dụng Monstache được áp dụng khi bạn muốn kết hợp MongoDB với Elasticsearch. Ví dụ bạn dùng MongoDB để lưu dữ liệu nhưng khi thực hiện query thì query trên Elasticsearch vì Elasticsearch hỗ trợ search tốt hơn MongDB ở nhiều trường hợp khác nhau.

Cài đặt Monstache

Yêu cầu đã cài đặt MongoDB và Elasticsearch. Vì Monstache được viết bằng ngôn ngữ lập trình Golang nên cần phải cài Golang nữa nhé.

Ở ví dụ này mình sẽ cài đặt trên Ubuntu 16.04 (Các bạn có thể cài trên windows cũng được nhé)

Lưu ý: phải bật chức năng oplog trên MongoDB lên, vì oplog sẽ chứa tất cả thông tin về các thay đổi của MongoDB và monstache sẽ dựa trên sự thay đổi đó để đồng bộ dữ liệu sang Elasticsearch, để bật chức năng oplog ta có 2 cách như sau:

  Top 10 câu hỏi phỏng vấn Java Developer thường gặp

  Hướng dẫn Java Design Pattern – Memento

Bước 1: Download Monstache tại https://github.com/rwynn/monstache/releases

Lưu ý: phiên bản monstache từ 4.x mới hỗ trợ bản ES6+ (Elasticsearch phiên bản 6 trở nên) còn monstache 3.x chỉ hỗ trợ ES2-5.

Trong ví dụ này mình download bản monstache-4.8.0.zip

Download file trên và giải nén về, bạn sẽ thấy nó có cả 3 mục cho windows, linux và macOS

Monstache

Mình sử dụng trên ubuntu nên sẽ vào folder linux-adm64, các bạn sẽ thấy file monstache (monstache là file binary nha) và file conf.properties dùng để cấu hình thông tin MongoDB và Elasticsearch, nếu chưa có file này thì bạn tự tạo mới nhé.

Monstache

Thêm đường dẫn của thư mục chứa file monstache vào biến PATH

Ví dụ trong trường hợp của mình sẽ là:

  • PATH=“$HOME/bin:$HOME/.local/bin:$HOME/monstache/build/linux-amd64:$PATH”

Sau khi thêm vào biến PATH thành công chúng ta có thể chạy monstache với lệnh monstache

Ví dụ kiểm tra version monstache: bằng lệnh monstache -v

Tham khảo việc làm Java hấp dẫn trên TopDev

Cấu hình monstache bằng file conf.properties

Thông tin file conf.properties có dạng như sau:

# connection settings

# connect to MongoDB using the following URL
mongo-url = "mongodb://someuser:password@localhost:40001"
# connect to the Elasticsearch REST API at the following node URLs
elasticsearch-urls = ["https://es1:9200", "https://es2:9200"]

# frequently required settings

# if you don't want to listen for changes to all collections in MongoDB but only a few
# e.g. only listen for inserts, updates, deletes, and drops from mydb.mycollection
# this setting does not initiate a copy, it is a filter on the change listener only
namespace-regex = '^mydb\.mycollection$'
# additionally, if you need to seed an index from a collection and not just listen for changes from the oplog
# you can copy entire collections from MongoDB to Elasticsearch
direct-read-namespaces = ["mydb.mycollection", "db.collection", "test.test"]

# additional settings

# compress requests to Elasticsearch
gzip = true
# generate indexing statistics
stats = true
# index statistics into Elasticsearch
index-stats = true
# use the following PEM file for connections to MongoDB
mongo-pem-file = "/path/to/mongoCert.pem"
# disable PEM validation
mongo-validate-pem-file = false
# use the following user name for Elasticsearch basic auth
elasticsearch-user = "someuser"
# use the following password for Elasticsearch basic auth
elasticsearch-password = "somepassword"
# use 4 go routines concurrently pushing documents to Elasticsearch
elasticsearch-max-conns = 4
# use the following PEM file to connections to Elasticsearch
elasticsearch-pem-file = "/path/to/elasticCert.pem"
# validate connections to Elasticsearch
elastic-validate-pem-file = true
# propogate dropped collections in MongoDB as index deletes in Elasticsearch
dropped-collections = true
# propogate dropped databases in MongoDB as index deletes in Elasticsearch
dropped-databases = true
# do not start processing at the beginning of the MongoDB oplog
# if you set the replay to true you may see version conflict messages
# in the log if you had synced previously. This just means that you are replaying old docs which are already
# in Elasticsearch with a newer version. Elasticsearch is preventing the old docs from overwriting new ones.
replay = false
# resume processing from a timestamp saved in a previous run
resume = true
# do not validate that progress timestamps have been saved
resume-write-unsafe = false
# override the name under which resume state is saved
resume-name = "default"
# exclude documents whose namespace matches the following pattern
namespace-exclude-regex = '^mydb\.ignorecollection$'
# turn on indexing of GridFS file content
index-files = true
# turn on search result highlighting of GridFS content
file-highlighting = true
# index GridFS files inserted into the following collections
file-namespaces = ["users.fs.files"]
# print detailed information including request traces
verbose = true
# enable clustering mode
cluster-name = 'apollo'
# do not exit after full-sync, rather continue tailing the oplog
exit-after-direct-reads = false

Trong đó:

  • mongo-url là url tới database MongoDB
  • elasticsearch-urls là url tới các server elasticsearch mà bạn muốn đồng bộ với MongoDB
  • direct-read-namespaces là các database, collection của MongoDB sẽ được đồng bộ hóa
  • Ngoài ra ở dưới còn các thông tin khác như username/password của Elasticsearch…

Demo

Ở đây mình sử dụng luôn MongoDB và Elasticsearch trên local với url lần lượt là:

mongo-url = "mongodb://localhost:27017"

elasticsearch-urls = ["https://localhost:9200"]

direct-read-namespaces = ["stackjava.player"]

Mình sẽ tiến hành đồng bộ dữ liệu từ collection player của database stackjava sang Elasticsearch

Khởi động elasticsearch bằng lệnh sudo service elasticsearch startvà chạy monstache bằng lệnh monstache

Monstache

Nhớ giữ nguyên màn hình teminal chạy monstache nhé hoặc bạn cũng có thể tạo service để chạy ngầm monstache

Insert dữ liệu vào stackjava.player

  • db.player.insert({‘name’:‘ronaldo’,‘country’:‘Portugal’})

Monstache

Xem dữ liệu trên Elasticsearch:

  • curl http://localhost:9200/stackjava.player/_search?pretty

Monstache

Kết quả trên Elasticsearch sẽ có thêm bản ghi mà bạn vừa thêm ở MongoDB, tương tự bạn có thể thêm bản ghi mới, xóa hoặc chỉnh sửa bản ghi trên MongoDB nó cũng sẽ đều cập nhật luôn sang Elasticsearch.

Bài viết gốc được đăng tải tại stackjava.com

Có thể bạn quan tâm:

Tuyển dụng IT lương cao, đãi ngộ hấp dẫn. Ứng tuyển ngay!

Dependency Inversion, Dev xịn là phải biết

Dependency Inversion, Dev xịn là phải biết

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Bài viết này mình đề cập tới nguyên lý Dependency Inversion hay đảo ngược sự phụ thuộc khi dịch ra tiếng Việt.

Anh em tìm đọc được bài viết này, chứng tỏ anh em đang có nhu cầu tìm hiểu về các nguyên lý SOLID đúng không? Thôi thì chúng ta vào bài luôn và mình giới thiệu về SOLID một chút.

À bài viết này hơi dài một chút, hơi nhiều code một chút. Because dài và nhiều code thì mình mới có thể truyền tải hết được các kiến thức về nguyên lý Dependency Inversion cho anh em được. Chúc mừng anh em trước nếu anh em đọc và lĩnh hội được kiến thức trong bài viết này.

Sơ lược các nguyên lý Solid

SOLID Principles được giới thiệu lần đầu năm 2000 bởi Robert C. Martin (Uncle Bob), và có 5 nguyên lý sau:

  • Single Responsibility (S)
  • Open / close principle (O)
  • Liskov substitution principle (L)
  • Interface Segregation (I)
  • Dependency Inversion (D)

Bài viết này mình sẽ trình bày chi tiết nhất về nguyên lý cuối cùng – Dependency Inversion Principle (DIP). Sẽ có anh em thắc mắc là không biết gì mấy nguyên lý đầu thì thì quất luôn nguyên lý cuối sẽ hiểu không? Anh em đừng lo, sẽ hiểu bình thường, mình lo tất =]].

Giải thích nguyên lý Dependency Inversion Principle

Nguyên văn của DIP như sau:

  • High-level modules should not depend on low-level modules. Both should depend on abstractions.
  • Abstractions should not depend on details. Details should depend on abstractions.

Dịch ra tiếng Việt:

  • Module cấp cao (high-level module) không nên phụ thuộc vào module cấp thấp (low-level module). Mà cả 2 nên phụ thuộc vào abstractions.
  • Abstraction không nên phụ thuộc vào chi tiết (implementation). Mà chi tiết (implementation) nên phụ thuộc vào abstraction.

Đọc thôi là thấy khó hiểu ** rồi phải không anh em =]]? Đừng lo! Mình sẽ giải thích cho anh em hiểu. Chứ ban đầu khi đọc về nguyên lý này, mình cũng như anh em, thua và muốn chửi thề!

  Thông não Java Design Pattern – Dependency Injection

  SQL Injection là gì? Cách giảm thiểu và phòng ngừa SQL Injection

Bad Design khi không áp dụng Dependency Inversion 

Xem ví dụ bên dưới – Ví dụ về thiết kế một chương trình nghe nhạc siêu siêu đơn giản. Đây là một cách viết code rất phổ biến. Có thể anh em sẽ thấy quen, hoặc chính anh em đã từng viết như thế cũng nên.

class MusicPlayer
{
    private $file;
    
    public function __construct()
    {
        $this->file = new MP3File(); // Vi phạm DIP
    }

    public function play()
    {
        return $this->file->play();
    }
}

class MP3File
{
    public function play()
    {
        return "Play MP3 file!";
    }
}

Hoặc một cách viết khác như bên dưới: Inject dependency thông qua constructor của class. Cách viết này cho phép chúng ta viết Unit test dễ hơn nhưng vẫn vi phạm DIP.

Lưu ý: Có một số từ ngữ như dependency, unit test, inject, high/low-level module, … Anh em nếu mới tiếp xúc lần đầu thì sẽ không hiểu. Anh em đừng lo lắng, mình sẽ cho anh em “tiếp xúc” nhiều lần hơn trong xuyên suốt bài viết để anh em hiểu.

public function __construct(MP3File $file) // Vi phạm DIP
{
     $this->file = $file;
}

Code như thế này thì …

Giải thích một chút về thiết kế chương trình ở trên, chúng ta bắt đầu phát triển một phần mềm nhỏ để có thể chơi nhạc. Chúng ta có class MusicPlayer đang sử dụng class MP3File (Hay còn gọi là phụ thuộc – dependency).

Như vậy, với đoạn code trên chúng ta có thể giải thích một số khái niệm dưới đây:

  • High (low)-level module: Class A nào đó sử dụng class B thì class A chính là high-level module. Và class B chính là low-level module. Như vậy ở ví dụ trên thì MusicPlayer là high-level module, còn MP3File chính là low-level module.
  • Dependency: MP3File chính là 1 dependency (hay còn gọi là sự phụ thuộc) của high-level module MusicPlayer
  • Hard dependency: Bạn có thể nhìn dòng code này $this->file = new MP3File(); ở trên. Và đây được gọi là một hard dependency. Lưu ý thêm, khi trong code bạn có hard dependency thì bạn sẽ khó viết Unit test.

Đọc tới đây ổn đúng không anh em? Chúng ta cùng đi tiếp nào.

Tham khảo việc làm Java hấp dẫn trên TopDev

Tại sao thiết kế ở trên là Bad Design?

Khó bảo trì, khó mở rộng

Class MusicPlayer bị phụ thuộc vào class MP3File (dependency). Khi chúng ta thay đổi class MP3File thì class MusicPlayer cũng bị thay đổi theo. Điều này vi phạm Open / close principle (anh em có thể search google 1p29s để đọc sơ sơ và nắm được nguyên lý này một xíu xíu nhá). Và giả sử trong tương lai hệ thống của chúng ta có rất nhiều class như MusicPlayer (đang phụ thuộc vào MP3File). Mỗi khi chúng ta thay đổi class MP3File, thì phải thay đổi tất cả những nơi sử dụng class này. Dẫn đến khó bảo trì và dễ gây ra bug trong quá trình chỉnh sửa, phát triển hay bảo trì.

Mình lấy luôn một ví dụ cụ thể về sự thay đổi được đề cập ở trên cho anh em dễ nắm. Đọc đoạn code dưới sau đó đọc phần comment trong code để nắm nhá.

class MusicPlayer
{
    private $file;
    
    public function __construct()
    {
        // Thì phải đổi code ở đây để đối ứng 
        // cho việc thay đổi classname bên dưới
        $this->file = new MP3MusicFile(); 
    }

    public function play()
    {
        return $this->file->play();
    }
}

class MP3MusicFile // Thay đổi classname ở đây.
{
    public function play()
    {
        return "Play MP3 file!";
    }
}

Hiện tại thiết kế trên chỉ chạy cho file MP3, và khi hệ thống của anh em chỉ support cho duy nhất file MP3 thì đây là một thiết kế ổn. Nhưng trên thực tế, chẳng có cái máy chơi nhạc quái nào lại chỉ support cho duy nhất file MP3 cả, còn nhiều file khác như WAV, AAC, M4A, e.g. nữa chứ. Đây là vấn đề khó mở rộng cho hệ thống. Code theo phong cách này mà mở rộng cho nhiều file khác là anh em… há mỏ ngay =]].

Chính vì vậy thiết kế trên chính là Bad design. Một thiết kế như sh**.

Khó viết Unit Test

Sơ lược một chút nhé!

Ở thiết kế trên khi chúng ta sử dụng new MP3MusicFile(), đây là một hard dependency nên sẽ cực kì khó viết unit test. Làm sao biết là khó viết, thì chúng ta sẽ đi sơ lượt qua Unit test một chút. Mình sẽ giải thích cho cả những anh em chưa từng viết unit test vẫn có thể hiểu được. Nên sẽ hơi dài, anh em nào rành unit test rồi (và hiểu tại sao khó viết unit test) thì có thể bỏ qua phần này.

Tại sao chúng ta lại đề cập tới Unit test trong bài này? trên thực tế, khi anh em và đội ngũ làm ra một sản phẩm phần mềm, thì chúng ta thường gọi nó là production code (hay code sản phẩm). Bên cạnh production code, trong một số project “được đầu tư kĩ lưỡng hơn“ thì sẽ có thêm testing code (thông thường là unit test, và đôi khi có cả automation test nhưng trong bài viết này chúng ta chỉ đề cập tới unit test). Mục đích của unit test nói nôm na là kiểm tra tính đúng đắn theo từng đơn vị nhỏ như function, method, class, modules. Khi sản phẩm có unit test, chắc chắn rằng anh em sẽ hạn chế được bug một cách tối đa trong quá trình phát triển sản phẩm cũng như mở rộng, bảo trì, refactor.

Và một điều chắc chắn khi anh em viết code theo nguyên lý Dependency Inversion thì việc viết Unit test sẽ vô cùng đơn giản!

Ví dụ nè

Ví dụ chúng ta có một method downloadMusicFile và với những kiến thức đã đọc tới bây giờ thì trong method này có một hard dependency là MusicFileRepository.

// Đây là production code
public function downloadMusicFileById(int $fileId)
{
    $musicFileRepository = new MusicFileRepository();
    $musicFileRepository->download($fileId);
}

Chúng ta sẽ thử viết Unit test như bên dưới.

Về ý tưởng để test hàm downloadMusicFileById thì đơn giản làm sao khi hàm này được gọi. Chúng ta phải kiểm tra xem method download có được gọi đúng với $fileId không là đủ rồi. Chúng ta không cần quan tâm method download có chạy đúng hay không. Vì muốn biết nó chạy đúng hay không thì chúng ta sẽ viết unit test riêng cho hàm download.

Và rõ ràng unit test (viết bằng PHPUnit) sẽ không thể chạy được (failed case) bởi vì chúng ta không thể mock hard dependency MusicFileRepository.

À, mock là một kĩ thuật được xài trong unit test rất nhiều. Anh em có 1p29s để search google và quay lại bài viết vì mình không thể giải thích quá nhiều sẽ dẫn tới một bài viết quá dài.

// Đây là unit test cho production code ở trên

// Tạo một mock object cho MusicFileRepository class
// chỉ mock cho method downloadMusicFileById()
$stub = $this->getMockBuilder(MusicFileRepository::class)
             ->setMethods(['downloadMusicFileById'])
             ->getMock();

// Expect method download được call 1 lần
$stub->expects($this->once())->method('downloadMusicFileById');

Nếu dùng kĩ thuật inject dependency vào constructor hoặc method thì có thể dễ dàng mock MusicFileRepository với kĩ thuật như trên.
Bên dưới là 2 cách để có thể viết unit test đơn giản hơn: Constructor injection và method injection.

// Method injection
function downloadMusic(
    MusicFileRepository $musicFileRepository,
    int $fileId
) {
    $this->musicFileRepository->download($fileId);
}

// Constructor injection
private MusicFileRepository $musicFileRepository;

public function __construct(MusicFileRepository $musicFileRepository)
{
    $this->musicFileRepository= $musicFileRepository;
}

public function downloadMusicFile(int $fileId)
{
    $this->musicFileRepository->download($fileId);
}

Túm cái váy Unit Test

Túm cái váy lại, nếu trong code xuất hiện Hard Dependency thì việc viết Unit test sẽ trở nên khó khăn hơn. Chúng ta đề cập tới chữ khó ở đây để nói lên rằng, trong một số trường hợp vẫn có thể viết Unit test được. Đó chính là kĩ thuật Black Box. Nói đơn giản là chúng ta không cần quan tâm tới cấu trúc bên trong function/method viết gì. Mà chỉ cần quan tâm tới input, output thì khi đó có thể áp dụng kĩ thuật Black Box được.

Anh em có thể để lại comment nếu muốn một bài viết chuyên sâu về Unit Test. Hoặc có thể tìm kiếm thêm thông tin trên Internet về các kĩ thuật Unit test

Dependency Inversion Principle Design

Vậy câu hỏi đặt ra là làm thế nào để chương trình của chúng ta vừa dễ phát triển, vừa dễ dàng bảo trì và mở rộng. Bây giờ hãy xem chương trình ở trên được thiết kế lại như sau:

class MusicPlayer
{
    private $file;
    
    // Chổ này bây giờ là phụ thuộc vào interface
    public function __construct(PlayerFile $file)
    {
        $this->file = $file;
    }

    public function play()
    {
        return $this->file->play();
    }
}

// Xuất hiện interface ở đây
interface PlayerFile {
    public function play();
}

class MP3File implements PlayerFile
{
    public function play()
    {
        return "Play MP3 file!";
    }
}

class FLACFile implements PlayerFile
{
    public function play()
    {
        return "Play FLAC file!";
    }
}

Chúng ta đã tạo ra một interface PlayerFile để phá vỡ sự phụ thuộc. Bây giờ thiết kế mới sẽ là

dependency-inversion

Hay nói cách khác, chúng ta đã tuân thủ nguyên tắc thứ nhất của DIP: High-level modules should not depend on low-level modules. Both should depend on abstractions.

Và 2 class MP3File và FLACFile đang phụ thuộc vào interface PlayerFile tuân thủ nguyên tắc thứ 2 của DIP: Abstractions should not depend on details. Details should depend on abstractions.

Bây giờ với thiết kế mới, MusicPlayer hoàn toàn chỉ phụ thuộc vào interface. Nên dù có thay đổi MP3, FLAC, hay thêm, mở rộng bất cứ loại file nhạc mới nào thì class MusicPlayer vẫn sẽ không bị thay đổi. Hay nói cách khác là đã tuân thủ nguyên lý Open / close principle. Điều này sẽ làm cho các developer khác tiếp cận tốt hơn, code clean hơn, dễ bảo trì và mở rộng hơn. Xong!

Đọc tới đây nếu anh em còn chưa hiểu thì có thể đọc lại vài lần nữa. Còn nếu vẫn không hiểu thì anh em để lại comment cho mình bên dưới. Mình sẽ giải đáp thắc mắc cho anh em. Chúc mừng và cám ơn anh em đã đọc tới

Lời chia sẻ “thật lòng”

Chúng ta là lập trình viên cũng có thể được xem là những kiến trúc sư trong thế giới lập trình. Việc thiết kế ra những chương trình/phần mềm ổn định, dễ bảo trì và mở rộng là điều cực kì quan trọng đối với một lập trình viên. Không phải ai mới bước vào thế giới lập trình cũng có thể ngày một ngày hai trở nên giỏi giang. Nhưng có một điều chắc chắn rằng, nếu anh em rèn luyện càng nhiều, thì khả năng sẽ càng tăng. Sẽ ngày càng giỏi hơn và dần trở thành một lập trình viên thực thụ.

Bài viết gốc được đăng tải tại lenhatthanh.com

Lập trình game với Java cho người mới bắt đầu

Lập trình game với java cho người mới bắt đầu

Bài viết được sự cho phép của tác giả Lê Hồng Kỳ

Lập trình game với java dành cho người mới bắt đầu sẽ trình bày những kiến thức cũng như những xử lý đặc thù khi lập trình game như xử lý va chạm, xử lý chuyển động, xử lý âm thanh, xử lý vòng lặp game,…

Các bạn lưu ý, để học tốt bài này người học phải có kiến thức về lập trình với ngôn ngữ Java. Trong bài học này, người học sẽ dùng ngôn ngữ Java để thiết kế giao diện game, cài đặt xử lý game. Chúng ta hãy bắt đầu bài học bằng một game nhỏ (mini game) với tựa là Mini Tennis.

Game này có luật chơi rất đơn giản. Quả bóng di chuyển từ trên xuống dưới. Nếu đụng biên dưới, trò chơi kết thúc. Người chơi sẽ sử dụng 2 phím mũi tên để di chuyển thanh ngang qua trái/phải sao cho quả bóng không được đụng biên dưới.

Lập trình game với java

Lập trình game với java – Nội dung bài học

  • Đồ họa (Graphic)
  • Chuyển động và lặp lại (Animation and loop)
  • Nhân vật (Sprite)
  • Sự kiện (Event)
  • Va cham (Collision)
  • Âm thanh (Sound)

  Top 5 Ngôn Ngữ Lập Trình Game Không Thể Bỏ Qua 2024

  Mẫu bảng mô tả công việc lập trình Game

Lập trình game với java – Đồ hoạ trong game

Để vẽ một cái gì đó, trước tiên chúng ta cần một bề mặt để vẽ. Đó chính là JPanel. Khi vẽ một đối tượng nào đó, chúng ta phải xác định được toạ độ (x, y) và kích thước của đối tượng đó.

Lập trình game với java

Phần code dùng để vẽ các hình oval và hình chữ nhật

public class Game extends JPanel { 
 public void paint(Graphics g) { 
   g.setColor(Color.RED);
   // Hình oval có tô màu tại vị trí 0,0
   g.fillOval(0, 0, 30, 30);
   // Hình oval không tô màu tại vị trí 0, 50
   g.drawOval(0, 50, 30, 30);
   // Hình chữ nhật có tô màu tại vị trí 50, 0
   g.fillRect(50, 0, 30, 30);
   // Hình chữ nhật không tô màu tại vị trí 50, 50
   g.drawRect(50, 50, 30, 30);
   // Hình oval không tô mau tại vị trí 0, 100
   g.drawOval(0, 100, 30, 30);
 } 
}

Lập trình game với java – Chuyển động và vòng lặp game (game loop)

Mỗi lần vẽ một đối tượng nào đó, chúng ta phải biết vị trí (x,y) và để di chuyển đối tượng, chúng ta sẽ thay đổi vị trí này theo quy tắc:

  • Thay đổi giá trị của x sẽ làm cho đối tượng chuyển động theo chiều ngang
  • Thay đổi giá trị của y sẽ làm cho đối tượng chuyển động theo chiều dọc

Xem tuyển dụng Game Developer tại các công ty hàng đầu trên TopDev

Phần code dùng để xử lý chuyển động (move)

private void moveBall() {
  // Tăng toạ độ x lên 1
  x = x + 1;
  // Tăng toạ độ y lên 1
  y = y + 1;
}

Phần code dùng để xử lý vòng lặp game (game loop)

while (true) {
  // Xử lý chuyển động cho quả bóng
  moveBall();
  // Vẽ lại quả bóng ở vị trí mới
  repaint();
  // Delay
  Thread.sleep(20);
}

Lập trình game với java – Nhân vật trong game (Sprite)

Giống như các lĩnh vực nghệ thuật khác, trò chơi có một dàn các nhân vật và mỗi nhân vật có một vai trò cụ thể. Mỗi nhân vật có các đặc điểm như vị trí (x,y), tốc độ và hướng di chuyển.

Lập trình game với java

Tốc độ và hướng di chuyển của nhân vật được hiểu như sau

  • Gọi xa, ya đại diện cho tốc độ quả bóng đang di chuyển.
  • Nếu xa = 1 thì quả bóng di chuyển về bên phải và xa = -1 thì bóng di chuyển về bên trái.
  • Nếu ya = 1 thì bóng di chuyển xuống và ya = -1 thì bóng di chuyển lên trên.
  • Mỗi lần di chuyển, tọa độ được cập nhật tăng/giảm một hoặc nhiều hơn một đơn vị tùy thuộc vào hướng di chuyển.

Phần code dùng để xử lý thay đổi hướng di chuyển và tốc độ

private void moveBall() { 
 if (x + xa < 0) 
   xa = 1; 
 if (x + xa > getWidth() - 30) 
   xa = -1; 
 if (y + ya < 0) 
   ya = 1; 
 if (y + ya > getHeight() - 30) 
   ya = -1; 
 //Cập nhật tọa độ
 x = x + xa; 
 y = y + ya; 
}

Xem ngay việc làm Java tại TopDev

Lập trình game với java – Xử lý sự kiện trong game

Xử lý sự kiện chính là xử lý sự tương tác giữa người chơi với game. Sự tương tác đó có thể là chạm, nghiêng màn hình (game cho mobile); hoặc khi người chơi click chuột, nhấn một phím trên bàn phím (game cho pc),…

Đối với Mini Tennis, khi người chơi nhấn phím mũi tên left thì cây vợt sẽ chuyển động sang trái, khi người chơi nhấn phím mũi tên right thì cây vợt sẽ chuyển động sang phải. Đây chính là sự kiện bàn phím.

Bên dưới là đoạn code mẫu

KeyListener kl = new KeyListener() {
 // Xử lý khi một phím được nhả
 public void keyReleased(KeyEvent arg0) {
   // Viết xử lý của bạn tại đây
 }
 // Xử lý khi một phím được nhấn
 public void keyPressed(KeyEvent arg0) {
   // Viết xử lý của bạn tại đây
 }
};
addKeyListener(kl);
setFocusable(true);

Lập trình game với java – Xử lý va chạm trong game (collision)

Một trong nhiều phương pháp được xử dụng đó là kiểm tra biên (bound). Đầu tiên người lập trình phải xác định đâu là va chạm trong game. Đối với game Mini Tennis, người lập trình phải xử lý va chạm giữa quả bóng và cây vợt.

Sau khi xác định được va chạm, người lập trình sẽ tạo biên cho những đối tượng này. Tuỳ theo hình dáng của đối tượng mà chúng ta lựa chọn biên cho phù hợp. Hãy xem hình bên dưới.

Lập trình game với java

Phần code mẫu

Tạo biên cho quả bóng

public Rectangle getBallBound() {
 return new Rectangle(x, y, DIAMETER, DIAMETER);
}

Tạo biên cho cây vợt

public Rectangle getBattledoreBound() {
 return new Rectangle(x, y, WIDTH, HEIGHT);
}

Kiểm tra va chạm xử dụng phương thức intersects(). Nếu biên của quả bóng và cây vợt giao nhau thì đông nghĩa quả bóng chạm cây vợt. Phương thức này sẽ trả về true. Phương thức này trả về false cho trường hợp ngược lại.

private boolean isCollision() { 
 return getBattledoreBound().intersects(getBallBound()); 
}

Lập trình game với java – Bài tập thực hành

Yêu cầu 1: Vẽ quả bóng và cây vợt

  • Vẽ hình chữ nhật (Battledore) kích thước 80×20 tại tọa độ y = 300, tọa độ x thay đổi theo điều khiển của người dùng.
  • Khi người dùng nhấn phím mũi tên trái/phải, di chuyển Battledore theo hướng tương ứng

Yêu cầu 2: Xử lý va chạm

  • Qua bóng (Ball) di chuyển tự động từ trên xuống
  • Cây vợt (Battledore) di chuyển sang trái hoặc sang phải theo sự điều khiển của người chơi khi nhấn phím
  • Khi quả bóng chạm (Collision) cây vợt thì quả bóng sẽ đổi hướng

Yêu cầu 3: Hoàn thiện game

  • Trò chơi sẽ ghi nhận số lần người chơi hứng được quả bóng bằng điểm số. Mỗi lần hứng được quả bóng điểm số tăng lên 1.
  • Quả bóng sẽ chuyển động nhanh hơn sau mỗi lần chạm để tăng độ khó.
  • Trong game có 3 loại âm thanh: âm thanh quả bóng chạm biên hoặc chạm cây vợt, âm thanh nền và âm thanh khi kết thúc game (game over).

Bài viết gốc được đăng tải tại giasutinhoc.vn

Bạn có thể xem thêm:

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev