Home Blog Page 60

Giới thiệu về OffHeap và ZeroCopy

giới thiệu offheap và zerocopy

Bài viết được sự cho phép của tác giả Trần Văn Dem

Java là một ngôn ngữ dễ học mang lại hiệu năng đủ tốt dành cho hầu hết các sản phẩm hiện nay. Chắc hẳn mọi người biết rằng để xây dựng một hệ thống có thời gian phản hồi trong khoảng vài milliseconds thì việc caching là rất quan trọng. Việc của chúng ta sẽ phải làm là tăng tỉ lệ cache hit và cách đơn giản nhất là cache càng nhiều dữ liệu trên memory một vài ứng dụng sẽ cần cache tất cả lên memory mà không sử dụng thêm một memory database nào khác.

Một trong các hạn chế của Java khi xây dựng hệ thống có tải cao và độ trễ thấp đó là garbage collection (gc). Mặc dù qua các phiên bản khác nhau của Java hệ thống này ngày càng được cải tiến với các thuật toán gc thông minh hơn giúp giảm thời gian stop the world đi nhưng hiện tại với phiên bản Java 11 thì thời gian stop the world vẫn chưa bằng 0. Dữ liệu trên heap càng nhiều thì sẽ ảnh hưởng tiêu cực đến các thuật toán gc của Java. Nếu các bạn muốn đọc thêm về turning gc trong Java, chọn thuật toán gc nào phù hợp với ứng dụng của mình thì click Garbage Collection Tuning Guide đây là tài liệu của oracle viết giúp turning gc.

Tại bài viết hôm nay mình muốn giới thiệu cho mọi người một kỹ thuật khác trong Java có thể dùng để caching dữ liệu mà không làm nặng tải cho các thuật toán gc giúp giảm thiểu thời gian stop the world. Như đã trình bày bên trên càng nhiều dữ liệu trên heap thì càng làm tăng tải cho các thuật toán gc. Vậy cách cache dữ liệu mà không ảnh hưởng đến gc sẽ là chúng ta sẽ cache một số dữ liệu tại off-heap vùng bộ nhớ này sẽ không chịu tác động của gc nên sẽ giảm tải cho thuật toán gc.

Bộ nhớ Off-Heap trong Java là một khái niệm không mới mặc dù nó đã tồn tại rất lâu nhưng hiện tại mình chỉ sử dụng nó được khoảng gần 1 năm. Tại bài viết này mình sẽ chia sẻ về off heap , zero copy và các ứng dụng thực tế mình đã làm.

Bộ nhớ on-heap trong Java đã quá quen thuộc với mọi người. Mọi lập trình viên Java đều sử dụng nó hằng ngày để cấp phát và lưu các đối tượng trong chương trình.

Bộ nhớ off-heap sẽ sử dụng memory trực tiếp của hệ điều hành nên sẽ không chịu tác động của gc trên Java chúng ta chỉ cấp phát một object nhỏ trong heap để làm việc với bộ nhớ off-heap nên sẽ không ảnh hưởng đến gc.

Vì đây là bộ nhớ của OS nên chúng ta chỉ lưu được dữ liệu dưới dạng binary sequence. Mọi object muốn được lưu trong off heap sẽ phải serialize thành các byte array và khi muốn truy xuất đối tượng trong offheap thì sẽ cần bước deserialize từ byte array sang object.

Để sử dụng được bộ nhó off-heap trong Java cung cấp cho chúng ta class :

  • DirectByteBuffer và
  • MappedByteBuffer.

Hai class không những giúp chúng ta xây dựng caching trên off-heap mà còn có thể tăng hiệu năng của chương trình trong một số trường hợp nhất định.

Các thách thức khi implement offheap caching.

On-Heap OffHeap
Cấu trúc dữ liệu Implement Hashtable bằng array. Array cho phép ramdom accesss vào object Implement Hashtable bằng DirectByteBuffer. DirectByteBuffer cho phép access đến offset của bytes
Trùng mã Hash Implement B-Tree hoặc LinkedList tùy phiên bản của Java Implement B-Tree hay LinkedList trên OffHeap là rất khó khăn
resize HashTable Tạo ra array mới có size lớn hơn (thường là gấp 2) và tính toán lại hết các mã hash và slot lưu dữ liệu Việc tạo mới DirectByteBuffer với size gấp đôi là rất tốn kém chi phí.

Chúng ta có thể lựa chọn giải pháp kết hợp giữa on-heap và off-heap bằng cách sẽ lưu offset của một object trên on heap. Sau khi lấy được offset của object rồi thì sẽ dùng các api có sãn để seek đến offset và lấy dữ liệu ra.

Vì có quá nhiều bài toán cần phải giải quyết khi implement off-heap cache nên hiện tại mình chưa code demo cho mọi người về offheap cache được.

Nhưng trong các project trading của bên mình (caching tất cả lệnh đang được mở của khách hàng) đã làm đều sử dụng thư viện MapDB. Đây là một thư viện rất mạnh đang được hơn 4.5K sao trên github. Mình đã đọc qua source code của thư viện này thì thấy tác giả đã cài đặt off-heap cache lưu cả phần offset và data trên DirectByteBuffer. Thuật toán của anh ta rất tuyệt vời mang lại tốc độ đọc/ghi ngang với các concurrent collection của Java.

Khi đọc/ghi dữ liệu từ off-heap thì chúng ta cần quan tâm một điều nữa là việc serialize dữ liệu. Khi có thuật toán đủ tốt dành cho caching data rồi thì bottleneck của hệ thống chính là phần serialize này. Khi sử dụng Java thì mọi người nên tránh sử dụng serialize có sẵn của nó mà nên dùng một số thư viện như : kryo,proto,… Hoặc tự xây dựng một bộ serialize riêng, tham khảo bài viết ngắn gọn của mình về Serialize, code trong blog đã được mình sửa lại rất nhiều và commit trên github.

Theo hiểu biết của mình hiện tại có 2 mô hình socket server :

  • Blocking IO socket. Một Thread sẽ đọc dữ liệu từ một connection
  • Non Blocking IO socket. Một Thread đọc dữ liệu từ nhiều connection

Tại đây mình sẽ nói đôi chút về Non Blocking IO socket với DirectByteBuffer. Theo các tài liệu viết về mô hình NonBlockingIO này dữ liệu sẽ đọc từ channel vào bytebufferDirectByteBuffer được tối ưu cho việc đọc ghi này. Vì DirectByteBuffer dùng memory của hệ điều hành chứ không dùng heap của Java. Và vẫn như trên DirectByteBuffer không làm tăng tải cho gc.

Khi bạn sử dụng Heap Buffer khi ghi dữ liệu của socket thì sẽ làm các bước sau:

  1. Tạo direct bytebuffer tạm
  2. Ghi dữ liệu từ Heap Buffer vào direct buffer tạm
  3. Thực hiện các quá trình socket I/O khác bằng buffer tạm

Việc tạo mới DirectByteBuffer là rất tốn kém nên nếu sử dụng DirectByteBuffer thì hãy nên tạo và tái sử dụng không nên tạo mới.

Công việc hiện tại của mình mỗi khi code socket thì sẽ sủ dụng netty và netty cũng sử dụng DirectByteBuffer.

  Cách tuần tự hóa dữ liệu trong Java như Protobuf
  Mẹo tối ưu câu lệnh truy vấn (query) SQL

Một ứng dụng rất nổi tiếng đó là Kafka nó sử dụng cơ chế zero copy để khiến dữ liệu từ server chuyển về phía consumer là nhanh nhất. Để an toàn Kafka persist tất cả message của producer xuống file của server và sẽ chuyển dữ liệu từ file này đến phía của consumer.

Mặc dù liên quan rất ít đến nội dung bài blog này nhưng mình vẫn xin phép giải thích một chút về zero copy của Kafka.

Nếu không sử dụng kỹ thuật zero copy thì logic khi code sẽ là như sau.

NormalLogic.png

Chương trình của chúng ta sử dụng rất nhiều API của hệ điều hành, nhất là khi thao tác với các hệ thống File hoặc thao tác với socket. Vậy nên khi muốn đọc File hay muốn gửi nhận dữ liệu thì chúng ta đều phải switching context để sử dụng API của OS

Có một số điểm cần lưu ý tại hình trên:

  • Chúng ta có 4 lần switching context: 2 lần gọi syscall() từ Application, 2 lần OS trả lại kết quả và cho Application chạy tiếp.
  • Có một lần copy data từ OS sang Application, một lần copy data từ Application sang OS.

Bốn lần switching context và hai lần copy data có thể gây chậm cho hệ thống Kafka. Với hầu hết các ứng dụng thì phần code logic rất phức tạp nên ta không thể tránh được 4 lần switching context và 2 lần copy data được, nhưng với các kỹ sư code Kafka thì họ có thể xử lý được.

Sau khi sử dụng kỹ thuật zero copy thì sẽ được như sau.

ZeroCopy.png

Với sự support của OS thì các kỹ sư của Kafka đã sử dụng API transferTo() để gửi thẳng nội dung từ FileChannel sang SocketChannel mà không cần copy lên Application và cũng giảm tải được số lần switching context. Tất nhiên để làm được điều này thì các kỹ sư của Kafka phải có cách thiết kêt File đủ tốt để biết khi gửi sẽ gửi từ byte nào đến byte nào để dưới client có thể hiểu và deserialize được

Đọc code Kafka nòi mắt thì mình tìm thấy code implement zero copy này:

img_1.png

Mình cũng đang tìm hiểu cách ghi xuống File và cách xóa Data của Kafka mà code nó to quá chưa nghiên cứu hết được :((. Hy vọng sau này tìm được mình sẽ trình bày một bài.

Mặc dù Zero Copy mang lại hiệu năng rất cao nhưng mà hầu hết các ứng dụng của chúng ta không phải chỉ dùng để forward dữ liệu mà còn thực hiện nhiều logic khác. Vậy nên chúng ta sẽ không ứng dụng được nhiều phần Zero copy này. Tại đây mình muốn dưới thiệu một kiểu đọc ghi hiệu quả hơn là sủ dụng mmap() của hệ điều hành.

Bình thường đọc ghi của chúng ta sẽ là như sau :

normal_read_write.png

Cũng tương tự như làm việc với socket khi chúng ta read/write thì phải sử dụng API của OS các API này sẽ copy data và switching context. Vậy nên trong hầu hết các ngôn ngữ lập trình đều sử dụng buffer và chỉ thực hiện gọi API của hệ điều hành khi đầy buffer hoặc đã đọc hết data trong buffer.

Khi sử dụng buffer thì khi ghi dữ liệu bằng một cách nào đó chương trình chúng ta bị lỗi thì dữ liệu sẽ không được ghi xuống đĩa của OS.

OS còn hỗ trợ một kiểu đọc ghi nữa là mmap() kiểu này sinh ra dành cho mục đích IPC (Inter-process communication) nên có IO nhanh hơn read/write. Trong Java để làm việc với mmap() thì qua class MappedByteBuffer. Khi sử dụng MappedByteBuffer chúng ta có interface dễ hiểu như làm việc với ByteBuffer vấn đề phức tạp đã được Java giải quyết giúp chúng ta.

Khi sử dụng mmap() thì đọc ghi sẽ như sau:

Mmap_read_write.png

Sự khác biệt khi sử dụng mmap() chúng ta không phải copy dữ liệu lên buffer của Application mà vẫn thực hiện IO. Khi đọc dữ liệu cần lên Application sẽ copy trực tiếp từ main memory lên buffer.

Cách này có các ưu điểm sau:

  • không switching context nhiều như cách đọc bằng buffer. Việc copy hay flush đã được OS quản lý.
  • Không có copy data vì dữ liệu đã được OS map vào main memory
  • Không cần tự flush dữ liệu, khi hệ thống không may bị crash thì dữ liệu sẽ được OS flush xuống ổ đĩa.

Trong hệ thống trading mình đang xây dựng đang sử dụng MappedByteBuffer dùng để CDC (capture data change). Để thiết kế tối ưu nhất về thời gian cũng như tài nguyên dành cho giao tiếp thì bên mình sử dụng mô hình asynchronous trong cả giao tiếp lẫn trong tính toán. Bên mình không trực tiếp làm việc với DB luôn mà mọi request thay đổi dữ liệu trong DB sẽ áp dụng event driven bắn vào msg queue cho service khác thực hiện việc update db.

Để tiết kiệm chi phí bên mình không sử dụng Kafka mặc dù open source nhưng mà deploy lại khá tốn server nên mỗi khi đọc dữ liệu từ msg queue bên mình sẽ dùng MappedByteBuffer ghi dữ liệu đọc được xuống File sau đó sẽ đọc từ File này ghi vào DB. Vì MappedByteBuffer hay mmap() thiết kế cho việc IPC nên rất phù hợp cho quá trình này. Tiếp đến bên mình sử dụng Tcp socket nên nếu mình đọc dữ liệu từ socket ra chậm thì giao thức Tcp sẽ gửi chậm lại và ảnh hưởng rất nhiều đến hệ thống. Vậy nên bước ghi xuống File này rất quan trọng. Tiếp đến nó sẽ không bị mất dữ liệu khi crash app nên rất phù hợp để CDC.

Mô hình xử lý bên mình như sau:

process-service.png

Mình cũng đã chia sẻ communication-way-in-high-traffic-system nếu quan tâm mọi người vào đọc ủng hộ mình nhé. Còn phần processing asynchronous hiện tại mình chưa viết nhưng sẽ viết trong tương lai nếu thời gian rảnh và được ủng hộ bởi mọi người.

Hy vọng qua bài viết này các bạn biết thêm một loại bộ nhớ nữa là off-heap và tùy vào ứng dụng có thể áp dụng trong thực tế.

Theo mình thấy thì nếu các bạn caching quá nhiều trong trường hợp đó ảnh hưởng quá xấu đến gc dẫn đến stop the world quá nhiều thì nên sử dụng vì khi sử dụng off heap tốc độ sẽ không thể nhanh bằng on heap được.

Mình cũng trình bày thêm một số ứng dụng cảu ByteBuffer của Java và zero copy của mô hình Non blocking IO hy vọng giúp ích được mọi người hiểu thêm và ứng dụng được vào Application của mình.

Như mọi lần nếu bài viết có vấn đề gì thì mọi người góp ý nhé vì chia sẻ cũng là học hỏi thêm. Bài viết hay thì mình xin một sao trên repo blog trên github này làm động lực mình thêm bài viết mới.

Bài viết gốc được đăng tải tại demtv.hashnode.dev

Xem thêm:

Đừng bỏ lỡ hàng loạt việc làm IT hấp dẫn trên TopDev!

KICC HCMC x TOPDEV – Cái Bắt Tay Góp Phần Phát Triển Tài Năng IT Của Việt Nam

KICC HCMC x TOPDEV 2022

Tiếp nối thành công của những năm trước, KICC HCMC cùng TopDev tiếp tục mang đến chương trình hợp tác năm 2022 với thông điệp “Make Your IT Career Outstanding – Khởi sắc sự nghiệp IT của bạn”. Theo đó là những hoạt động phối hợp với mục đích kết nối các việc làm ngành CNTT tại các doanh nghiệp IT Hàn Quốc với đối tượng Lập Trình Viên Việt Nam.

KICC HCMC x TOPDEV 2022

Mối quan hệ đầu tư chiến lược Hàn Quốc – Việt Nam

Hiện tại, Việt Nam là đối tác hợp tác kinh tế hàng đầu trong Chính sách hướng Nam mới và là một trong những đối tác kinh tế lớn nhất của Hàn Quốc tại khu vực ASEAN. Không chỉ có các doanh nghiệp lớn, tập đoàn đang từng bước xây dựng các chuỗi cung ứng chiến lược tại Việt Nam mà các doanh nghiệp nhỏ và vừa của Hàn Quốc cũng tăng cường xúc tiến đầu tư tại Việt Nam. 

Kết nối công nghệ trong kỷ nguyên mới

“Công nghệ” là lĩnh vực có tiềm năng vô tận, và là chìa khóa để mọi quốc gia bước vào kỷ nguyên phát triển nhanh và bền vững. Đặc biệt, đây cũng là lĩnh vực để hai quốc gia có thể phát huy tiềm năng, khai thác hiệu quả nguồn lực từ mỗi bên để cùng phát triển những giá trị rõ rệt cho nền kinh tế – thương mại cũng như thị trường lao động.

FDI Hàn Quốc “bùng nổ” trở lại sau đại dịch Covid-19

Theo số liệu của Cục Đầu tư nước ngoài, 6 tháng đầu năm 2022, các nhà đầu tư Hàn Quốc đã đăng ký đầu tư vào Việt Nam trên 2,66 tỷ USD, chiếm gần 19% tổng vốn đầu tư, tăng 29,6% so với cùng kỳ. Điều này cho thấy, thị trường Việt Nam vẫn là mảnh đất màu mỡ với các doanh nghiệp Hàn Quốc dù trước hay sau đại dịch Covid-19 bùng nổ.

Khởi sắc sự nghiệp IT tại các công ty Công nghệ Hàn Quốc ngay tại Việt Nam

Trong khuôn khổ hợp tác, KICC HCMC cùng TopDev hứa hẹn mang đến những giá trị cho tổ chức/ doanh nghiệp:

  • Hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các công ty IT Hàn Quốc;
  • Quảng bá hình ảnh, sản phẩm/ dịch vụ và thương hiệu tuyển dụng của các công ty IT Hàn Quốc đến với Cộng đồng Lập trình viên Việt Nam;
  • Hỗ trợ khách hàng tiềm năng của nhau cùng tiếp cận thị trường địa phương, tìm kiếm đối tác, khách hàng tiềm năng và mở rộng kinh doanh tại Việt Nam.

Cơ hội phát triển sự nghiệp tại các công ty IT Hàn Quốc dành cho các Lập trình viên Việt:

  • Trực tiếp tham gia các dự án công nghệ sử dụng nền tảng hiện đại, tiên tiến từ nước ngoài;
  • Được tạo điều kiện để phát triển bằng các công tác giáo dục và bồi dưỡng nâng cao năng lực chuyên môn và kỹ năng thường xuyên;
  • Môi trường làm việc quốc tế, chuyên nghiệp tại các doanh nghiệp hàng đầu của Hàn Quốc;
  • Mức lương xứng đáng, phù hợp với kinh nghiệm và vị trí;
  • Tiếp cận nền tảng công nghệ hiện đại, sản phẩm lớn và nhiều dự án mang đầy tính sáng tạo, thử thách;
  • Cơ hội nâng cao trình độ qua các chuyến công tác onsite tại Hàn Quốc, training sử dụng các công nghệ….

Thông tin chi tiết về dự án vui lòng truy cập tại đây

Về KICC HCMC và NIPA:

Được thành lập vào ngày 23 tháng 5 năm 2019, KICC HCMC (KICC Hồ Chí Minh) là văn phòng thứ 6 trên toàn cầu và thứ 2 tại Việt Nam. KICC là văn phòng quốc tế trực thuộc Bộ Khoa học – Công nghệ Thông tin  Hàn Quốc (MSIT) và Cơ quan Xúc tiến Công nghệ Thông tin – Truyền thông (NIPA) với mục đích giúp đỡ việc kinh doanh quốc tế của những công ty về Công nghệ Thông tin (CNTT) của Hàn Quốc. KICC có 06 văn phòng ở Thung lũng Silicon (Mỹ), Tokyo (Nhật), Bắc Kinh (Trung Quốc), Singapore, Hà Nội (Việt Nam) và Hồ Chí Minh (Việt Nam).

NIPA là tổ chức phi lợi nhuận từ Chính phủ Hàn Quốc và là thành viên của Bộ Khoa học – Công nghệ Thông tin Hàn Quốc, chịu trách nhiệm trong việc hỗ trợ các công ty và các chuyên gia CNTT. NIPA hiện dẫn đầu trong kiến thức về cơ sở hạ tầng kinh tế xã hội và phát triển kinh tế quốc gia bằng việc xúc tiến khả năng cạnh tranh của toàn ngành công nghiệp thông qua sự tiến bộ kỹ thuật CNTT và công nghiệp.

Thông tin liên hệ:

  • Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)
  • E-mail: HCMC@nipa.kr
  • Địa chỉ: 135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

Về TopDev – nền tảng tuyển dụng IT

Với hơn 300.000 profile lập trình viên đồng thời sở hữu Cộng đồng Lập trình viên lớn nhất Việt Nam, TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam.  Ngoài ra, TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam, giúp xây dựng và phát triển thương hiệu tuyển dụng – Employer Brand cho hàng trăm công ty công nghệ trong và ngoài nước. Đây còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo quý, năm về thị trường và nhân lực IT tại Việt Nam. (Báo cáo thị trường IT tại đây)

Khám phá các việc làm IT hấp dẫn có trên TopDev

Xem thêm:

KICC HCMC chính thức hợp tác cùng TopDev phát triển nguồn nhân lực IT Việt

Khởi sắc sự nghiệp IT cùng các cơ hội tại công ty IT Hàn Quốc

Bàn Về Định Nghĩa Yêu Cầu

định nghĩa yêu cầu

Bài viết được sự cho phép của tác giả Nguyễn Văn Trọng

Tiếp tục sê ri công đoạn phát triển phần mềm, hôm nay mời quí bạn và các vị đến với “định nghĩa yêu cầu” 要件定義 – Requirements Definition. Quả thật là những BrSE được có cơ hội làm công đoạn này không nhiều. Một phần vì kỹ năng nghe, thứ 2 là nó rất khó. Mình thì may mắn được đi hóng hớt suốt 2 tháng trời, hằng ngày muối mặt ở shinjuku (ngay khu phố trong bộ phim Đại Náo Shinjuku – Thành Long) nghe khách hàng nói trên trời dưới đất. Dạo ấy đi cùng mình là một bác đồng nghiệp người Nhật, người sau này mình gọi là shisho (師匠 – sư phụ). Bác ấy nghe chính còn mình chỉ phụ hoạ chứ hồi đó mới nứt mắt thì biết gì mà hear vs chả ring. Đến tận mấy dự án sau này, ngồi đọc các tài liệu nên cũng thấm dần, đầu đất mà mưa dầm thì nó cũng nhão ra.

Giải Thích Thuật Ngữ

Hẳn là các bạn đã từng nghe đến “phân tích yêu cầu” – “tài liệu định nghĩa yêu cầu” –  要件分析 – 要求分析 – 要求定義書 – 要件定義書 và không hiểu nó là cái gì và khác gì nhau, bày ra lắm cho rắc rối. Nói thật ra Nhật họ cũng loạn cả lên chứ đừng nói là mình. Vô tình lượm được bí kíp nên chia sẻ cho các bạn đỡ bực

要求分析

  • Khách hàng muốn làm gì
  • Bao gồm cả những yêu cầu mâu thuẫn nhau
  • Làm rõ những yêu cầu của khách hàng
  • Kết quả phân tích được tổng hợp lại gọi là 要求定義書

要件分析

  • System cần những cái gì
  • Phân tích và loại bỏ những yêu cầu mâu thuẫn
  • Làm rõ những yêu cầu hệ thống
  • Kết quả phân tích được tổng hợp lại gọi là 要件定義書

Và trên thực tế 2 công đoạn phân tích này cũng sẽ được tiến hành đồng thời. Và cái để BrSE cần để làm design đó là 要件定義書.

Để lấy thêm 1 ví dụ cho dễ hiểu về “những yêu cầu mâu thuẫn”. Khách : xây dựng cho tụi ta 1 hệ thống quản lý mà nó vận hành liên tục 24/24. Sau 1 hồi nghĩ ra thêm : à, mà nếu có lỗi thì phải khôi phục lại được nên hằng ngày tụi bây cho back up hệ thống vào khung giờ 0 đến 1h đêm dùm với được không? Đau chưa. Cái vận hành 24/24 gọi là “yêu cầu chức năng” 機能要求, còn cái back up định kỳ gọi là “yêu cầu phi chức năng” 非機能要求. Và nhiệm vụ của mình là giải quyết hoặc … giải thích để họ bỏ mấy cái điên điên đi :D.

Các Bước Tiến Hành

Thu Thập Thông Tin

Họp – hỏi – trả lời – lên danh sách câu hỏi – họp…Vòng lặp (while : khách chưa bực mình). Giỡn chứ hỏi đến khi nào sáng tỏ thì thôi. Để việc thu thập thông tin có hiệu quả thì người phân tích yêu cầu phải làm việc với các bên am hiểu hệ thống để biết cái mà hỏi, ngoài ra còn khuyên khách hàng làm như thế nào cho tốt.

requiredefine_tigernguyenQ&A

Khách đưa yêu cầu : tôi muốn có 1 màn hình để xuất hoá đơn. Cái cần hỏi : hoá đơn bao gồm những gì, giới hạn bao nhiêu record, xuất dạng nào – pdf hay image…, tổng tiền có cần làm tròn không, role gì có quyền xuất … vv…

Phản Hồi Thông Tin

Sau khi làm việc với người có chuyên môn để tham khảo những vấn đề mà mình không rõ hoặc không chắc thì lên danh sách câu trả lời, cái nào làm được, cái nào không, lý do, nên thêm cái gì. Và lên 1 danh sách câu hỏi khác để tiếp tục làm việc trong các buổi họp kế tiếp.

Đừng bỏ lỡ tin tuyển dụng kỹ sư cầu nối (BrSE) với đãi ngộ hấp dẫn trên TopDev nhé!

Tổng Hợp Thông Tin

Đến bước này mình sẽ chia nhỏ ra thành các tài liệu riêng để nhóm nội dung lại. Cần có những tài liệu để mô tả hệ thống, danh sách chức năng, flow nghiệp vụ, use case, quản lý issue …

requiredefine_documentlistDocument List of Requirements Definition

Làm Sao Cho Tốt

Các bạn có thể tham khảo bài viết bên dưới để biết các mẹo trong công đoạn này. Vì lười dịch nên mình chỉ đưa vào 1 phần nhỏ trong phạm vi bài viết này là 5W2H

いつ(When) Thời hạn – start – end, và status từng giai đoạn
どこから(Where) Sử dụng nội bộ hay có liên kết với cả hệ thống bên ngoài công ty
誰が(Who) Ai là người dùng, đối với từng role thì quyền hạn như nào
何の情報を(What) giải quyết những thông tin gì
どういう理由で(Why) Tại sao lại cần “cái ấy”
どれぐらいで(How Much/Many) 1 ngày 1 lần hay 1 năm. Bao nhiêu thì tốt. Ví dụ : backup system, 1 tuần 1 lần hay hàng ngày, mỗi lần backup toàn bộ hay chỉ phần quan trọng
どうするのか(How) KH muốn gì, và với cái đó tui phải làm như thế nào

Nguồn: atmarkit.co.jp

Kết

Đầu ra

  • 要件定義書 (Bản định nghĩa yêu cầu):Phải đầy đủ để có thể create được basic design mà không cần hỏi lại khách hoặc hạn chế hỏi nhất. Đảm bảo tính khả thi, cái gì làm được với không được thì điều tra và nói ngay từ đầu, sau này đỡ mất công chỉnh sửa, thậm chí … cãi nhau

Phương thức

  • Thu thập thông tin
  • Phản hồi thông tin
  • Tổng hợp thông tin

Mẹo

  • Sử dụng 5W2H : nằm ngay trên nè

BrSE cần :

  • Chịu khó đọc tài liệu
  • Rèn kỹ năng nghe và hỏi, đặc biệt là hỏi sao cho đỡ mất công hỏi nhiều lần
  • Rèn kỹ năng mềm : để kiềm chế với các thượng đế đòi hỏi trên trời

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

Xem thêm:

Tìm việc làm IT mới nhất trên TopDev

Java Developer là gì? Lộ trình để trở thành Java Developer

Java Developer la gi

Theo số liệu từ trang LinkedIn – trang mạng xã hội cho doanh nghiệp và thị trường việc làm lớn nhất thế giới, số lượng tin tuyển dụng Java đang đứng thứ 2 chỉ sau tin tuyển dụng Python trên hai thị trường Mỹ và Châu Âu.

ngon ngu lap trinh 2022

Nguồn:techrepublic.com

Vậy Java Developer là gì? Lộ trình để trở thành một Java Developer đáp ứng được nhu cầu của thị trường việc làm hiện nay? Bài viết này mình sẽ cùng các bạn tìm hiểu và trả lời cho hai câu hỏi trên nhé.

Java là gì?

Ngôn ngữ lập trình Java được ra đời từ những năm 1990 bởi các lập trình viên đến từ Sun. Nó được tạo ra với phương châm: “Viết code một lần, chạy ở mọi nơi”.

Để làm được điều này, đội ngũ phát triển đã tạo ra một máy ảo (Java Virtual Machine – JVM); nhiệm vụ của nó là biên dịch mã nguồn thành bytecode và chạy chương trình. Từ đó thì bạn có thể đem mã nguồn của mình và chạy trên bất cứ môi trường nào, từ Window, Linux, MacOS, … miễn là nó được cài JVM.

Java là gì

Nguồn:i.ytimg.com

Ưu điểm của Java:

  • Java được kế thừa trực tiếp từ C/C++, dễ tiếp cận và có thể học được nhanh chóng nếu đã có kiến thức về lập trình cơ bản
  • Hiệu suất đáp ứng cao nên được sử dụng cho rất nhiều hệ thống có quy mô lớn.
  • Có thể sử dụng Java để viết ứng dụng chạy trên nhiều nền tảng khác nhau từ PC, Web đến Mobile và các hệ thống nhúng

>>> Xem thêm: Java là gì? Tổng quan về ngôn ngữ lập trình java

Java Developer là gì?

Chắc hẳn bạn đã tự hình dung được khái niệm Java Developer là gì rồi. Cũng như các ngôn ngữ khác, lập trình viên Java là những người sử dụng ngôn ngữ lập trình để tạo ra các ứng dụng, phần mềm hay các trang web.

Đặc thù Java Developer

Ngoài những yếu tố chung, kỹ năng mà bất cứ một lập trình viên nào cũng phải có là khả năng học hỏi, tìm tòi, kỹ năng làm việc teamwork, … Java Developer có những đặc thù khác như sau:

  • Java có thể viết được ở cả Frontend và Backend, vì thế nên Java Developer có thể trở thành một Fullstack Developer. Mặc dù vậy thì thực tế trong các dự án, Java thường được chọn để chuyên xử lý dữ liệu cho phía BE nhiều hơn.
  • Java là một ngôn ngữ lập trình hướng đối tượng – 1 khái niệm mà bạn chắc chắn phải biết khi học Java và lập trình hướng đối tượng OOP. Trong các khóa học về OOP, Java gần như là ngôn ngữ mặc định được sử dụng để học và thực hành. Ngoài ra khi viết Java, các bạn cũng sẽ được giới thiệu về các pattern quen thuộc nhất như MVC, MVP.
  • Các framework nổi bật của Java: nổi bật nhất là hệ sinh thái Spring (Spring còn có framework dành cho việc phát triển cloud service là Spring Cloud), ngoài ra còn có các framework như Hibernate, Struts dành cho phát triển Web. Trên desktop thì chúng ta có Java Swing hay Java SWT. Với mobile, Java là ngôn ngữ chính để phát triển các ứng dụng Android của Google.

Java tuyển dụng lương cao, đãi ngộ tốt

Định hướng phát triển dành cho Java Developer

Nhờ sự đa dạng về khả năng phát triển, hệ sinh thái hỗ trợ nên Java Developer có thể là được rất nhiều thứ , có thể thoải mái lựa chọn định hướng cho mình:

  • Phát triển ứng dụng độc lập: các ứng dụng chạy trên nền desktop dành cho các cơ quan, tổ chức, ví dụ như phần mềm quản lý nhân sự nội bộ, chấm công, …
  • Phát triển web: như đã đề cập ở trên, Java có thể viết được cả FE và BE cho các ứng dụng web, vì thế nên bạn có thể tự tin hoàn thiện các website từ đơn giản đến phức tạp bằng Java.
  • Ứng dụng doanh nghiệp: là những ứng dụng lớn đòi hỏi yêu cầu về lượng truy cập, hiệu năng và tính ổn định, tính bảo mật cao. Java với sự tối ưu của mình giúp nó được lựa chọn để xây dựng các Enterprise Application chuyên dụng.
  • Làm mobile app: Ngoài Android, Java ME cũng là 1 lựa chọn để phát triển các ứng dụng mobile và thiết bị nhúng sử dung Java. Với các thiết bị hạn chế về khả năng xử lý, giới hạn nguồn điện thì Java ME là một lựa chọn tốt để lập trình các ứng dụng.
  • Automation Testing: Đừng bất ngờ vì điều này, nếu không quá bắt bẻ thì kiểm thử tự động cũng được xem như là 1 lập trình viên để tạo ra các phần ứng dụng kiểm tra. Nếu bạn là 1 lập trình viên mà lại yêu thích việc kiểm thử, Java sẽ giúp bạn với công cụ Selenium. Trở thành 1 Automation Tester là 1 định hướng hoàn toàn khả thi cho bạn. 

Java Developer là gì

Nguồn: profoundedutech.com

Đừng bỏ lỡ việc làm fresher Java mới nhất tại đây!

Lộ trình để trở thành Java Developer

Để trở thành lập trình viên Java, trước tiên bạn hãy xác định định hướng cụ thể cho mình. Trong phần này mình sẽ chỉ đề cập đến lộ trình để trở thành 1 Backend Java Developer với framework phổ biến nhất hiện nay là Spring/ Spring Boot.

Hãy học tốt những kiến thức cơ bản dưới đây

  • Cú pháp ngôn ngữ lập trình Java
  • Khai báo biến, các kiểu dữ liệu
  • Các khối câu lệnh điều kiện, vòng lặp: if else, switch case, for, while, …
  • Cấu trúc dữ liệu trong Java
  • Tìm hiểu về OOP: các khái niệm, đặc trưng, class, interface, …
  • Các gói (packages) trong Java: Java Util, Java Datetime, Java SQL, …
  • Cách làm việc với File, giao tiếp thông qua API
  • Xử lý các ngoại lệ: runtime error như ClassNotFoundException, IOException, SQLException, RemoteException

Đi sâu hơn vào các đặc trưng của Java

  • Tìm hiểu về JVM, cách nó hoạt động
  • Garbage Collection hay Memory Management: cách quản lý bộ nhớ, tạo và giải phóng bộ nhớ lưu trữ các biến trong Java
  • Serialization: cách chuyển đổi trạng thái object trong Java về các dạng data có thể lưu trữ và truyền tải
  • Networking, Socket: cơ chế mạng trong Java, cách kết nối hay thiết lập mạng giữa các thiết bị
  • Thread (luồng), multi thread (đa luồng) trong Java
  • Stream: một bổ sung từ Java 8 cho việc tăng tốc độ xử lý dữ liệu lớn

Sau khi tìm hiểu đến những khái niệm trên thì bạn có thể tự tin với những kiến thức về Java của mình. Cùng đi sâu vào framework để học và thực hành trên những dự án thực tế

Làm việc với Spring/ Spring Boot

  • Hãy tìm hiểu Spring – một framework cho việc phát triển ứng dụng Web của Java
  • Spring Boot: giúp cho việc đơn giản hóa các bước cấu hình trong Spring

Để làm Web (nhất là BE), chúng ta cũng không thể thiếu những kiến thức dưới đây:

  • Cách viết API, REST APIs trong Spring: từ CRUD đơn giản đến các microservices
  • Tương tác Database: kết nối, truy vấn, đồng bộ. Bạn nên tìm hiểu cả SQL và no SQL vì đơn giản là Java Spring được sử dụng cho cả 2 loại này nhờ khả năng xử lý dữ liệu của nó
  • Java logging framework: SLF4FJ, TinyLog giúp bạn lưu lại các trạng thái, các lỗi hay nhật ký của hệ thống mà bất cứ BE nào cũng cần.
  • Testing: viết test được cho ứng dụng của bạn cũng sẽ giúp bạn trở lên chuyên nghiệp hơn và có khả năng học hỏi nhiều hơn.

lộ trình java Developer

Nguồn: blogspot.com

 Đến đây thì bạn có thể trở thành một keymember trong dự án Java của mình rồi. Sẽ còn nhiều thứ phải học hỏi và tìm hiểu, nhất là về kiến trúc Web và các cấu hình thiết kế để xây dựng hệ thống chuyên nghiệp sử dụng Java nói chung và Spring nói riêng.

Lời kết

Nhu cầu tuyển dụng lập trình viên Java hiện nay rõ ràng là đang rất lớn, chính vì thế việc trở thành lựa chọn Java làm ngôn ngữ cho việc lập trình là một lựa chọn hợp lý cho hiện tại và nhiều năm nữa trong tương lai.

Bài viết này hy vọng đã đem đến cho các bạn một cái nhìn chi tiết về Java Developer là gì, cũng như lộ trình rõ ràng để trở thành một Java Developer trong tương lai. Cảm ơn các bạn đã đọc và ủng hộ, 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:

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

Kinh nghiệm tự xây dựng business website

Kinh nghiệm để tự xây dựng business website

Bài viết này xin dành trọn cho anh em nào có đủ kỹ năng và kinh nghiệm, với mong muốn tự xây dựng business website cho riêng mình.

Nội dung bài viết được đúc rút và là ý kiến cá nhân của tác giả, mọi góp ý luôn được trân trọng và lắng nghe nhé.

À mà xây dựng business cấp độ cá nhân không có nghĩa là một mình anh em xử hết từ Frontend tới Backend hay tới SEO nhé. Vẫn có đồng đội hoặc nguyên team support anh em, tuy nhiên ý chính là anh em là người đóng vai trò hơn cả Product Owner.

Ví dụ như business anh em cần 3 Backend Developer, 4 Frontend Developer thì bản thân anh em kiêm luôn cả PO, BA, QC và 1 dev BE nếu anh em chuyên backend.

xây dựng business website

1. Chốt được scope, đóng vai trò PO

Rõ ràng, để tự xây dựng website business hay bất cứ loại hình business nào khác, anh em cần xác định được scope. Scope ở đây bao hàm rất rộng, nhưng cũng có thể tóm gọm lại với MVP (Minimum Viable Product).

Ví dụ, nếu anh em quyết định start business như Mioto, MVP sẽ bao gồm các ý chính sau:

  • Tài xế xe ô tô có thể đăng ký xe của mình cho thuê
  • Người dùng có thể tìm kiếm và đặt được xe qua app
  • Người dùng có thể thanh toán qua nền tảng, app cũng có thể trả tiền cho chủ xe

Ba ý trên là MVP của app, kinh nghiệm cho thấy những business cá nhân đôi khi bị lạc trôi khá xa.

xây dựng business website

Chính vì vậy lời khuyên tới anh em là nên xác định và giới hạn chính xác MVP và feature business của mình. Một số ý tưởng cần gấp rút về mặt thời gian, một số ý tưởng lại bị ràng buộc về ngân sách

Viết về Mioto vì tuần rồi mới đặt xe đi du hí Vũng Tàu, tiện thấy mô hình kinh doanh này khá hay, biết đâu list ra đây anh em lại có idea phát triển business khác của riêng mình.

Cho anh em nào chưa biết về MVP thì định nghĩa của nó đây.

A minimum viable product is a version of a product with just enough features to be usable by early customers who can then provide feedback for future product development.

MVP là phiên bản của sản phẩm chỉ có đủ các tính năng để những khách hàng ban đầu có thể sử dụng, sau đó họ có thể cung cấp phản hồi để phát triển sản phẩm trong tương lai.

2. Tự quyết định được technical

Ý này tui viết trong trường hợp anh em là technical guys và có cả business idea nhé. Trường hợp một số anh em khác có ý tưởng về business nhưng chưa rõ về công nghệ có thể nhờ tư vấn từ một bên thứ 3 hoặc bạn bè nhé.

Technical stack ở đây là yếu tố quyết định, kiểu dám chơi dám chịu. Nếu ý tưởng là app mobile, thì làm native với Objective C hay Swift, hay đi theo Flutter. Những quyết định technical này cần được cân nhắc dựa trên 3 yếu tố:

  • Tech Stack đó đã đáp ứng được yêu cầu về business chưa (business requirement)
  • Tech Stack có familiar với anh em trong đội không?
  • Tech Stack có thể tăng tốc quá trình phát triển được không?

Một khi đã quyết định được TechStack, anh em có thể transfer và tiến hành phát triển. Việc lựa chọn tech stack càng tốt, business của anh em có cơ hội thành công càng cao.

xây dựng business website

Việc tự xây dựng business website ngoài ý tưởng ra, tech stack để hiện thực được nó là điều quan trọng thứ 2 nhé anh em.

3. Khả năng truyền đạt

Trường hợp start business cá nhân với ngân sách hạn hẹp, không thể tránh khỏi việc anh em vừa là Technical Leader, vừa kiêm luôn PO.

Việc giải thích cho anh em hiểu được business chính, nhóm tính năng chính, yêu cầu của tính năng là điều bắt buộc. Nếu bản thân các lập trình viên không hiểu họ đang làm gì -> product hoặc business đó chắc chắn fail.

Chính vì vậy, khả năng truyền đạt, giải thích chính xác về model của business cho các thành viên khác hiểu là vô cùng quan trọng.

xây dựng business website

Xác định anh em mà không hiểu thì product còn không có chứ đừng nói với business có thành công không nha.

4. Bao quát tất cả vấn đề

Một khi đã bắt đầu và xác định sẽ tự xây dựng business riêng, ngoài kiến thức chung về technical, anh em sẽ cần phải học hỏi thêm rất nhiều. Một số câu hỏi khi xây dựng business website:

  • Về luật pháp đã được công nhận chưa?
  • Marketing sản phẩm như thế nào?
  • SEO đã tốt chưa?

Cơ bản mà nói thì lúc này bản thân không còn chỉ handle mỗi một công việc là technical nữa, anh em vừa là Product Owner, vừa là Business Analysts.

Đôi khi còn kiêm của Product Management (giám sát tiến độ), test luôn cả tính năng đã phát triển xem đã đáp ứng được business chưa, có bug gì không?. Đơn giản mà nói thì tự xây dựng business website có thể biến anh em trở thành siêu anh hùng. =))

Business hoàn thành chứ thành công hay không thì còn nhiều yếu tố thiên thời địa lợi nhân hoà nữa nha.

5. Dấn thân ngoài technical

Rõ ràng luôn, xây dựng business website không chỉ bao gồm việc code. Có cả trăm ngàn công việc trong đó không tên, không tuổi. Đôi khi chả liên quan quỷ tha ma bắt gì tới technical

Nhưng muốn thành thì phải làm cho được. Đơn cử có một vài công việc như mình đã trải qua như sau:

  • Xử Google Rich Result test tối ưu cho SEO
  • Đăng ký với bộ công thương để website legal
  • Đăng ký doanh nghiệp Facebook

Và trăm ngàn công việc không tên khác không tên, đảm bảo anh em sẽ học được rất rất chi là nhiều thứ xung quanh. Đơn giản là kinh doanh nó không đơn giản chỉ là website phát triển xong.

Có website mà không có các yếu tố khác, thì website cũng chỉ là một tên miền trơ trọi lạnh lẽo mà thôi.

6. Được và mất khi xây dựng business website

Đúc rút kinh nghiệm bản thân thì thấy học được rất rất nhiều anh em ạ. Control và hiểu tất cả mọi thứ, liệt kê được những thứ cần để xây dựng business website. Thành công không thì chưa biết nhưng học được cực kì nhiều.

Technical, of course, dĩ nhiên là học được. Non technical, kỹ năng mềm, kỹ năng quản lý, những kỹ năng tuyệt vời cho bản thân.

Thế còn mất?. Mất thời gian, tốn thời gian vãi. Đó là cái mất duy nhất.

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

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

Xem thêm:

Top IT job hot có trên TopDev, tìm việc ngay!

Năm 2024 rồi, tình hình ngôn ngữ Python như thế nào?

ngôn ngữ Python

Trong bối cảnh hiện tại của giới lập trình, có thể khẳng định chắc nịch rằng ngôn ngữ Python vẫn đang sống khoẻ và sống êm. Python cũng là ngôn ngữ được dự đoán có tuổi thọ dài và sự bền bỉ liên tục trong bối cảnh Web3 ra đời, ngôn ngữ lập trình trở nên cực kì thông dụng.

Tại sao lại như vậy?

Chắc hẳn anh em cũng biết, một ngôn ngữ lập trình sinh ra, bản thân nó cũng có một vòng đời nhất định. Xưa cổ như ngôn ngữ Cobol những năm 1960 tới tận bây giờ cũng không phải là đã chết, rất nhiều hệ thống tài chính, ngân hàng vẫn đang sử dụng Cobol.

Tuy nhiên, tình thế cạnh tranh của các ngôn ngữ lập trình hiện nay rất khác. Bản thân ngôn ngữ lập tình tốt là chưa đủ, bản thân ngôn ngữ đó cần phải có cộng đồng mạnh, có library được xây dựng tốt và sử dụng dễ dàng.

Chính vì lý do đó, Python, ngôn ngữ được mệnh danh là “tốt nhất dành cho người mới học lập trình” năm 2023 tình hình đang như thế nào?

Thông tin sẽ được cung cấp cho anh em. Vui vẻ tý trước khi bắt đầu!

ngôn ngữ python năm 2022Khách hàng hỏi: Ai cài Python lên server á mấy cha?

1. Python là gì?

Làm gì làm đôi khi nhiều anh em vừa mới chân ướt chân ráo bước vào tìm hiểu ngôn ngữ lập trình. Nên dù gì đi chăng nữa vẫn phải điểm xuyết lại khái niệm ngôn ngữ.

Mà đã làm Python 2,3 năm đọc cũng không sao. Mỗi lần đọc, một lần nhớ. Gét gô

Python is an interpreted, object-oriented, high-level programming language with dynamic semantics. Its high-level built in data structures, combined with dynamic typing and dynamic binding, make it very attractive for Rapid Application Development

Python là một ngôn ngữ lập trình thông dịch, hướng đối tượng, cấp cao với ngữ nghĩa động. Cấu trúc dữ liệu tích hợp sẵn ở cấp độ cao, kết hợp với tính năng nhập động và liên kết động, làm cho nó trở nên rất là ngon khi muốn phát triển ứng dụng mau lẹ.

Rồi, ngôn ngữ lập trình cấp cao, anh em chắc nhớ hết rồi. Mà tui vẫn phải nhắc, cú pháp nó đơn giản lắm nha.

  Các lệnh: break, continue, pass trong Python

2. Cái sự cuồng Python

Bắt đầu bằng một câu chuyện nha, hồi kia ông Steve Huffman có phát biểu một câu ngắn gọn như này. Cho ông nào chưa biết thì ông này là CEO và Co-founder của reddit nha. Đẹp trai, mlem lắm.

Steve HuffmanSteve Huffman – CEO, founder của Reddit

Mà reddit thì anh em biết rồi đấy, nó là trang trang web tổng hợp tin tức xã hội, xếp hạng nội dung và thảo luận của Mỹ. Người dùng đã đăng ký gửi nội dung đến trang web như liên kết, bài đăng văn bản, hình ảnh hoặc video gì đó đều được. Ổng phán

I don’t think we’ve yet hired an employee who knew Python,

Tôi không nghĩ rằng chúng tôi vẫn chưa thuê một nhân viên biết Python

Đại ý là trong Reddit ổng thuê nhiều developer Python lắm rồi. Ông này có lẽ cuồng python, bởi ổng còn nói

‘Everything you write needs to be in Python.’ Just so I can read it. And it’s awesome because I can see from across the room, looking at their screen, whether their code is good or bad. Because good Python code has a very obvious structure

Tất cả anh em cứ viết code bằng Python. Cứ viết để tao còn đọc được. Thật là tuyệt vời vì tao có thể thấy trên màn hình của anh em những dòng code Python, bất kể code ngon hay dở, tốt hay xấu. Bởi vì code Python có một cấu trúc rất chi là rõ ràng.

Tới đây thì không nghi ngờ gì nữa là ổng cuồng Python, mà cũng không phải nói chơi. Reddit lúc đầu viết bằng Lisp, nhưng đổi qua Python chỉ sau 6 tháng. Reddit cũng là một trong những công ty lớn chấp nhận Python, ngôn ngữ vô cùng phổ biến.

Năm 2021, Python xếp hạng đầu tiên trong số các ngôn ngữ “được mong muốn nhất” của Stack Overflow – kiểu most wanted, anh em khao khát nhất. Đây cũng là ngôn ngữ lập trình phổ biến thứ ba. Kể từ tháng 5 năm 2022 vừa rồi đây, thì nó leo lên hẳn top 1 cho chắc cú.

  Top 10 thư viện Python tốt nhất cho Data Scientist nửa đầu năm 2024

3. Những ai đang sử dụng Python

Nhờ độ phổ biến luôn lọt top 3, ngôn ngữ Python hiện tại được sử dụng tại cho rất nhiều đối tượng. Danh sách sơ bộ có thể liệt kê tại đây

  • Những gã khổng lồ công nghệ
  • Công ty khởi nghiệp
  • Cơ quan chính phủ
  • Công ty tài chính và nhiều tổ chức khác trên nhiều lĩnh vực

Này mới là phân loại tổ chức thôi nha, còn anh em lập trình cần liệt kê ra tên các ông lớn sử dụng Python thì đây:

  • Amazon
  • Dropbox
  • Facebook
  • Google
  • IBM
  • Industrial Light and Magic
  • Instagram
  • JP Morgan Chase
  • Lyft
  • NASA
  • Netflix
  • PayPal
  • Pinterest
  • Pixar
  • Quora
  • Shopify
  • Spotify
  • Stripe
  • Uber

ngôn ngữ Python Mới đây ông lớn Amazon cũng khuyến khích anh em sử dụng Python

Danh sách này cũng là danh sách tiêu biểu thôi nha, còn rất rất nhiều các loại hình doanh nghiệp khác sử dụng Python.

Tuyển dụng python Hồ Chí Minh lương cao trên TopDev

4. Python được dùng để làm gì?

Để mà liệt kê được hết công dụng một ngôn ngữ lập trình thì khá là khó. Vì bản thân ngôn ngữ lập trình, ví dụ như Python, cũng chỉ được xem như là công cụ.

Tức là tuỳ vào nhu cầu mà sử dụng cho linh hoát. Tuy nhiên, tuy nhiên nha. Python được biết tới với một số công dụng chủ yếu sau đây:

  • Lập trình web với Django và Flask (phát triển web nhanh)
  • Khoa học dữ liệu (data science)
  • Machine learning (học máy)

Nhắc tới Python mà không nhắc tới khoa học dữ liệu thì quả thật là thiếu sót to lớn. Các chuyên gia trong lĩnh vực này tận dụng khả năng của ngôn ngữ để hỗ trợ các tính toán phức tạp và khai thác, xử lý và xây dựng hình ảnh trực quan.

Rõ ràng hơn mà nói thì cú pháp Python cực kỳ đơn giản, lại hỗ trợ thêm toán học nữa (math), dẫn tới các nhà khoa học nghiên cứu dữ liệu khoái Python vô cùng.

ngôn ngữ PythonHầu hết machine learning book hay course hiện nay đều sử dụng ngôn ngữ Python

Dạo gần đây, khi Machine Learning phát triển, một lĩnh vực con của trí tuệ nhân tạo, thu hút được sức hút, Python thực tế là ngôn ngữ lập trình phổ biến nhất sử dụng cho các chuyên gia, kỹ sư nghiên cứu về Học máy.

Tham khảo việc làm python Hà Nội mới nhất

5. Có gì mới ở Python 3.10?

Bản cập nhật mới gần đây của Python là bản 3.10. Bản này được release vào ngày 4 tháng 10 năm 2021. Ở bản cập nhật này, ngôn ngữ Python có một số thay đổi đáng lưu ý

  • Syntax features – cú pháp
  • Library features – bổ sung cho thư viện
  • Interpreter improvements – cải tiến trình thông dịch
  • Iyping features
  • Some additional removals and restrictions – loại bỏ một số hạn chế

Bản cập nhật mới nhất lại là bản Python 3.10.4, bản này cũng là bản phát hành ổn định hiện tại, fix lỗi và bổ sung 4 lần từ bản Python 3.10, release ngày 24 tháng 3 năm 2022.

  • Line numbers for debugging and other tools – Bổ sung số dòng debug và một số tools khác
  • Explicit type aliases – kiểu alias rõ ràng
  • Parameter specification variables – biến đặc tả tham số

Liệt kê ra đây để anh em biết Python vẫn đang được cập nhật và sửa lỗi liên tục, những tính năng mới, những hỗ trợ tuyệt vời từ ngôn ngữ Python là yếu tố sống còn giúp Python vẫn giữ vững danh hiệu là ngôn ngữ lập trình phổ biến nhất

6. Tương lai ngôn ngữ lập trình Python

Hiện tại, cam kết là anh em đi dạo zòng zòng đâu đâu cũng gặp Python. Phổ biến quá đôi khi gây ra nhàm chán -> một số anh em developer thích hái hoa bắt bướm cho biết.

Nhưng đó là cho anh em đã có kinh nghiệm hái hoa bắt bướm thôi, chứ mà anh em mới bắt đầu học lập trình, Python vẫn luôn là lựa chọn tốt nhất.

Python đã và đang sống khoẻ trong vài chục năm, từ junior cho tới CTO, senior expert ở các công ty lớn vẫn đang tin tưởng lựa chọn Python là ngôn ngữ lập trình chính.

Trong giới Machine Learning, Data Science thì thôi khỏi bàn, trong vài chục năm nữa, khó mà tìm được ngôn ngữ nào thay thế python

ví dụ PythonLàm gì căng

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

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

Hàng loạt việc làm IT lương cao trên TopDev đang chờ bạn, ứng tuyển ngay!

Các cấp bậc: Fresher, Junior, Senior là gì?

Fresher Junior Senior là gì?

Fresher, Junior, Senior là gì? Chắc hẳn bạn không ít lần nghe mọi người nhắc đến những từ này nhỉ! Cụ thể, đây là những từ chỉ mức độ kinh nghiệm của người lao động trong nhiều ngành nghề. Những tên gọi này thay đổi tùy theo công ty và tùy theo công việc. Dưới đây, mình sẽ đưa ra một góc nhìn trong yêu cầu công việc và mức độ nhiệm vụ của những cấp bậc này.

Khái quát Fresher, Junior, Senior là gì

Khái niệm

Các cấp bậc như Fresher, Junior, Senior hay các vị trí cao hơn giúp phân loại và đánh giá năng lực, kinh nghiệm của nhân viên, đồng thời tạo ra hệ thống phân cấp công việc rõ ràng trong một tổ chức. Có 3 level cơ bản trong công việc phổ biến như sau:

  • Fresher là người mới bắt đầu đi làm, thường là sinh viên vừa tốt nghiệp và chưa có kinh nghiệm làm việc thực tế.
  • Junior là nhân viên đã tích lũy được một chút kinh nghiệm trong công việc (khoảng 1-2 năm), vẫn đang tiếp tục trau dồi
  • Senior là nhân viên giàu kinh nghiệm (thường từ 3-5 năm trở lên), có khả năng giải quyết các vấn đề phức tạp một cách độc lập và thường có nhiệm vụ training cho các cấp bậc thấp hơn.

Tại sao cần phân chia các cấp bậc Fresher, Junior, Senior

Phân chia cấp bậc công việc có mục đích quan trọng trong việc quản lý và phát triển nhân sự trong tổ chức. Dưới đây là những lý do chính cho việc phân chia cấp bậc:

Quản lý và phân bổ công việc hiệu quả

Phân chia cấp bậc giúp nhà quản lý dễ dàng xác định mức độ phức tạp của từng công việc và giao đúng người có năng lực phù hợp. Những nhiệm vụ khó và đòi hỏi nhiều kinh nghiệm có thể được giao cho nhân viên cấp cao như Senior, trong khi các nhiệm vụ cơ bản hơn có thể phù hợp với Junior hoặc Fresher.

Định hướng lộ trình phát triển nghề nghiệp

Cấp bậc công việc giúp nhân viên hiểu rõ vị trí hiện tại của họ và xác định các mục tiêu cần đạt được để tiến bộ trong sự nghiệp. Nhân viên có thể biết rõ họ cần học hỏi và cải thiện những kỹ năng gì để thăng tiến từ Fresher lên Junior, rồi đến Senior, và xa hơn nữa.

Tạo động lực và định mức lương hợp lý

Phân chia cấp bậc giúp công ty thiết lập các chính sách đãi ngộ phù hợp với từng cấp độ. Cấp bậc cao hơn thường đi kèm với mức lương, phúc lợi tốt hơn, từ đó tạo động lực để nhân viên phấn đấu nâng cao năng lực, kỹ năng của mình.

Xác định vai trò và trách nhiệm rõ ràng

Các cấp bậc giúp phân định rõ ràng trách nhiệm của từng nhân viên trong tổ chức. Senior thường chịu trách nhiệm về các quyết định kỹ thuật quan trọng và hướng dẫn nhóm, trong khi Junior và Fresher tập trung vào học hỏi và hoàn thành các nhiệm vụ được giao. Điều này giúp tránh xung đột và nhầm lẫn trong quá trình làm việc.

Hỗ trợ quá trình tuyển dụng và đào tạo

Phân chia cấp bậc công việc giúp công ty tuyển dụng đúng đối tượng cho từng vị trí và đưa ra kế hoạch đào tạo phù hợp. Một người được tuyển dụng ở cấp độ Junior sẽ cần được đào tạo khác với người ở cấp độ Senior, vì vậy quá trình đào tạo có thể được tùy chỉnh theo cấp bậc của nhân viên.

Tiêu chí đánh giá cấp bậc của một nhân sự

Dưới đây là giải thích chi tiết về các tiêu chí phân chia level công việc dựa trên các yếu tố quan trọng như kinh nghiệm, kỹ năng và khả năng lãnh đạo:

  • Kinh nghiệm làm việc là tiêu chí đánh giá dựa trên số năm hoặc thời gian một người đã tham gia vào công việc hoặc ngành nghề cụ thể. Nó phản ánh mức độ từng trải trong việc xử lý các tình huống thực tế, dự án, và mức độ thành thạo với quy trình làm việc.
  • Kỹ năng chuyên môn là khả năng áp dụng kiến thức, công cụ, và quy trình cụ thể trong công việc. Kỹ năng chuyên môn có thể bao gồm cả kỹ thuật (technical skills) và các kỹ năng mềm (soft skills). Ví dụ: Trong lập trình, kỹ năng chuyên môn bao gồm khả năng viết mã, làm việc với cơ sở dữ liệu, xử lý vấn đề kỹ thuật, và sử dụng các công cụ phát triển phần mềm.
  • Hiệu suất công việc đo lường khả năng hoàn thành các nhiệm vụ được giao đúng thời hạn và chất lượng yêu cầu. Nhân viên có hiệu suất cao thường tự quản lý tốt thời gian, có khả năng ưu tiên công việc, và duy trì chất lượng đầu ra ổn định.
  • Khả năng hướng dẫn và đào tạo phản ánh khả năng của một nhân viên trong việc chia sẻ kiến thức và kinh nghiệm với các đồng nghiệp khác, đặc biệt là với những người có ít kinh nghiệm hơn. Đây là tiêu chí quan trọng ở các cấp bậc cao như Senior hoặc Lead, khi những người này đóng vai trò hỗ trợ và phát triển năng lực của các thành viên trong nhóm.
  • Năng lực lãnh đạo đánh giá khả năng dẫn dắt một nhóm hoặc dự án. Người có năng lực lãnh đạo không chỉ giỏi về chuyên môn mà còn biết cách quản lý con người, truyền cảm hứng và điều phối công việc để đạt được mục tiêu chung.

Fresher là gì?

Fresher chỉ những bạn đã có kiến thức chuyên môn nhưng chưa có kinh nghiệm thực chiến. Hoặc các bạn đã tham gia vào dự án thực tế, tuy nhiên đều được giám sát và giúp đỡ bởi những người có kinh nghiệm. Thường Fresher có kinh nghiệm làm việc dưới 6 tháng.

Giai đoạn Fresher là thời gian để họ học hỏi, làm quen với môi trường làm việc và tích lũy kinh nghiệm thực tế.

Yêu cầu chính cho vị trí Fresher

  • Kiến thức lý thuyết tốt: Có nền tảng vững chắc về lý thuyết trong lĩnh vực họ theo đuổi (ví dụ: lập trình, hệ thống thông tin…).
  • Tinh thần học hỏi: Sẵn sàng tiếp thu kiến thức mới, cải thiện kỹ năng thông qua việc học từ đồng nghiệp và dự án thực tế.
  • Kỹ năng mềm cơ bản: Biết cách giao tiếp, làm việc nhóm và tuân thủ quy trình công việc.
  • Sự chủ động: Dù còn thiếu kinh nghiệm, Fresher cần thể hiện sự chủ động trong công việc và không ngần ngại tìm hiểu để hoàn thành nhiệm vụ được giao.
  • Khả năng thích ứng: Fresher cần sẵn sàng học hỏi và làm quen với môi trường làm việc chuyên nghiệp, cũng như các công cụ, công nghệ mới.

Phân công công việc

Fresher thường được giao các nhiệm vụ đơn giản, lặp đi lặp lại và không đòi hỏi sự hiểu biết sâu sắc hoặc khả năng giải quyết các vấn đề phức tạp. Các công việc điển hình bao gồm:

  • Tham gia hỗ trợ các dự án nhỏ hoặc những phần công việc không quá phức tạp.
  • Thực hiện các nhiệm vụ cơ bản, chẳng hạn như kiểm tra, chỉnh sửa mã (bug fixing), hoặc các công việc hỗ trợ như tạo tài liệu.
  • Làm quen với các công cụ, quy trình nội bộ, và hệ thống làm việc của công ty.

fresher junior senior là gì

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

Junior là gì?

Junior là level thường có ít hơn 2 năm kinh nghiệm làm việc, đã có một số kiến thức cơ bản về công việc. Junior lúc này đã có khả năng thực hiện các nhiệm vụ đơn giản một cách độc lập nhưng vẫn cần sự hướng dẫn từ các Senior hoặc quản lý khi gặp các tình huống phức tạp.

Ví dụ trong lập trình, mối quan tâm của các bạn Junior Developer xoay quanh việc làm sao để code chạy được.

Yêu cầu chính cho vị trí Junior

  • Kiến thức cơ bản về chuyên môn, công cụ và công nghệ sử dụng trong công việc.
  • Hiểu biết về quy trình phát triển và làm việc theo nhóm.
  • Khả năng hoàn thành các nhiệm vụ cơ bản và học hỏi thêm từ các nhiệm vụ phức tạp.
  • Tinh thần học hỏi và phát triển bản thân để nâng cao kỹ năng.

Mức độ thực hiện nhiệm vụ

Nhân viên Junior có thể tự hoàn thành các công việc cơ bản nhưng vẫn cần sự hỗ trợ từ các cấp trên đối với các vấn đề phức tạp. Họ có thể làm việc độc lập trong các nhiệm vụ được giao nhưng thường không chịu trách nhiệm cho các phần quan trọng trong dự án:

  • Tự mình giải quyết các vấn đề đơn giản.
  • Có khả năng làm việc độc lập nhưng cần sự giám sát định kỳ.
  • Hỗ trợ Senior trong việc thực hiện các dự án lớn hoặc phức tạp hơn.
  • Thường được giao các nhiệm vụ giúp họ phát triển thêm kỹ năng và kinh nghiệm.

Middle là gì?

Middle là cấp độ trung bình, nằm giữa Junior và Senior. Nhân viên Middle có kinh nghiệm làm việc từ 2-4 năm, đã tích lũy được kỹ năng chuyên môn đáng kể và có khả năng làm việc độc lập với nhiều nhiệm vụ hơn. Họ có thể xử lý các dự án từ đơn giản đến phức tạp mà không cần nhiều sự giám sát.

Tất nhiên, các task được giao cho Middle không đòi hỏi quá nhiều kiến thức kỹ thuật chuyên sâu, mặc dù đã làm việc độc lập tuy nhiên cũng cần cố vấn của leader.

Yêu cầu chính cho vị trí Middle

  • Kinh nghiệm làm việc từ 2-4 năm.
  • Khả năng tự quản lý thời gian và tiến độ công việc.
  • Kỹ năng giải quyết vấn đề và phân tích tốt hơn.
  • Có thể hướng dẫn Junior hoặc hỗ trợ họ khi cần.
  • Có khả năng tham gia hoặc quản lý các dự án nhỏ mà không cần sự giám sát chặt chẽ.

Mức độ thực hiện nhiệm vụ

Nhân viên Middle có thể thực hiện các nhiệm vụ phức tạp hơn mà không cần giám sát nhiều. Họ thường tham gia vào các dự án tầm trung và có thể quản lý một số phần quan trọng của dự án như:

  • Có thể tự đưa ra quyết định cho các vấn đề ở mức độ trung bình.
  • Đảm nhận nhiều trách nhiệm hơn và quản lý các phần dự án quan trọng.
  • Hỗ trợ và hướng dẫn Junior, đồng thời có thể tư vấn cho Senior trong một số trường hợp.
  • Có khả năng làm việc nhóm hiệu quả và chịu trách nhiệm trực tiếp cho các phần công việc lớn hơn.

Senior là ai?

Chắc hẳn bạn nghĩ rằng trên Middle sẽ là Senior nhưng không hẳn như vậy. Có thể nói, khoảng cách giữa Midde và Senior khá lớn, bạn sẽ phải cố gắng tự phát triển rất nhiều khía cạnh mới có thể trở thành Senior hoặc bạn chỉ có thể mãi mãi dừng lại ở cấp độ Middle.

Xem xét dựa trên sự nỗ lực 110% của các bạn lập trình viên với mong muốn trở thành Senior thì Senior Developer nhìn chung có kinh nghiệm làm việc từ 5 đến 8 năm. Là một Senior bạn hẳn đã phải “kinh” qua rất nhiều lĩnh vực, mắc rất nhiều lỗi, từ đó mới đưa ra được kết luận đúng đắn về quá trình tổng thể.

Senior là cấp độ cao nhất trong các vị trí chuyên môn, với kinh nghiệm làm việc từ 5 năm trở lên. Senior không chỉ có khả năng hoàn thành công việc độc lập mà còn đảm nhận vai trò hướng dẫn, đào tạo, và quản lý các dự án phức tạp. Họ thường chịu trách nhiệm về các quyết định quan trọng trong dự án và có thể lãnh đạo nhóm.

senior là gì

Một Senior trong lĩnh vực phần mềm có thể làm phần lớn các công việc như:

  • Làm việc với khách hàng để đưa ra nhu cầu, phân tích nghiệp vụ,  xây dựng quy trình làm việc và truyền đạt cho team cũng thực hiện.
  • Senior có thể làm Automation test, DevOps, UI/UX design.
  • Xây dựng kiến trúc code, trực tiếp code, review code của cấp dưới và hạn chế lỗi code.

Yêu cầu chính cho vị trí Senior

  • Kỹ năng training, truyền đạt tốt
  • Kinh nghiệm làm việc từ 5 năm trở lên, nắm vững kiến thức chuyên môn sâu rộng.
  • Kinh nghiệm chuyên sâu giải quyết vấn đề và thực hiện task với độ phức tạp cao.
  • Có khả năng phân tích và xây dựng chiến lược cho các dự án lớn.

Mức độ thực hiện nhiệm vụ

  • Đưa ra giải pháp công nghệ cho những bài toán khó.
  • Quản lý con người, thời gian, đảm bảo dự án hoàn thành đúng tiến độ.
  • Traning và giao nhiệm vụ cho các thành viên trong nhóm (Fresher, Junior, Middle).
  • Tạo tài liệu kỹ thuật cho các chương trình phần mềm mới.

Tóm lại

Những định nghĩa về Fresher, Junior, Senior là gì mình đưa ra với góc nhìn về những yêu cầu chính và mức độ nhiệm vụ sẽ giúp bạn xác định được level của bản thân ở đâu, từ đó nổ lực phát triển lên những level cao hơn. Bên cạnh đó, việc xác định cấp độ của bản thân sẽ giúp bạn tìm việc và thỏa thuận mức lương một cách tự tin hơn. Chúc bạn thành công!

Bạn là Fresher, Junior hay Senior? Bạn đang tìm kiếm cơ hội việc làm? Tham khảo ngay việc làm IT mọi cấp độ trên TopDev!

Tối ưu ứng dụng React bằng Code-Spliting

Tối ưu ứng dụng React bằng Code-Spliting

React hiện nay là thư viện rất được ưa chuộng bởi các lập trình viên khi xây dựng những ứng dụng web dạng một trang (Single Page Application) nhờ việc dễ học, dễ viết và nhiều công cụ hỗ trợ. Tuy nhiên khi ứng dụng của bạn ngày càng trở nên lớn hơn thì các vấn đề cũng xuất hiện nhiều hơn, nhất là việc liên quan tới tối ưu hiệu năng cho ứng dụng. Trong bài viết này, mình sẽ cùng các bạn tìm hiểu về Code-Splitting – một kỹ thuật để giúp “giảm” dung lượng file bundle nhằm cải thiện thời gian load website và nâng cao hiệu năng ứng dụng của bạn.

Bundle JS Files là gì?

Trước tiên bạn cần hiểu khái niệm bundle file trong React là gì. Thông thường khi tạo ra một ứng dụng thì chúng ta sẽ viết source code của mình vào nhiều files khác nhau, trong đó có chứa nhiều các modules và thư viện bên thứ 3 (3rd-party libs). Khi tiến hành build ứng dụng của bạn, React sẽ thực hiện việc chuyển đổi rất nhiều file source code mà bạn viết trở thành 1 file lớn hơn để sử dụng nó đưa cho các trình duyệt web khi load ứng dụng. Những file đó được gọi là bundle.

Bundle JS Files là gì

Nguồn: telerik.com

Ban đầu ứng dụng  của bạn tạo ra những file bundle nhỏ, và việc trình duyệt load chúng lên không thành vấn đề; sau một thời gian phát triển, với việc import và sử dụng ngày càng nhiều các thư viện và module thì các files bundle của bạn cũng ngày càng nặng thêm. Nếu không thực hiện tối ưu, kích thước các file bundle có thể lên tới 40-50Mb là chuyện bình thường, điều đó cũng đồng nghĩa với việc ứng dụng của bạn trở nên nặng nề khi load, user sẽ cần chờ 1 khoảng thời gian khá lâu để có thể tương tác được với các phần tử trên màn hình.

Vậy cách giải quyết cho vấn đề này là gì?

Code-Splitting là gì?

Rõ ràng để load một ứng dụng hay một màn hình cụ thể, ứng dụng của bạn không cần phải “nạp” hết các module hay thư viện được import vào; vì thế để giải quyết cho vấn đề bundle file size lớn, chúng ta cần một kỹ thuật để tách nó ra thành 2 phần: phần cần thiết load để khởi động ứng dụng (hay màn hình) và phần có thể load nạp vào sau khi ứng dụng đã được chạy. Và khi cần cần thiết load để có thể khởi động ứng dụng càng nhỏ, thì thời gian tải ứng dụng của chúng ta càng nhanh hơn. React đã cung cấp cho chúng ta tính năng này và gọi nó là Code-Splitting.

Code-Splitting là gìNguồn: wiki.tino.org

Có 3 kỹ thuật xử lý trong Code-Splitting thường được sử dụng, chúng ta cùng lần lượt tìm hiểu và xem cách triển khai của chúng nhé.

Dynamic Import

Thông thường khi chúng ta cần import 1 module nào để sử dụng, câu lệnh import sẽ được thực hiện như dưới đây:

import { add } from './math';
 
console.log(add(16, 26));

Đoạn khai báo trên sẽ import module math một cách đồng bộ – tức là sẽ import vào luôn file bundle từ khởi tạo. Với Dynamic Import, chúng ta sẽ xử lý lại đoạn code trên để chỉ import khi ứng dụng cần gọi đến phương thức add của module math. Code sẽ được viết lại như sau:

import("./math").then(math => {
  console.log(math.add(16, 26));
});

Phương thức dynamic import giúp việc import module, file một cách bất đồng bộ bằng việc trả về 1 Promise. Nó hoạt động được cả ở server-side và client-side giúp bạn có thể sử dụng trong các trường hợp load file, assets hay những module, 3rd-party libs không cần thiết cho việc hiển thị ứng dụng, màn hình lần đầu tiên.

Sử dụng React.lazy và Suspense

Phương thức React.lazy giúp bạn tạo ra 1 component ở dạng lazy-loading, nghĩa là sẽ chỉ tạo ra component đó khi nó thực sự được gọi đến và cần hiển thị ra. Hãy xem ví dụ dưới đây:

import React, { useState } from 'react';
import ProjectIntro from './projectIntro';
import ProjectDetails from './projectDetails';
 
export default function App() {
  const [showDetails, setShowDetails] = useState(false);
 
  return (
      <>
        <h1>Project List</h1>
        <ProjectIntro />
        <button onClick={() => setShowDetails(true)}>Show Details</button>
        {showDetails ? <ProjectDetails /> : null }
      </>
  );
};

Ở đoạn code trên, component ProjectDetails mặc định sẽ không hiển thị, tuy nhiên nó vẫn sẽ được load vào trong bundle file vì đã được import ngay trên đầu. React.lazy giúp bạn dynamic import 1 component, kết hợp với Suspense bọc bên ngoài cho phép chúng ta thêm xử lý hiệu loading component đó mà không làm tăng đáng kể bundle file size. Source code cho việc triển khai React.lazy và Suspense như sau:

import React, { useState, Suspense } from 'react';
import ProjectIntro from './projectIntro';
 
const ProjectDetails = React.lazy(() => import("./projectDetails"));
 
export default function App() {
  const [showDetails, setShowDetails] = useState(false);
 
  return (
    <>
        <h1>Project List</h1>
        <ProjectIntro />
        <button onClick={() => setShowDetails(true)}>Show Details</button>
        <Suspense fallback={<div>Loading...</div>}>
          {showDetails ? <ProjectDetails /> : null }
        </Suspense>
    </>
  );
};

Có một lưu ý ở đây là React.lazy sẽ không thực hiện được khi render app ở server-side. Các bạn có thể tham khảo cách sử dụng 1 thư viện lazy load khác dành cho React như Loadable-components.

Tham khảo tin tuyển dụng lập trình viên React mới nhất tại đây!

Route-based code splitting 

Ở hai kỹ thuật trên, chúng ta đã tìm cách giảm kích thước bundle file bằng cách giảm những thành phần cần thiết để load ứng dụng trong 1 component. Với phạm vi một ứng dụng, chúng ta có chứa nhiều màn hình, tại mỗi thời điểm sử dụng thì người dùng sẽ chỉ tương tác với một hoặc một vài màn hình nhất định. Vì thế việc code splitting hoàn toàn cần thiết để thực hiện trên phạm vi ứng dụng.

Khi 1 ứng dụng React chạy, tương ứng với mỗi route sẽ có 1 component đảm nhiệm việc hiển thị và tương tác với người dùng, điều đó cũng có nghĩa các component khác không cần thiết phải được load lên ngay lúc đó. Chúng ta vẫn sẽ sử dụng lazy load cho trường hợp này, code thực hiện sẽ như sau:

import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from "./home";
 
const Profile = lazy(() => import('./profile'));
const ContactUs = lazy(() => import('./contact'));
 
const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/profile" element={<Profile />} />
        <Route path="/contact" element={<ContactUs />} />
      </Routes>
    </Suspense>
  </Router>
);

Ở đoạn code trên, 2 components Profile và ContactUs được xử lý lazy loading, chúng sẽ chỉ được load khi user đi đến route tương ứng. Điều đó giúp cho ứng dụng của bạn không cần phải chờ load hết tất cả các component trong Router, giảm kích thước bundle file ban đầu.

Lời kết

Như vậy chúng ta đã đi qua được các kỹ thuật Code-Splitting giúp tối ưu ứng dụng React thông qua việc giảm bundle file size. Trong thực tế các project React hiện nay, việc sử dụng lazy load là hết sức cần thiết khi có quá nhiều component, các module, thư viện được sử dụng trên cùng 1 màn hình. Hãy cố gắng tối ưu source code của bạn nhất có thể ngay từ ban đầu để tránh phải giải quyết các vấn đề về hiệu năng cho việc mở rộng sau này. Hy vọng bài viết cung cấp cho bạn kiến thức hữu ích cho các dự án React sắp tới, hẹn gặp lại mọi người trong các biết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Tìm việc làm IT mọi cấp độ mới nhất trên TopDev

Chân Dung Lập Trình Viên Gen Z – Lực Lượng Lao Động Tương Lai

Lap trinh vien GenZ
Chân dung lập trình viên GenZ

 

Theo số liệu trong “Báo Cáo Thị Trường IT Việt Nam 2022 – Tech Hiring 2022” do TopDev phát hành, hiện nay nhân sự ngành IT tại Việt Nam phần lớn là các lập trình viên trẻ thuộc thế hệ Millennials (Gen Y). Tuy nhiên, các nhà tuyển dụng cũng cần chuẩn bị cho Centennials (GenZ), theo sau Millennials. Thế hệ này được dự báo như một làn sóng mới có thể thay đổi thị trường nhân sự, chắc chắn ngành IT không phải là trường hợp miễn trừ vì nhu cầu về lập trình viên sẽ tiếp tục tăng mạnh trong vòng 5 năm tới. 

Hãy cùng TopDev khám phá chân dung của lập trình viên Gen Z tại Việt Nam ngay bên dưới đây nhé!

Chân dung Lập trình viên 2022

Tổng quan về Gen Z

Thế hệ Z (Gen Z hay Centennial) là tập hợp nhóm người thuộc thế hệ trẻ có năm sinh từ 1997 đến 2012. Các thành viên lớn tuổi nhất của thế hệ Z đang bắt đầu những năm đầu sự nghiệp (lớn nhất là 23 tuổi và trẻ nhất là 10 tuổi). 

Hiện tại, số lượng nhân sự trong ngành CNTT ở Việt Nam chiếm đa số với 53,97% ở độ tuổi 20 – 29 tuổi. Dự đoán đến năm 2025, thế hệ Z dự kiến sẽ chiếm 30% lực lượng lao động tại Việt Nam. Vì vậy trong tương lai gần (từ 5 đến 10 năm) sẽ là thời đại của Gen Z vào thị trường IT. 

Tuy nhiên, sự khác biệt trong các thế hệ làm cho việc tuyển dụng các nhân sự Gen Z trở nên khó khăn hơn bao giờ hết dù đây là thế hệ có đủ các yếu tố có thể tạo ra các bứt phá góp phần to lớn trong công cuộc đổi mới tương lai. Vì vậy, các nhà tuyển dụng cần phải nắm bắt, thấu hiểu về tính cách, sở thích cũng như hành vi của thế hệ này nhằm chuẩn bị các kế hoạch tổ chức quản lý nhân sự để đón làn sóng mới trong tương lai.

Đặc điểm của thế hệ Gen Z

Gen Z được xem là con người của thời đại số hoá, điều đó được thể hiện bởi cơ hội được tiếp xúc với Internet từ rất sớm nên việc học tập và tìm hiểu các công nghệ mới vượt trội hơn so với các thế hệ trước. Hãy cùng khám phá những đặc điểm nổi bật của Gen Z ngay bên dưới đây.

1. Digital Native

Có thể nói, thuật ngữ Digital Native (chỉ những người sinh ra trong một thế giới nơi công nghệ kỹ thuật số) là dành cho thế hệ Gen Z, khi mà thời điểm họ sinh ra Internet đã trở nên phổ biến. 

Là thế hệ đầu tiên được tiếp cận với công nghệ từ khi còn bé và có tư duy đổi mới, mong muốn góp phần thay đổi thế giới bởi sự thông thạo công nghệ và ý chí cạnh tranh khốc liệt. Gen Z đóng vai trò rất quan trọng, thiết yếu trong công cuộc thay đổi và xây dựng thế giới trong thời kỳ đổi mới.

2. Tech-Savvy 

Gen Z dành sự quan tâm rất cao đến những ứng dụng công nghệ hay các lĩnh vực liên quan. Có thể nói rằng việc dễ dàng làm quen với các công nghệ mới và sử dụng thành thạo các ứng dụng trên smartphone đã trở thành một trong những đặc điểm nổi bật của thế hệ này. 

Không chỉ vậy Gen Z còn có khả năng nắm bắt các xu hướng nhanh chóng với khả năng thích ứng cao đối với các nền tảng xã hội. Có thể nói, Facebook, Tiktok, Instagram,…trở nên quen thuộc và gần gũi khi họ rất cởi mở và dễ dàng tiếp nhận các thông tin cũng như tạo ra các nội dung có thể làm nên các xu hướng mới được thay đổi không ngừng chỉ trong thời gian ngắn. Vì thế mà đây cũng là lợi thế lớn đối với thế hệ Gen Z.

3. Value Human Connection (Mối liên kết giá trị giữa người với người)

Bình đẳng trong công việc là điều mà đa phần các Gen Z muốn hướng đến. Các ranh giới “cấp trên – cấp dưới” dường như được xóa nhòa khi thế hệ này mong muốn xây dựng các mối quan hệ trong công việc như một đồng nghiệp hơn là sự phân chia các thứ bậc. Vì họ tin rằng, sự kết nối của con người thật sự không có giới hạn.

Bên cạnh đó, Gen Z cũng đánh giá cao tính hiệu quả khi giao tiếp, các vấn đề sẽ được giải quyết khi trò chuyện trực tiếp hơn là thông qua các hình thức online như tin nhắn, email.

Phương pháp quản lý nguồn lực mới 

Rất nhiều câu hỏi được đặt ra cho các nhà tuyển dụng trong “bài toán” tìm kiếm phương pháp quản lý nguồn nhân lực mới, đặc biệt nguồn nhân lực này (Gen Z) đã bắt đầu những năm đi làm đầu tiên trong thời kỳ đại dịch toàn cầu. Báo cáo thị trường IT – Tech Hiring 2022 cũng đã đề cập đến vấn đề này cũng như đưa ra một số định hướng để các nhà tuyển dụng có thể triển khai kế hoạch quản lý nguồn nhân lực thế hệ mới này:

Áp dụng các phương pháp thu hút nhân tài thế hệ mới

  • Tái thiết kế công việc ở vị trí bắt đầu;
  • Làm mơi lại các quy trình tuyển dụng từ offline sang online đồng thời giúp họ thể hiện cá tính của mình;
  • Nhấn mạnh sự ổn định và cơ hội tăng trưởng;
  • Tập trung vào tính linh hoạt & độc lập của mỗi cá nhân.

“Giữ chân” nhân tài trong giai đoạn thiếu nguồn cung nhân lực IT khốc liệt 

  • Tôn trọng và đón nhận sự khác biệt của họ;
  • Điều chỉnh mục đích làm việc với sứ mệnh và giá trị của công ty;
  • Thể hiện sự quan tâm đến sự phát triển nghề nghiệp và cá nhân;
  • Tạo thế mạnh quản lý và lãnh đạo.

Xây dựng và phát triển trong một đội ngũ có đa thế hệ bền vững

  • Tận dụng khoảng cách thế hệ nhằm đảm bảo tính bền vững của doanh nghiệp, đồng thời truyền tải các kiến thức chuyên môn của các thế hệ trước để tạo “bệ phóng” giúp Gen Z trở thành nhà lãnh đạo trong tương lai;
  • Kết hợp tầm nhìn, sứ mệnh và giá trị của công ty với mục tiêu cá nhân;
  • Nuôi dưỡng tinh thần kinh doanh và luôn minh bạch, cởi mở và thẳng thắn.

Có thể nói, tương lai sẽ không ngừng thay đổi và các thế hệ mới sẽ không ngừng đi lên và phát triển, tạo nhiều xu hướng khác biệt so với trước đây. Hi vọng thông qua bài viết này, các nhà tuyển dụng phần nào hiểu được chân dung của lập trình viên Gen Z và từ đó chuẩn bị cho những thay đổi về mặt nhân sự trong tương lai.

Bên cạnh đó, Báo cáo thị trường IT – Tech hiring 2022 cũng khai thác về nhiều khía cạnh khác nhau của ngành Công nghệ thông tin trong năm 2022 như: mức lương, ngôn ngữ lập trình phổ biến,… mời bạn đón đọc trọn bộ báo cáo tại đây.

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Nguồn: TopDev

Xem thêm:

BÁO CÁO THỊ TRƯỜNG IT VIỆT NAM NĂM 2022: Từng bước thay đổi hướng đến sự phát triển kinh tế lấy nhân tài làm trung tâm

 

Type Query trong GraphQL với Spring Boot

Type Query trong GraphQL với Spring Boot

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết trước, mình đã giới thiệu với các bạn về GraphQL, những vấn đề mà GraphQL đã giải quyết được cho những hạn chế của RESTful Web Service. Mình cũng đã hướng dẫn  sơ qua cho các bạn về cách hiện thực type Query của GraphQL với Spring Boot. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết hơn về cách hiện thực type Query này sử dụng Spring Boot các bạn nhé!

Đầu tiên, mình sẽ tạo một Spring Boot project với Web và GraphQL Starter để làm ví dụ:

Kết quả:

Như mình đã nói trong bài viết trước, để làm việc với GraphQL, chúng ta cần định nghĩa các tập tin schema .graphqls. Mặc định thì Spring Boot sẽ scan tất cả các thư mục trong classpath src/main/resources của project để đọc các tập tin schema này.

Mình sẽ tạo một thư mục tên là graphql trong thư mục src/main/resources và để các tập tin schema của GraphQL trong thư mục này.

Để làm ví dụ mình đã tạo mới tập tin schema.graphqls với nội dung ban đầu đơn giản như sau:

type Query {
  hello: String
}

Query này sẽ return dòng chữ “Hello World” khi chúng ta query tới!

Để handle cho Query trên, chúng ta sẽ tạo mới một controller và định nghĩa một method có tên giống với tên field của type Query này, như sau:

package com.huongdanjava.graphql;
 
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
 
@Controller
public class GraphQLController {
 
  @QueryMapping
  public String hello() {
    return "Hello World";
  }
}

Như các bạn thấy, phương thức hello() đã được annotate với annotation @QueryMapping giúp cho Spring có thể scan và map tên method này với field của type Query. Rất đơn giản phải không các bạn?

Behind the sense, thì annotation @QueryMapping được implement sử dụng một generic annotation là @SchemaMapping:

Annotation @SchemaMapping này định nghĩa một thuộc tính là typeName cho phép chúng ta định nghĩa type của GraphQL. Ở đây, type của chúng ta là Query đó các bạn!

Một thuộc tính khác của annotation @SchemaMapping là field, giúp Spring có thể map field của GraphQL với tên method sẽ handle request:

Mặc định nếu chúng ta không khai báo giá trị cho thuộc tính field này, giá trị của nó sẽ là tên method các bạn nhé!

Tuyển dụng lập trình viên Java đãi ngộ hấp dẫn, xem thêm tại đây!

Nếu không sử dụng annotation @QueryMapping, chúng ta có thể viết lại code ở trên sử dụng annotation @SchemaMapping như sau:

package com.huongdanjava.graphql;

import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;
 
@Controller
public class GraphQLController {

  @SchemaMapping(typeName = "Query", field = "hello")
  public String hello() {
    return "Hello World";
  }
}

Để tiện cho việc testing, chúng ta sẽ thêm property spring.graphql.graphiql.enabled=true để enable sử dụng công cụ GraphiQL, trong tập tin application.properties:

spring.graphql.graphiql.enabled=true

Bây giờ, nếu chạy ứng dụng này và query sử dụng field hello trên, các bạn sẽ thấy kết quả như sau:

Để truyền tham số cho một Query, chúng ta sẽ định nghĩa ví dụ như sau:

type Query {
  hello(name: String): String
}

Trong controller, chúng ta sẽ sử dụng annotation @Argument để bind tham số được định nghĩa trong field của Query với tham số trong method handle request:

package com.huongdanjava.graphql;
 
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
 
@Controller
public class GraphQLController {
 
  @QueryMapping
  public String hello(@Argument("name") String name) {
    return "Hello, " + name;
  }
}

Thuộc tính name của annotation @Argument này cho phép chúng ta chỉ định rõ tham số trong method được bind với tham số nào trong Query.

Kết quả khi chúng ta query:

{
  hello(name: "Khanh")
}

như sau:

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

Xem thêm:

Ứng tuyển ngay việc làm IT lương cao trên TopDev!

Cách tuần tự hóa dữ liệu trong Java như Protobuf

cách tuần tự hóa dữ liệu trong java như protobuf

Bài viết được sự cho phép của tác giả Trần Văn Dem

Khi dữ liệu được chuyển qua mạng qua các hệ thống rpc, msg queue,internal service,… Tùy vào các hệ thống chúng ta cần serialize dữ liệu thành dạng json hoặc array byte. Tuy nhiên để đảm bảo tốc đố của hệ thống thì phương pháp serialize dữ liệu thành array byte sẽ được sử dụng rộng rãi hơn.

Hiện nay việc serialize đã có các công ty lớn tạo ra các thư viện khác nhau với chất lượng và tốc độ rất cao như :

  • Protobuf của google.
  • Thrift của facebook.
  • Kryo một framework mạnh mẽ của java.

Việc sử dụng các framework trên là khá dễ dàng nên lập trình viên thường sẽ coi việc serialize dữ liệu là một hộp đen. Điều này khá nguy hiểm vì trên thực tế có những project đội ngũ lập trình thường sẽ không dùng các framework có sẵn vì một số lý do như : nhiều dependency, tốc độ chưa đảm bảo, mất công tạo file (.proto, .thrift) khiến thay đổi các object gây khó khăn. Tại project này sẽ giới thiệu cho mọi người một cách để serialize dữ liệu thành array byte.

Để serialize dữ liệu sang dạng array byte trong máy tính chúng ta có 2 cách serialize chính là BIG_ENDIAN và LITTLE_ENDIAN mọi người tham khảo lý thuyế tại wiki: en.wikipedia.org/wiki/Endianness

Chúng ta sẽ hiểu đơn gian như sau :

  • BIG_ENDIAN : sẽ ghi dấu trước ghi dữ liệu khác sau
  • LITTLE_ENDIAN : sẽ ghi dữ liệu trước và ghi dấu sau.

Ví dụ ta sẽ biến số interger 32 và -32 thành array byte ta code như sau:

public class Test {
    public static void main(String[] args){
        int number = 32;
        ByteBuffer x = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);
        x.putInt(number);
        System.out.println("LITTLE_ENDIAN");
        for (int i = 0 ; i < 4 ; i++){
            System.out.printf("%d ", x.array()[i]);
        }
        System.out.println();
        System.out.println("BIG_ENDIAN");
        ByteBuffer y = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN);
        y.putInt(number);
        for (int i = 0 ; i < 4 ; i++){
            System.out.printf("%d ", y.array()[i]);

        }
    }
}

Ta sẽ được kết quả sau:

LITTLE_ENDIAN
32 0 0 0 
BIG_ENDIAN
0 0 0 32

Thay number = -32 ta được kết quả sau:

LITTLE_ENDIAN
-32 -1 -1 -1 
BIG_ENDIAN
-1 -1 -1 -32

Tiếp đến ta sẽ tìm hiểu cách protobuf serialize các kiểu đơn giản của chúng ta như thế nào. Tôi có file .proto sau

syntax = "proto3";

package proto;

option java_package = "blog.proto";

message SimpleObject {
    int32 count = 1;
    string name = 2;
    repeated DataObject dataList = 3;
}

message DataObject {
     int32 num1 = 1;
     int32 num2 = 2;
}

Tiếp theo ta sẽ sử dụng API của protobuf để serialize

public class Test {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Blog.SimpleObject data = Blog.SimpleObject.newBuilder()
                .setCount(10)
                .setName("ânhdem976")
                .build();

        System.out.println(data.toByteArray().length); 
    }
}

Sau khi debug vào sâu bên trong framework (hàm data.toByteArray()) ta sẽ tìm thấy cách protobuf serialize object của chúng ta như sau:

 public static final class SimpleObject extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:proto.SimpleObject)
      SimpleObjectOrBuilder {
//.........
    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (count_ != 0) {
        output.writeInt32(1, count_);
      }
      if (!getNameBytes().isEmpty()) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
      }
      for (int i = 0; i < dataList_.size(); i++) {
        output.writeMessage(3, dataList_.get(i));
      }
      unknownFields.writeTo(output);
    }
//.........

}

Với kiển interger như sau :

//.........
    @Override
    public void writeInt32(int fieldNumber, int value) throws IOException {
      writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
      writeInt32NoTag(value);
    }



 @Override
    public void writeInt32NoTag(int value) throws IOException {
      if (value >= 0) {
        writeUInt32NoTag(value);
      } else {
        // Must sign-extend.
        writeUInt64NoTag(value);
      }
    }

    @Override
    public void writeUInt32NoTag(int value) throws IOException {
      if (position <= oneVarintLimit) {
        // Optimization to avoid bounds checks on each iteration.
        while (true) {
          if ((value & ~0x7F) == 0) {
            UnsafeUtil.putByte(position++, (byte) value);
            return;
          } else {
            UnsafeUtil.putByte(position++, (byte) ((value & 0x7F) | 0x80));
            value >>>= 7;
          }
        }
      } else {
        while (position < limit) {
          if ((value & ~0x7F) == 0) {
            UnsafeUtil.putByte(position++, (byte) value);
            return;
          } else {
            UnsafeUtil.putByte(position++, (byte) ((value & 0x7F) | 0x80));
            value >>>= 7;
          }
        }
        throw new OutOfSpaceException(
            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1));
      }
    }

    @Override
    public void writeUInt64NoTag(long value) throws IOException {
      if (position <= oneVarintLimit) {
        // Optimization to avoid bounds checks on each iteration.
        while (true) {
          if ((value & ~0x7FL) == 0) {
            UnsafeUtil.putByte(position++, (byte) value);
            return;
          } else {
            UnsafeUtil.putByte(position++, (byte) (((int) value & 0x7F) | 0x80));
            value >>>= 7;
          }
        }
      } else {
        while (position < limit) {
          if ((value & ~0x7FL) == 0) {
            UnsafeUtil.putByte(position++, (byte) value);
            return;
          } else {
            UnsafeUtil.putByte(position++, (byte) (((int) value & 0x7F) | 0x80));
            value >>>= 7;
          }
        }
        throw new OutOfSpaceException(
            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1));
      }
    }
//.........

Dễ dàng thấy đối với kiểu interger > 0. protobuf sẽ chỉ mất từ 1-5 byte để serialize thành byte array chú ý hàm (writeUInt32NoTag) ngược lại đối với số mà nhỏ hơn 0 thì protobuf sẽ mất 10 byte để serialize thành byte array. Điều này suy ra protobuf sẽ tạo ra một array byte lớn hơn bình thường nếu số của chúng ta muốn serialize nhỏ hơn 0. Bình thường thì chỉ mất 4 bytes cho mọi thể loại số interger.

Tiếp tục ta sẽ kiểm tra tiếp đến kiểu dữ liệu string, debug chán chê các bạn sẽ đến được hàm sau trong class com.google.protobuf.Utf8, rảnh các bạn vào đọc source của nó cũng khá nhiều thứ hay ho.

final class Utf8 {
//.........
  @Override
    int encodeUtf8(final CharSequence in, final byte[] out, final int offset, final int length) {
      long outIx = offset;
      final long outLimit = outIx + length;
      final int inLimit = in.length();
      if (inLimit > length || out.length - length < offset) {
        // Not even enough room for an ASCII-encoded string.
        throw new ArrayIndexOutOfBoundsException(
            "Failed writing " + in.charAt(inLimit - 1) + " at index " + (offset + length));
      }

      // Designed to take advantage of
      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
      int inIx = 0;
      for (char c; inIx < inLimit && (c = in.charAt(inIx)) < 0x80; ++inIx) {
        UnsafeUtil.putByte(out, outIx++, (byte) c);
      }
      if (inIx == inLimit) {
        // We're done, it was ASCII encoded.
        return (int) outIx;
      }

      for (char c; inIx < inLimit; ++inIx) {
        c = in.charAt(inIx);
        if (c < 0x80 && outIx < outLimit) {
          UnsafeUtil.putByte(out, outIx++, (byte) c);
        } else if (c < 0x800 && outIx <= outLimit - 2L) { // 11 bits, two UTF-8 bytes
          UnsafeUtil.putByte(out, outIx++, (byte) ((0xF << 6) | (c >>> 6)));
          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & c)));
        } else if ((c < MIN_SURROGATE || MAX_SURROGATE < c) && outIx <= outLimit - 3L) {
          // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
          UnsafeUtil.putByte(out, outIx++, (byte) ((0xF << 5) | (c >>> 12)));
          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & (c >>> 6))));
          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & c)));
        } else if (outIx <= outLimit - 4L) {
          // Minimum code point represented by a surrogate pair is 0x10000, 17 bits, four UTF-8
          // bytes
          final char low;
          if (inIx + 1 == inLimit || !isSurrogatePair(c, (low = in.charAt(++inIx)))) {
            throw new UnpairedSurrogateException((inIx - 1), inLimit);
          }
          int codePoint = toCodePoint(c, low);
          UnsafeUtil.putByte(out, outIx++, (byte) ((0xF << 4) | (codePoint >>> 18)));
          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & codePoint)));
        } else {
          if ((MIN_SURROGATE <= c && c <= MAX_SURROGATE)
              && (inIx + 1 == inLimit || !isSurrogatePair(c, in.charAt(inIx + 1)))) {
            // We are surrogates and we're not a surrogate pair.
            throw new UnpairedSurrogateException(inIx, inLimit);
          }
          // Not enough space in the output buffer.
          throw new ArrayIndexOutOfBoundsException("Failed writing " + c + " at index " + outIx);
        }
      }

      // All bytes have been encoded.
      return (int) outIx;
    }
//.........
}

Code khá dài nên anh em nào ngại đọc thì sẽ giải thích như sau. Bình thường kiểu Character sẽ mất 2 byte để lưu trữ cũng như serialize. Nhưng trong code của google chúng ta thấy họ đã tối ưu khá nhiều khiến kiểu Character sẽ chỉ còn mất từ 1-3 byte nhưng trường hợp 3 byte thì chắc sẽ rất hiếm gặp. Từ đây kết luận protobuf họ làm khá tốt đối với kiểu dữ liệu String

Mình chỉ phân tích 2 kiểu dữ liệu đó thôi các kiểu còn lại mọi người chịu khó đọc tìm hiểu sẽ ra :)) chúc may mắn.

Xem tin tuyển dụng Java mới nhất trên TopDev

Vì protobuf không có kiểu dữ liệu Map một kiểu rất hay được dùng, tiếp đến việc có thêm object mới lại phải chỉnh sửa lại file proto kiến công việc khá rắc rối và thêm dependency mới vào project mà không dùng tính năng grpc là những điểm mình không thích thư viện protobuf này. Tất nhiên nếu dùng serialize, deserialize có sẵn của java thì sẽ khắc phục được những nhược điểm bên trên nhưng nó lại gây chậm cho hệ thống và khó có thể dùng một ngôn ngữ khác dịch được các byte này thành object.

Tại project này mình sẽ kết hợp protobuf, Kryo và các project khác đã được trải nghiệm để xây dựng lên cách serialize riêng vẫn đảm bảo được tốc dộ cũng như vẫn có thể sử dụng một ngôn ngữ khác để Deserialize được.

Project sẽ được xây dựng theo khung sau:

  • Marshaller : là một anotation của java dùng để đánh dấu các class sẽ được serialize, deserialze, chứa một số thông tin để thực hiện quá trình này
  • DInput : Một Interface chứa các phương thức dùng để Deserialize dữ liệu (Các class implement DByteArrayInput, DByteBufferInput)
  • DOutput : Một Interface chứa các phương pháp dùng để Serialize dữ liệu (Các class implement DByteArrayOutput, DByteBufferOutput)
  • DSerialize : Một Interface mà các class cần implement để serialize, deserialize
  • DMarshaller : Một Interface điều khiển quá trình serialize,deserialize

Trong project có viết sẵn các hàm giống như protobuf để ghi một số integer mất từ 1-5 byte. ghi một dữ liệu character mất từ 1-3 byte. Với cách tự serialize, deserialize này chúng ta hoàn toàn có thể sử dụng một ngôn ngữ khác để serialize,deserialize dữ liệu một cách bình thường.

Tất cả các class muốn được serialize, deserialize cần phải implement interface DSerialize. Ví dụ trong project là User,TestMapData,TestObject


import blog.serilize.base.DInput;
import blog.serilize.base.DMarshaller;
import blog.serilize.base.DOutput;
import blog.serilize.base.DSerialize;
import blog.serilize.base.anotation.Marshaller;

@Marshaller(name = User.class,number = 2)
public class User implements DSerialize<User> {
    private String name;
    private int age;


    public User(String name) {
        this.name = name;
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void write(DMarshaller marshaller, DOutput output, User data) {
        output.writeString(data.getName());
        output.writeInt(data.getAge());
    }

    @Override
    public User read(DMarshaller marshaller, DInput input) {
        User user = new User();
        user.name = input.readString();
        user.age =input.readInt();
        return user;
    }

    @Override
    public Class<?> getClasses() {
        return User.class;
    }
}

Để sử dụng được thì các class này cần phải được đăng ký với DMarshaller. Ta có ví dụ về cách sử dụng như sau :

public class Test {
  public static void main(String[] args) throws InstantiationException, IllegalAccessException {
          DMarshaller marshaller = new DMarshallerIml();
          marshaller.register(TestObject.class);
          marshaller.register(User.class);
          marshaller.register(TestMapData.class);
          marshaller.register(HashMapSerialize.class);
          marshaller.register(StringSerialize.class);


          User demtv = new User("demtv");
          Map<String ,User> map = new HashMap<>();
          map.put(demtv.getName(), demtv);
          TestMapData data = new TestMapData();
          data.setData(map);

          DOutput output = new DByteBufferOutput(100);

          marshaller.write(data, output);
          TestMapData y = marshaller.read(new DByteBufferInput(output.toArrayBytes()));
          System.out.println(y.getData().get("demtv").getName());
      }
}

Dưới đây là link github : github.com/trandem/blog/tree/main/simple-se.. Nếu cái này có ích cho bạn thì mình xin 1 sao nhé.

Bài viết gốc được đăng tải tại demtv.hashnode.dev

Xem thêm:

Việc làm IT mọi cấp độ có trên TopDev

React dành cho người mới bắt đầu

React dành cho người mới bắt đầu

Đối với bất kỳ bạn lập trình viên mới nào thì React hiện tại đang là một thư viện JavaScript được sử dụng rộng rãi, được phát triển và duy trì bởi Meta (tiền thân là Facebook). React đã trở thành một thư viện front-end được ưa chuộng nhất và lên tục được phát triển về cả mức độ phổ biến và tầm ảnh hưởng của mình.

Để cho các bạn mới bắt đầu tiếp cận với thế giới React một cách thuận tiện nhất, mình có tổng hợp một số các hướng dẫn, gợi ý dành cho các bạn trong bài viết này hôm nay. Chúng ta cùng bắt đầu nhé 

Sử dụng Create React App để khởi tạo projects

Một trong những chức năng đơn giản mà hiệu quả nhất của React là khả năng tạo ra một dự án mới bằng một dòng lệnh duy nhất: sử dụng Create React App. Bạn có thể chạy 1 trong 3 dòng lệnh dưới đây:

  • npx create-react-app my-app
  • npm init react-app my-app
  • yarn create react-app my-app

Đây là cách nhanh và cũng là tốt nhất dành cho các bạn mới học React, 1 project React với tên “my-app” (tất nhiên các bạn có thể đổi tên nó) được tạo ra với đầy đủ các package cần thiết cho bạn.

Sau khi cài đặt, chúng ta có thể ngay lập tức chạy ứng dụng của mình ở chế độ development bằng lệnh: “npm start” hoặc “fiber start”, cổng (port) mặc định sẽ là 3000, thậm chí nó còn tự động mở trình duyệt lên và chạy ứng dụng vừa được tạo ra.

Tìm hiểu những cú pháp cơ bản

React là thư viện thân thiện với lập trình viên, hãy bắt đầu học và nắm chắc những khái niệm dưới đây, bạn có thể tự tin trong việc viết code React:

  • Props: là 1 object được truyền vào 1 component, cho phép giao tiếp giữa các component bằng cách truyền tham số qua lại giữa component cha và component con
  • State: là phần dữ liệu động bên trong component của bạn, nó có thể thay đổi theo thời gian thông qua tương tác của component với người dùng
  • Components: bản chất là 1 function nhận đầu vào chính là props và trả về JSX (1 cú pháp mở rộng trong React để viết HTML). Components có khả năng mở rộng và tái sử dụng – đây cũng chính là đặc trưng và ưu điểm lớn nhất của React
function Links(props) {
  const [linkedin, setLinkedin] = useState("");
 
  return (
    <div>
      <h3>Links</h3>
      <a href={props.github}>{props.github}</a>
      <a href={linkedin}>{linkedin}</a>
    </div>
  );
}

Đoạn code trên là cú pháp cơ bản nhất trong React, thể hiện 1 component Links với props “github” và state “linkedin”.

  • React Hooks: các function đặc biệt cho phép chúng ta “móc nối” vào các biến state bên trong components. Để sử dụng hook, trước tiên hãy import và gọi chúng bên trong component của bạn. Để làm quen, mình khuyên các bạn hãy tìm hiểu kỹ 2 hooks: useState và useEffect
    • useState: sử dụng để truy cập và sửa đổi các biến state của components
    • useEffect: sử dụng để thực hiện những side effect (tác động từ bên ngoài function chính) như: lấy dữ liệu, cập nhật các phần tử bên trong components, …
import React, { useState, useEffect } from "react";
 
function Links(props) {
  const [timeRemaining, setTimeRemaining] = useState(1);
 
  useEffect(() => {
    if (timeRemaining === 0) {
      setTimeRemaining(10);
      return;
    }
  }, []);
}

Hãy giữ cho component của bạn “nhỏ vừa đủ”

Thực tiễn trong các dự án React, component nên được chia càng nhỏ các tốt về mặt chức năng và không nên bị trừu tượng hóa quá mức. Theo kinh nghiệm của mình, hãy bắt đầu từ App component ở top (bao trọn cả tất cả các components khác), sau đó chia nhỏ dần các thành phần giao diện nhỏ hơn đến mức chức năng. Điều này sẽ giúp ứng dụng của bạn:

  • Dễ dàng debug gỡ lỗi hơn
  • Code bạn viết dễ hiểu hơn
  • Cho phép tái sử dụng và khả năng mở rộng component tốt hơn
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
 
function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}

Tham khảo tin tuyển dụng IT Fresher, Inten mới nhất tại đây!

Đừng lạm dụng state

Một trong những sai lầm lớn mà các bạn mới làm React hay gặp phải là việc tạo ra quá nhiều biến state không cần thiết trong các trường hợp mà chỉ cần sử dụng props kết hợp với logic có điều kiện là đủ. Chúng ta đều biết mỗi khi biến state thay đổi thì component sẽ thực hiện việc re-render lại, và khi bạn tạo ra quá nhiều biến state trong 1 component cũng đồng nghĩa với việc có thêm nhiều “nguồn tác động” đến việc cập nhật hiển thị component.

Hãy xem xét việc nên hay không nên thêm 1 biến state mới vào 1 component, có 1 vài yếu tố các bạn có thể cân nhắc

  • Component của bạn có tĩnh và không thay đổi hay không?
  • Bạn có thể tính toán trước giá trị props theo logic có sẵn để tạo ra các trạng thái component mong muốn hay không?

Nếu câu trả lời là có thì tốt nhất là không sử dụng thêm biến state lúc này.

const [option1, setOption1] = useState(false);
const [option2, setOption2] = useState(false);
const [option3, setOption3] = useState(false);
const [option4, setOption4] = useState(false);
const [option5, setOption5] = useState(false);

Tránh các lỗi không đồng bộ

Khi bạn sử dụng state trong React, luôn luôn phải để ý rằng việc setState (thay đổi giá trị state) là bất đồng bộ. Điều đó có nghĩa là biến state sẽ không thay đổi ngay lập tức mà nó phải đợi việc re-render component. Để tránh các lỗi xảy ra do việc cập nhật dữ liệu 1 cách không đồng bộ, hãy tìm hiểu vòng đời của component trong React. 

Thêm 1 lời khuyên nữa cho các bạn trong trường hợp này, hãy “bắt” sự kiện biến state thay đổi, thay vì “chờ” biến state đó thay đổi xong.

const [state, setState] = useState(0);
...
setState(2020);
console.log(state); // 0

Kết bài

Sẽ còn nhiều thứ phải học để các bạn có thể thành thạo với React, hy vọng những gợi ý trên sẽ giúp các bạn có thể nhanh chóng và dễ dàng hơn từ lúc bắt đầu làm quen với thư viện này. Cảm ơn các bạn đã đọc bài viết, hẹn gặp mọi người trong các bài sắp tới của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Bạn đang tìm việc làm UI/UX Designer hay việc làm ngành IT? Tham khảo ngay những tin tuyển dụng mới nhất trên TopDev!

Quản lý realm database theo hướng micro-service trong iOS

Quản lý realm database theo hướng micro-service trong iOS

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Yêu cầu bài viết

  • Đã sử dụng qua realm swift.
  • Có kiến thức căn bản về lập trình iOS

Micro-service là gì?

Với những ai đang làm các dự án Backend thì khái niệm micro-service sẽ không còn xa lạ nữa.

Micro-service nghĩa là chia nhỏ các service của ứng dụng thành những phần riêng biệt, độc lập với nhau để dễ dàng cho việc quản lý, release sản phẩm. Lấy 1 ví dụ, khi backend có các nghiệp vụ: đăng nhập, đăng ký tài khoản, lưu giỏ hàng, thanh toán.. thì chúng ta sẽ có thể chia các cụm micro-service như sau:

  • Cụm authentication: đăng nhập, đăng ký nơi các nghiệp vụ xác nhận người dùng.
  • Cụm payment: gồm lưu giỏ hàng, thanh toán chứa nghiệp vụ về mua bán sản phẩm.

Khi 1 API nào ở cụm payment bị lỗi thì nó hoàn toàn không ảnh hưởng tới cụm authentication. Đó là lợi ích của việc chia để trị trong micro-service.

Ở trong các ứng dụng iOS, nghiệp vụ về database cũng tương tự. Lấy ví dụ, khi bạn lưu data cho phần authentication, bao gồm các bảng bảng user, token… và nghiệp vụ payment gồm các bảng về product, wishList thì chúng ta cũng có thể chia để trị như trên.

Realm swift cho phép chúng ta sử dụng nhiều file realm riêng biệt, mỗi file realm gồm 1 số bảng liên quan tới nhau trong đó. Mỗi file realm như vậy chúng ta gọi là database.

Ví dụ về 1 database pets, nơi chứa nghiệp vụ về pets, gồm nhiều bảng

Như hình trên, chúng ta có thể thấy nghiệp vụ pets trong 1 ứng dụng về quản lý chó mèo, chúng ta chia nhỏ các bảng ra thành 1 database có tên là PetSchema như hình:

Vậy là chúng ta đã có thể hình dung rằng thay vì dùng 1 file realm Default.realm mặc định thì giờ đây chúng ta có rất nhiều file realm trong ứng dụng.

Vậy lợi ích của việc này là gì?

  • Khi gọi các bảng từ các file .realm này thì tốc độ sẽ nhanh hơn thay vì load 1 file lớn vào memory của ứng dụng.
  • Dễ dàng migration khi có thay đổi trường trong bảng.
  • Tránh conflict khi làm team với nhiều người.
  • Dễ dàng cho việc testing

OK, vậy là các bạn đã hiểu được nguyên lý micro-service rồi. Tiếp theo để xây dựng realm manager thì chúng ta cần triển khai những gì?

Các yêu cầu của Realm manager

Yêu cầu của realm manager cần xử lý các nghiệp vụ sau:

  • Quản lý thêm, sửa, xóa, update cũng như query bảng.
  • Tăng sự tiện lợi khi sử dụng.
  • Dễ dàng truy cập, dễ dàng sửa đổi.
  • Kết nối với lớp database.

Các loại lưu trữ của Realm

Thật tuyệt vời, giờ đây Realm sẽ cho phép bạn có 2 cách để lưu trữ:

  • Lưu trữ trên memory
  • Lưu trữ vào ổ đĩa(các file realm).

Lưu trữ trên ổ đĩa

Mặc định anh em làm iOS sẽ hay dùng phương pháp lưu trữ vào 1 file .realm. Toàn bộ bảng sẽ lưu vào file realm và tồn tại trên ổ đĩa của ứng dụng.

Lưu trữ trên memory

Hàm init của Realm bản 10.28.2 như sau:

public init(fileURL: URL? = URL(fileURLWithPath: RLMRealmPathForFile("default.realm"), isDirectory: false),
                    inMemoryIdentifier: String? = nil,
                    syncConfiguration: SyncConfiguration? = nil,
                    encryptionKey: Data? = nil,
                    readOnly: Bool = false,
                    schemaVersion: UInt64 = 0,
                    migrationBlock: MigrationBlock? = nil,
                    deleteRealmIfMigrationNeeded: Bool = false,
                    shouldCompactOnLaunch: ((Int, Int) -> Bool)? = nil,
                    objectTypes: [ObjectBase.Type]? = nil,
                    seedFilePath: URL? = nil) {
  ...
}

Như chúng ta thấy tham số inMemoryIdentifier nhằm định danh memory theo 1 string để lưu trữ.

Mục đích lưu trữ trên memory giúp chúng ta có thể thực hiện các nghiệp vụ về unit-test hoặc Short live data.

Version Management & Migration Management

Việc đánh số version cho realm của chúng ta nhằm mục đích migration. Khi có bất kỳ 1 sự thay đổi nào trong các bảng dữ liệu, realm cho phép bạn chuyển đổi nó 1 cách đơn giản thông qua MigrationBlock. Con số này sẽ tăng lên sau mỗi phiên bản. Đây là yêu cầu bắt buộc của realm. Các bạn có thể xem tại đây.

Increment Versions MonotonicallyMigrations must update a realm to a higher schema version. Realm Database will throw an error if a client application opens a realm with a schema version that is lower than the realm’s current version or if the specified schema version is the same as the realm’s current version but includes different object schemas.

Nói cách khác, nếu khi bạn thay đổi bảng của realm nhưng không tăng version, thì ứng dụng của bạn sẽ crash.

Khi các bạn đã xác định được các thành phần của 1 realm manager thì chúng ta sẽ tiến hành triển khai nó.

Tham khảo ngay tin tuyển dụng lập trình viên backend tại TopDev!

Triển khai realm manager

Các thành phần cần thiết của nó như sau:

/// DatabaseConfigurable all defines which you must conform according
public protocol DatabaseConfigurable {
    var realmMemoryType: RealmMemoryType { get }

 // This property you must assign the database name that you want.
    //  If you want to use legacy architecture you can assign nil for it.
    //  If you want to use legacy architecture you can assign nil for it.
    var schemaName: String? { get }

// This property you must assign the database version according to the migration count.
    // You must change the version on kLegacySchemaVersion instead according to the migration count too.
    //  If you want to use legacy architecture you can assign nil for it.
    var schemaVersion: UInt64? { get }

  // This property you must assign the table type to verify that this schema will use only this table.
    //  If you want to use legacy architecture you can assign nil for it.
    var objectTypes: [Object.Type]? { get }

 var embeddedObjectTypes: [EmbeddedObject.Type]? { get }

  // This property you must implement the migration logic if a table has changed.
    // If you want to use legacy architecture you can assign nil for it. If you assign nil.
    var migrationBlock: MigrationBlock? { get }
}

Trong đó:

  • realmMemoryType sẽ gồm 2 loại: lưu vào ổ đĩa và lưu vào memory
  • schemaName: Tên của micro-realm schema mà bạn muốn.
  • schemaVersion: số phiên bản realm schema. Đánh số từ 0.
  • objectTypes: 1 list các Object realm mà bạn muốn lưu trữ ở file realm này. Nó có thể nhiều bảng liên quan tới nhau, ví dụ:
var objectTypes: [Object.Type]? {
        return [DogToy.self, Dog.self, DogClub.self, Person.self]
    }
  • embeddedObjectTypes: tương tự objectTypes, realm giờ đây đã cung cấp cho chúng ta những Object embedded vào các object khác. Nghĩa là khi bạn xóa 1 Object, thì các object embedded của nó sẽ bị xóa tự động. Xem thêm tại đây.
  • migrationBlock: Thành phần không thể thiếu khi bạn muốn migrate data của bạn. Ví dụ:
var migrationBlock: MigrationBlock? {
        let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
            if oldSchemaVersion < 1 {
                // Rename the "name" property to "yourName".
                // The renaming operation should be done outside of calls to `enumerateObjects(ofType: _:)`.
                migration.renameProperty(onType: MigrationSample.className(), from: "age", to: "yearsSinceBirth")
//                migration.renameProperty(onType: MigrationSample.className(), from: "name", to: "yourName")
            }

            // The enumerateObjects(ofType:_:) method iterates over
            // every Person object stored in the Realm file to apply the migration
            migration.enumerateObjects(ofType: MigrationSample.className()) { oldObject, newObject in
                // combine name fields into a single field
                let firstName = oldObject!["firstName"] as? String
                let lastName = oldObject!["lastName"] as? String
                newObject!["fullName"] = "\(firstName!) \(lastName!)"
            }
        }
        return migrationBlock
    }

Tôi đã triển khai thư viện để implement toàn bộ các thành phần trên. Các bạn có thể sử dụng vào project của mình bằng 2 cách như sau:

Sử dụng pod:

pod 'QRealmManager'
sau đó import thư viện:
import QRealmManager

Sử dụng Swift package:

Thêm bằng dòng sau:
https://github.com/lexuanquynh/QRealmManagerPackage.git
Sau đó import:
import QRealmManagerPackage

Trong thư viện, tôi đã sử dụng hàm writeAsync nhằm đảm bảo quá trình xử lý realm luôn luôn ở background thread. Các bạn có thể xem thêm ở đây.

Perform a Background WriteNew in version 10.26.0.
You can add, modify, or delete objects in the background using writeAsync.

Cách sử dụng

Đầu tiên, tất nhiên rồi bạn cần có các object của realm. Theo chuẩn mới nhất realm sẽ sử dụng Persisted vừa ngắn gọn, vừa đơn giản và chúng ta có thể dùng các high function của swift để query 1 cách dễ dàng.

import RealmSwift

class Person: Object {
    @Persisted(primaryKey: true) var id = 0
    @Persisted var name = ""
    // To-many relationship - a person can have many dogs
    @Persisted var dogs: List<Dog>
    // Inverse relationship - a person can be a member of many clubs
    @Persisted(originProperty: "members") var clubs: LinkingObjects<DogClub>
}

Tiếp theo chúng ta sẽ tạo lớp Repository để implement lại các cài đặt của realm manager:

import RealmSwift
import QRealmManager

class PetRepository: DatabaseConfigurable {
    var realmMemoryType: RealmMemoryType {
       return .inStorage
    }

    var schemaName: String? {
        return "PetSchema"
    }

    var schemaVersion: UInt64? {
        0
    }

    var objectTypes: [Object.Type]? {
        return [DogToy.self, Dog.self, DogClub.self, Person.self]
    }

    var embeddedObjectTypes: [EmbeddedObject.Type]? {
        return nil
    }

    var migrationBlock: MigrationBlock? {
        return nil
    }
}

Sau đó bạn sẽ dùng repository đó để thao tác với các Object trong file realm của bạn 1 cách dễ dàng:

Để lưu entity:

let repository = PetRepository()
repository.save(entity: dog, update: false) { result in
            switch result {
            case .success:
                // Handle success here
                print("Handle success here")
            case .failure:
                print("Handle failed here")
            }
        }

Để lưu nhiều entities:

        let aDog = Dog(value: ["name": "Lulu", "age": 3])
        let anotherDog = Dog(value: ["name": "Nana", "age": 2])

        // Instead of using pre-existing dogs...
        let aPerson = Person(value: [123, "Jane", [aDog, anotherDog]])
        // ...we can create them inline
        let anotherPerson = Person(value: [456, "Jane", [["Buster", 5], ["Buddy", 6]]])

        repository.save(entities: [aPerson, anotherPerson], update: true) { result in
            switch result {
            case .success:
                print("Handle success here")
            case .failure:
                print("Handle failed here")
            }
        }

Thậm chí bạn còn có thể lưu JSON data:

let data = "{\"name\": \"Tennis ball\"}".data(using: .utf8)!
        repository.save(saveClass: DogToy.self, jsonData: data, update: false) { result in
            switch result {
            case .success:
               break
            case .failure:
                break
            }
        }

Để query, realm nói say goodbye với predicate, mà sử dụng luôn các high function swift, quá tiện lợi đúng không?

let coffeDrinks = repository.queryAll(returningClass: CoffeeDrink.self)
let cofferRate = coffeDrinks!.filter { $0.rating == 4 }

Xem thêm say goodbye ở đây.

Kết luận

Giờ đây, với realm manager, bạn đã có thể quản lý dễ dàng các file realm của mình.

Nếu có bất kỳ câu hỏi nào xin vui lòng để lại comment ở bài viết này.

Nếu yêu thích bài viết hãy tặng 1 sao vào repository sau:

https://github.com/lexuanquynh/QRealmManager

Xin cảm ơn.

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

Xem thêm:

Top Developer đừng bỏ lỡ Top IT Job được cập nhật mỗi ngày trên TopDev nhé!

Cuộc Thi Tìm Kiếm Giải Pháp Chuyển Đổi Số Quốc Gia (Vietsolutions) Năm 2022

Cuộc thi tìm kiếm giải pháp chuyển đổi số quốc gia năm 2022

Cuộc thi Tìm kiếm giải pháp chuyển đổi số quốc gia (Viet Solutions) là cuộc thi thường niên do Bộ Thông tin và Truyền thông chủ trì, Cục Chuyển đổi số quốc gia và Tập đoàn Công nghiệp Viễn thông Quân đội Viettel đồng tổ chức, từ năm 2022 có sự tham gia đồng hành của Công ty Galaxy Digital, cùng sự tham gia bảo trợ truyền thông của Đài Truyền hình Việt Nam (VTV), Đài Tiếng nói Việt Nam (VOV), Báo VietNamNet, Báo Vnexpress và Tạp chí Thông tin và Truyền thông.

Ngày 22/7/2022, Bộ Thông tin và Truyền thông đã tổ chức Lễ phát động cuộc thi Tìm kiếm giải pháp chuyển đổi số Quốc gia (Viet Solutions) 2022.

Cuộc thi năm 2022 bao gồm các hạng mục:
(1) Tìm kiếm và công bố các bài toán chuyển đổi số Việt Nam ở các ngành, lĩnh vực, địa phương và doanh nghiệp.
(2) Tìm kiếm và trao giải cho cặp bài toán và giải pháp xuất sắc cho ngành.
(3) Tìm kiếm và trao giải cho các cặp bài toán và giải pháp xuất sắc cho địa phương.
(4) Tìm kiếm và trao giải cho các cặp bài toán và giải pháp xuất sắc cho doanh nghiệp.
(5) Tìm kiếm và trao giải cho các cặp bài toán và giải pháp xuất sắc cho các dự án về cộng đồng.

Bộ Thông tin và Truyền thông kêu gọi các doanh nghiệp công nghệ hưởng ứng cuộc thi và tham gia giải các bài toán, đặc biệt là các bài toán thuộc hạng mục bộ, ngành và địa phương.

Danh sách các bài toán đã được tổng hợp và đăng tải trên cổng Bài toán chuyển đổi số https://c63.mic.gov.vn/. Đây cũng là hoạt động thiết thực hướng tới hưởng ứng ngày Chuyển đổi số quốc gia (10/10).

Các doanh nghiệp đăng ký tham gia Cuộc thi tại: https://vietsolutions.net.vn.
Thời hạn gửi đăng ký giải pháp: trước ngày 22/9/2022.
Đầu mối liên hệ, hỗ trợ tham gia cuộc thi: Bà Trịnh Thị Trang, Cục Chuyển đổi số quốc gia, số điện thoại: 0383.199.885, email: tttrang@mic.gov.vn.

*Tài liệu đầy đủ về Cuộc thi được tải về tại https://drive.google.com/drive/folders/1Rmx4o0Lal3gpi3B9PdNDHze5TOrRhxNp

Nguồn: http://vdca.org.vn/

[Updated] Bộ câu hỏi phỏng vấn Fullstack Developer hay và khó năm 2024

Câu hỏi phỏng vấn Fullstack Developer

Trở thành lập trình viên fullstack (fullstack developer) từ lâu đã là mục tiêu hướng tới của nhiều bạn lập trình viên, những kì vọng của bạn khi phỏng vấn fullstack developer là gì?, những nội dung nào sẽ được quan tâm khi bạn apply ở vị trí fullstack?

Tất nhiên, chỉ nhìn vào cái title là fullstack thôi cũng đủ để anh em hiểu ta cần nắm vững khối lượng kiến thức cũng phải thuộc dạng “full”, đầy đầy một tí.

meme
Fullstack là đầy đủ cả Frontend, Backend nha anh em. Không chơi một nữa đâu nha

Bắt đầu ngay cho nóng nào.

1. Khối lượng kiến thức chung

Trước khi bắt đầu thử sức với một vài câu hỏi phỏng vấn fullstack developer. Mình muốn list ra đây một số topic cần nhìn lại trước khi bắt đầu tham gia buổi phỏng vấn.

Đầu tiên, expect cơ bản nhất khi phỏng vấn fullstack là đã có kinh nghiệm làm cả Frontend và Backend. Chi tiết từng phần có thể được đào sâu tuỳ theo vị trí yêu cầu.

  • Frontend
  • Backend
  • Intergration

Đi sâu vào kiến thức backend, một số topic có thể là câu hỏi để xác định đúng ứng viên có phải là fullstack developer hay không bao gồm:

  • Database design
  • Xử lý vấn đề query chậm cho cả Frontend và Backend
  • Thiết kế DB adapt với requirement và field từ UI
Ngoài technology, kiến thức và sự hiểu biết sâu về cơ chế cũng là yếu tố quan trọng không kém khi phỏng vấn fullstack developer

Sau đi đã nắm rõ về các topics cần có để tham gia phỏng vấn, cùng tham khảo một số câu hỏi dưới đây. Anh em chú ý là bộ câu hỏi này chỉ là mẫu, các topics có vô vàn các câu hỏi, đòi hỏi người phỏng vấn cần chuẩn bị và có lượng kiến thức tốt trước khi tham gia phỏng vấn.

2. Câu hỏi ví dụ phỏng vấn fullstack level experience

2.1 Callback trong JavaScript có thể được hiểu như thế nào?

Callback trong Javascript là một function được sử dụng như là một đối số cho function khác.

Ngoài ra, có 2 điểm chính cần lưu ý khi nói tới Callback là:

  • Function này có thể gọi tới function khác
  • Callback có thể được gọi sau ở function này sau khi function khác đã kết thúc.

Callback chỉ là một topic nhỏ trong danh sách các câu hỏi phỏng vấn cho fullstack developer.

2.2 GraphQL khác gì so với RestAPI?

Câu này dành cho lập trình viên fullstack đã có kinh nghiệm nên cần nêu bật lên được cái main core của sự khác nhau.

Cốt lõi giữa GraphQLRestAPI nằm ở 4 ý chính, nếu nắm chắc thì trong buổi phỏng vấn chắc chắn sẽ trả lời được.

  • GraphQL đi theo hướng layer server-side (lớp phía server), lúc viết queries thì sẽ thực thi ở server với data đã có sẵn, còn REST thì đi theo hướng tạo kiến trúc với các ràng buộc để phát triển Web services.
  • GraphQL có thể tổ chức theo hướng schema trong khi đó REST được thiết kế để đi theo hướng endpoints.
  • Quá trình phát triển sử dụng GraphQL sẽ nhanh hơn rất nhiều so với REST.
  • Kiểu message trả về với GraphQL mutations luôn là string, trong khi đó với REST thì trả về kiểu gì cũng được.
Phỏng vấn fullstack developer

2.3 Có những cách nào để improve load time cho ứng dụng web (web applications)

Câu hỏi này sử dụng để xác định độ dày về kinh nghiệm của lập trình viên. Người phỏng vấn có thể đi sâu về cách hiện thực hoặc chi tiết để chắc chắn hơn về kinh nghiệm của lập trình viên fullstack.

  • Tối ưu HTTP requests.
  • Sử dụng CDNs và xoá các files/scripts không sử dụng tới.
  • Tối ưu files và nén các hình ảnh.
  • Sử dụng caching.
  • Dùng CSS3 và HTML5.
  • Tối ưu kích thước của JavaScript & Style Sheets.
  • Tối ưu caches.

Trên đây chỉ là một số ý chính có thể nêu ra, chi tiết hơn có thể hỏi tới như: cụ thể cache ở đây là gì, cache redis hay cache CDN hay cache trên browser?.

Loại nào tốt hơn, ví dụ như cache redis thì có lợi gì, lúc nào nên dùng?.

Người phỏng vấn cũng có thể hỏi sâu hơn về các thông số sử dụng để đo tốc độ của website

 

Phỏng vấn fullstack developer
Tối ưu không phải là bài toán dễ để giải quyết

Đào sâu vào kinh nghiệm và cách thức để tối ưu có thể cho ta biết nhiều hơn về một lập trình viên fullstack có nhiều kinh nghiệm.

2.4 Giải thích chi tiết về Observer Pattern

Câu hỏi này đặt nặng về kiến thức Design Pattern của ứng viên, lập trình viên Fullstack luôn mong muốn có skill và hiểu biết tốt về design pattern (vốn là một yếu tố để phân biệt giữa Junior và Senior).

Với câu hỏi này, anh em chỉ cần nhớ main concepts của pattern (mục đích sử dụng, giải quyết được vấn đề gì), chỉ vậy là ok.

The purpose of the Observer pattern is to define a one-to-many dependency between objects, as when an object changes the state, then all its dependents are notified and updated automatically. The object that watches on the state of another object is called the observer, and the object that is being watched is called the subject. Mục đích của Observer pattern là định nghĩa mối liên hệ 1 nhiều giữa các object (sự phụ thuộc). Mỗi khi một object thay đổi trạng thái của nó, nó sẽ thông báo và cập nhật tự động. Lúc này đối tượng theo dõi trạng thái của một đối tượng khác được gọi là người quan sát, và đối tượng đang được theo dõi được gọi là chủ thể (subject).

Phỏng vấn fullstack developer
Những câu hỏi phỏng vấn fullstack developer liên quan tới design pattern thường chú trọng tới sự hiểu biết về concepts.

Nhớ được mục đích và cái core của design pattern sẽ giúp anh em nhớ lâu hơn, áp dụng linh hoạt hơn so với nhớ code khô khan trong đầu. Đi sâu và cụ thể hơn về Observer pattern anh em có thể tham khảo thêm bài viết về Observer Pattern (giải thích cụ thể) ở Kieblog.

2.5 ACID trong database system mang ý nghĩa gì?

  • Chữ A ở đây là Atomicity
  • Chữ C là Consistency
  • Chữ I là Isolation
  • Chữ D là Durability.

Trong các hệ thống cơ sở dữ liệu, ACID đề cập đến một tập hợp các thuộc tính tiêu chuẩn đảm bảo các giao dịch cơ sở dữ liệu được xử lý một cách đáng tin cậy.

Đi vào chi tiết hơn:

  • Atomicity đảm bảo rằng tất cả các câu lệnh thực thi như (read, write, update hoặc delete dữ liệu), một là thực thi tất cả theo transaction, hoặc là không thực thi cái nào). Đảm bảo tính toàn vẹn của dữ liệu
  • Consistency, tính nhất quán. Đảm bảo rằng việc thao tác với dữ liệu trong table luôn được thực hiện theo cách đã được chuẩn bị trước, đảm bảo không có thao tác sai ảnh hưởng tới dữ liệu.
  • Isolation là tính độc lập, khi có nhiều yêu cầu truy xuất hoặc thay đổi dữ liệu, tính độc lập đảm bảo thao tác này không ảnh hưởng tới thao tác khác. Thực hiện tuần tự hoặc ít nhất là đảm bảo tính độc lập của từng thao tác. Cũng góp phần đảm bảo tính độc lập của dữ liệu.
  • Durability là tính bền vững, bền vững ở đây được hiểu là kết quả đã được ở các thực hiện trước đó sẽ luôn được lưu lại cho dù hệ thống bị lỗi

ACID

Mời anh em tham khảo tin tuyển dụng Fullstack Developer mới nhất trên TopDev nhé!

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

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

Xem thêm:

Tìm việc làm IT lương cao, đãi ngộ hấp dẫn trên TopDev!

BÁO CÁO THỊ TRƯỜNG IT VIỆT NAM NĂM 2022: Từng bước thay đổi hướng đến sự phát triển kinh tế lấy nhân tài làm trung tâm

mức lương Lập trình viên Việt 2022

Đến thời điểm hiện tại, chuyển đổi số không còn là câu chuyện mới mẻ. Hơn hết, đây được xem là xu hướng tất yếu cho sự phát triển kinh tế của mỗi quốc gia. Trải qua các đợt bùng phát đại dịch Covid-19, chúng ta đã chứng kiến sự vươn lên bứt phá của lĩnh vực Công nghệ thông tin với hàng loạt những ý tưởng, cải tiến mới. Hai năm đại dịch vừa qua được đánh giá là cú hích trăm năm giúp đẩy nhanh quá trình chuyển đổi số cho Việt Nam và toàn cầu. Sự chuyển dịch nhanh chóng này đã tạo ra nhiều cơ hội cho phần lớn những người hoạt động trong lĩnh vực IT. Đồng thời mang đến nhiều thách thức mới cho thị trường tuyển dụng Công nghệ và cả nền kinh tế nước nhà. 

Đứng trước nhu cầu cạnh tranh từ các doanh nghiệp, vấn đề tuyển dụng nhân lực IT chất lượng ngày càng được chú trọng. Mới đây nhất, TopDev – Nền tảng tuyển dụng IT hàng đầu đã phát hành Báo cáo thị trường IT Việt Nam – Tech Hiring 2022, với những đánh giá và phân tích về vận hội cũng như viễn cảnh của thị trường lao động IT năm 2022. Phát biểu trong báo cáo, ông Park JongHo – CEO | TopDev đã có những nhận định rằng: “Việt Nam đang có một nguồn nhân lực IT đầy hứa hẹn về chất và lượng cũng như thị trường tiềm năng và tăng trưởng kinh tế. Điều quan trọng nằm ở các kế hoạch, chiến lược về đầu tư, phát triển và định hướng cho nguồn lực này nhằm thúc đẩy các mục tiêu kinh tế, xã hội Quốc gia trong bối cảnh toàn cầu hóa. Đây thực sự là một chủ đề lớn và là chặng đường dài cho tất cả chúng ta, nhưng chúng tôi tin rằng SỰ THAY ĐỔI sẽ làm nên những điều lớn lao. Và để tạo ra sự thay đổi, mỗi bên đều có thể đóng góp theo vai trò riêng. Tất cả cho sự phát triển kinh tế lấy nhân tài làm trung tâm.

Bối cảnh Kinh tế – Xã hội và Thị trường IT tại Việt Nam

Vực dậy mạnh mẽ sau những biến động từ các đợt bùng phát đại dịch Covid-19, nền kinh tế tại Việt Nam đã “gặt hái” được những thành quả đáng chú ý. GDP bình quân đầu người trong quý 2/2022 của Việt Nam được ước tính tăng 7,72% so với cùng kỳ năm ngoái, cao hơn tốc độ tăng trưởng của quý 2 trong giai đoạn 2011-2021. Sau 2 năm đại dịch xảy ra, Việt Nam vẫn ghi nhận tổng số vốn mới, được điều chỉnh và mua cổ phần của các nhà đầu tư nước ngoài đạt 31,15 tỷ đô la vào ngày 20 tháng 12 năm 2021, tăng 9,2% so với 2020. Sáu tháng đầu năm 2022, lĩnh vực Công nghệ thông tin và Truyền thông có doanh thu đạt khoảng 77 tỷ USD, tăng 17% so với cùng kỳ năm ngoái, kỳ vọng có sự tăng trưởng trong năm 2022. Đây là những dấu hiệu tích cực cho thấy sự hồi phục nhanh chóng của nền kinh tế nước nhà dù cho phải chịu nhiều ảnh hưởng từ đại dịch. 

Vietnam IT market report - chỉ số kinh tế & xã hội

Thị trường lao động Việt Nam trong quý 2 năm 2022 quay trở lại đà tăng trưởng. Thất nghiệp và thiếu việc làm đều giảm so với giai đoạn dịch bệnh. Tuy nhiên, với tác động đáng kể từ đại dịch và sự thay đổi trong công việc cũng như mô hình lao động, cách thức làm việc truyền thống trước đây đã thay đổi mãi mãi. 

Từ năm 2020, các doanh nghiệp ở Việt Nam đã cho phép nhân viên của họ làm việc tại nhà để ngăn chặn sự lây lan của Covid-19. Từ đó mở ra các xu hướng mới về hình thức làm việc từ xa (Remote Work), mô hình làm việc kết hợp (Hybrid Work) hay mô hình làm việc tự do (Freelance). Đến năm 2025, thế hệ Z dự kiến sẽ chiếm 30% lực lượng lao động tại Việt Nam với những mong đợi về sự cân bằng giữa công việc – cuộc sống và hạnh phúc cá nhân. Điều này càng thúc đẩy các mô hình làm việc kiểu mới mở rộng và phát triển.

 Cơ hội mới đi kèm với những thách thức mới

Sự thay đổi về mô hình làm việc để thích ứng linh hoạt và vực dậy sau đại dịch đã tạo nên những thay đổi trong nhu cầu khi tìm kiếm công việc của người lao động trong lĩnh vực IT. Công việc kết hợp (Hybrid Work) là một mô hình làm việc linh hoạt, mang đến cho nhân viên quyền tự chủ để lựa chọn địa điểm và cách thức làm việc. Hybrid Work sẽ là một phần của mô hình làm việc trong tương lai, nhưng đồng thời đặt ra nhiều vấn đề mới về sự thích nghi và cách thức quản lý & gắn kết tốt hơn. 

Vietnam IT Market report - Mối quan tâm của NTD

Làn sóng đầu tư nước ngoài đã mang đến nhiều cơ hội cho thị trường lao động IT Việt Nam mở rộng và trở nên sôi động hơn bao giờ hết. Việt Nam đã thu hút đủ sự chú ý để đưa các công ty CNTT trong khu vực bắt đầu vào Việt Nam tuyển dụng và xây dựng đội ngũ kỹ sư phát triển sản phẩm. Các doanh nghiệp truyền thống trong các lĩnh vực như du lịch, nông nghiệp, bất động sản… nay đã chuyển đổi số và bước vào mô hình thương mại điện tử. Điều này lại càng tạo nên sức ép cho bài toán khó về thiếu hụt nhân lực CNTT của thị trường, khi nhu cầu tăng lên đáng kể nhưng khả năng đáp ứng còn nhiều hạn chế.

Theo Báo cáo thị trường IT Việt Nam năm 2022 do TopDev phát hành, mức lương lập trình viên dao động từ $350 (Fresher) đến $1.190 cho vị trí Mid-Senior. Lập trình viên Senior có mức lương dao động từ $860 đến $1.510. Các vị trí Quản lý (từ 5 năm trở lên) hoặc cấp cao hơn được khảo sát có mức lương từ $1.410 cho đến hơn $2.300. Theo dự đoán của các báo cáo trước đó, các vị trí được trả lương cao nhất yêu cầu các kỹ năng như Data Analyst, Cloud, DevOps, AI/Machine Learning. Tuy được săn đón với mức lương hấp dẫn, nguồn cung nhân lực trong lĩnh vực CNTT vẫn chưa đáp ứng được nhu cầu và tốc độ phát triển như mong đợi của ngành.

Do ảnh hưởng của Covid-19, số lượng công việc Freelancer dự kiến sẽ tăng từ 5% đến 13%. Hơn nữa, nhu cầu tuyển dụng IT cũng tăng trưởng mạnh mẽ từ các quốc gia trên thế giới và xu hướng tuyển các lập trình viên ở nước ngoài trở nên phổ biến hơn. Điều này dẫn đến việc các lập trình viên ở Việt Nam có nhiều cơ hội lựa chọn hơn và phần nào có mong muốn mức lương và phúc lợi tốt hơn từ các công ty trong nước. 

Mặt khác, làn sóng đầu tư tài chính cá nhân như NFT, Blockchain, chứng khoán đang ngày càng mạnh mẽ. Một số cá nhân có hiểu biết và thích nghi nhanh với xu hướng đã nhanh chóng tạo lập được cơ sở tài chính cá nhân ổn định. Điều này trực tiếp gây ảnh hưởng đến thị trường lao động khi một thành phần lao động tách ra khỏi thị trường và theo đuổi những lĩnh vực này như một công việc chính.

Vietnam IT market report - Thach thuc trong thi truong tuyen dung

Ngoài ra, sau giai đoạn đại dịch, người lao động tự nguyện nghỉ việc, tạo nên làn sóng The Great Resignation. Đối mặt trước những thách thức này, các công ty cần có sự tăng tốc để đáp ứng kịp thời những yêu cầu từ phía nhân tài IT, tập trung vào yếu tố con người, quan tâm đến sức khỏe & tinh thần nhân viên và trải nghiệm ứng viên, đồng thời nỗ lực tạo lợi thế cạnh tranh trên thị trường tuyển dụng Công nghệ trong sắp tới.

Mục tiêu tạo ra những sản phẩm công nghệ “Make In Vietnam” không còn xa

Năm 2021 là một năm đáng nhớ đối với ngành công nghiệp CNTT của Việt Nam khi chuyển đổi kỹ thuật số diễn ra trong tất cả các lĩnh vực, và Công nghệ trở thành một trong những trụ cột của cuộc chiến chống lại Covid-19, cho sự phục hồi và phát triển kinh tế của Việt Nam. Bộ TT&TT đã đặt mục tiêu cho ngành Công nghệ thông tin, Điện tử và Viễn thông với nhiệm vụ “Make In Vietnam” – chuyển dịch mạnh mẽ từ lắp ráp, gia công sang sáng tạo, thiết kế một cách chủ động, để từ đó cho ra đời các sản phẩm công nghệ số Việt Nam.

Theo Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành, Việt Nam đang có một nguồn nhân lực CNTT đầy hứa hẹn về chất và lượng cũng như thị trường tiềm năng và tăng trưởng kinh tế. Đến nay, lập trình viên Việt Nam đang giữ những thứ hạng cao, thuộc Top 6 các quốc gia hàng đầu về dịch vụ gia công phần mềm (2021) theo Xếp hạng về chỉ số vị trí dịch vụ toàn cầu của Kearney. Đồng thời, Việt Nam là một trong hai điểm đến gia công phần mềm hàng đầu ở Đông Nam Á theo Accelerance. Điều này đã cho thấy chất lượng sản phẩm công nghệ đến từ Việt Nam. 

Không dừng lại ở đó, Việt Nam xếp hạng thứ 2 Châu Á Thái Bình Dương và thứ 22 toàn thế giới theo Chỉ số Kỹ năng Toàn cầu (GSI) năm 2020. Chỉ sau Hoa Kỳ, chất lượng Lập trình viên của Việt Nam xếp hạng thứ 2 Thế giới về Khảo sát Freelancer tốt nhất. Hạng 29 trên toàn thế giới trong Bảng xếp hạng kỹ năng dành cho lập trình viên Báo cáo Skill Value 2019. Những thứ hạng trên không chỉ khẳng định sức mạnh tiềm lực của nguồn nhân lực IT Việt Nam mà còn cho thấy tính khả thi cao trong việc tạo ra các sản phẩm trong nước mang hàm lượng công nghệ cao. Nhân tài công nghệ Việt hoàn toàn có thể tạo ra được những sản phẩm “Make In Vietnam”, tạo nên những giá trị lớn lao hơn cho xã hội và quốc gia. Với sự cổ vũ từ phía Chính phủ, đã đến lúc chúng ta trăn trở về giá trị công việc của chính mình, về khả năng cống hiến cho nước nhà cũng như cơ hội phát triển bản thân trong tương lai sắp tới.

Vietnam IT market report - thu hang LTV

Và để tạo ra sự thay đổi, mỗi bên đều có thể đóng góp theo vai trò riêng: các doanh nghiệp nhận thức các thay đổi và thích nghi với các chính sách quản lý hiện đại, các nhân tài công nghệ cần suy nghĩ nhiều hơn về giá trị công việc của mình, cũng như các bên trung gian hỗ trợ và tạo điều kiện tốt hơn.

Tổng kết, TopDev nhận thấy rằng với những cơ hội mới, chân dung Lập trình viên hiện nay đã có rất nhiều sự thay đổi so với trước đây. Tuy nhiên, mỗi sự thay đổi sẽ song hành cùng những thách thức, và ngành Công nghệ vẫn luôn là “mũi nhọn” cho sự phát triển kinh tế Quốc gia, đi đầu đối mặt với thử thách sắp đến. Với sứ mệnh “Make IT Vietnam Better”, TopDev không ngừng nỗ lực củng cố vai trò của mình cũng như tin tưởng rằng sự hợp sức từ các Cấp, Cơ quan, Doanh nghiệp và cả Người lao động sẽ giúp ngành Công nghệ Việt Nam vươn xa, sẵn sàng cạnh tranh với thị trường thế giới.

Báo cáo năm 2022 về thị trường và nhu cầu nhân sự IT do TopDev phát hành đã được đăng tải, độc giả tìm hiểu thêm về xu hướng các ngành Công nghệ trong nước qua bản Vietnam IT Market Report tại đây.

===================

Về TopDev – Đơn vị phát hành Vietnam IT Market Report – Tech Hiring 2022:

Được thành lập từ năm 2015 bởi Applancer JSC, TopDev đã trở thành nền tảng Tuyển dụng CNTT hàng đầu tại Việt Nam với trang web có lượng truy cập lớn tập trung vào CNTT https://topdev.vn (800.000 người truy cập hàng tháng), 350.000+ hồ sơ Lập trình viên & quản lý Cộng đồng Lập trình viên lớn nhất Việt Nam với hơn 550.000 đối tượng IT theo dõi trên mạng xã hội:

  • Đơn vị tiên phong và độc nhất trong lĩnh vực CNTT tại Việt Nam giúp xây dựng và phát triển Thương hiệu Tuyển dụng cho hàng trăm công ty trong nước và quốc tế.
  • Nhà xuất bản uy tín chuyên thực hiện khảo sát, phân tích, dự báo và phát hành báo cáo thường niên về thị trường CNTT & nguồn nhân lực CNTT tại Việt Nam.
  • Đơn vị tổ chức 2 sự kiện công nghệ quy mô lớn nhất Việt Nam: Vietnam Mobile DayVietnam Web Summit.

Chúng tôi mong muốn đem đến giá trị bằng việc: Thúc đẩy nguồn nhân lực IT Việt Nam cả về chất lượng và số lượng thông qua cộng đồng, sự kiện / hoạt động và giáo dục; Kết nối các Lập trình viên với các vị trí tuyển dụng tốt nhất từ các công ty IT đã được xác minh; Cung cấp cho các công ty IT nguồn lập trình viên tốt nhất và xây dựng thương hiệu nhà tuyển dụng lâu dài.

Khám phá các việc làm IT hấp dẫn trên TopDev tại đây.

 

Giới thiệu về StoryBook cho dự án FrontEnd

Giới thiệu về StoryBook cho dự án FrontEnd

Bài viết được sự cho phép của tác giả Phạm Minh Khoa

Storybook là một công cụ thiết kế và phát triển những UI Components cho ứng dụng của bạn trên một môi trường hoàn toàn biệt lập. Storybook mang lại trải nghiệm mới khi thiết kế những UI components tưởng chừng chỉ dừng lại ở khâu design trước khi chuyển sang giai đoạn code Frontend.

Ngày nay khi phát triển một dự án, chúng ta dành rất nhiểu thời gian để xây dựng những UI Components. Hơn hết, chúng ta cần chú trọng làm rành mạch các thuộc tính cũng như hiển thị hết các tính năng cần có (props and states) của những Components này…ngay từ điểm khởi đầu…Không thể phủ nhận đó là cái khó trong một dự án Frontend!

Dựa vào design ta có thể hoàn thiện một Component, hay thậm chí hoàn thành cả một Page. Nhưng bạn có chắc chắn chất lượng code vừa hoàn thiện đã cover toàn bộ các trường hợp? Những người đồng hành có tái sử dụng được hay bạn không viết lại một cái đã có 80% rồi?… Tất cả liệu đã tường minh?…

Storybook đã có ~28k star ở thời điểm này và nó được sử dụng rộng rãi bởi những ông lớn như Airbnb, Coursera, LonelyPlanet. Hãy bắt đầu khai thác lợi ích mà Storybook có thể mang lại.

Hãy lấy ví dụ trực quan, hãy tưởng tượng bạn đối mặt với một trong hai trường hợp sau trong dự án Frontend:

  • Trường hợp lý tưởng: Design đã xong 98%, đã có StyleGuide, gần như các phần core là cố định sẽ không có thay đổi lớn nào.
  • Trường hợp éo le: Design mới chỉ hoàn thành 60%, dự án lên kế hoạch làm những phần chính Frontend song song với design, vừa làm vừa cập nhật.

Trường hợp éo le, bạn hoàn toàn có lý do để chia nhau ra code những page đã hoàn thành trước, làm được gì hay được đó, đơn giản vì chưa có StyleGuide cover toàn bộ dự án. Nhưng thực tế là dù có được đưa vào trường hợp lý tưởng, chúng ta cũng bỏ qua bước thiết kế từng Component mà thường bắt tay ngay vào từng page cụ thể, và chỉ xem StyleGuide như một tài liệu tham khảo, người trước làm chưa đủ thì người sau xem lại và bổ sung.

Storybook sẽ là một lời giải cho bài toán này

  • Chúng ta sẽ gọi các UI Components vừa thực hiện ra và gán cho nó một ‘câu chuyện’ – Đó chính là hiển thị toàn bộ các props và state. Bất cứ ai khi viết xong Components của mình đều có thể tạo ra câu chuyện của mình được, hoàn toàn không conflict.
  • Những câu chuyện này hiển thị đầy đủ và độc lập – Storybook chạy ở một port riêng, có thể chạy song song với dự án. Việc này giúp ích chúng ta rất nhiều khi chỉnh sửa và theo dõi trạng thái của các elements, rất trực quan và nhanh chóng.

Bạn có thể tham khảo 1 số storybook dưới đây:

  • Coursera: https://building.coursera.org/coursera-ui/
  • GumGum: http://gumdrops.gumgum.com/index.html

Xem ngay các tin đăng tuyển dụng Front-end lương cao trên TopDev

Ví dụ sử dụng Storybook

Chúng ta cùng thử triển khai 1 storybook với ví dụ dưới đây:

import React from 'react'
import MainSection from '../MainSection'
import { storiesOf } from '@storybook/react'
import { action } from '@storybook/addon-actions'

storiesOf('MainSection', module)
  .add('all active', () => {
    const todoItems = [
      { id: 'one', text: 'Item One', completed: false },
      { id: 'two', text: 'Item Two', completed: false },
    ];

    return getMainSection(todoItems)
  })
  .add('some completed', () => {
    const todoItems = [
      { id: 'one', text: 'Item One', completed: false },
      { id: 'two', text: 'Item Two', completed: true },
    ];

    return getMainSection(todoItems)
  })
  .add('all completed', () => {
    const todoItems = [
      { id: 'one', text: 'Item One', completed: true },
      { id: 'two', text: 'Item Two', completed: true },
    ];

    return getMainSection(todoItems)
  });

function getMainSection(todos) {
  const actions = {
    clearCompleted: action('clearCompleted'),
    completeAll: action('completeAll')
  };

  return (
    <div className="todoapp">
      <MainSection todos={todos} actions={actions} />
    </div>
  )
}

Thực hiện lệnh chạy storybook: npm run storybook ta được kết quả

Ưu điểm của Storybook

Storybook sẽ là một trợ lực đáng giá từ những ngày dự án còn trong trứng nước với những features được khẳng định:

  • Được build với những lib/framework lớn đương đại: Angular, React, Vue.
  • Môi trường phát triển cho từng Component riêng biệt, tách rời, base trên rất nhiều iframe. Giao diện đơn giản, thống nhất, dễ tiếp cận.
  • Suport HMR, bất kể Component của bạn là gì.
  • Chạy bên trong dự án của bạn và có thể sử dụng server static.
  • Extendable với đa dạng plugin (phong phú và chi tiết cho stories của bạn, cũng như có thể đặt hoàn cảnh test…)

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

Xem thêm:

Tham khảo ngay việc làm IT mọi cấp độ trên TopDev!

The Merge – Bước tiến quan trọng của blockchain Ethereum

The Merge – bước tiến quan trọng của blockchain Ethereum

The Merge, một sự kiện rất được chờ đợi đối với blockchain Ethereum và số đông nhà đầu tư cũng như nhà phát triển ứng dụng đang làm việc trên mạng lưới này. Trên trang chủ của mình, Ethereum đã đưa ra deadline cho The Merge vào ngày 19/9/2022, và trên khắp các sàn giao dịch ETH cũng thông báo về sự kiện cũng như việc tạm ngưng các giao dịch liên quan. Vậy The Merge là gì? Tác động của nó đến thị trường tiền mã hóa, blockchain như thế nào? – Bài viết này mình sẽ cùng các bạn đi tìm hiểu về nó nhé.

The Merge là gì?

The Merge hay Ethereum Merge là sự kiện nâng cấp của blockchain Ethereum khi chuyển từ cơ chế đồng thuận POW (Proof-of-Work) sang POS (Proof-of-Stake) và cho ra đời chuỗi Ethereum 2.0 là sự hợp nhất giữa chuỗi Ethereum hiện tại và chuỗi Beacon.

the merge là gì

Nguồn: ethereum.org

The Merge là 1 bước đột phá trong hành trình phát triển của hệ sinh thái blockchain Ethereum với những cải tiến trong công nghệ giúp giảm bớt tài nguyên sử dụng, có khả năng vận hành nhanh và dễ dàng mở rộng hơn, đồng thời vẫn giữ được khả năng bảo mật của nó.

Sự ra đời của ETH 2.0

Trước đây ETH vận hành theo cơ chế PoW với việc các thợ đào coin sẽ dùng sức mạnh của máy đào để giải các bài toán tạo ra mã hash. Sau khi giải xong thì họ sẽ giành được quyền xác thực giao dịch và tạo khối mới trong blockchain (hay nói cách khác là sở hữu coin ETH đó). Nhược điểm của hệ thống PoW chính là hiệu suất đào thấp, chi phí giao dịch cao khiến khả năng mở rộng và tính bảo mật kém của mạng lưới ETH.

Để giải quyết bài toán trên, cha đẻ của mạng Ethereum Vitalik Buterin cùng đội ngũ của ông đã nghiên cứu trong suốt 7 năm để đưa ra cơ chế PoS dành cho việc ra đời ETH 2.0. PoS hoạt động sẽ không có các thợ đào coin như PoW mà thay vào đó, những người tham gia xác thực giao dịch sẽ giải đặt cược lượng coin lớn để giành quyền xác thực giao dịch và tạo khối. Nhờ thế mà PoS không yêu cầu đầu tư phần cứng cho máy đào mà vẫn đảm bảo được hiệu suất cao.

eth 2.0

Nguồn: miro.medium.com

The Merge là sự kiện thuộc phase 1.5 trong quá trình hình thành lên Ethereum 2.0. Trước đó ở phase 0 và phase 1, các thử nghiệm cơ chế Pos trên mạng dưới blockchain này đã được tiến hành và hoàn thiện. Sau khi sự kiện The Merge xảy ra thì các cải tiến liên quan trực tiếp đến tài khoản, giao dịch và hợp đồng thông minh của blockchain này sẽ được áp dụng.

Tham khảo việc làm Blockchain mới nhất tại đây!

Những tác động sau sự kiện The Merge

Ethereum hiện nay đang là blockchain lớn thứ hai chỉ sau Bitcoin và cũng là cơ sở hạ tầng cho rất nhiều ứng dụng quan trọng, chính vì thế mà sự kiện The Merge chắc chắn sẽ có tác động lớn đến Ethereum nói riêng và cả thị trường tiền mã hóa nói chung.

  • Tác động đến Ethereum: Việc chuyển đổi cơ chế sang PoS hứa hẹn mang tới sự ổn định cho ETH và các dự án được xây dựng trên nền tảng này khi mà chi phí cũng như tốc độ được cải thiện đáng kể. 
  • Tác động đến môi trường: Sự cải tiến sau The Merge giúp cắt giảm mức sử dụng năng lượng của Ethereum tới 99,95%, điều đó giúp các công ty lớn có thể yên tâm đầu tư vào ETH mà không cần phải lo ngại các vấn đề về môi trường hay việc giảm lượng khí thải CO2 đồng thời thay đổi cái nhìn của công chúng về tiền mã hóa nói riêng và blockchain nói chung.
  • Tác động đến thị trường: bản thân đồng coin ETH được dự báo sẽ tăng trưởng mạnh mẽ khi triển khai hệ thống PoS, nhu cầu dự trữ ETH để có thể Stake và trở thành một Validator của mạng lưới Ethereum tăng sẽ giúp cho giá trị của ETH tăng trưởng. Về dài hạn, nếu chuỗi Ethereum 2.0 có thể hoạt động ổn định sẽ giúp ETH có thể đáp ứng nhu cầu xanh và nhanh của những tổ chức lớn trên toàn cầu đang đề ra. Xét chung về toàn bộ thị trường Crypto, nếu The Merge diễn ra thành công sẽ thúc đẩy các quỹ đầu tư lớn và các tập đoàn công nghệ tham gia vào giúp thị trường có thể tăng trưởng bền vững.
  • Tác động lên các thợ đào: sau The Merge thì các thợ đào sẽ không thể tham gia vào quá trình mining ra ETH qua các máy đào được nữa, hàng loạt máy đào có thể phải “đắp chiếu”. Đang có kiến nghị về một đợt Hard Fork ETH thành 2 mạng để duy trì việc khai thác ETH thông qua việc đào coin, tuy nhiên không có gì đảm bảo các token từ đợt Hard Fork sẽ có giá trị trong tương lai.

Kết bài

Sự kiện The Merge sẽ là một nhân tố ảnh hưởng lớn đến thị trường trong thời gian tới cho dù nó thành công hay thất bại. Cả thị trường Crypto nói riêng cũng như blockchain nói chung đang trông đợi sự thành công từ sự kiện này để có thể tạo ra một bước tiến quan trọng trong quá trình phát triển của công nghệ này. Hy vọng bài viết này đã đem lại cho các bạn những thông tin hữu ích về sự kiện này, 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:

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

Cơ bản về GraphQL trong Java

GraphQL trong Java

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết Giới thiệu về GraphQL, mình đã giới thiệu với các bạn sơ qua về cách xây dựng một GraphQL server sử dụng Spring Boot. Về bản chất thì Spring Boot đã sử dụng thư viện GraphQL Java và wrap tất cả mọi thứ behind the scenes liên quan đến việc xử lý một câu query của GraphQL của thư viện này rồi. Trong bài viết này, mình sẽ trình bày với các bạn một số kiến thức cơ bản về GraphQL và cách mà thư viện GraphQL Java xử lý một câu query như thế nào các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:

Maven project

GraphQL Java dependency như sau:

Nói về GraphQL, như mình đã đề cập trong bài viết trước, chúng ta phải nói về các type. Ngoài các type định nghĩa cho các đối tượng data mà chúng ta sẽ provide cho client, ví dụ như:

type Student {
  id: ID
  code: String
  name: String
  age: Int
  address: String
  clazz: String
}

GraphQL còn có 3 type đặc biệt là Query, Mutation và Subscription. Trong mỗi type, chúng ta sẽ định nghĩa các fields, và trong mỗi field, chúng ta sẽ có các sub-fields. Để định nghĩa kiểu dữ liệu cho các fields hay sub-fields, các bạn có thể sử dụng các built-in scalar types (https://graphql.org/learn/schema/#scalar-types), định nghĩa enum types (https://graphql.org/learn/schema/#enumeration-types) hoặc định nghĩa các object types như ví dụ ở trên.

Chúng ta có thể định nghĩa một field là non-null sử dụng dấu chấm than, được khai báo phía sau kiểu dữ liệu của field hoặc sub-field, ví dụ như:

type Student {
  id: ID!
  code: String!
  name: String!
  age: Int
  address: String
  clazz: String
}

Sub-fields id, code và name của type Student trên là non-null nha các bạn!

Chúng ta sẽ định nghĩa giá trị của field, sub-field là list sử dụng 2 dấu ngoặc vuông như sau:

type Student {
  id: ID
  code: String
  name: String
}

type Clazz {
  id: ID
  name: String
  students: [Student]
}

GraphQL hỗ trợ nhiều ngôn ngữ lập trình khác nhau https://graphql.org/code/ nên tuỳ nhu cầu thì các bạn có thể sử dụng cho phù hợp. Cho Java, thì như mình đã nói ở trên, chúng ta sử dụng GraphQL Java https://github.com/graphql-java/graphql-java.

Ứng tuyển các vị trí việc làm Java lương cao trên TopDev

Bây giờ, mình sẽ làm một ví dụ để xem cách hoạt động của GraphQL Java hoạt động như thế nào các bạn nhé!

Mình sẽ tạo mới một main class để chạy ứng dụng:

package com.huongdanjava.graphql; public class Application {     public static void main(String[] args) {    } }

Bây giờ, mình sẽ định nghĩa một schema sử dụng type Query với nội dung đơn giản như sau:

String schema = """
        type Query {
            hello: String
        }
        """;

Với schema này, mình đã định nghĩa một field đơn giản là “hello”, data trả về sẽ có kiểu dữ liệu là String.

Chúng ta sẽ sử dụng đối tượng của class SchemaParser và TypeDefinitionRegistry của GraphQL Java để đọc nội dung của schema này:

SchemaParser schemaParser = new SchemaParser();
TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);

Class TypeDefinitionRegistry sẽ nắm giữ thông tin tất cả các type được định nghĩa trong tập tin schema.

Để handle cho từng request tới các type này, chúng ta sẽ sử dụng đối tượng của class RuntimeWiring. Chúng ta sẽ khởi tạo mới đối tượng RuntimeWiring và ứng với mỗi GraphQL type, chúng ta sẽ process cho từng field như sau:

RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring()
    .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")))
    .build();

Như các bạn thấy, cho Query type trong ví dụ của mình, chúng ta sẽ sử dụng đối tượng TypeRuntimeWiring để handle data trả về. StaticDataFetcher implement interface DataFetcher sẽ đảm nhận data được trả về là gì. DataFetcher interface có nhiều implementation khác nhau:

Tuỳ theo nhu cầu của mình, các bạn hãy sử dụng implementation cho phù hợp nhé! Ở đây, mình sử dụng SimpleDataFetcher để trả về value mà mình khai báo khi khởi tạo đối tượng này.

Sau khi đã có đối tượng TypeDefinitionRegistry và RuntimeWiring, chúng ta cần combine chúng lại sử dụng để GraphQL engine có thể sử dụng và thực thi query cho các bạn:

SchemaGenerator schemaGenerator = new SchemaGenerator();
GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);

Class GraphQLSchema sẽ chứa thông tin về query và cách mà ứng dụng GraphQL của chúng ta sẽ trả kết quả về.

Bây giờ là lúc GraphQL engine sẽ thực thi query cho chúng ta:

GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();
ExecutionResult executionResult = build.execute("{hello}");

System.out.println(executionResult.getData().toString());

Như các bạn thấy chúng ta sẽ sử dụng đối tượng của class GraphQL được khởi tạo từ đối tượng GraphQLSchema để thực thi câu GraphQL, kết quả sẽ như sau:

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

Xem thêm:

Việc làm IT mọi cấp độ mới nhất trên TopDev

Những câu hỏi phỏng vấn React thường gặp

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

React là thư viện front-end được rất nhiều công ty sử dụng hiện nay, nhu cầu tuyển dụng cho vị trí này cũng rất lớn. Nếu bạn đang chuẩn bị tham gia vào những cuộc phỏng vấn cho vị trí lập trình viên React thì bài viết này là dành cho bạn. Đây là tổng hợp những câu hỏi phỏng vấn React thường gặp nhất từ cơ bản đến nâng cao sẽ giúp bạn tự tin hơn cho cuộc phỏng vấn sắp tới của mình.

React là gì? Những tính năng chính của React.

React là một thư viện mã nguồn mở viết bằng ngôn ngữ JavaScript (JS), được Facebook phát triển từ hơn 10 năm nay. Nó được xây dựng bằng cách tiếp cận theo hướng dựa trên thành phần (component-based) giúp có thể dễ dàng tái sử dụng lại các phần UI/UX trên các màn hình khác nhau.

React thích hợp cho việc tạo ra các ứng dụng một trang (Single Page App) dành cho cả web và thiết bị di động, vì thế hiện nay có rất nhiều các công ty lựa chọn React làm thư viện để phát triển các ứng dụng của mình.

Các tính năng chính của React bao gồm:

  • Sử dụng DOM ảo (VirtualDOM) để quản lý sự thay đổi và cập nhật trạng thái của các đối tượng trên DOM thật. VirtualDOM sẽ xác nhận những thành phần cần phải cập nhật và thực hiện việc render lại thành phần đó trên DOM thật thay vì cập nhật lại tất cả cùng một lúc, từ đó giúp hiệu năng của các ứng dụng React trở nên tốt hơn.
  • Component-Based: với React thì tất cả đều được tạo nên từ components (thành phần). Một trang web phức tạp như Facebook cũng được tạo nên từ hàng nghìn components độc lập, dễ dàng tái sử dụng hay chỉnh sửa mà không ảnh hưởng đến các thành phần khác.
  • Liên kết dữ liệu một chiều: khi thiết kế ứng dụng React, các component con sẽ được lồng trong component cha, dữ liệu sẽ được truyền từ cha xuống con theo một chiều nhanh chóng và thống nhất

Sự khác nhau giữa ReactJs và React Native.

React Native được team phát triển Facebook ra mắt 2 năm sau khi ra mắt ReactJs, nó được dùng để phát triển các ứng dụng dành cho mobile (không phải chạy trên nền web). React Native và ReactJs có chung nguyên lý phát triển, ngôn ngữ sử dụng, các đặc trưng của React vì thế nên có thể dễ dàng học và sử dụng cả hai nền tảng này cùng lúc. 

Điểm khác nhau ở đây là trong khi React Native là một framework hoàn chỉnh có thể giao tiếp với native API để build ra các ứng dụng chạy trên nền tảng di động như Android hay iOS; thì ReactJs vốn dĩ chỉ là một thư viện UI dành cho web, nó cần thêm một số các thư viện khác giúp cho việc build, setup môi trường thì mới có thể tạo ra được một ứng dụng hoàn chỉnh. Một điểm khác nhau nữa trong cách viết code đó là việc React Native không sử dụng HTML vì nó không phải viết để chạy trên web như ReactJs, thay vào đó nó cung cấp cho các lập trình viên các component hoạt động tương tự (hầu hết là được biến đổi từ các phần tử tương đương trong HTML).

Phân biệt khái niệm Component và Element trong React

Khái niệm React Element dùng để chỉ những gì được hiển thị lên màn hình như một nút bấm (button), một ô nhập liệu (input) hay cả một modal đăng nhập. Một Element có thể chứa nhiều elements khác, giống như trên modal đăng nhập thì có thể chứa ô input nhập usernam và password cùng với cả button thực hiện đăng nhập.

Trong source code, để tạo ra được React Element thì chúng ta sẽ sử dụng một function hoặc class để render ra nó, và phần function hay class đó được gọi là React Component.

React cung cấp function tạo ra Element như sau:

const Button = ({ onLogin }) => React.createElement(
  'div',
  { id: 'login-btn', onClick: onLogin },
  'Login'
)

Trong đoạn code trên Button là một React Component và sẽ thực hiện việc render ra màn hình một Element là thẻ div với các thuộc tính như id hay onClick được truyền vào.

Lifecycle của component trong React

Lifecycle (vòng đời) của một component trong React có 3 giai đoạn:

  • Mounting: giai đoạn khởi tạo – khi component đã sẵn sàng để gắn kết trong DOM của trình duyệt để hiển thị lên cho người dùng.
  • Updating: giai đoạn component được cập nhật – để cập nhật component thì chúng ta có thể truyền props mới đến component hoặc set lại local state bên trong component đó. Sau khi component render lại thì cây DOM vị trí chứa component cũng sẽ được hiển thị với các giá trị mới để người dùng nhìn thấy.
  • Unmounting: giai đoạn component bị ngắt kết nối, bỏ ra khỏi cây DOM của trình duyệt. Đây cũng là giai đoạn cuối trong vòng đời của component. Từ lúc này component sẽ không thể được truy cập hay tác động nữa trừ khi nó được mouting và bắt đầu mộ lifecycle mới.

Với class component, React cung cấp cho chúng ta các lifecycle method như componentDidMount, componentDidUpdate, componentWillReceiveProps, componentWillUnMount để quản lý các sự kiện xảy ra ở từng giai đoạn trong vòng đời của nó. Còn trong functional component, React cung cấp Hook useEffect cho việc xử lý này. Ví dụ bài toán muốn call API lấy dữ liệu về khi vào màn hình, chúng ta có thể xử lý như sau:

  • Với class component:
componentDidMount() {
    fetchApi(); //thực hiện call api
}
  • Với functional component:
useEffect(() => {
    fetchApi(); //thực hiện call api

}, []);

Higher-Order Components là gì?

Higher-Order Component (HOC) là một kỹ thuật nâng cao trong React được sử dụng cho mục đích tái sử dụng logic của Component. HOC bản chất là một function nhận tham số đầu vào gồm 1 Component và các logic được tái sử dụng để tạo ra được một Component mới. HOCs là 1 pattern rất quan trọng giúp React trở nên hữu ích hơn rất nhiều khi ngoài việc tái sử dụng phần UI, giờ chúng ta có thể tái sử dụng được cả phần logic code.

HOCs rất phổ biến trong các thư viện bên thứ ba hay được sử dụng cùng với React như Redux – một thư viện giúp quản lý các global state trong ứng dụng.

Redux là gì? Tại sao phải sử dụng Redux trong ứng dụng React

Redux là 1 công cụ giúp quản lý các biến global state trong ứng dụng React hay các thư viện JavaScript nào khác. Khi ứng dụng của chúng ta trở nên lớn hơn với hàng trăm hay hàng nghìn components thì việc chia sẻ dữ liệu giữa các Components với nhau cũng trở nên phức tạp hơn. Redux tạo ra 1 store lưu trữ dữ liệu của ứng dụng vào một nơi duy nhất, sau đó bằng cách connect đến store thì Component của chúng ta có thể lấy ra để sử dụng hoặc cập nhật để thay đổi giá trị biến.

3 thành phần cơ bản trong Redux gồm:

  • Store: Nơi giữ các biến trạng thái của ứng dụng, với mô hình Redux thì sẽ chỉ tồn tại một store duy nhất
  • Actions: các sự kiện được gửi đến để cập nhật dữ liệu các biến trong store của Redux
  • Reducers: là các function để lấy ra giá trị (trạng thái) của các biến trong store

React Hook là gì? Bạn đã từng viết custom Hook nào chưa?

Hooks là những function cho phép bạn sử dụng các biến state và các hàm liên quan đến lifecycle ở trong các functional Components. Hooks giúp giảm lượng code thừa khi phải triển khai lại các logic có thể dùng chung ở nhiều components khác nhau mà cần liên quan đến local state. React cung cấp sẵn cho chúng ta một số các hook hữu ích: useState, useEffect, useContext, useMemo, ….

Chúng ta cũng có thể tự viết những custom Hook riêng cho mình như ví dụ dưới đây: useWindowSize là 1 hook có tác dụng lấy kích thước của khung trình duyệt web hiện tại.

import { useState, useEffect } from 'react' export const useWindowSize = () => {   const [windowSize, setWindowSize] = useState({     width: window.innerWidth,     height: window.innerHeight,   })   useEffect(() => {     const handler = () => {       setWindowSize({           width: window.innerWidth,           height: window.innerHeight,       })     }     window.addEventListener('resize', handler)     return () => {         window.removeEventListener('resize', handler)     }   }, [])   return windowSize }

Có những cách nào để styling trong React

Có vài cách để thiết lâp CSS cho các component trong React như sau:

  • Inline Styling: khai báo trực tiếp CSS vào thuộc tính style trong code JS
<h1 style={{color: "blue"}}>Hello world! </h1>
  • CSS module: tạo file .css riêng và import vào component
//content.css
.content {
  color: blue;
}
//content.js
import styles from './content.css';
<h1 className={styles.content}>Hello world!</h1>
  • Sử dụng thư viện styled-components tạo ra 1 component mới kèm css
const Content = styled.h1({
  color: blue,
});

Tổng kết

Trên đây là tổng hợp của mình về một số câu hỏi hay gặp nhất khi các bạn tham gia phỏng vấn cho vị trí lập trình viên React. Hy vọng bài viết đã giúp các bạn có thể tư tin hơn và đạt được kết quả tốt nhất cho đợt tuyển dụng sắp tới. 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:

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