Home Blog Page 140

Các khái niệm căn bản trong kiến trúc phần mềm

Kiến trúc phần mềm

Bài viết được sự cho phép của tác giả Edward Thien Hoang

Trong bài viết này, hãy cùng điểm qua các khái niệm căn bản trong kiến trúc phần mềm để có thể hiểu rõ hơn trong các bài viết về sau.

  19 tips cho các kỹ sư phần mềm hữu ích trong 2024
  3 workhack để duy trì năng lượng tích cực tại công sở cho kĩ sư phần mềm

NO SILVER BULLETS!

Điều đầu tiên, cho dù bạn nghĩ thế nào đi nữa thì chắc chắn sẽ không có chuyện 1 bước lên mây, bạn không thể hi vọng có thể áp dụng 1 kiến trúc cho tất cả các vấn đề gặp phải dù cho kiến trúc đó có good cỡ nào, một đôi giày triệu $ chắc gì đã làm bạn thấy thoải mái và vừa vặn. Hãy học hỏi thật nhiều các cách tiếp cận khác nhau, ưu nhược của từng cái, vấn đề mà nó giải quyết. Hãy chắc chắn là bạn hiểu rõ dự án của bạn cần gì, hiểu rõ kiến thức nghiệp vụ và yêu cầu của khách hàng, từ đó sẽ đi đến việc quyết định lựa chọn / tùy chỉnh mô hình nào phù hợp nhất.

Rõ ràng là không dễ để những người trẻ tuổi, có ít hoặc không có kinh nghiệm trong việc chọn lựa mô hình kiến trúc nào phù hợp với yêu cầu của dự án. Bằng cách tham khảo các dự án đi trước, tham vấn ý kiến, kinh nghiệm từ những người dày dặn cộng với kiến thức đã học được về kiến trúc phần mềm sẽ giúp bạn đỡ bối rối hơn khi giải quyết các vấn đề ở mức vĩ mô hơn.

Trong kỹ nghệ phần mềm có hàng trăm các thuật ngữ nhập nhằng, mơ hồ được đưa ra khiến cho việc sử dụng và hiểu biết của chúng ta bị nhầm lẫn thậm chí hiểu sai. Cùng làm rõ 1 số thuật ngữ chuyên dùng nhất ở phía dưới đây (tôi dùng nguyên bản tiếng Anh cho tiện refer về sau):

FUNCTIONAL

Là những đơn vị code (dòng code, method, class hoặc nhóm các class) đề cập đến khía cạnh kỹ thuật của ứng dụng. Functional không liên quan đến nghiệp vụ. Ví dụ một số functional thường gặp: Layers Factories Repositories Value Objects Views ViewModels ConceptualLà những đơn vị code phản ánh các khái niệm nghiệp vụ của ứng dụng, ví dụ như: User Product Checkout Post Comment Review Một điểm lưu ý là một đơn vị code có thể đảm nhận luôn 2 chức năng là Functional và Conceptual. Ví dụ như class “Money” vừa có thể thể hiện như 1 domain concept hoặc có thể coi như là 1 Value Object. (không có ID, có thể immutable,…)

PACKAGE

Tập các class được group lại với nhau theo 1 số rule.

MODULE

Theo định nghĩa từ cuốn Software Architecture in Practice thì một module là 1 functional package, nó phản án 1 technical capability (tính năng kỹ thuật) trong ứng dụng. Các module có tính độc lập (decoupled) và một module có thể được thay thế bởi một module khác mà ứng dụng vẫn có thể hoạt động. Ví dụ ta có 1 “Security Module” hoặc “ORM”, hoặc cao hơn nữa, ta có thể xem Client và Server là 2 module của ứng dụng. Module tạo ra tính gắn kết về mặt chức năng kỹ thuật (Functional cohesion) nghĩa là tập các đơn vị code làm chung một Functional sẽ được đóng gói vào một module.

COMPONENT

Ngược lại với Module, theo định nghĩa từ cuốn Software Architecture in Practice thì một Component là một conceptual package, nó phản ánh một business capability (tính năng về nghiệp vụ). Và tất nhiên nó cũng có tính độc lập với các component và module khác. Ví dụ ta có User component, Product component, Checkout component.Một chú ý rất quan trọng đó là component phản ánh 1 bounded context, nó cung cấp tính gắn kết về mặt chức năng nghiệp vụ.Lưu ý: bounded context là thuật ngữ dùng trong Domain Driven Design, đề cập đến việc phân rã nghiệp vụ thành các nghiệp vụ đơn lẻ, nhỏ hơn mà vẫn đảm bảo ý nghĩa của nó trong toàn bộ hệ thống, khi đó bounded context được xem như là cái bao trùm và diễn tả cho nghiệp vụ đó.

APPLICATION

Tác giả xem application là UI – user-facing code, cái được build phía trên cùng và sử dụng các nền tảng nghiệp vụ phía dưới (components). Lấy ví dụ về Web shop, chúng ta có 1 tập các component về nghiệp vụ của 1 web shop. Chúng ta cũng có 2 là trang bán hàng (storefront) cung cấp các UI đến khác hàng và trang admin dùng để quản lý nội bộ. Trang bán hàng và admin có thể coi đó như 2 application sử dụng các nền tảng nghiệp vụ phía dưới.

SYSTEM

System là một tập các applications làm việc, tương tác cùng với nhau nhằm phục vụ các nhu cầu của một doanh nghiệp, tổ chức, hay còn được gọi với cái tên mỹ miều hơn: Enterprise Application. Các application trong 1 system có thể hoặc không xây dựng dựa trên cùng một nền tảng nghiệp vụ. Cũng ví dụ về web shop, trang bán hàng và trang admin phụ thuộc vào các nghiệp vụ bán hàng, tuy nhiên bên cạnh đó còn có các application bên thứ 3 khác liên kết trong hệ thống của mình đó là dịch vụ thanh toán, hoặc dịch vụ vận chuyển.

Động não: REST API có phải là 1 application? Các dịch vụ thanh toán, vận chuyển trong ví dụ trên nếu không có UI thì có thể được gọi là application hay không? Liệu bạn có muốn thay đổi định nghĩa về 1 application hay không?

Tham khảo thêm về Services vs. Applications

ARCHITECTURE

Theo wikipedia thì kiến trúc phần mềm của một chương trình máy tính hay một hệ thống tính toán là cấu trúc của các thành phần trong hệ thống đó. Kiến trúc phần mềm bao gồm các phần tử phần mềm, các thuộc tính và mối quan hệ giữa chúng. Ngoài ra, thuật ngữ “kiến trúc phần mềm” cũng đề cập đến các tài liệu kiến trúc phần mềm của một hệ thống, thuận tiện cho việc trao đổi thông tin giữa các thành viên trong một dự án. Kiến trúc phần mềm giúp việc quyết định ở mức cao trong thiết kế phần mềm dễ dàng hơn và cho phép tái sử dụng các thành phần và mẫu thiết kế của các dự án.

Ngoài ra còn có rất nhiều định nghĩa về Software Architecture, tuy nhiên tôi lại thích cách diễn đạt về Architecture bằng cách nói về két quả đầu ra của Architecture

Khi nói về Architecture, điều đó có nghĩa là:

  • Tất cả các quyết định kỹ thuật xuyên suốt tất cả các vấn đề phát triển phần mềm. Ví dụ như: frameworks, coding standards, documentation, process, …;
  • Những quyết định về mặt kỹ thuật rất khó thay đổi về sau trong dự án Big picture (cái view tổng thể) của cả system.
  • Những bản vẽ tổng quan ban đầu về hình hài của system, cấu trúc và mối liên hệ giữa các components
  • Nó chuẩn bị cho dự án sao cho có thể trì hoãn các quyết định (về framework, view, db, …) càng lâu càng tốt.
  • Nó chuẩn bị cho dự án để tái sử dụng các thành phần và mô-đun
  • Nó thiết lập các chuẩn trong việc nhất quán về mặt kết quả và Nó không phải là trách nhiệm của chỉ một người, mà là của một nhóm các nhà phát triển giàu kinh nghiệm thuộc các nhóm đặc trưng khác nhau trong dự án.

ARCHITECT

Về cơ bản, kiến trúc sư phần mềm chịu trách nhiệm cho thiết kế hệ thống phần mềm và đảm bảo rằng nó đáp ứng các yêu cầu của doanh nghiệp cũng như yêu cầu hệ thống của kết cấu nền của công ti. Kĩ năng đặc biệt này yêu cầu nhiều năm kinh nghiệm phát triển phần mềm trong các nền, ngôn ngữ và công nghệ nào đó. Trước khi thiết kế hệ thống, kiến trúc sư phần mềm phải làm việc chặt chẽ với kĩ sư yêu cầu hay người phân tích doanh nghiệp để hiểu các yêu cầu của khách hàng rồi hỗ trợ cho người quản lí dự án phát triển kế hoạch dự án nơi việc chia các yêu cầu thành những nhiệm vụ nhỏ hơn là mấu chốt.

SMELLS OF A BAD ARCHITECTURE (AND BAD CODE)

RIGIDITY (CỨNG NHẮC)

Phần mềm được gọi là cứng nhắc khi nó rất khó thay đổi vì thay đổi này sẽ dẫn đến những thay đổi khác mà không thấy điểm dừng.

FRAGILITY (DỄ VỠ)

Một phần mềm dễ vỡ là khi chỉ một thay đổi nhỏ cũng có thể dẫn đến những behavior không mong muốn và không thể dự đoán.

Immobility (không có tính di động)Một thiết kế không có tính di động (tái sử dụng) là khi nó không thể tách ra hoặc tốn quá nhiều effort để tái sử dụng cho nhiều thành phần khác nhau.

VISCOSITY (LÕNG LẼO)

Trong một hệ thống lõng lẽo là hệ thống dễ dàng để làm sai hơn là làm đúng. Nghĩa là khi ta muốn thực hiện một thay đổi, thay vì làm theo quy định trong thiết kế, ta lại đi “đường tắt” để làm việc đó. Điều đáng nói ở đây không phải là việc ta được đi đường tắt, mà bản thân thiết kế đã không có những ràng buộc chắc chắn để không ai có thể vi phạm và phá vỡ cấu trúc của hệ thống.

Đọc thêm về Technical Debt và Legacy System

NEEDLESS REPETITION (TRÙNG LẮP)

Điều này xảy ra khi các khái niệm trừu tượng (abstraction) cần thiết không được thực hiện, hoặc là do thiếu thời gian hoặc thiếu kinh nghiệm. Mã có thể đã không được dán sao chép nhưng các quy tắc kinh doanh tương tự được định nghĩa ở nhiều nơi.

OPACITY (KHÔNG RÕ RÀNG)

Mã đã được viết bằng một cách mờ đục và khó hiểu, và chúng ta cần phải nhảy vào từng method để hiểu những gì đang làm.

NEEDLESS COMPLEXITY (PHỨC TẠP KHÔNG CẦN THIẾT)

Việc tạo ra các khái niệm trừu tượng là rất cần thiết để có thể dễ dàng thay đổi và mở rộng trong tương lai, tuy nhiên trong 1 số nỗ lực để tránh các smell ở trên thì các nhà thiết kế có thể sẽ rơi vào bẫy phức tạp hóa vấn đề. Thiết kế phần mềm tốt nhẹ, linh hoạt, dễ đọc và dễ hiểu và trên hết là dễ thay đổi, tuy nhiên bạn không phải cố gắng dự đoán tất cả những thay đổi có thể xảy ra trong tương lai.

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:
Software Architecture Premises

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

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

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

NoSQL là gì? Điểm mạnh vượt trội của NoSQL

NoSQL là gì? Điểm mạnh vượt trội của NoSQL

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

Thời gian gần đây NoSQL nổi lên như là một loại hình cơ sở dữ liệu mới. Hỗ trợ đầy đủ, hiệu năng không thua kém cấu trúc SQL truyền thống. Tuy nhiên, điểm mạnh NoSQL thực sự nằm ở đâu, điều gì làm NoSQL trở thành lựa chọn tuyệt vời trong một số trường hợp?

Bài viết dưới đây cung cấp cho anh em cái nhìn tổng quan NoSQL là gì, trường hợp nào nên sử dụng, khi nào không, tất tần tật sẽ được giải đáp.

NoSQL là gì?
Hiểu điểm mạnh NoSQL để đỡ phải lăn tăn sau này

NoSQL là gì?

NoSQL (Not only SQL) là một loại cơ sở dữ liệu không quan hệ (non-relational database), được xây dựng dành riêng cho mô hình dữ liệu có sơ đồ linh hoạt để xây dựng các ứng dụng hiện đại (như document-oriented, key-value, column-family, graph,…).

Cơ sở dữ liệu NoSQL được công nhận rộng rãi vì tính dễ phát triển, có khả năng mở rộng theo chiều ngang (horizontal scaling) để xử lý lượng dữ liệu lớn, mở rộng chức năng cũng như hiệu năng ở quy mô lớn.

Cần lưu ý rằng NoSQL tỏ ra vượt trội hơn về khả năng dễ phát triển và tính linh hoạt.

8 tính năng chính của NoSQL

  • Sơ đồ động (Dynamic schema): Cơ sở dữ liệu NoSQL không có sơ đồ cố định và có thể điều chỉnh các cấu trúc dữ liệu đang thay đổi mà không cần di chuyển hoặc thay đổi sơ đồ.
  • Khả năng mở rộng ngang (Horizontal scalability): Cơ sở dữ liệu NoSQL được thiết kế để mở rộng ra bằng cách thêm nhiều nút vào một cụm cơ sở dữ liệu, làm cho chúng phù hợp để xử lý lượng lớn dữ liệu và mức độ lưu lượng truy cập cao.
  • Dựa trên tài liệu (Document-based): Một số cơ sở dữ liệu NoSQL, chẳng hạn như MongoDB, sử dụng một mô hình dữ liệu dựa trên tài liệu, trong đó dữ liệu được lưu trữ ở định dạng bán cấu trúc không có sơ đồ, chẳng hạn như JSON hoặc BSON.
  • Dựa trên khóa-giá trị (Key-value-based): Một số cơ sở dữ liệu NoSQL khác, chẳng hạn như Redis, sử dụng một mô hình dữ liệu dựa trên khóa-giá trị, trong đó dữ liệu được lưu trữ dưới dạng một bộ sưu tập các cặp khóa-giá trị.
  • Dựa trên cột (Column-based): Một số cơ sở dữ liệu NoSQL, chẳng hạn như Cassandra, sử dụng một mô hình dữ liệu dựa trên cột, trong đó dữ liệu được tổ chức thành các cột thay vì các hàng.
  • Phân tán và khả năng sẵn sàng cao (Distributed and high availability): Cơ sở dữ liệu NoSQL thường được thiết kế để có sẵn cao và tự động xử lý lỗi nút và sao chép dữ liệu trên nhiều nút trong một cụm cơ sở dữ liệu.
  • Tính linh hoạt (Flexibility): Cơ sở dữ liệu NoSQL cho phép các nhà phát triển lưu trữ và truy xuất dữ liệu một cách linh hoạt và động, với hỗ trợ cho nhiều loại dữ liệu và các cấu trúc dữ liệu đang thay đổi.
  • Hiệu suất (Performance): Cơ sở dữ liệu NoSQL được tối ưu hóa cho hiệu suất cao và có thể xử lý một khối lượng lớn các thao tác đọc và ghi, làm cho chúng phù hợp cho dữ liệu lớn và các ứng dụng thời gian thực.

Ưu điểm nổi bật của NoSQL

Các ưu điểm vượt trội của NoSQL so với cơ sở dữ liệu quan hệ (SQL) bao gồm:

Tính co giãn (Scalability)

NoSQL có khả năng mở rộng theo chiều ngang (horizontal scaling) một cách dễ dàng bằng cách thêm máy chủ, cho phép xử lý lượng dữ liệu lớn. Điều này rất hữu ích trong các ứng dụng có lưu lượng dữ liệu lớn và không đồng nhất.

Hiệu suất (Performance)

NoSQL thường có hiệu suất cao hơn so với SQL khi xử lý dữ liệu lớn và phi cấu trúc. Các cơ sở dữ liệu NoSQL thường sử dụng các cấu trúc dữ liệu tối ưu hóa cho các truy vấn cụ thể.

Linh hoạt (Flexibility)

Các mô hình dữ liệu của NoSQL (document-oriented, key-value, etc.) cho phép lưu trữ dữ liệu phi cấu trúc một cách dễ dàng. Không cần phải định nghĩa sơ đồ dữ liệu trước khi lưu trữ dữ liệu, cho phép dễ dàng thay đổi và phát triển.

Khả năng sẵn sàng (Availability)

Nhiều cơ sở dữ liệu NoSQL được thiết kế để có tính sẵn sàng cao, cho phép duy trì hoạt động ngay cả khi có sự cố. Điều này được đạt được thông qua việc phân phối dữ liệu trên nhiều máy chủ.

Tính đa dạng (Diversity)

NoSQL cung cấp nhiều mô hình dữ liệu khác nhau như document-oriented, key-value, column-family, graph, etc. Điều này cho phép chọn mô hình phù hợp nhất với từng ứng dụng cụ thể.

Chi phí thấp (Cost-effectiveness)

Cơ sở dữ liệu NoSQL thường tiết kiệm chi phí hơn so với cơ sở dữ liệu quan hệ truyền thống vì chúng thường ít phức tạp hơn và không yêu cầu phần cứng hoặc phần mềm đắt tiền.

Nhược điểm của NoSQL

  • Thiếu chuẩn hóa: Có nhiều loại cơ sở dữ liệu NoSQL khác nhau, mỗi loại đều có điểm mạnh và điểm yếu riêng. Điều này có thể làm cho việc lựa chọn cơ sở dữ liệu phù hợp cho một ứng dụng cụ thể trở nên khó khăn.
  • Các cơ sở dữ liệu NoSQL không đảm bảo hoàn toàn tính ACID (Atomicity, Consistency, Isolation, Durability). Điều này có thể là hạn chế đối với các ứng dụng yêu cầu đảm bảo tính nhất quán và toàn vẹn của dữ liệu.
  • Quản lý dữ liệu lớn trong NoSQL phức tạp hơn so với cơ sở dữ liệu quan hệ.
  • Một số NoSQL lưu trữ dữ liệu dưới dạng JSON, khiến kích thước tài liệu trở nên lớn.

>> Đọc thêm: TOP 15 Hệ quản trị cơ sở dữ liệu nên dùng nhất hiện nay

Một số loại mô hình CSDL NoSQL

Key-Value (K-V) Stores

Key-value là loại cấu trúc thường được sử dụng nhất trong các Hệ CSDL NoSQL.

mô hình CSDL NoSQL - Key-Value (K-V) Stores

This model is also the fastest way to get data by known key, but without the flexibility of more advanced querying.

Model này là cách nhanh chóng để lấy dữ liệu bằng cách cung cấp key. Tránh được việc phải viết thêm nhiều query để collect data

Hình dưới đây là Key-value được lưu trữ trong collection ở Firebase. Với một key (được Firebase định danh duy nhất), ta có thể lấy ra tất cả field được store với key này.

Điểm mạnh NoSQL chính là ở chỗ này, một key có thể lấy ra nhiều value, số lượng item trong value cũng flexible, có thể tùy biến được.

It may be used for data sharing between application instances like distributed cache or to store user session data.

Ngoài, sử dụng Key-value còn hữu ích nếu muốn chia sẻ giữa các application trong hệ thống distributed cache hoặc lưu giữa user session data.

Document Stores

Ngoại trừ Key-value sử dụng phổ biến, NoSQL cũng hỗ trợ Document Stores

mô hình CSDL NoSQL - Document Stores

Document store is a data model for storing semi-structured document object data and metadata. The JSON format is normally used to represent such objects.

Document store là loại lưu trữ bán cấu trúc, gồm các đối tượng dữ liệu và siêu dữ liệu. Thông thường kiểu JSON được sử dụng để lưu trữ kiểu này

Thay vì tạo các column lưu trữ VARCHAR, CHAR rồi store JSON. Một số platform hỗ trợ lưu trữ các object JSON, dễ dàng để store và collect hơn. Đây là điểm mạnh NoSQL có được, vượt lên so với các hệ cơ sở dữ liệu SQL truyền thống.

Column-Oriented Stores

Lưu trữ hướng về cột (Column Oriented Stores) gần giống như relations ship giữa các primary key bên phía SQL.

mô hình CSDL NoSQL - Column-Oriented Stores

It is similar to a relational database index, however a column family may be an arbitrary collection of columns.

Gần giống như quan hệ giữa database index, tuy nhiên một họ cột có thể là một tập hợp các cột tùy ý.

Ngoài ra:

This particular approach is used for very large scalable databases to greatly reduce time for searching data. It is rarely used outside of enterprise level applications.

Cách tiếp cận cụ thể này được sử dụng cho các cơ sở dữ liệu có khả năng mở rộng. Giúp giảm đáng kể thời gian tìm kiếm dữ liệu. Loại này thường được sử dụng cho các application ở cấp doanh nghiệp.

Graph stores

Mô hình dữ liệu Graph Database được lưu trữ dưới dạng các nút (nodes), các mối quan hệ (edges) và các thuộc tính (properties). Các nút có thể là bất kỳ đối tượng, địa điểm hoặc cá nhân nào.

mô hình CSDL NoSQL - Graph stores

Các mối quan hệ (edges) định nghĩa các mối liên kết giữa các nút.

Graph Databases rất thích hợp cho việc lưu trữ và quản lý mạng lưới các mối kết nối giữa các thực thể trong dữ liệu như mạng xã hội, hệ thống khuyến nghị, phát hiện gian lận, quản lý quan hệ khách hàng, v.v.

Ví dụ về Graph Database: Neo4j là một ví dụ về Graph Database, được xây dựng trên nền tảng Java với cộng đồng mã nguồn mở. Neo4j cung cấp cả phiên bản miễn phí (community edition) và các bản có license để sử dụng các tính năng nâng cao như sao lưu và tính sẵn sàng cao.

NoSQL vs SQL

SQL hay NoSQL sẽ phù hợp hơn cho dự án của bạn? Cùng điểm qua một vài so sánh cơ bản về hai loại database này trong bảng dưới đây:

Tiêu chí NoSQL SQL
Mô hình dữ liệu Dữ liệu được lưu trữ dưới dạng tài liệu, bảng, đồ thị, column-family, hoặc cấu trúc dữ liệu khác. Dữ liệu được lưu trữ dưới dạng các bảng với hàng và cột.
Cấu trúc dữ liệu Linh hoạt, không cần theo một cấu trúc cứng nhắc. Cấu trúc cứng nhắc, đòi hỏi định nghĩa bảng và các ràng buộc trước khi lưu trữ dữ liệu.
Quan hệ dữ liệu Không có quan hệ chuẩn như trong SQL, thường sử dụng denormalization. Quan hệ giữa các bảng được định nghĩa rõ ràng bằng các khóa chính và khóa ngoại.
Tính mở rộng Mở rộng theo chiều ngang (scale-out) bằng cách thêm nút vào hệ thống. Mở rộng theo chiều dọc (scale-up) bằng cách nâng cấp phần cứng.
Sử dụng Phù hợp với dữ liệu có cấu trúc không chuẩn và yêu cầu tính mở rộng cao. Phù hợp với dữ liệu có cấu trúc chuẩn và yêu cầu tính nhất quán cao.
Ví dụ MongoDB, Cassandra, Redis, Couchbase. MySQL, PostgreSQL, Oracle, SQL Server.

Nên sử dụng NoSQL trong trường hợp nào?

Khi cấu trúc dữ liệu chưa hoàn chỉnh

Thực tế, thời gian cho vòng đời một phần mềm (Software) đang ngày càng rút ngắn. Không thể cứng nhắc là phải có Database Structure rõ ràng mới bắt đầu phát triển phần mềm. Tùy vào đặc thù của từng dự án để linh động trong giải quyết vấn đề.

Hiện tại, nếu table A được định nghĩa 4 column (4 field). Nhưng trong quá trình phát triển, nếu ta cần thêm 2 field nữa, sự khác biệt sẽ nhận thấy rõ ngay giữa SQL NoSQL

  • Nếu sử dụng SQL (Structure), có cấu trúc. Tất nhiên sẽ phải ALTER table đó, hoặc là tầm nhìn xa hơn sẽ dùng column store Json. Thay đổi Json Store. Việc này tuy có thể đáp ứng nhưng khá phức tạp.
  • Nếu sử dụng NoSQL, do không quá ràng buộc về mặt cấu trúc, ta vẫn có thể thoải mái store node đó với 4 field, trong khi những node trước đó là 2 field.

NoSQL là lựa chọn lý tưởng cho dữ liệu không được tổ chức thành cấu trúc hoặc có cấu trúc chưa hoàn chỉnh

Rõ ràng, khi ứng dụng chưa thực sự rõ ràng về cấu trúc dữ liệu (có thể do requirement từ khác hàng, các feature hoặc bug chưa tìm thấy). NoSQL là lựa chọn tốt hơn so với SQL truyền thống

Rõ ràng mà nói điểm mạnh NoSQL là tốt cho các ứng dụng có cấu trúc CSDL chưa hoàn chỉnh, đang hoặc sẽ được điều chỉnh trong quá trình sử dụng.

Xử lí Dữ liệu lớn (Big Data)

Với khả năng xử lý lượng dữ liệu khổng lồ, NoSQL là lựa chọn lý tưởng cho các hệ thống cần phân tích dữ liệu quy mô lớn, như các ứng dụng phân tích dữ liệu, Internet of Things (IoT), và các nền tảng truyền thông xã hội.

Các cơ sở dữ liệu như MongoDB, Cassandra, Couchbase rất phù hợp với các ứng dụng Big Data.

Cần khả năng mở rộng liên tục

Khi dữ liệu thay đổi liên tục và không có cấu trúc rõ ràng, NoSQL có thể phù hợp hơn.

Khi dữ liệu liên tục tăng lên và cần mở rộng cơ sở dữ liệu thường xuyên, NoSQL có thể cung cấp khả năng mở rộng tốt hơn.

Không cần quan hệ giữa dữ liệu

Nếu mối quan hệ giữa các dữ liệu không quan trọng, không yêu cầu các ràng buộc và kết nối phức tạp cấp độ database bạn có thể chọn NoSQL, ngược lại nên chọn RDBMS.

Tóm lại, NoSQL hay SQL đều có những ưu và nhược điểm riêng, với những phân tích trên, hi vọng bạn đã hiểu NoSQL database là gì và khi nào cần sử dụng cơ sở dữ liệu SQL. Theo dõi TopDev để cập nhật thêm nhiều kiến thức công nghệ!

Nguồn tham khảo: kieblog.com

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

Làm thế nào tôi trở thành một Software Developer tại Twitter?

cv it tiếng anh
Làm thế nào tôi trở thành một Software Developer tại Twitter?

Dịch từ bài viết của tác giả: Zhia Chong

Cách tôi bắt đầu cuộc hành trình của mình

Tôi sống và làm việc hàng ngày trong một căn hộ thuê ở tầng hầm với mức giá 600 đô/tháng. Mong muốn tìm cho bản thân một công việc tốt ở những môi trường chuyên nghiệp luôn hiện hữu trong tôi. Và Twitter là một trong những nơi tôi hướng đến với suy nghĩ như thế. Tôi cũng hiểu rõ là để bắt đầu cuộc hành trình chinh phục giấc mơ này, trước tiên mình cần chăm chút hơn cho CV IT tiếng Anh của mình.

Năng lực chuyên môn

Về background của mình, tôi tốt nghiệp với tấm bằng cử nhân về khoa học máy tính và nộp đơn xin việc vào 30 công ty khác nhau, được phỏng vấn với 15 công ty, bị từ chối bởi 6 trong số đó. Tôi hiểu rằng để nhận được offer của các công ty tốt, một chiếc CV English IT là rất cần thiết. Vậy nên tôi dành nhiều thời gian để đầu tư hơn cho CV của mình. Cuối cùng tôi nhận việc tại một công ty startup và có 3 năm làm việc với tư cách một Full stack Engineer. Công việc chính của tôi là build microservices cũng như phát triển API trên AWS stack. Đây là công việc đầu tiên của tôi, trước đây tôi chưa hề có kinh nghiệm làm việc hay thực tập ở bất kì vị trí nào khác cả.

cv english it
Thể hiện năng lực trong CV là cách chinh phục nhà tuyển dụng

Làm sao tôi đến được Twitter với CV IT tiếng Anh của mình?

Trước đây tôi đã từng ứng tuyển vào Twitter nhưng không thành công. Một phần là vì tôi chưa có nhiều kinh nghiệm xin việc (như đã chia sẻ ở trên) nên cũng không biết cách để CV IT tiếng Anh của mình được đánh giá cao hơn. Vì thế ở lần thứ hai này, tôi may mắn nhận email từ phòng tuyển dụng của họ với đề nghị sắp xếp một cuộc phỏng vấn qua điện thoại với các kỹ sư của họ. Họ cũng gửi cho tôi một sheet tổng hợp toàn diện những kiến thức liên quan đến việc luyện tập và nâng cao kỹ năng coding cũng như xây dựng thuật toán.

  Software Developer và 5 bài học kinh nghiệm quan trọng
  9 trang web mà bất kỳ developer nào cũng nên theo dõi

Trong tài liệu có đề cập đến việc sử dụng Leetcode cho việc luyện tập. Tôi dành hàng giờ mỗi ngày để luyện coding và chuẩn bị tốt nhất cho vòng phỏng vấn sắp tới. Những cuộc phỏng vấn liên quan đến chuyên môn thật sự không hề dễ dàng, nhất với một người đã tốt nghiệp được một khoảng thời gian như tôi. Tôi phải dành nhiều thời gian để trau dồi thêm kỹ năng và nguyên tắc cần thiết khác để ứng tuyển thành công.

Twitter đã nhấn mạnh cuộc phỏng vấn này sẽ tập trung vào những kiến thức chuyên môn liên quan tới map, cây nhị phân, danh sách liên kết, đồ thị,… Vậy nên thậm chí tôi còn tham gia khóa huấn luyện cá nhân Acing The Technical Interview để chuẩn bị tốt nhất.

Xem thêm các tin đăng việc làm software developer trên TopDev

Cách tôi nộp CV IT tiếng Anh và chuẩn bị cho một cuộc phỏng vấn

Tôi tìm được công việc này thông qua LinkedIn. Đây là một trong những nền tảng giúp bạn dễ dàng tìm được nhiều công việc hấp dẫn vì nó được các nhà tuyển dụng sử dụng rất nhiều. Tôi đăng tải CV IT tiếng Anh của mình trên tài khoản cá nhân để các nhà tuyển dụng dễ quan sát và tìm kiếm. Và kể từ khi nhận được thông báo phỏng vấn, tôi có 1 tháng làm việc và học tập liên tục để chuẩn bị cho cuộc phỏng vấn này.

Đầu tiên, tôi được giao cho các tài liệu liên quan đến coding trên Google Tài liệu. Chúng tôi bàn về cách phân tích và tiếp cận các dữ liệu này, tôi có 30 phút để phân tích với nhà tuyển dụng. Những kinh nghiệm và chuyên môn được đề cập trong CV IT tiếng Anh là một phần để nhà tuyển dụng tham khảo và đặt ra câu hỏi phỏng vấn ứng viên. Sau hai vòng đầu tiên, tôi được chuyển tiếp đến vòng phỏng vấn tại chỗ tiếp theo tại Twitter Seattle.

Xem thêm Top 5 API thú vị dành cho các New Developers

Sau đó, họ gửi cho tôi một liên kết đến kho mã hóa trực tuyến và yêu cầu tôi đánh giá code. Tôi cần đưa ra đề xuất về cách cải thiện code và thảo luận với người phỏng vấn trực tiếp. Có một điều bạn cần lưu ý trong các cuộc phỏng trực tiếp tại Twitter là mỗi vòng sẽ có 2 người phỏng vấn bạn.

Thiết kế hệ thống

Các vấn đề xoay quanh nội dung này liên quan đến việc thiết kế một hệ thống từ đầu, mục đích là kiểm tra xem giới hạn thật sự của ứng viên có thể đạt đến đâu. Một trong những câu hỏi mà tôi được hỏi là “Bạn có thể xây dựng một hệ thống đáng tin cậy với thời gian ngừng hoạt động hợp lý từ đầu đến cuối, từ thiết lập giao diện người dùng đến giao tiếp thông qua API HTTP, xây dựng dịch vụ phụ trợ không?”…

Chuyên môn – phần quan trọng của CV IT tiếng Anh

Các vấn đề xung quanh cuộc phỏng vấn đều xoay quanh chuyên môn và kỹ năng thật sự của bạn. Các câu hỏi sẽ đi sâu vào từng khía cạnh của vấn đề như “Dự án bạn đã xây dựng gần đây là gì? Tại sao bạn lại xây dựng nó? Những lựa chọn thay thế được xem xét là gì? Cuối cùng thì nó có hoạt động không?” Vòng này không có các câu hỏi mã hóa mà sẽ tập trung năng lực của bạn trong xử lý từng chi tiết nhỏ của dự án.

Văn hóa làm việc

Nếu được vào đến vòng này, nghĩa là bạn đã làm tốt trong 2 vòng phỏng vấn trước, và ở vòng này họ đang tìm kiếm một người có văn hóa làm việc phù hợp với văn hóa doanh nghiệp. Bạn sẽ được nói chuyện với Giám đốc tuyển dụng và chuyên viên cấp cao trong công ty. Mọi hành động và lời nói của bạn sẽ được đánh giá một cách khắt khe nhất để đảm bảo tìm được ứng viên phù hợp.

Mỗi môi trường làm việc chuyên nghiệp đều đòi hỏi ứng viên cần có tính cách hoặc cách ứng xử phù hợp. Mỗi nhân viên là thành phần gắn kết và có ảnh hưởng đến công ty. Chính vì thế khi tuyển dụng họ đều chú ý đến vấn đề này. Gear Inc. là một ví dụ điển hình.

Kết luận

Đa phần việc tuyển dụng tại các doanh nghiệp lớn như Twitter đều đòi hỏi người ứng tuyển có chuyên môn cao và năng lực ứng xử tốt. Do đó, bạn hãy cố gắng trau dồi, cải thiện những khả năng này của mình để có được công việc mình mong muốn nhé.

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

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

Xem thêm Junior/Senior Developer Jobs hấp dẫn tại TopDev

Dùng .NET Framework với IronPython

Dùng .NET Framework với IronPython

Bài viết được sự cho phép của tác giả Pymi

IronPython là một triển khai của Python chạy trên .NET Framework, cho phép bạn kết hợp sức mạnh của Python với các tính năng của .NET. Dưới đây là hướng dẫn chi tiết cách sử dụng IronPython với .NET Framework

Assembly là gì?

Assembly (số nhiều: assemblies) là một file được tạo ra bởi quá trình compile một ứng dụng .NET. Nó có thể có đuôi .dll hoặc .exe. .NET Framework có sẵn rất nhiều assemblies (chính là thành phần Class Library trong .NET Framework), cũng tương tự như Python có sẵn rất nhiều standard libraries vậy.

AddReference .NET Assemblies

Khi lập trình các ngôn ngữ .NET khác như C# hay VB.NET, dùng Visual Studio, muốn sử dụng các công cụ trong .NET Framework thì bạn phải thêm “Reference” vào project browser. IronPython có 1 module hỗ trợ “Add Reference” vào script là clr. Các methods Add Reference trong IronPython:

# Sử dụng một trong các methods sau
clr.AddReference
clr.AddReferenceByName
clr.AddReferenceByPartialName
clr.AddReferenceToFile
clr.AddReferenceToFileAndPath

clr.AddReference nhận vào 1 đối tượng System.Reflection.Assembly, hoặc full name của assembly (vd clr.AddReference("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")), hoặc partial name của assembly (vd clr.AddReference("System.Drawing")). Khi dùng partial name, IronPython sẽ tìm file dll ở trong Global Assembly Cache (GAC). Mình thường dùng cách thứ 3: truyền vào partial name cho ngắn gọn. Xem các assemblies đã add ở clr.References:

C:\Users\HTL>"c:\Program Files (x86)\IronPython 2.7\ipy.exe"
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.42000 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> clr.AddReference("System.Drawing")
>>> clr.References
(<mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089>,
<System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089>,
<IronPython.SQLite, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b71
3576e1>,
<IronPython.Wpf, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b713576e1>,
<System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a>)

>>>

Sau khi AddReference, phải import các namespaces có trong assemblies để sử dụng trong IronPython. Cú pháp import như bình thường:

>>> from System import Drawing
>>> print(Drawing)
Microsoft.Scripting.Actions.NamespaceTracker:System.Drawing
>>>

Thắc mắc hay gặp: Mình muốn sử dụng 1 công cụ trong .NET Framework thì biết tên assembly là gì để AddReference, biết namespace nào để import? Trả lời với từ khóa tìm kiếm: Tên_công_cụ msdn (VD System Environment msdn). Dùng phần Assembly để AddReference, phần Namespace để import.

Khi chạy ipy.exe, IronPython đã AddReference sẵn tới mscorlib.dll và System.dll [1]. Khi đó chỉ việc import các namespaces có trong 2 assemblies này mà không phải AddRerence.

Xem thêm tuyển dụng .NET developer lương cao cho bạn

AddReference các Assemblies khác

Ngoài các assemblies có trong .NET Framework, còn có các assemblies khác đi kèm với các phần mềm cài vào Windows, hoặc assemblies được compiled từ chính IronPython. Cú pháp AddReference tương tự như trên, với lưu ý là AddReference khi đó sẽ tìm assemblies trong GAC hoặc sys.path. Nếu không muốn append đường dẫn tới folder chứa file .dll thì có thể dùng AddReferenceToFileAndPath. Phải chạy đúng phiên bản IronPython 32bit/64bit tương ứng với Target Platform mà file assembly được compiled.

Ví dụ file RevitAPI.dll được compiled với Target Platform là x64 (64-bit), nếu chạy ipy.exe (32-bit) sẽ không AddReference được:

C:\Users\HTL>"C:\Program Files (x86)\IronPython 2.7\ipy.exe"
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.42000 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> import sys
>>> sys.path.append(r'C:\Program Files\Autodesk\Revit 2018')
>>> clr.AddReference('RevitAPI')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: System.IO.IOException: Could not add reference to assembly RevitAPI
   at IronPython.Runtime.ClrModule.AddReference(CodeContext context, String name
)
   at IronPython.Runtime.ClrModule.AddReference(CodeContext context, Object refe
rence)
   at IronPython.Runtime.ClrModule.AddReference(CodeContext context, Object[] re
ferences)
   at Microsoft.Scripting.Interpreter.ActionCallInstruction`2.Run(InterpretedFra
me frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0
, T1 arg1, T2 arg2, T3 arg3)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite s
ite, T0 arg0, T1 arg1, T2 arg2)
   at Microsoft.Scripting.Interpreter.FuncCallInstruction`6.Run(InterpretedFrame
 frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0
, T1 arg1, T2 arg2, T3 arg3)
   at IronPython.Compiler.Ast.CallExpression.Invoke1Instruction.Run(InterpretedF
rame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 a
rg1)
   at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
   at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
   at IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction
>b__0()
>>>

Mà phải dùng ipy64.exe để AddReference:

C:\Users\HTL>"C:\Program Files (x86)\IronPython 2.7\ipy64.exe"
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.42000 (64-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> import sys
>>> sys.path
['.', 'C:\\Program Files (x86)\\IronPython 2.7\\Lib',
 'C:\\Program Files (x86)\\IronPython 2.7\\DLLs',
 'C:\\Program Files (x86)\\IronPython 2.7',
 'C:\\Program Files (x86)\\IronPython 2.7\\lib\\site-packages']
>>> sys.path.append(r'C:\Program Files\Autodesk\Revit 2018')
>>> clr.AddReference('RevitAPI')
>>> from Autodesk.Revit.DB import Wall
>>> Wall
<type 'Wall'>
>>>

AddReference các assemblies được compiled bằng IronPython

Nếu như bạn chưa biết, IronPython có thể compile python script thành các file assemblies (.dll hoặc .exe) sử dụng công cụ kèm theo là pyc.py (sẽ có bài viết riêng về Compile python script dùng IronPython).

Một lưu ý quan trọng khi AddReference các file assemblies này là: phải dùng đúng phiên bản IronPython tương ứng với phiên bản đã dùng để compile ra file assembly đó thì mới AddReference được. Ví dụ: file assembly được compiled bằng IronPython 2.7.3 thì khi AddReference ta phải dùng IronPython 2.7.3. Sẽ có ví dụ cụ thể trong bài Compile python script dùng IronPython.

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

Có thể bạn quan tâm: Cách cài .NET framework 3.5 cho Window

15 thư viện slider jquery miễn phí cho dự án website của bạn

15 thư viện slider jquery miễn phí cho dự án website của bạn

Bài viết được sự cho phép của tác giả Võ Quang Huy

Slider jquery miễn phí – Trong các website hiện đại slider là 1 phần không thể thiếu, nó giúp trang web của chúng ta chuyên nghiệp hơn, bắt mắt hơn, truyền tải nội dung tới người đọc 1 cách rõ ràng, sinh động hơn…

Để tự code được 1 slider chuyên nghiệp có hiệu ứng đẹp thì thật sự tốn thời gian và không hề đơn giản, vì vậy người ta thường dùng những thư viện slider được cung cấp sẵn để nhúng vào dự án web của họ. Vì thế hôm nay mình sẽ giới thiệu cho các bạn 15 thư viện slider jquery miễn phí, hi vọng sẽ giúp ích cho dự án website của các bạn!

1. bxSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

Các bạn có thể click vào hình để xem demo và cách sử dụng

  • Bxslider đáp ứng đầy đủ nội dung của 1 slider jquery.
  • Có reponsive thích hợp cho nhiều màn hình, lên di động có thể lướt cảm ứng để chuyển động.
  • Nội dung của slider có thể là hình ảnh, video, hoặc là nội dung html.
  • Tương thích với tất cả các trình duyệt.

2. Jssor Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Jssor Slider là 1 thư viện rất thông dụng mình đã sự dụng rất nhiều lần cụ thể là dự án Quảng Đà Hitech, nó chứa hàng chục mẫu slider khác nhau.
  • Dung lượng nhẹ.
  • Tương thích với các trình duyệt.
  • 1 số slider có responsive, thích hợp với các loại màn hình khác nhau.

3. Swiper

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là slider có hiệu ứng chuyển động cực kỳ bắt mắt.
  • Tương thích với tất cả các hệ điều hành: windows, Android, iOS điện thoại cũng như desktop.
  • Có thể sử dụng trên các ứng dụng di động.

4. FlexSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Flexslider được phát triển bởi WooThemes (nếu ai chơi wrodpress sẽ biết 😀 )
  • Là 1 slider đơn giản, nhẹ nhàng.
  • Tương thích với nhiều loại màn hình, trình duyệt cũng như hệ điều hành.

5. Superslides

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là loại slider full màn hình.
  • Tự động canh hình ảnh ở vị trí trung tâm.
  • Slider rất nhẹ giúp tăng tốc độ cho website.
  • Tính tương thích cao.

6. Unslider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Unslider là 1 jquery slider nhẹ.
  • Có hỗ trợ reponsive.
  • Có nhiều hiệu ứng chuyển động ngang và dọc.
  • Có tính tương thích cao.

7. AnythingSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là 1 slider jquery miễn phí có nhiều hiệu ứng độc đáo
  • Có nhiều tính năng ưu việt (Bạn click vào hình để xem thêm)

8. OWL Carousel

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là thư việc slider jquery mình hay sử dụng nhất.
  • Có thể chuyển động slider bằng cách kéo lê chuột.
  • Có responsive có thể tùy chỉnh trên từng loại màn hình.
  • Sử dụng hiệu ứng css3.

9. PgwSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là silider thích hợp dùng ở vị trí bài viết
  • Dung lượng nhẹ
  • Có hỗ trợ responsive
  • Thân thiện với các hệ điều hành và trình duyệt
  • Hỗ trợ seo tốt.

10. ayaSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Là 1 slider jquery miễn phí, đơn giản, dễ cài đặt.
  • Có hỗ trợ responsive.
  • Có thể tùy biến cao.

11. Liquid Slider  jquery miễn phí

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • 1 slider jquery dạng tabs
  • Có hỗ trợ responsive, dễ dàng sử dụng
  • Sử dụng hiểu ứng Animation and transition

12. StackSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là slider có responsive thân hiện với các trình duyệt, hệ điều hành.
  • Sử dụng hiệu ứng 3D.
  • Lên di động có thể sử dụng lướt để thay đổi slider.

13. Immersive Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Có responsive.
  • Hiệu ứng chuyển động độc đáo và lạ mắt.
  • Có tính tương thích cao

14. 360 Image Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

15. Fullscreen Slit Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Có responsive
  • Tương thích cao

Trên đây là 15 thư viện slider jquery miễn phí khá chất lượng mà mình tìm hiểu được, còn rất nhiều thư viện khác nếu có thời gian các bạn có thể tìm hiểu.

Hi vọng những thư viện này sẽ có ích trong dự án website của các bạn, nếu biết được những thư viện slider jquery nào hay hãy cmt chia sẽ bên dưới nhé!

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

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

Xem thêm các việc làm JQuery lương cao hấp dẫn tại TopDev

[Update] Thêm Firebase vào Flutter và login với Google

Thêm Firebase vào Flutter và login với Google (Update 9/2020)

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

Firebase là gì?

Firebase là một nền tảng lập trình di động và web application được phát triển bởi Firebase, Inc năm 2011. Vào năm 2014, Firebase được Google mua lại, và đây chính là sự bùng nổ của Firebase khi được một ông lớn công nghệ như Google đứng sau. Tính đến thời điểm tháng 10 năm 2018, Firebase có 18 sản phẩm, chúng được sử dụng bởi 1.5 triệu ứng dụng.

Rất nhanh chóng, sau khi Flutter ra mắt, các plugin hỗ trợ Flutter kết nối với Firebase cũng đã được Google phát triển, họ gọi các plugin đó là FlutterFire. Tuy nhiên, do còn mới các FlutterFire này vẫn chưa chạm đến phiên bản 1.0, đây chính là nguyên nhân gây ra rất nhiều lỗi trong quá trình tích hợp Firebase vào Flutter. Hôm nay mình sẽ hướng dẫn các bạn cách tích hợp Firebase vào Flutter và login với Google. Hãy cùng bắt đầu ngay bây giờ!

>>> Xem thêm: Có nên dùng cho các ứng dụng lớn?

Tạo project Flutter

Chọn nơi bạn muốn lưu project Flutter của mình, nhấn chuột phải mở git bash, chạy câu lệnh “flutter create <your_project_name>”, mình sẽ đặt tên App là firebase_login. Mình muốn là trên màn hình có hai nút Login, Logout và một dòng chữ thông báo user đã login hay chưa, code của mình như sau:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _message = 'You are not sign in';

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Login'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_message),
            OutlineButton(
              onPressed: () {},
              child: Text('Login'),
            ),
            OutlineButton(
              onPressed: () {},
              child: Text('Logout'),
            ),
          ],
        ),
      ),
    );
  }
}

Sau khi xong phần flutter project, chúng ta sẽ chuyển sang phần Firebase project.

Tạo project Firebase và kết nối với Flutter

Đầu tiên, bạn truy cập Firebase Console, nhấn vào nút Add project. Sau đó đặt tên project, phần Project Id các bạn để mặc định. Ở đây mình đặt project tên là Flutter Firebase, sau đó nhấn Continue để tiếp tục.

Tiếp theo, ở phần Google Analytics for your Firebase project, bạn bỏ tích Enable Google Analytics for this project và nhấn Create project, sau khi tạo xong bạn nhấn Continue để tiếp tục.

Ở trang chủ, bạn nhấn vào biểu tượng Android để thêm ứng dụng Android vào project, ở đây chúng ta sẽ phải nhập applicationId. Bạn mở lại project flutter, vào thư mục “android/app”, mở file “build.gradle”, bạn tìm đến dòng “applicationId”, bạn sửa lại dòng này thành id bạn muốn (lưu ý định dạng com.example.app), copy nó và dán vào phần Android package name trong Firebase.

Tiếp đến phần Debug signing certificate SHA-1, nếu app của bạn không dùng Google Sign in hoặc Dynamic link thì không cần (mình vẫn khuyên bạn nên thêm vào cho chắc). Để lấy được mã SHA-1, bạn mở thư mục cài Android Studio và tìm đến thư mục “jre/bin”, máy của mình sẽ là thư mục “C:\Program Files\Android\Android Studio\jre\bin”. Trong thư mục bin, bạn mở git bash và chạy lệnh “keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android”, sau khi chạy lệnh này, bạn sẽ thấy trên cửa sổ git có một mục là Certificate fingerprints, bên trong đó có mục SHA1, bạn copy toàn bộ phần mã đó dán vào mục SHA-1 bên Firebase.

Nếu như lệnh keytool bị lỗi, các bạn hãy thay đường dẫn thành “keytool -list -v -keystore C:/Users/<Tên user trên máy của bạn>/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android”. Tiếp tục copy mã SHA1 và bỏ vào trong firebase.

Bạn nhấn Next để tiếp tục, ở bước tiếp theo, bạn nhấn vào Download google-services.json, sau đó để nó vào trong thư mục android/app của project.

Tiếp theo, bạn copy dòng “classpath ‘com.google.gms:google-services:4.3.3′”, mở project flutter, tìm đến folder android, mở file build.gradle, bạn tìm đến phần dependencies và dán đoạn code vừa copy vào.

Tiếp tục bạn quay lại Firebase, copy đoạn code “apply plugin: ‘com.google.gms.google-services’”, thêm vào cuối file build.gradle trong folder “android/app” và lưu lại. Quay về Firebase và nhấn Continue to console.

Tiếp theo, bạn copy file google-services.json đã tải ở trên vào thư mục “android/app”. Vậy là chúng ta đã hoàn thành phần config Firebase trong flutter rồi. Sang phần tiếp theo là code flutter để đăng nhập và đăng xuất.

Thêm plugin và code phần đăng nhập

Đầu tiên, mình cần thêm các plugin sau vào file pubspec.yaml:

dependencies:
  firebase_core: "0.5.0"
  firebase_auth: "^0.18.0+1"
  google_sign_in: ^4.5.3
  // ...

Trở lại với file main.dart của chúng ta, trong phiên bản rework mới của Google, chúng ta bắt buộc thêm đoạn code sau trước khi chạy bất kỳ dịch vụ nào của Google. Nhớ là phải gọi mọi dịch vụ của Google sau khi initializeApp hoàn tất, nếu không sẽ bị lỗi.

await Firebase.initializeApp();

Vì lý do này, chúng ta cần phải thêm FutureBuilder vào Widget tree để đảm bảo việc initial firebase được thực hiện xong trước khi bất kỳ chức năng nào khác được thực hiên.

// Thêm thư viện firebase_core
import 'package:firebase_core/firebase_core.dart';

class _MyHomePageState extends State<MyHomePage> {
// Thêm dòng này
final Future<FirebaseApp> _initialization = Firebase.initializeApp();

// Trong body của Scaffold
// Bọc Widget Center bằng FutureBuilder
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Login'),
      ),
      body: FutureBuilder(
          future: _initialization,
          builder: (context, snapshot) {
            // Kiểm tra xem có bị lỗi khi initialize không
            if (snapshot.hasError) {
              return Text('Something went wrong');
            }

            // Nếu thành công thì hiển thị như lúc đầu chúng ta đã tạo
            if (snapshot.connectionState == ConnectionState.done) {
              return Center(
                // Code goes here
              );
            }
            // Đang load
            return CircularProgressIndicator();
          }
}

Sau khi xong các bạn có thể run app để check thử xem có bị lỗi không. Nếu không có thì chúng ta tiếp tục thêm tính năng login.

import 'package:flutter/material.dart';
// import thêm hai thư viện này
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

// ...

class _MyHomePageState extends State<MyHomePage> {
  String _message = 'You are not sign in';

  // Thêm các đoạn code sau
  FirebaseAuth _auth;
  GoogleSignIn _googleSignIn;

  Future<User> _handleSignIn() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;

    final AuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    final User user = (await _auth.signInWithCredential(credential)).user;
    print("signed in " + user.displayName);
    setState(() {
      // User đã login thì hiển thị đã login
      _message = "You are signed in";
    });
    return user;
  }

  Future _handleSignOut() async {
    await _auth.signOut();
    await _googleSignIn.signOut();
    setState(() {
      // Hiển thị thông báo đã log out
      _message = "You are not sign out";
    });
  }

  Future _checkLogin() async {
    // Khi mở app lên thì check xem user đã login chưa
    final User user = _auth.currentUser;
    if (user != null) {
      setState(() {
        _message = "You are signed in";
      });
    }
  }

  // ...
            if (snapshot.connectionState == ConnectionState.done) {
              // Chỉ có thể thực hiện các dịch vụ Google sau khi initializeApp hoàn tất
              _auth = FirebaseAuth.instance;
              _googleSignIn = GoogleSignIn();
              _checkLogin();
                    // Code goes here
                    OutlineButton(
                      onPressed: () {
                        _handleSignIn();
                      },
                      child: Text('Login'),
                    ),
                    OutlineButton(
                      onPressed: () {
                        _handleSignOut();
                      },
                      child: Text('Logout'),
                    ),
                    // Code goes here
            }
// ...

Code của mình đơn giản chỉ có vậy. Nhưng hiện giờ bạn chưa thể login được đâu, bạn cần bật phương thức đăng nhập bằng Google Account trong Firebase Console. Cách thực hiện như sau: bạn mở tab Authentication, nhấn vào button Set up a sign-in method.

Tiếp theo, bạn nhấn vào dòng Provider là Google, chọn Enable. Sau đó, ở phần Project public-facing name bạn đặt tên gì cũng được, nó sẽ là tên hiển thị trong phần hỏi user khi login. Phần project support email, bạn chọn email của bạn và nhấn Save.

Vậy là chúng đã xong rồi, giờ là lúc chúng ta run app và test thử. Một lưu ý nhỏ cho các bạn là các bạn dùng Login với Google thì phải run trên máy ảo có Google Play, hoặc chạy trên máy thật cho nó chắc, nếu không app sẽ bị lỗi. Và đây là kết quả!

Nếu như bạn nào gặp phải lỗi build app, bạn nên xem lại các cái version của dependencies, classpath, đã chỉnh sửa lại như trong bài viết chưa (mình sẽ có gắng update bài liên tục), nếu vẫn chưa được, bạn hãy migrate sang android X, chỉnh minSdkVersion (trong file “android/app/build.gradle”) từ 16 sang ít nhất là 21. Nếu vẫn chưa giải quyết được bạn có thể comment phía bên dưới mình sẽ giúp đỡ bạn.

Tổng kết

Vậy là trong bài này, mình đã hướng dẫn các bạn tích hợp Firebase vào Flutter và đăng nhập với Google Sign In. Nếu các bạn có thắc mắc dì có thể để lại comment phía bên dưới, mình sẽ giúp nếu có thể. Nếu Firebase có update, các plugin có thay đổi hoặc flutter có thay đổi, bài viết này không còn áp dụng được nữa, bạn có thể vào trang Liên hệ để thông báo với mình, mình sẽ update lại bài viết này nha.

Bài viết này sẽ được mình cập nhật khi có thay đổi lớn diễn ra. Nếu các bạn gặp vấn đề với các method bị Deprecated thì có thể comment bên dưới, mình sẽ cố gắng cập nhật bài viết sớm nhất có thể nha. Trong bài này mình chỉ hướng dẫn các bạn cách có thể thêm firebase và login bằng Google thôi, code chưa được tổ chức hợp lý nên các bạn có thể tổ chức lại cho dễ quản lý hơn nha.

Các bạn có thể xem code tại GitHub của mình. Hy vọng bài viết này hưu ích đối với các bạn, nếu bạn thấy bài viết hay, hãy share bài viết để mọi người cùng biết nha ^^. Cảm ơn các bạn đã đọc bài viết của mình!

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

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

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

5 tips để trở thành một coder giỏi hơn mỗi ngày!

javascript

javascript Dịch từ bài viết của tác giả: Kevin Gardner

Giới thiệu

Lập trình từ khi ra đời cho đến nay vẫn không ngừng phát triển. Bạn càng có kỹ năng coding tốt thì càng có nhiều cơ hội làm việc tốt hơn. Quan trọng là hãy biết cách “làm mới” mình mỗi ngày, đừng tự mãn với những gì mình có mà hãy cố gắng học hỏi thêm thật nhiều kiến thức mới từ những kiến thức cơ bản như ngôn ngữ JavaScript đến các ngôn ngữ, kỹ thuật chuyên môn hơn như Assembly, C,…. Dưới đây là 5 chiến thuật tuyệt vời bạn có thể áp dụng để trở thành một dev giỏi hơn.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer
  5 ngôn ngữ lập trình “khó chịu” nhất thế giới

5 chiến thuật học hỏi tốt nhất (áp dụng cả với JavaScript)

1. Lên kế hoạch để vượt qua điểm yếu của bản thân

Một trong những kỹ năng quan trọng của dev là biết mình cần phải làm gì. IT là một lĩnh vực rộng nên mỗi dev chỉ cần tập trung vào đúng lĩnh vực chuyên môn của mình và làm tốt nhất có thể trong khả năng với một số nhiệm vụ hay ngôn ngữ lập trình nhất định.

javascript cơ bản
Cần biết cách vượt qua điểm yếu của chính mình

Khi mới bắt đầu bạn nên làm quen với ngôn ngữ JavaScript cơ bản. Đó là ngôn ngữ nền tảng web chuẩn, được sử dụng phổ biến nhất và thường được ứng dụng trong build mobile app. Bạn cũng nên cân nhắc về khả năng tài chính của mình để đăng kí thêm những khóa học JavaScript online hoặc tự học để trau dồi kiến thức, khắc phục các điểm yếu trong chuyên môn của mình.

Bên cạnh đó, khi làm việc và học tập, bạn nên cố gắng lựa chọn một môi trường yên tĩnh, giúp bạn tập trung tối đa nhất. Vì theo kết quả nghiên cứu của Viện Công nghệ Georgia, các lập trình viên có thể mất 10 đến 15 phút để quay trở lại với công việc sau khi bị ngắt quãng, điều này có thể khiến các dev bị gián đoạn suy nghĩ và giải quyết vấn đề kém hơn.

Xem thêm: Javascript ES6 – Đôi điều thú vị có thể bạn chưa biết

2. Luôn có một dự án trong quá trình hoạt động, nhất là với code mới

Ngoài các công việc thường ngày, dev nên làm thêm các dự án phụ bên ngoài để nâng cao khả năng cũng như giới hạn của bản thân. Việc làm thêm những task mới chắc chắn sẽ giúp bạn học hỏi rất nhiều điều bổ ích khác như một kỹ thuật mới, ngôn ngữ mới, kiến thức mới chẳng hạn. Học tập chưa bao giờ là việc dễ dàng, nhất là trong lĩnh vực IT, từ ngôn ngữ lập trình JavaScript, C/C++,… đến các kỹ thuật chuyên môn khác, đều cần sự kiên trì, chăm chỉ rèn luyện. Hãy cố gắng giữ cho bản thân động lực cao nhất để hoàn thành nhiều việc hơn, từ đó nâng cấp trình độ của bạn lên một vị trí mới.

3. Tham khảo ý kiến với các lập trình viên đi trước bất cứ khi nào có thể

Bạn có thể học hỏi được nhiều thứ từ những tiền bối trong nghề vì họ có nhiều kinh nghiệm làm việc hơn. Bạn có thể nhờ các đồng nghiệp trong công ty hỗ trợ và giải thích khi gặp một số công việc hay chưa hiểu rõ về JavaScript cơ bản,… vấn đề mà bạn không quen thuộc. Hoặc bạn có thể tham khảo thêm ý kiến của những người đi trước thông qua các nền tảng trực tuyến như đặt câu hỏi trên Google, Reddit, YouTube, blog hoặc Codecademy.

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

Hãy học hỏi cách người khác viết code. Đó là một nguồn tài nguyên tuyệt vời để bạn mở mang tầm mắt và suy nghĩ của mình, học hỏi thêm nhiều thứ từ cách mà người khác xử lý vấn đề.

4. Không chỉ dừng lại ở một lần viết code, nhất là với JavaScript

Bạn sẽ không bao giờ có thể cải thiện được kỹ năng viết code của mình nếu chỉ viết đến khi code có thể chạy được và ngay lập tức dừng lại, hoặc chỉ đơn thuần là copy và paste mà không tìm hiểu lý do tại sao code đó hoạt động được. Với ngôn ngữ lập trình JavaScript chẳng hạn, bạn nên cố gắng viết code đến khi nào bạn hoàn toàn hiểu hết về chúng thì lúc đó mới có thể gọi là đã hoàn thành một dự án. Có một sự thật là bạn có thể viết code bằng tay trên giấy, tuy hơi mất thời gian nhưng đây được xem là cách giúp cải thiện kỹ năng coding đáng kể dù đang ở trình độ nào đi chăng nữa.

>>> Xem thêm Top 5 API thú vị dành cho các New Developers

Code luôn luôn có thể cải thiện được để nó hoạt động nhanh hơn, đáng tin cậy hơn. Nếu bạn thật sự muốn đạt trình độ bậc thầy coding, bạn nên viết code cho một dự án ít nhất 3 lần. Nghĩa là sau khi viết code 1 lần và nó đã chạy được, bạn hãy viết tiếp thêm lần nữa, viết mới hoàn toàn. Cứ như thế, sau 3 lần bạn sẽ tìm ra được đâu mới là sản phẩm thật sự chất lượng, đáp ứng đầy đủ các thông số kỹ thuật cho yêu cầu của dự án.

5. Không nên chỉ học một ngôn ngữ lập trình

Mỗi ngôn ngữ lập trình (JavaScript, Golang, Java,…) đều có ưu và nhược điểm riêng, các dev không nên có suy nghĩ phiến diện rằng chỉ có ngôn ngữ này thì tốt và ngôn ngữ khác thì vô dụng và không đáng để học hỏi. Học một ngôn ngữ mới mang lại cho bạn một góc nhìn mới và có thể giúp bạn xử lý các dự án đang triển khai với chuyên môn cao hơn.

Bạn có thể bắt đầu học thêm về ngôn ngữ C / C ++, JavaScript, Ruby, Python, Django, Pascal và NodeJS,… Học thêm ngôn ngữ lập trình khác, với cách tiếp cận và tư duy khác nhau sẽ cho bạn cơ hội hiểu được vấn đề ở nhiều góc độ khác nhau. Giúp các dev mở rộng suy nghĩ và sáng tạo hơn trong quá trình làm việc của mình.

Kết luận

Có nhiều cách khác nhau để bạn có thể nâng cao trình độ coding của mình và tìm được việc làm phù hợp tại các công ty như Gear Inc. Hãy cân nhắc với các tip hữu ích nhất và từ đó rút ra kinh nghiệm làm việc phù hợp nhất với bản thân mình nhé!

Tìm hiểu thêm về công ty Gear Inc. tại đây

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

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

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

Docker to Serverless (Google Cloud Platform)

Docker to Serverless (Google Cloud Platform)

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

Hi xin chào các bạn sau chuỗi ngày dài trốn dịch thì mình đã quay trở lại, chợ bị yêu cầu đống cửa, chả buôn bán được gì nên mình lại có thời gian rảnh để mà vọc vạch, tình cờ nghe ông anh nói qua serverless đồ các kiểu thì mình cũng thấy hứng thú, trong bài viết này mình sẽ chia sẻ những thứ mà mình đã vọc vạch trong ngày vừa qua.

Deploy application từ docker image

Ý tưởng đơn giản là bạn s đống gói ứng dụng thành docker image rồi upload lên docker image repository nào đó như gcloud container registry sau đó sử dụng một dịch vụ hỗ trợ chạy container từ docker image như google cloud run.

  1. Build ứng dụng ra Docker Image

Trong ví dụ này mình sẽ dùng blog của mình làm ví dụ. Project này sử dụng nextjs, mỗi khi mình viết một bài mới thì mình sẽ build code rồi export ra static file, mình không cần phải làm phức tạp, vì với blog này chỉ cần static file là đủ.

git clone https://github.com/dongnguyenltqb/dongnguyen.dev.git
cd dongnguyen.dev
yarn install# Để build project
yarn build
# Để export ra static file
yarn export

Và sau khi export thì mình có toàn bộ static file trong thư mục out

➜  dongnguyen.dev git:(master) ✗ ll
total 864
-rw-r--r--    1 gopher  staff    25B Apr  4 23:57 404.html
-rw-r--r--    1 gopher  staff   155B Apr  5 11:41 Dockerfile
-rw-r--r--    1 gopher  staff   1.1K Mar 14 13:29 LICENSE
-rw-r--r--    1 gopher  staff   870B Apr  5 11:45 cloudbuild.yaml
-rw-r--r--    1 gopher  staff   667B Mar 14 13:29 next.config.js
-rw-r--r--    1 gopher  staff   174B Apr  4 23:57 nginx.conf
drwxr-xr-x  854 gopher  staff    27K Apr  4 20:13 node_modules
drwxr-xr-x   44 gopher  staff   1.4K Apr  4 20:15 out
-rw-r--r--    1 gopher  staff   1.5K Apr  4 20:12 package.json
-rw-r--r--    1 gopher  staff   506B Mar 14 13:29 postcss.config.js
drwxr-xr-x   37 gopher  staff   1.2K Mar 16 10:02 public
drwxr-xr-x    8 gopher  staff   256B Mar 16 10:02 src
-rw-r--r--    1 gopher  staff   867B Mar 14 13:29 tailwind.config.js
-rw-r--r--    1 gopher  staff   394K Apr  4 20:12 yarn.lock
➜  dongnguyen.dev git:(master) ✗

Các bạn để ý thì thấy mình có sử dụng nginx để serve static file

Nginx sẽ lắng nghe request, dựa vào path mà xem có file nào match không, không thì nó sẽ gửi file index.htmlvà nếu không thấy fileindex.html nữa thì trả về 404

server {
    listen 80;
    listen [::]:80;root /usr/share/nginx/html;
    error_page 404 /404.html;location / {
        try_files $uri /index.html =404;
    }
}

Và đây là nội dung của Dockerfile

FROM nginx:1.14WORKDIR /usr/share/nginx/htmlCOPY out  /usr/share/nginx/html/
COPY 404.html .
COPY nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80

Khi build image thì mình sẽ copy tất cả file trong thư mục out vào /usr/share/nginx/html/ Sau đó copy file nginx.conf vào /etc/nginx/conf.d/default.conf để nginx dùng cho việc tạo server serve static file.

➜  dongnguyen.dev git:(master) ✗ sudo docker build .
Password:
Sending build context to Docker daemon    312MB
Step 1/6 : FROM nginx:1.14
 ---> 295c7be07902
Step 2/6 : WORKDIR /usr/share/nginx/html
 ---> Running in b3833b65516a
Removing intermediate container b3833b65516a
 ---> 88cb20f7c71e
Step 3/6 : COPY out  /usr/share/nginx/html/
 ---> 6baffa267a2e
Step 4/6 : COPY 404.html .
 ---> ccc50836cbf4
Step 5/6 : COPY nginx.conf /etc/nginx/conf.d/default.conf
 ---> af5a5d05ce44
Step 6/6 : EXPOSE 80
 ---> Running in d5c64c94d39e
Removing intermediate container d5c64c94d39e
 ---> 45bbe32cd01c
Successfully built 45bbe32cd01c
➜  dongnguyen.dev git:(master) ✗

Kết quả image nặng 138MB

➜  dongnguyen.dev git:(master) ✗ docker image ls
REPOSITORY   TAG     IMAGE ID     CREATED            SIZE
<none>       <none>  45bbe32cd01c  32 seconds ago      138MB

2. Đưa image lên Google Container Registry

container registry là nơi mà ta sẽ lưu trữ image, để push được image lên đây thì docker của các bạn cần phải được config để có quyền. Ở đây mình dùng gcloud cli để cấp quyền cho docker và nếu các bạn chưa cài gcloud cli thì có thể xem hướng dẫn cài đặt, cài đặt tài khoản cho cli tại đây.

➜  dongnguyen.dev git:(master) ✗ sudo gcloud auth configure-docker
Password:
WARNING: Your config file at [/Users/gopher/.docker/config.json] contains these credential helper entries:{
  "credHelpers": {
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud"
  }
}
Adding credentials for all GCR repositories.
WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
gcloud credential helpers already registered correctly.Updates are available for some Cloud SDK components.  To install them,
please run:
  $ gcloud components update➜  dongnguyen.dev git:(master) ✗

Vậy là xong việc cấp quyền, việc tiếp theo là đánh tag cho nó và upload lên.

➜  dongnguyen.dev git:(master) ✗ sudo docker push asia.gcr.io/tough-racer-272817/blog:v0.69
The push refers to repository [asia.gcr.io/tough-racer-272817/blog]
518883fbeafc: Pushed
39fdf81e18fd: Pushed
070d58aabef7: Pushed
82ae01d5004e: Layer already exists
b8f18c3b860b: Layer already exists
5dacd731af1b: Layer already exists
v0.69: digest: sha256:965753d697100fa539efaf0730de6856db0d52a0f3db7557a87a18f5467f7fcd size: 1573
➜  dongnguyen.dev git:(master) ✗

Và ở trên container registry

Docker to Serverless (Google Cloud Platform)

Và để deploy lên cloud run các bạn chỉ cần

sudo gcloud \
beta \
run \
deploy \
--region asia-east1 \
--image asia.gcr.io/tough-racer-272817/blog:v0.69 \
--max-instances 1 \
--platform managed \
--port 80 \
--allow-unauthenticated \
blog

Kết quả

➜  dongnguyen.dev git:(master) ✗ 

Deploying container to Cloud Run service [blog] in project [tough-racer-272817] region [asia-east1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [blog] revision [blog-00014-dax] has been deployed and is serving 100 percent of traffic at https://blog-k3ndrinnqq-de.a.run.app
➜  dongnguyen.dev git:(master) ✗

Và xong ứng dụng của mình đã được deploy tại https://blog-k3ndrinnqq-de.a.run.app

Để tự động hóa quá trình build và deploy thì mình dùng đến dịch vụ google cloud build, trình tự sẽ như thế này, kết nối GitHub repository với cloud build, tạo một triggerđến một event từ githubví dụ như là khi push to a branchpush new tag

Docker to Serverless (Google Cloud Platform)

Ví dụ như trong hình mình setup một trigger cứ mỗi khi mình push code lên branch master thì cloud buildsẽ tiến hành làm những công việc mình đã định nghĩa trong file cloudbuild.yaml

Sau khi tạo xong trigger

Docker to Serverless (Google Cloud Platform)

Nội dung file cloudbuild.yamltrong gitHub repository

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA']
- name: 'gcr.io/cloud-builders/docker'
  args: ['tag', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA', 'asia.gcr.io/tough-racer-272817/blog:latest']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'asia.gcr.io/tough-racer-272817/blog:latest']
- name: 'gcr.io/cloud-builders/gcloud'
  args:
    - beta
    - run
    - deploy
    - --region=asia-east1
    - --image=asia.gcr.io/tough-racer-272817/blog:latest
    - --cpu=1
    - --memory=128Mi
    - --max-instances=1
    - --platform=managed
    - --port=80
    - --concurrency=100
    - --allow-unauthenticated
    - blog
images:
  - 'asia.gcr.io/tough-racer-272817/blog:latest'

Trình tự các bước mà cloud run sẽ làm

  1. Build image và đánh tagcho nó.
  2. Đẩy image đã build lên container registry
  3. Đánh thêm tag latest nữa cho image
  4. Đẩy image với tag latest lên container registry
  5. Chạy lệnh để deploylên cloud run với image có tag latest

Nhưng trước tiên, bạn phải setup kết nối gitHub repository và cấp quyền cho cloud build với thêm hai role Cloud Run Admin vàCloud Run Service Agent là trong cài đăt IAM

Docker to Serverless (Google Cloud Platform)

Và bây giờ mọi thứ đã có thể diễn ra tự động rồi, mình sẽ commit code và push lên branch master, và đây là kết quả

Docker to Serverless (Google Cloud Platform)

Thực ra thì cái gì cũng có hạn chế, serverless (Google cloud Platform) cũng vậy, đây là một vài issue đang tồn tại của Cloud Run nhưng so với nhau cầu serve static file hay là host một web api của mình thì cái này cũng đủ rồi.

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

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

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

Đối diện với sự non kém của chính mình

Đối diện với sự non kém của chính mình

Bài viết được sự cho phép của BBT Tạp chí Lập trình

Nếu chúng ta đánh giá cao tính độc lập, nếu chúng ta cảm thấy phiền lòng về sự phát triển kiến thức, giá trị và thái độ theo cùng một khuôn mẫu mà hệ thống hiện tại tạo ra, thì chúng ta có thể mong muốn tạo lập môi trường học tập khuyến khích sự khác biệt, tự định hướng và tự học.

—Carl Rogers, On Becoming a Person

Bối cảnh

Bạn đã xác định được những kĩ năng mình còn thiếu, những kỹ năng đó liên quan trực tiếp tới công việc hàng ngày của bạn.

Vấn đề

Có rất nhiều công cụ và kỹ thuật mà bạn cần phải nắm vững, nhưng bạn không biết cách để bắt đầu. Những người xung quanh bạn dường như đã biết một số kỹ năng đó, và họ kỳ vọng rằng bạn cũng đã lam chủ được các kiến thức này.

Giải pháp

Hãy chọn một kỹ năng, công cụ hoặc một kỹ thuật nào đó để lấp đầy khoản trống còn thiếu.

Hãy thực hiện điều này bằng cách lựa chọn một cách làm hiệu quả nhất đối với mình. Với một số người, cách tiếp cận tốt nhất là tìm hiểu để có cái nhìn tổng quan thông qua việc đọc các bài giới thiệu và danh sách các câu hỏi thường gặp. Một số người khác lại thích bắt tay ngay vào xây dựng một chương trình phần mềm nhỏ, đó là cách hiệu quả giúp họ hiểu rõ vấn đề. Bạn lựa chọn cách tiếp cận nào cũng được, đừng quên hỏi những người có cùng sở thích và cố vấn của bạn để xem họ có kỹ năng này không và họ có sẵn sàng chia sẻ về những gì họ biết không. Đôi khi có những người khác cũng như bạn, đang cố gắng tìm hiểu những kỹ năng này, làm việc cùng nhau sẽ giúp bạn tiến bộ hơn. Đến một thời điểm nào đó, bạn sẽ đạt được trình độ mà mình khá hài lòng trong lĩnh vực mới này, sau đó bạn có thể quyết định liệu có nên đào sâu hơn hay là chuyển sang tìm hiểu các kỹ năng khác. Chúng ta không có đủ thời gian để mài giũa tất cả các kỹ năng đến trình độ cao, vì vậy bạn phải đưa ra lựa chọn của mình.

Trường hợp này rất gần với tình huống không che giấu sự thiếu hiểu biết (Expose Your Ignorance), nhưng bạn sẽ ít ngại ngùng hơn vì có thể tự mình thực hiện, sẽ không có ai biết được những thiếu sót của mình. Tuy nhiên, với tư cách là một người học việc có khát vọng làm chủ kiến thức thì bạn cần sẵn sàng biểu lộ sự thiếu hiểu biết của mình. Sử dụng mô hình này một cách tách biệt (tức là, khắc phục sự thiếu hiểu biết của mình mà không biểu lộ ra ngoài) có nguy cơ tạo ra một văn hoá mà ở đó việc thất bại và học tập không được khuyến khích, tất cả mọi người đều tự học trong im lặng. Nên nhớ rằng học tập công khai là một trong những cách để một người học việc có thể trở thành thợ lành nghề. Đây là một bước nhỏ cần thiết để mọi người thấy được rằng bạn đang cố gắng học, và sau đó họ sẽ dạy bạn.

Kể cả khi áp dụng thành công cách làm này thì nó cũng có thể dẫn đến một số ảnh hưởng xấu. Chẳng hạn, trong trường hợp bạn cần học cách xây dựng các hệ thống đồng thời (concurrent system), các lập trình viên khác sẽ không đánh giá cao nếu bạn tự viết một hệ thống nhắn tin của riêng mình bằng ngôn ngữ Scala thay vì sử dụng một sản phẩm đã có sẵn. Và họ sẽ thấy khó chịu hơn nếu họ không thể hỏi bạn bất cứ một câu hỏi nào về vấn đề này bởi vì đơn giản là bạn đang tham dự một cuộc họp. Và cuối cùng ông chủ của bạn cũng không thể hiểu liệu nhu cầu học của bạn có gây trở ngại trong việc hoàn thành dự án hay không. Tóm lại, bạn cần có đủ sự tinh tinh tế để giữ cho việc học tập của mình không gây ra vấn đề cho nhóm. Một trong những điểm nổi bật của cách tiếp cận thủ công là sẵn sàng đưa lợi ích của cộng đồng lên trước cá nhân, không sử dụng nhóm và khách hàng để phục vụ việc phát triển của cá nhân.

Mặt khác, cũng có người thể hiện sự thiếu hiểu biết của mình nhưng lại không đối mặt với nó. Những người làm điều này chỉ đơn thuần nhún vai xin lỗi, như để nói rằng “đó là điều hiển nhiên”. Việc này khiến họ trở nên thấp kém, thiếu hiểu biết và quá phụ thuộc vào các thành viên khác trong nhóm. Cuối cùng, nó tạo nên các nhóm mà ở đó các thành viên bảo vệ cái “nhà kho” kiến thức nhỏ bé của mình và nhún vai khi gặp một vấn đề nằm trong phạm vi lãnh thổ của người khác.

Vì vậy, điều quan trọng là phải cân bằng giữa mô hình này và việc thể hiện sự thiếu hiểu biết của bạn. Tự đối mặt với sự thiếu hiểu biết của chính mình có thể khiến bạn trở thành một kiêu ngạo không bao giờ hoàn thành được việc gì, còn nếu không thể hiện sự thiếu hiểu biết của chính mình và đối mặt với nó thì bạn sẽ trở nên kém cỏi và vô dụng hơn.

Hành động

Lập một danh sách các kỹ năng mà mình còn non kém (Thể hiện sự thiếu hiểu biến của mình) và cố gắng học từng thứ một để đạt được và loại bỏ nó khỏi danh sách. Khi biết thêm một kiến thức mới, bạn lại có thể phát hiện ra những thiếu sót khác của mình mà đã không nhận ra trước đây, đừng quên thêm chúng vào danh sách của bạn.

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

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

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

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Bài viết được sự cho phép của tác giả AnonyViet

Ruby và Python là hai trong số các ngôn ngữ lập trình được sử dụng phổ biến nhất để lập trình ứng dụng. Theo khảo sát hàng năm của Stack Overflow, được đánh giá bởi hơn 90.000 lập trình viên trên toàn thế giới. Ruby và Python nằm trong Top 15 ngôn ngữ lập trình có nhu cầu cao nhất trong năm 2019. Cho bạn nào chưa biết thì trên thế giới có khoảng 700 ngôn ngữ lập trình nhé.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Ruby và Python có rất nhiều điểm chung. Chúng đều là các ngôn ngữ hướng đối tượng bậc cao, tập trung vào sự đơn giản và rõ ràng. Tuy nhiên, như trên tiêu đề của bài viết, hôm nay chúng ta sẽ so sánh hai ngôn ngữ này để tìm ra ngôn ngữ nào tốt hơn cho các dự án lập trình ứng dụng web của bạn.

Trước tiên, chúng ta hãy bắt đầu tìm hiểu những thông tin cơ bản về Ruby và Python trước khi tiến hành so sánh.

Ruby

Ruby được phát hành vào năm 1995. Yukihiro Matsumoto, người sáng lập Ruby, cho biết: Mục đích của Ruby là làm cho các lập trình viên cảm thấy hài lòng. Ruby được thiết kế như một ngôn ngữ thân thiện với các lập trình viên. Nó cũng là một ngôn ngữ rất linh hoạt cho phép các lập trình viên dễ dàng thay đổi các yếu tố của nó và kết hợp các cách tiếp cận khác nhau theo nhiều cách mạnh mẽ. Ngôn ngữ này tập trung vào nhu cầu của con người, chứ không phải là máy tính.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Bất kỳ loại phần mềm nào cũng có thể được tạo ra với sự trợ giúp của Ruby, từ web đến các ứng dụng di động. Tuy nhiên, Ruby có thể được sử dụng cho nhiều mục đích khác nhau, nhưng nổi tiếng nhất vẫn là dùng để xây dựng các ứng dụng web. Ruby on Rails (RoR), một framework ứng dụng web mã nguồn mở được viết bằng Ruby, tập trung vào việc lập trình đơn giản nhưng hiệu quả. RoR được các lập trình viên yêu thích vì nó cung cấp cho họ các công cụ có sẵn giúp việc lập trình ứng dụng cực kỳ nhanh.

Ruby là ngôn ngữ lập trình hướng đối tượng. Trong Ruby, mọi giá trị, thậm chí là class, đều là đối tượng – object. Behavior mặc định có thể được sửa đổi bằng cách thêm các methods (phương thức) mới vào class và mở rộng các class tuỳ chỉnh. Ngoài ra, Ruby còn cho phép các lập trình viên sử dụng lại code và các đơn vị lập trình logic cho các dự án khác. Bên cạnh đó, lập trình hướng đối tượng đảm bảo tính kết hợp các đối tượng lại với nhau thành các mô đun để cấu trúc dự án trở nên rõ ràng hơn.

Ruby sử dụng trình thu gom rác là một hệ thống quản lý bộ nhớ tự động, do đó, lập trình viên không phải phân bổ bộ nhớ theo cách thủ công. Bên cạnh các tính năng hữu ích khác, Ruby còn có khả năng thích ứng cao và dễ dàng chấp nhận các bản cập nhật và bản phát hành mới.

Xem thêm việc làm ruby các vị trí

Python

Python được tạo ra bởi một lập trình viên người Hà Lan, Guido van Rossum. Được phát hành vào năm 1991, Python là ngôn ngữ lập trình đa năng nhất cho việc lập trình back-end. Python là một ngôn ngữ kịch bản mạnh mẽ (scripting language) cho phép bạn tạo các tập lệnh và thực hiện nó nhiều lần mà không cần tốn nhiều thời gian code.

Giống như Ruby, Python là một ngôn ngữ hướng đối tượng bậc cao. Triết lý mà Python tập trung nhiều nhất là khả năng đọc. Code Python cũng giống như nói chuyện tiếng Anh với nhau vậy, cú pháp của nó rất dễ sử dụng và rất đơn giản để đọc. Đó là lý do tại sao Python là ngôn ngữ tuyệt vơi nhất cho beginners. Python cũng có tiếng tăm trong giới những lập trình viên có kinh nghiệm, những người này thường sẽ chọn Python là ngôn ngữ thứ hai hoặc thứ ba để học.

>>> Xem thêm: Python Là Gì? Các Bước Tự Học Lập Trình Python

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Python được thiết kế cho các chương trình khoa học và học thuật. Nó có thể xử lý khá nhanh chóng các dữ liệu lớn và được sử dụng để lập trình các trang web nặng. Python là ngôn ngữ lập trình được ưu thích nhất cho trí tuệ nhân tạo, machine learning và các ứng dụng Robot. Python còn có thể được sử dụng để lập trình các ứng dụng di động.

Python là ngôn ngữ đa nền tảng mà không cần cài đặt (portable code). Điều đó có nghĩa là các lập trình viên có thể sử dụng code Python trên nhiều hệ điều hành (Linux, Windows, Mac, Unix) mà không cần phải thay đổi code.

Framework web mã nguồn mở, Django, khuyến khích việc lập trình nhanh chóng và sạch sẽ. Framework mạnh mẽ này được dùng để xây dựng một số trang web phổ biến như Spotify, Instagram và YouTube. Không có gì ngạc nhiên khi theo đánh giá PYPL của Github, Python là ngôn ngữ lập trình phổ biến nhất trong năm 2020.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

 Ruby vs Python: Những khác biệt chính

Như đã được đề cập, cả Ruby và Python đều là các ngôn ngữ kịch bản hướng đối tượng bậc cao thuộc thế hệ mới. Tuy nhiên, sự khác biệt chính giữa chúng là nằm ở triết lý đằng sau của mỗi ngôn ngữ.  Ruby nhằm mục đích làm các lập trình viên hài lòng với cú pháp thanh lịch và đẹp đẽ, trong khi nhiệm vụ chính của Python là làm cho mọi thứ trở nên rõ ràng với các lập trình viên. Ruby cung cấp cho các lập trình viên sự tự do và linh hoạt. Họ có thể giải quyết vấn đề bằng các phương pháp khác nhau, trong khi Python chỉ có một cách chính xác để giải quyết vấn đề. Các cách tiếp cận khác nhau làm cho Ruby và Python phù hợp với các loại ứng dụng web khác nhau.

Dưới đây là bảng so sánh sự khác biệt chính giữa Python và Ruby.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Khi nào nên chọn Ruby?

Ruby sẽ là sự lựa chọn tuyệt vời cho các doanh nghiệp nhỏ và các công ty khởi nghiệp mong muốn lập trình các ứng dụng nhanh. Ruby rất hữu ích khi bạn có nhu cầu xây dựng một nguyên mẫu nhanh ngay cả khi dự án chưa được xác định rõ ràng và sẽ có các thay đổi trong tương lai. Nhìn chung, Ruby được khuyến nghị trong các trường hợp có thời gian ngắn và bị giới hạn về ngân sách.

Nếu bạn cần tìm các ví dụ cụ thể hơn về các loại ứn dụng được xây dựng tốt nhất với Ruby, thì đó là các trang web thương mại điện tử và phát nhạc trực tuyến. Shopify là một ví dụ đầy cảm hứng về giải pháp thương mại điện tử phức tạp được lập trình với sự trợ giúp của framework Ruby on Rails đã có mặt trên thị trường từ năm 2006 và là ngôi nhà chung cho hơn 800 ngàn của hàng trực truyến.

Framework Ruby on Rails hoàn toàn phù hợp với lập trình các ứng dụng web tuỳ chỉnh nhiều chức năng. Ruby còn có một trong những cộng đồng mạnh nhất, đảm bảo tài liệu đầy đủ và chính xác, kèm theo đó là một thư viện rộng lớn được gọi là Ruby gems. Chúng cung cấp các chức năng đặc biệt cho các ứng dụng Ruby và tăng tốc mọi giai đoạn trong quá trình lập trình.

Đồng thời, bạn phải nhớ rằng Ruby không phải là lựa chọn tốt nhất để tạo ra các ứng dụng web đòi hỏi phải kiểm soát toàn bộ kiến trúc sản phẩm, modules chương trình hoặc tích hợp dữ liệu.

Khi nào nên chọn Python?

Python sẽ là lựa chọn tốt hơn cho các giải pháp và ứng dụng khoa học phức tạp trên cloud. Nó cũng được sử dụng để lập trình các ứng dụng có quy mô theo chiều ngang. Các ứng dụng như vậy giúp quản lý khối lượng công việc thay đổi thường xuyên.

Xây dựng các ựng dụng với Python, có thể vượt xa các dự tích lập trình web ban đầu so với khi sử dụng Ruby. Bởi vì Python được sử dụng trong các ngành công nghiệp khác nhau, từ khoa học dữ liệu đến robot. Đó là lý do tại sao cộng đồng Python là một trong những cộng đồng đa dạng nhất. Trên Stack Overflow, cộng đồng trực tuyến lớn nhất và đáng tin cậy nhất dành cho các lập trình viên, có hơn 1.455.817 câu hỏi về Python.

>>> Xem thêm: Python cơ bản cho ứng dụng trong công việc

Python, kết hợp với thư viện TensorFlow, đơn giản hoá đáng kể việc lập trình các giải pháp dựa trên AI vì nó có các thuật toán machine learning tích hợp. Python cũng được sử dụng rộng rãi trong xử lý và phân tích dữ liệu. Nó đặc biệt hữu ích trong phân tích âm thanh và video nhờ khả năng hiển thị dữ liệu và khả năng sắp xếp dữ liệu của nó.

Xem thêm tuyển dụng python các vị trí

Kết luận

Sẽ là không công bằng khi tuyên bố đâu mới là người chiến thằng. Cả hai đều là ngôn ngữ bậc cao mạnh mẽ được các lập trình viên yêu thích. Tuy nhiên, bạn phải nhớ rằng Ruby và Python phù hợp với các loại ứng dụng khác nhau. Nếu bạn đang có kế hoạch lập trình các trang web và ứng dụng dữ liệu nặng với các yếu tố có machine learning, hãy chọn Python. Trong trường hợp, bạn muốn lập trình ứng dụng web nhanh, Ruby sẽ là sự lựa chọn tuyệt vời.

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

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

Xem thêm các việc làm it lương cao hấp dẫn tại TopDev

Tips tạo dấu ấn cho CV ứng viên ngành IT

CV IT Developer
CV IT Developer

Bạn đã biết cách tạo một CV ấn tượng để ghi điểm với nhà tuyển dụng hay chưa? Một CV IT Developer liệu có được đảm bảo các nội dung và format đúng chuẩn? Nếu bạn là ứng viên trong lĩnh vực CNTT, đừng bỏ qua bài viết! TopDev sẽ chia sẻ cho bạn những mẹo giúp tạo dấu ấn đặc biệt đối với nhà tuyển dụng.

Chú trọng đến sự trải nghiệm gián tiếp

Nếu là những người mới, có thể chiếc CV cho sinh viên IT mới ra trường (CV IT student) dường như còn quá “non” để đủ sức cạnh tranh. Tuy nhiên, kinh nghiệm nhiều hay ít không quan trọng. Bạn vẫn có thể tạo được lợi thế nếu có sự chuẩn bị khoa học nhất.

CV IT Developer
Cách ứng viên nhận biết về sự trải nghiệm của bản thân rất quan trọng.

Thách thức lớn nhất đối với các ứng viên nằm ở vấn đề kinh nghiệm. Thế đâu là giải pháp hoàn hảo cho việc xoay chuyển các thách thức này? 

Nếu là một ứng viên mới, đừng e ngại về năng lực. Bạn hãy liệt kê những công việc tình nguyện, hoặc các dự án về công nghệ mà bạn/team đã thực hiện, cộng tác,… Ngoài ra, nếu có các sản phẩm khoa học về ngành IT hay đã từng thực tập; làm báo cáo về một vấn đề chuyên sâu nào đó thuộc lĩnh vực IT, hãy tự tin chia sẻ với nhà tuyển dụng.

Đó được gọi là trải nghiệm gián tiếp. Tức sự cộng hưởng về mức độ am hiểu của ứng viên về một khía cạnh có liên quan đến việc giải quyết các vấn đề mà nhà tuyển dụng đặt ra. 

Bạn phải tin rằng bạn đang dẫn dắt nhà tuyển dụng đi đúng hướng. Đồng thời, sự lựa chọn thông minh từ các trải nghiệm cá nhân sẽ phản ánh tính xác thực; khả năng phân tích về kiến thức và tiềm năng phát triển của bạn.

>>> Xem thêm các vị tri tuyển dụng IT nổi bật tại AIA Vietnam

Gợi nguồn tương tác thông tin bổ sung

Thông qua các tài khoản mạng xã hội, nhà tuyển dụng sẽ biết về bạn rõ hơn. Đồng thời, có những đánh giá chính xác hơn dựa trên các tài nguyên ấy. Một số tài nguyên phản ánh rõ cá tính cảu bạn như Facebook, Linkedin, Instagram,… 

CV cho sinh viên IT mới ra trường
Kênh truyền thông mạng xã hội của ứng viên là yếu tố khai thác hiệu quả cá tính của ứng viên.

Bạn là ứng viên tích cực? Sở hữu cá tính hướng nội hay hướng ngoại? Bạn quan tâm đến các vấn đề, lĩnh vực chuyên sâu nào? Chúng đều có ý nghĩa lớn trong việc khoanh vùng ứng viên tiềm năng. Do vậy, hãy chia sẻ các nguồn thông tin với nhà tuyển dụng. Điều này giúp gợi cho họ các minh chứng thể hiện bạn xứng đáng với vị trí ứng tuyển.

Đặc biệt nếu bạn ứng tuyển các vị trí ngành IT của các công ty lớn, ngoài CV IT tiếng Anh (CV English IT), việc bổ sung các kênh mạng xã hội có ý nghĩa quan trọng. Hãy lưu tâm điều này và tận dụng lợi thế từ mạng xã hội một cách khôn ngoan nhất.

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Tạo CV IT chuẩn ATS miễn phí trên TopDev

Văn phong ngôn ngữ thật sự là điểm nhấn!

Nếu một CV sở hữu cách định dạng  – bố cục trình bày (format và visual), tổ chức nội dung (content) đầy đủ, thu hút thì chưa chủ để tạo nên một CV IT chuyên nghiệp. Điểm nhấn quan trọng nhất nằm ở văn phong ngôn ngữ. 

cv it tiếng anh
Văn phong ngôn ngữ có giá trị quan trọng đối với chất lương CV IT.

Không một nhà tuyển dụng nào dành 5 phút để đọc một CV chứa các câu cú dài ngoằn, phức tạp. Thậm chí, cách viết quá hời hợt, không có sự hiểu biết về văn viết cơ bản sẽ khiến CV của bạn bị out ngay lập tức.

Cách diễn đạt trong CV cần rõ ràng, tránh mơ hồ và thiếu khả thi. Chẳng hạn, bạn ứng tuyển vị trí về Mobile App Developer, thì tính tư duy mạch lạc trong CV IT Developer được nhà tuyển dụng rất quan tâm. Đừng biến CV của bạn trở nên khó đọc, khó hiểu và không có giá trị.

Hãy đọc lại thông tin trong CV để chắc chắn rằng nội dung đều được liên kết với nhau một cách tốt nhất. Chính việc kiểm tra sẽ giúp CV của bạn chỉn chu hơn.

Một điều quan trọng nữa là bạn có thể cập nhật những nội dụng mới. Đâu là điểm mạnh – điểm yếu để định hướng truyền tải nội dung trong CV IT Developer một cách hợp lý. CV cần được bạn update lại nếu bạn có những thay đổi tốt hơn trong hành trình nghề nghiệp. Đó có thể là các kinh nghiệm mới, các dự án với quy mô lớn hơn. Hãy đầu tư cho CV để sẵn sàng cho cuộc chơi tuyển dụng bất cứ lúc nào!

Lời kết

Một CV IT ấn tượng sẽ giúp gia tăng cơ hội ứng tuyển của bạn. TopDev mong rằng với những tip vừa chia sẻ, bạn đọc sẽ có những thong tin bổ ích. Hãy xem xét về nội dung, hiệu chỉnh về format để CV của bạn thật xịn xò, đủ sức tạo được dấu ấn riêng của bản thân. Đặc biệt, bạn cần lưu các đặc trưng riêng từng vị trí, ví dụ như CV IT Developer để có cách triển khai nội dung CV IT phù hợp. Chúc bạn thành công!

Học AI tại Phần Lan, tại sao không?

Học Trí tuệ nhân tạo – Artificial Intelligence (AI) đã và đang góp phần không nhỏ trong việc giúp chúng ta thêm hiểu về thế giới và xây dựng tương lai tốt đẹp hơn. AI tác động tích cực đến xã hội từ sản xuất đến giao thông, năng lượng, chăm sóc sức khỏe, kinh tế và cả những thách thức từ môi trường.

Không chỉ thế giới đón nhận những tiến bộ của AI, tại thị trường Việt Nam cũng đang ghi nhận nhu cầu tuyển dụng nhân lực lĩnh vực này. Có thể nói, đây là thời điểm không thể nào thích hợp hơn để học về AI, cũng như trở thành chuyên gia về nó.

  Trải nghiệm giáo dục Phần Lan cùng Hội thảo Khoa học Việc làm: Future Is Made In Finland
  Hội thảo Khoa học Việc làm - Webinar Series: Future Is Made In Finland

Tiếp thu kiến thức thực tế nhất về AI tại Phần Lan

Không những là quốc gia nổi tiếng về chiếc nôi giáo dục, Phần Lan còn đặt mục tiêu trở thành một trong những quốc gia đi đầu trong việc ứng dụng AI. Trung tâm Trí tuệ Nhân tạo Phần Lan tập hợp nhiều ngành khoa học, lĩnh vực kinh doanh, sáng kiến đổi mới giáo dục và xã hội cho cuộc cách mạng AI. Trong đó, các nhà khoa học và doanh nghiệp cùng hợp tác phát triển và khai thác AI giúp nhân loại giải quyết những thách thức hiện thời của thời đại. 

Episode 5: Get REAL, AI!

Tiếp nối chuỗi hội thảo Webinar Series: Future is made in Finland, episode 5 của chương trình sẽ diễn ra vào ngày 11/11/2020 lúc 17h với tên gọi Get REAL, AI!, tổ chức bởi Finnish Center for Artificial Intelligence, FCAI, điều phối bởi tiến sĩ Patrik Floréen, Giám đốc, hợp tác quốc gia và quan hệ đối ngoại FCAI, Helsinki University.

Theo dõi chương trình để tìm hiểu bạn có thể làm gì để tạo ra REAL AI cho Real People – AI thật cho Việc thật trong cộng đồng tiên tiến tại Phần Lan. Qua các cuộc thảo luận từ những nhà khoa học và chuyên gia hàng đầu, hội thảo lần này giới thiệu các cơ hội học tập, nghiên cứu, làm việc và hợp tác tại Phần Lan.

Timeline EP 5: Get REAL, AI tại chuỗi hội thảo

  • 17:00 – 17:05: Giới thiệu chương trình
  • 17:05 – 17:30: THE REAL AI IS MADE HERE! REAL AI FOR REAL PEOPLE IN THE REAL WORLD: được trình bày bởi Ms. Samuel Kaski, Giáo sư ngành Khoa học Máy tính, Aalto University và Giám đốc tại Finnish Center for Artificial Intelligence
  • 17:30 – 17:45: BECOME A REAL AI EXPERT OF FUTURE: Mr. Teemu Roos, Giáo sư ngành Khoa học Máy tính, Helsinki University và là Leader của chương trình AI Education tại Finnish Center for Artificial Intelligence
  • 17:45 – 17:55: Giải lao
  • 17:55 – 18:05: STUDYING AND WORKING IN REAL AI IN FINLAND: Milica Todorović, Research fellow, Aalto University
  • 18:05 – 18:25: CONQUERING CURRENT AND FUTURE PROBLEMS WITH REAL AI: Nidhi Singh, Director of Research, Elisa Corporation
  • 18:25 – 18:30: Kết thúc

Tìm hiểu chi tiết thông tin về chuỗi Hội thảo và đăng ký ngay tại: https://www.studyinfinland.fi/future-is-made-in-finland/webinar-series-programme/episode-v-get-real-ai

Higher Order Functions trong Scala

scala

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

Định nghĩa Higher Order Function

Higher Order Function là function thỏa mãn ít nhất một trong hai điều kiện :

  • Có ít nhất một tham số truyền vào là một function khác
  • Kết quả trả về của HOF đó là một function khác.

Với Higher Order Function, tính trừu tượng hóa, tái sử dụng chính là điểm mạnh.

  10 lí do để học Scala và FP
  Cân bằng công việc chính với dự án ngoài liệu có khó không?

Tính trừu tượng hóa (Abstraction)

Hãy nghĩ đến dây chuyền lắp ráp một chiếc xe. Dây chuyền gồm bốn bộ phận:

  • Bộ phận tạo bánh xe
  • Bộ phận tạo khung xe
  • Bộ phận tạo động cơ
  • Bộ phận lắp ráp

Bộ phận tạo bánh xe sẽ tạo ra bánh xe và chuyển qua bộ phận lắp. Tương tự như vậy, bộ phận tạo khung xe và bộ phân tạo động cợ sẽ tạo ra khung và động cơ, sau đó chuyển sang cho bộ phân lắp ráp. Bộ phận lắp ráp không cần phải biết bánh xe, khung xe hay động cơ xe được tạo ra như thế nào. Chức năng của bộ phận lắp ráp chỉ là ghép các thành phần để tạo ra chiếc xe mà thôi. Bộ phận lắp ráp chính là một HOF, nó nhận output của ba bộ phận còn lại để tạo ra output cho riêng nó. Có thể diễn giải như sau

Từ ví dụ trên, chúng ta có thể hiểu tính trừu tượng hóa của HOF giúp che giấu chi tiết bên trong một function, làm giảm sự phức tạp. Vấn đề sẽ được xử lý ở một tầng cao hơn, trừu tượng hơn.

Tính tái sử dụng (Reusable)

Cũng sử dụng ví dụ về dây chuyền tạo ra một chiếc xe. Chúng ta xây dựng một dây chuyền sản xuất xe máy. Tuy nhiên, nếu phải tạo ra thêm một dây chuyền sản xuất xe hơi thêm vào thì sẽ như thế nào ? Tạo ra một dây chuyền mới là giải pháp đơn giản nhất nhưng lại tốn kém về chi phí. Chúng ta có thể bổ sung thêm cho bộ phận tạo bánh xe máy khả năng tạo ra bánh xe hơi. Tương tự như vậy, bộ phận tao khung xe và động cơ đều trang bị thiết bị tạo ra đồng thời linh kiện cho xe máy lẫn xe hơi. Như vậy, ba bộ phân trên đều được sử dụng tùy theo yêu cầu tạo ra sản phẩm. Đó chính là tính tái sử dụng.

Cách sử dụng HOF trong Scala

Một bài toán đơn giản được đặt ra, hãy hình dung bạn đang là một ông chủ và muốn tăng lương cho nhân viên của mình. Tăng lương là việc bạn nhân số lương hiện tại của nhân viên với một hệ số nhất định. Bạn nghĩ rằng, việc tăng lương cần linh động do đó phải tạo ra nhiều cách tăng lương khác nhau. Với bài toán trên, chúng ta sẽ đi giải quyết như sau:

  • Để tiện cho việc quản lý vấn đề tăng lương, bạn sử dụng một Object có tên là SalaryRaiser.
  • Bạn có 3 mức tăng lương khác nhau, theo thứ tự tăng dần là: smallPromotion()greatPromotion() và hugePromotion().
  • Ở mức smallPromotion, hệ số là 1.1
  • Ở mức smallPromotion, hệ số là logarit cơ số 10 của số lương hiện tại ứng với nhân viên đó.
  • Ở mức smallPromotion, hệ số là số lương hiện tại của nhân viên đó.

Theo cách thông thường, chúng ta sẽ dùng một vòng for để cập nhật giá trị lương của từng nhân viên. Sau đó, trả về danh sách lương của nhân viên sau khi đã cập nhật. Các bạn xem code phía dưới.

Higher Order Functions trong Scala

Với HOF, việc viết code trở nên dễ dàng và ngắn gọn hơn khá nhiều. Ở đây, chúng ta sẽ sử dụng một HOF đó là map(). Chúng ta truyền vào map() một function, chính function này sẽ giúp chúng ta thay đổi lương của mỗi nhân viên theo hệ số mong muốn. Hàm map() đã thể hiện tính linh hoạt thông qua việc định nghĩa cách xử lý từng phần tử trong Array.

Higher Order Functions trong Scala

Hiện nay đối với Scalamap() là một trong những HOF được dùng nhiều nhất. Ngoài ra, các bạn có thể tìm hiểu thêm về các HOF khác như filter()flatMap() …

Nguồn tham khảo

  1. https://discuss.grokking.org/t/higher-order-functions-la-gi-va-d-c-s-d-ng-nh-th-nao/309
  2. https://docs.scala-lang.org/tour/higher-order-functions.html

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

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

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

Factory Function vs. Class

Factory Function vs. Class

Bài viết được sự cho phép của tác giả Lưu Bình An

Để tạo một object với các method và data dựng sẵn, chúng ta có các phương pháp để làm trong JS:

// class
class ClassCar {
    drive() {
        console.log('GOOO');
    }
}

const car1 = new ClassCar();
console.log(car1.drive());

// constructor function
function ConstructorCar() {}

ConstructorCar.prototype.drive = function() {
    console.log('GOOO');
}

const car2 = new ConstructorCar();
console.log(car2.drive());

// factory
const proto = {
    drive() {
        console.log('GOOO');
    }
};

const factoryCar = () => Object.create(proto);

const car3 = factoryCar();
console.log(car3.drive());

Về tính năng, thì cả 3 là như nhau, và có thể dùng thay thế cho nhau được.

Có thể bạn chưa biết: Trong JS, bất cứ function nào trả về một object, mà không phải là constructor function hay class, thì được gọi là factory function

Vài so sánh giữa Factory và Constructor

Constructor bắt buộc phải khởi tạo bằng keyword new. Factory thì không.

Vậy thì keyword new của Constructor và Class nó làm gì?

  1. Khởi tạo một object mới và bind giá trị cho từ khóa this
  2. Bind instance.__proto__ vào Constructor.prototype
  3. Bind instance.__proto__.constructor vào Constructor
  4. Ngầm trả về this (refer vào giá trị instance)
  Top 5 API thú vị dành cho các New Developers
  3 phút làm quen với Vue.js

Về mặt lợi ích khi sử dụng Constructor và Class

  • Dễ tiếp cận với những người có xuất phát điểm từ những ngôn ngữ lập trình có hỗ trợ class
  • this luôn prefer đến một object mới
  • Nhiều người thích cách viết myFoo = new Foo()

Nhược điểm của Constructor và Class

  • Bắt buộc phải dùng từ khóa new để khởi tạo
  • Tất cả những thằng sử dụng đều dùng chung một constructor, rất khó nếu muốn thay đổi hiện thực bên trong constructor từ bên ngoài.
  • Không đáp ứng dụng nguyên tắc open/closed: API chỉ cho phép extend, nhưng không cho phép modify
  • Kết thừa class và các vấn đề mà nó sinh ra là câu chuyện không mới khi các bạn viết object oriented (có thể tra cứu google bằng các từ khóa sau: the fragile base class problem, the gorilla banana problem, the duplication by necessity problem)

Lợi ích việc sử dụng Factory

  • Linh động hơn class và constructor function
  • Bạn sẽ không bao giờ đụng vô từ khóa extend vốn là một con đường đã gây ra đau khổ bấy năm nay.
  • Không còn cần dùng từ khóa new, không còn loằn ngoằn rối rắm với từ khóa this
  • Nhiều người thích đọc code dạng này myFoo = createFoo()

Nhược điểm của Factory

  • Không thể check instanceof, do không có liên kết giữa instance và Factory.prototype
  • this không còn refer vào object mới tạo (this cũng có ưu nhược điểm của nó chứ không phải toàn nhược điểm)
  • Có thể chậm hơn một chút. Thật ra cũng không cần quá bận tâm việc này, vì chưa ai chứng minh được nó ảnh hưởng đến tốc độ, hiệu năng của ứng dụng, lý thuyết là chậm hơn xíu xiu nhưng máy tính giờ nhanh lắm rồi.

Nên dùng factory function

Có rất nhiều quan điểm đưa ra để khuyên bạn đừng dùng contructor trong JS, bài viết Constructors Are Bad For JavaScript có liệt kê khá khá lý do bạn có thể tham khảo.

Một ví dụ tương đối đầy đủ về factory function

const Player = (name, level) => {
  let health = level * 2;
  const getLevel = () => level;
  const getName  = () => name;
  const die = () => {
    // uh oh
  };
  const damage = x => {
    health -= x;
    if (health <= 0) {
      die();
    }
  };
  const attack = enemy => {
    if (level < enemy.getLevel()) {
      damage(1);
      console.log(`${enemy.getName()} has damaged ${name}`);
    }
    if (level >= enemy.getLevel()) {
      enemy.damage(1);
      console.log(`${name} has damaged ${enemy.getName()}`);
    }
  };
  return {attack, damage, getLevel, getName}
};

const jimmie = Player('jim', 10);
const badGuy = Player('jeff', 5);
jimmie.attack(badGuy);

Để kế thừa trong factory function, các bạn có thể làm như sau

const Person = (name) => {
  const sayName = () => console.log(`my name is ${name}`)
  return {sayName}
}

const Nerd = (name) => {
  // tạo Person, sau đó trả về hàm sayName
  const {sayName} = Person(name)
  const doSomethingNerdy = () => console.log('nerd stuff')
  return {sayName, doSomethingNerdy}
}

const jeff = Nerd('jeff')

jeff.sayName() //my name is jeff
jeff.doSomethingNerdy() // nerd stuff

Với cách trên, chỉ định rất cụ thể hàm nào sẽ được trả về, còn nếu muốn trả tất cả những gì của Person, đơn giản là merge object

const Nerd = (name) => {
  const prototype = Person(name)
  const doSomethingNerdy = () => console.log('nerd stuff')
  return Object.assign({}, prototype, {doSomethingNerdy})
}

Nghe có vẻ hơi trái tai, mặc dù JS đã có hỗ trợ class, nhưng các bạn đừng nên dùng nó.

JavaScript Factory Functions vs Constructor Functions vs Classes

FACTORY FUNCTIONS AND THE MODULE PATTERN

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

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

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

Khi nào bạn đã là Senior dev

Khi nào bạn đã là Senior dev

Bài viết được sự cho phép của tác giả Lưu Bình An

Như thế nào là một Senior dev, có rất nhiều chuẩn mực được đặt ra như

  • Senior dev là những người viết code tốt hơn junior dev. Thực tế có những junior dev viết code rất tốt, và không ít senior dev viết code méo thể nào maintain nổi
  • Senior dev là người biết tuốt những công nghệ mới nhất. Thế hệ trẻ mới thật sự là người tiếp cận công nghệ mới nhất.
  • Senior dev hoàn thành công việc nhanh hơn. Không hẳn, nếu bạn giao task cho một principle dev, anh ta phải viết unit test coverage 90%, phải thực hiện một loạt các bài test khác, document cho toàn bộ những gì anh ta làm, thời gian có khi cần gấp đôi, gấp ba lần
  • Senior là những người viết code ít bug hơn, thậm chí không có bug, nhưng chúng ta điều biết một sự thật hơi đau đớn, tất cả code điều có bug, dev cũng chỉ là người và viết code chạy trên những môi trường không thể nào biết hết được, với tỉ tỉ use case khác nhau được tạo ra từ cả triệu người sử dụng.
  Quy tắc 333 hay là phiếm đàm về chuyện phỏng vấn Senior Developer

Vậy thì tiêu chí nào để đánh giá một bạn là Senior dev nói chung?

Đây là cách mà các sếp mình dùng để đánh giá bậc Senior Dev

Nên

  • Khi tiếp nhận từ đồng nghiệp, hãy suy nghĩ, dù là bất cứ câu hỏi nào, nó vẫn là câu đáng để hỏi, không có câu hỏi nào vô lý, hỏi vậy cũng hỏi. Luôn luôn lắng nghe, lâu lâu trả lời 😀
  • Không đưa ra bất kỳ nhận cá nhân trên code review, thảo luận mang mục đỉnh giải quyết vấn đề chứ không phán xét.
  • Khi review code, luôn luôn tìm ít nhất một điểm gì đó để đóng góp, trên tinh thần thảo luận, đặt câu hỏi, không đưa ra chỉ thị phải làm như thế nào
  • Sẵn sàng giải thích, một cách kiên trì, tìm ra giải pháp cho những vấn đề mà team đang vướng phải.
  • Tự thân tìm hiểu học hỏi những kỹ năng nâng cao nghề nghiệp
  • Không cần người cầm cây dí đít mới làm, luôn có tình thần trách nhiệm cao trong công việc được giao phó
  • Tìm giải pháp khi có vấn đề, chứ không phải ngồi đó la làng khó quá sao làmkhó quá anh tự đi mà làm
  • Khi đưa ra giải pháp, cân nhắc đảm bảo cân đối giữa các yếu tố: thời gian hoàn thành, best practice, chi phí thực hiện, mức độ rủi ro tới các phần khác của hệ thống
  Hãy commit code có tâm như Senior Developer

Tránh

  1. Khi gặp một cách code nào đó hơi lạstyle code bạn không thích thì sẽ là lối kiểu Đưa nào viết cái gì tào lao quá vậy, viết thế này như anh đi
  2. Khi review code – “nên đổi thế này, thế này đi”
  3. Áp đặt cách tư duy lập trình của mình lên người khác

Còn gì nữa không, mọi người góp ý thêm.

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

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

Lộ diện những “nhân vật” đầu tiên góp mặt tại Vietnam Web Summit 2020 | VWS2020

Trước khi Agenda VWS2020 chính thức được công bố, cùng điểm qua danh sách “sneak peek” những đại diện đầu tiên góp mặt trong đội ngũ Honored Speakers năm nay. Liệu bạn có đoán được chủ đề các chuyên gia sẽ chia sẻ tại VWS2020 là gì?

  1. Mr. LÊ YÊN THANH – CEO, Founder @BusMap

Được mệnh danh là “Chàng trai vàng trong làng tin học” , anh Lê Yên Thanh từng từ chối lời mời làm việc tại Google Singapore và trở về Việt Nam khởi nghiệp.

Hiện tại. anh đồng thời là CEO, Founder của BusMap và cũng là Co-founder của Elefos.io.
Ở vai trò của một “full-stack developer”, anh Thanh với những kỹ năng và kinh nghiệm xoay quanh công việc Software Development, đặc biệt về coding, thuật toán và giải quyết những vấn đề phức tạp, mục tiêu của anh là trở thành một “excellent programmer”, là người tạo ra những thay đổi tích cực cho đời sống.

2. Mr. PHAN NGUYỄN MINH TRƯỜNG – Technical Architect @NashTech

Anh đang là Principal Software Engineer tại NashTech Limited với thâm niên hơn 7 năm tính đến hiện tại.

Anh Phan Nguyễn Minh Trường với lịch sử kinh nghiệm dày dặn ở vị trí “đương đầu” cùng các con số như Lead một đội ngũ vận hành BI cho khối Banking ACB trong hơn 6 năm.
Anh đã thử sức ở nhiều lĩnh vực outsourcing: Media supply chain, Payment gateways, Supplier Information & Supply Chain, Insurance, Finance, Human Resources, Real Estate.

3. Mr. HOÀNG MINH DƯƠNG – Managing Director @AppROI

Với những kiến thức anh Hoàng Minh Dương đã “tích lũy” trong hơn 8 năm làm việc trong lĩnh vực Digital Marketing tại những công ty công nghệ lớn như Lazada, VNG, Shopee… anh có được những góc nhìn đa dạng và thấu hiểu về cách thức vận hành của digital trên nhiều lĩnh vực và ngành hàng khác nhau.

Đầu năm 2020, nhận thấy được tiềm năng phát triển của công nghệ app tại Việt Nam, anh Dương quyết định thành lập công ty của chính mình với tên gọi AppROI.

4. Mr. TRẦN TRỌNG THANH – Principal Web Engineer @Chotot.vn

Thúc đẩy bởi đam mê tạo ra những giao diện đẹp và tối ưu trải nghiệm người dùng, anh Thanh lựa chọn bắt đầu từ những vị trí UI dev, flash dev…. trong công ty tại Singapore.
Tiếp tục mục tiêu mang đến người dùng những trải nghiệm tuyệt vời, anh quyết định thành lập công ty riêng (Nâu Studio).

Sau một thời gian dài gắn bó với Nâu Studio, anh đầu quân cho các công ty TMĐT với vị trí Principal Web Engineer. Hiện tại anh công tác tại Chotot.vn.

5. Mr. TOÀN TRẦN – Vice President, Mobile @Lazada

Đắm say với Android Development kể từ năm 2011, đến nay anh đã bàn giao rất nhiều ứng dụng cho doanh nghiệp, từ startups cho đến những tập đoàn lớn, phục vụ cho hơn 80 triệu người dùng rộng khắp thế giới.

Anh hướng đến việc mang những kỹ năng mình có vào trong vòng phát triển của doanh nghiệp, thông qua việc gia tăng những giá trị, tối ưu mọi thứ có thể và xây dựng một đội ngũ tâm huyết trên suốt hành trình.

Anh có kinh nghiệm trong cả việc xây dựng đầu (scratch-build) cho đến việc tái cấu trúc/tối ưu những ứng dụng sẵn có.

Đăng ký tham gia sự kiện VWS2020 để có cơ hội gặp gỡ, giao lưu và lắng nghe những chia sẻ về sự thay đổi của web development/marketing và kinh doanh số trong thời gian tới bởi hàng chục diễn giả đến từ những công ty công nghệ hiện đang hoạt động tại Việt Nam.

===

Vietnam Web Summit 2020: LEAD THE AGE OF REVOLUTION TECHNOLOGIES

Vào tháng 12/2020, Vietnam Web Summit 2020 (VWS2020) trở lại tại 2 thành phố TP.HCM và HN – nơi những ý tưởng sẽ gặp nhau và cùng đón đầu những xu hướng, công nghệ mới trong chặng đường 5 năm tiếp theo – một kỷ nguyên mới của công nghệ!

Sự khác biệt giữa framework và library

Sự khác biệt giữa framework và library

Bài viết được sự cho phép của tác giả Kien Dang Chung

Trong lập trình ứng dụng nói chung và lập trình web nói riêng, khái niệm framework được nhắc đến rất nhiều bởi nó đang là một xu hướng phát triển các ứng dụng hiện nay. Bạn đã phân biệt Framework và Library khác nhau như thế nào chưa? Nếu bạn có câu trả lời chính xác tức là bạn đã nắm bắt được cách thức xây dựng ứng dụng tiên tiến nhất. Còn nếu chưa, cùng TopDev khám phá ngay dưới bài viết này.

Khái niệm Library

Library (thư viện) trong lập trình là một tập hợp các hàm, phương thức hoặc đoạn mã được xây dựng sẵn, nhằm thực hiện các nhiệm vụ cụ thể và có thể được tái sử dụng trong nhiều ứng dụng khác nhau. Thư viện giúp lập trình viên tiết kiệm thời gian và công sức bằng cách cung cấp các chức năng chung, chẳng hạn như xử lý dữ liệu, quản lý giao diện người dùng, hoặc thao tác với tập tin, mà không cần viết lại mã từ đầu.

Ví dụ:

  • JQuery là một library, nó cung cấp các chức năng giúp chúng ta thao tác với DOM.
  • LinqJS là một library, nó cung cấp các chức năng giúp chúng ta truy vấn (query) dữ liệu dễ dàng, đơn giản và nhanh hơn.

Ưu điểm của Library

  • Tái sử dụng mã: Thư viện cung cấp các hàm và phương thức sẵn có, cho phép lập trình viên tái sử dụng mã trong nhiều dự án khác nhau mà không cần viết lại từ đầu, giúp tiết kiệm thời gian và công sức.
  • Dễ dàng sử dụng: Các thư viện thường được thiết kế với giao diện lập trình dễ hiểu, giúp lập trình viên nhanh chóng tích hợp và sử dụng mà không cần phải tìm hiểu sâu về cách thức hoạt động bên trong.
  • Linh hoạt: Library cung cấp một tập hợp các chức năng mà lập trình viên có thể sử dụng tùy theo nhu cầu. Bạn có quyền kiểm soát khi nào và ở đâu sử dụng các hàm trong thư viện.
  • Tập trung vào nhiệm vụ cụ thể: Thư viện thường tập trung vào giải quyết một số vấn đề nhất định, chẳng hạn như xử lý chuỗi, mảng, yêu cầu HTTP, hoặc thao tác với DOM, giúp giải quyết nhanh chóng những tác vụ đó.
  • Giảm thiểu lỗi lập trình: Việc sử dụng các thư viện đã được kiểm thử và sử dụng rộng rãi sẽ giảm nguy cơ mắc phải những lỗi phổ biến trong lập trình, vì thư viện thường được kiểm tra và tối ưu hóa kỹ lưỡng.

Nhược điểm của Library

  • Phụ thuộc vào thư viện bên ngoài: Khi sử dụng nhiều thư viện, dự án của bạn có thể bị phụ thuộc vào các thư viện đó. Nếu thư viện không được duy trì tốt hoặc không còn được cập nhật, nó có thể gây ra các vấn đề bảo mật hoặc không tương thích với công nghệ mới.
  • Thiếu đồng nhất về cấu trúc: Thư viện không quy định cấu trúc tổng thể của ứng dụng, dẫn đến việc sử dụng quá nhiều thư viện khác nhau có thể làm cho mã nguồn không đồng nhất và khó bảo trì.
  • Hiệu suất: Một số thư viện có thể chứa nhiều tính năng không cần thiết cho ứng dụng của bạn, làm tăng kích thước tệp và có thể ảnh hưởng đến hiệu suất, đặc biệt là trong các ứng dụng web.
  • Cần học cách sử dụng từng thư viện: Mặc dù thư viện giúp giảm khối lượng công việc, nhưng mỗi thư viện đều có cú pháp và cách sử dụng riêng. Lập trình viên phải học cách sử dụng hiệu quả từng thư viện.
  • Khó kiểm soát nội dung bên trong: Vì library thường là mã đóng gói sẵn, bạn không thể dễ dàng điều chỉnh hay thay đổi cách thức hoạt động bên trong nếu thư viện không cung cấp đủ tính năng mà bạn cần.

Nhắc lại khái niệm Framework

Framework là gì? Sự khác biệt giữa framework và library

Framework là một khung làm việc hoặc bộ công cụ giúp lập trình viên phát triển ứng dụng một cách có tổ chức và hiệu quả. Khác với thư viện, framework không chỉ cung cấp các hàm và phương thức mà còn định nghĩa luồng điều khiển và cấu trúc tổng thể của ứng dụng. Khi sử dụng framework, lập trình viên phải tuân theo các quy tắc và cấu trúc mà framework đề ra.

Ví dụ: Angular là một framework. Mục đích Angular framework là giúp cho người dùng xây dựng được các ứng dụng website dạng single page một cách dễ dàng và nhanh chóng. Nó tập trung vào việc phát triển font-end cho ứng dụng web. Angular cung cấp sẵn cho bạn các directives, services, data-biding, filters,… Để sử dụng Angular, chúng ta phải tuân thủ theo mô hình và cách hoạt động của nó. Chẳng hạn, một page sẽ có phần html gọi là template, phần xử lý gọi là controller, các quy định về việc sử dụng $scope, isolate-scope, cách để trao đổi dữ liệu giữa các page như thế nào. Nghĩa là Angular team đã viết sẵn các thư viện ( Libraries ) để bạn sử dụng lại, cùng với một khuôn mẫu (design parttern) mà bạn phải tuân theo nó để có thể xây dựng được ứng dụng.

Lợi ích của việc sử dụng framework

Framework là gì? Sự khác biệt giữa framework và library

Trong mỗi một ngôn ngữ, một lĩnh vực đều có nhiều các framework được tạo ra bởi các nhóm lập trình hoặc thậm chí được hậu thuẫn bởi các công ty lớn, như vậy đương nhiên việc sử dụng lại các framework này có rất nhiều ưu điểm:

  • Framework xây dựng sẵn các tính năng chung, ví dụ dự án web nào cũng có cần có phần quản lý người dùng như đăng ký, đăng nhập, tích hợp mạng xã hội, kết nối cơ sở dữ liệu…
  • Sử dụng framework giảm thiểu tối đa thời gian và công sức phát triển ứng dụng.
  • Cho phép ứng dụng kế thừa một cấu trúc được chuẩn hóa, đảm bảo dễ dàng trong vận hành và bảo trì sau này.

Nhược điểm của Framework

  • Bạn phải mất nhiều thời gian để học và làm chủ một framework.
  • Kích cỡ ứng dụng khi sử dụng framework là rất lớn, một website có thể lên đến hàng vài trăm MB code khi chưa có bất kỳ nội dung nào.
  • Cần viết code tuân thủ theo các tiêu chuẩn chung mà framework đặt ra.
  • Không thích hợp với các ứng dụng quá nhỏ, ví dụ bạn tạo ra một ứng dụng nhỏ hiển thị kết quả World cup 2018 chẳng hạn, việc áp dụng cả một framework vào là không cần thiết, thay vào đó bạn tự viết code sẽ nhanh hơn.

Những điểm khác nhau giữa Framework và Library là gì?

Framework và thư viện có điểm chung là đều là mã code do người khác viết và chúng ta là người sử dụng nó vào project của mình sao cho hợp lí nhất.

Vậy Framework và Library khác nhau như thế nào? Cùng tìm hiểu ngay dưới đây:

  • Framework và Library đều cung cấp các tính năng (functions) được viết sẵn để chúng ta có thể tái sử dụng.
  • Framework lớn hơn và phức tạp hơn Library.
  • Sử dụng Framework bạn phải thay đổi cấu trúc code của dự án (project’s structure) theo các quy tắc của framework đó để có thể sử dụng được các functions mà framework đó cung cấp.
  • Chúng ta có thể sử dụng các functions của Library một cách trực tiếp mà không cần thay đổi cấu trúc code của dự án.
  • Framework có thể hiểu là một khung chương trình, người dùng bổ sung code và tuân theo quy tắc để tạo ra ứng dụng. Còn Library chỉ cung cấp các chức năng tiện ích hay các class để sử dụng trong quá trình xây dựng ứng dụng.
  • Framework hoạt động chủ động. Nghĩa là nó có thể đưa ra các quyết định gọi hoặc bị gọi bởi các Library hay ứng dụng nào đó. Library hoạt động bị động. Nghĩa là nó chỉ được gọi khi nào chúng ta cần dùng nó.

Tới đây, mình nghĩ các  bạn đã hiểu được Framework và Library là gì, chúng khác nhau thế nào rồi đúng không. Để giúp các bạn hiểu rõ hơn, mình lấy một ví dụ đời thực để so sanh Framework với Library thế này:

  • Framework: là mô hình để có một cái máy tính hoạt động được. Nghĩa là, một cái máy tính sử dụng được phải bao gồm: màn hình, CPU, bàn phím, chuột, … Và bạn phải lắp đặt các linh kiện này theo tuần tự và quy tắc như: màn hình phải được gắn vào case CPU qua card đồ họa, bàn phím phải được gắn vào case CPU qua cổng COM/USB,… và bản thân case CPU để nó hoạt động phải có đủ các thành phần: chíp CPU, nguồn, dây điện,… và chúng phải được gắn kết với nhau theo quy tắt và vị trí của nó.
  • Library: có thể xem các cổng COM/USB được chia thành nhiều loại phục vụ cho từng chức năng của nó. Dây điện với các giắc cấm điện (loại 3 đầu, 2 đầu), óc vít dùng để liên kết các thành phần máy tính lại,…

Sự khác biệt giữa framework và library

Một khác biệt nữa trong việc sử dụng framework và library đó là việc gọi các khối mã lệnh (phương thức, hàm), trong framework, các mã lệnh trong framework sẽ gọi đến mã lệnh của bạn, còn với thư viện lập trình thì mã lệnh của bạn gọi đến các mã lệnh của thư viện lập trình. Với library nó giống như mô hình client/server, client sẽ gửi các yêu cầu đến server và server sẽ hồi đáp lại kết quả. Một ví dụ khi sử dụng thư viện lập trình cURL, khi bạn sử dụng một function trong thư viện cURL, code PHP của bạn sẽ gọi đến function này trong thư viện cURL, như vậy code của bạn là chủ thể gọi còn thư viện lập trình là bị động. Khi bạn sử dụng các framework PHP như Laravel chẳng hạn, mối quan hệ này bị đảo ngược, code trong framework gọi đến các mã ứng dụng của bạn với một mẫu thiết kế mà nhiều người biết đến Inversion of Control, nếu bạn đã làm quen với Laravel bạn sẽ thấy mã framework được đưa vào index.php để quản lý luồng điều khiển trong khi các mã chúng ta viết được đưa vào các controller tạo ra các “hành vi” cho ứng dụng.

Khác biệt giữa framework và library

Như vậy có thể nói framework thiên về quản lý luồng điều khiển còn library thiên về tạo hành vi.

Qua bài viết này hi vọng bạn đã nắm được Framework và Library là gì và sự khác nhau giữa Library và Framework. Việc chọn sử dụng framework hay library phụ thuộc vào nhu cầu dự án, mức độ kiểm soát và sự linh hoạt mà bạn cần trong quá trình phát triển ứng dụng.

Nguồn tham khảo: allaravel.com

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

8 ý tưởng thu nhập phụ cho lập trình viên

thu nhập phụ
8 ý tưởng thu nhập phụ cho lập trình viên

Bài viết được sự cho phép của tác giả Phạm Văn Nguyên

Hãy đối mặt với nó, các kỹ sư phần mềm có mức lương khá cao.

Bạn có thể dễ dàng sống một cuộc sống rất thoải mái dựa trên tiền lương của bạn

Tuy nhiên, một số lập trình viên thích khám phá các ý tưởng thu nhập phụ để bổ sung cho mức lương toàn thời gian của họ.

Có lẽ bạn muốn nghỉ hưu sớm?

Có thể bạn muốn trải nghiệm sự tự do chỉ đơn giản là có đủ tiền để bạn không bao giờ phải lo lắng về tài chính hoặc mất việc.

Những lý do tại sao bạn có thể muốn có thêm thu nhập ngoài tiền lương của bạn rất nhiều và thay đổi từ người này sang người khác.

Trong bài viết này, tôi sẽ chia sẻ với bạn một số ý tưởng thu nhập phụ sẽ giúp tăng thu nhập của bạn mà không bỏ công việc toàn thời gian của bạn.

Tìm việc làm lập trình viên Web Developer lương cao tại Topdev

1. Đầu tư

Đối với nhiều lập trình viên, tiết kiệm tiền là đủ tốt.

Đó là một điều rất đơn giản để làm. Bạn nhận được tiền lương của bạn gửi vào tài khoản ngân hàng của bạn. Bạn dành một số tiền và bạn tiết kiệm phần còn lại.

Miễn là bạn chi tiêu ít hơn số tiền bạn kiếm được, giá trị ròng của bạn sẽ tăng dần theo thời gian.

Vấn đề là để lại tiền mặt trong tài khoản ngân hàng của bạn không lý tưởng vì tiền nhàn rỗi không mang lại bất kỳ lợi nhuận nào.

Và vì lạm phát, điều này về cơ bản có nghĩa là bạn thực sự đang mất tiền.

Nếu bạn muốn xây dựng sự giàu có của mình, tất cả các chỉ số cho thấy rằng bạn phải đầu tư tiền của mình.

Nếu bạn mới bắt đầu sự nghiệp lập trình ngay khi học đại học, có lẽ bạn không biết nhiều về đầu tư thị trường chứng khoán.

Dưới đây là hướng dẫn dành cho người mới bắt đầu sẽ dạy cho bạn mọi thứ bạn cần để tìm hiểu về đầu tư thị trường chứng khoán.

Nói rõ hơn là tôi không nói về giao dịch trong ngày và dành tất cả thời gian rảnh của bạn để mua và bán cổ phiếu! Đó là một công việc riêng và bạn sẽ không có thời gian hay năng lượng để làm việc đó.

Thay vào đó, những gì bạn nên làm là tập trung vào đầu tư dài hạn.

Do đó, ý của tôi  là đầu tư tiền tiết kiệm của bạn vào các công ty tốt và để danh mục đầu tư của bạn tăng chậm theo thời gian.

Bạn có thể đầu tư vào các quỹ ETF, quỹ tương hỗ hoặc cổ phiếu riêng lẻ của các doanh nghiệp tốt bằng cách sử dụng bất kỳ nhà môi giới trực tuyến có sẵn nào.

Nó đã từng là trường hợp bạn sẽ trả phí cho các nhà môi giới trực tuyến bất cứ khi nào bạn mua hoặc bán cổ phiếu nhưng những ngày này đã qua lâu :).

Nếu nhà môi giới trực tuyến của bạn vẫn tính phí giao dịch, đã đến lúc thay đổi nhà môi giới của bạn.

Mặc dù vậy, một điều quan trọng là bạn luôn cần phải đứng đầu trong tất cả các khoản đầu tư của bạn, 401ks, Roth IRAs, RSU và cổ phiếu mà bạn đầu tư vào chính mình.

  Function trong Python là gì? Tạo Function trong Python
  10 sự thật thú vị về ngôn ngữ lập trình Python

2. Bắt đầu Blog lập trình của riêng bạn

Đây là nguồn thu nhập phụ cũng khá đáng kể.

Ưu điểm của phương pháp này là bạn không chỉ kiếm được tiền mà còn tạo cho mình một tên tuổi trong cộng đồng lập trình.

Tiếp thị bản thân như một kỹ sư phần mềm và có sự hiện diện trực tuyến mạnh mẽ là vô cùng quan trọng và nó sẽ mở ra nhiều cơ hội trong sự nghiệp mà bạn không có.

Ngoài việc xây dựng thương hiệu cá nhân của bạn , tôi  tin tưởng mạnh mẽ rằng bạn không thể học được điều gì cho đến khi bạn dạy nó.

Với một blog lập trình, bạn sẽ dạy người khác về lập trình trong khi tự cải thiện như một lập trình viên. Tất cả điều đó trong khi kiếm tiền cùng một lúc. Thật tuyệt vời phải không?!

Và nó không phải là đắt tiền, bạn có thể bắt đầu blog bằng WordPress.

Nhưng hãy đợi một phút, làm thế nào bạn có thể kiếm tiền từ blog lập trình của bạn?

Bạn có thể kiếm tiền từ blog của mình theo nhiều cách:

Đầu tiên: Quảng cáo

Phương pháp đầu tiên là chỉ cần đặt quảng cáo trên blog của bạn.

Nếu bạn không biết bắt đầu từ đâu, bạn luôn có thể bắt đầu với Google Adsense .

Google cho phép bạn đặt quảng cáo Google trên trang web của mình và nhận một phần doanh thu quảng cáo mỗi khi một trong những độc giả của bạn click vào quảng cáo.

Đây là một bài viết chuyên sâu về Google Adsense.

Nếu bạn quyết định chỉ kiếm tiền bằng quảng cáo, bạn nên luôn cố gắng tăng độc giả vì thu nhập quảng cáo của bạn tỷ lệ thuận với quy mô độc giả của bạn.

Sau khi bạn cảm thấy thoải mái với Adsense, bạn có thể bắt đầu thử nghiệm với các cơ quan quảng cáo cao cấp khác.

Ví dụ: các blog / trang web lập trình phổ biến như coding horror , codewars và các trang khác sử dụng carbon ads .

Thứ hai: Làm Affiliate

Ngoài ra, bạn có thể thử thiết lập hệ thống liên kết của riêng mình bằng cách bán sản phẩm của người khác.

Ví dụ: bạn có thể đăng ký với các Amazon associates của Amazon  và bắt đầu bán bất kỳ sản phẩm amazon nào trên blog của bạn.

Điều đó khá tuyệt vời vì Amazon có khá nhiều thứ.

Khi bạn đăng ký, Amazon sẽ cung cấp cho bạn một liên kết giới thiệu mà bạn có thể sử dụng trên blog của mình. Nếu độc giả của bạn truy cập amazon thông qua liên kết giới thiệu của bạn và mua bất cứ thứ gì từ amazon, bạn sẽ nhận được hoa hồng.

Hoa hồng thay đổi rất nhiều dựa trên sản phẩm, hiệu suất của bạn và các biến khác.

Vì độc giả của bạn quan tâm đến lập trình, bạn nên luôn đề xuất các sản phẩm có giá trị cho các lập trình viên như sách lập trình và phần mềm.

Bây giờ hãy để tôi cho bạn một lời khuyên.

Không giống như kiếm tiền với quảng cáo, khi bạn kiếm tiền thông qua affiliate, bạn có thể muốn giới thiệu các sản phẩm đắt tiền ngay cả khi bạn chưa bao giờ sử dụng các sản phẩm này cho mình.

Đừng làm vậy. Điều này thật nguy hiểm !

Bất cứ điều gì bạn đề nghị, hãy chắc chắn rằng bạn giới thiệu các sản phẩm bạn thực sự sử dụng .

Điều này cực kỳ quan trọng bởi vì tài sản quý giá nhất mà bạn có là sự tin tưởng của độc giả.

Đừng bao giờ thỏa hiệp sự tin tưởng lẫn nhau này để có thêm một vài đồng. Hãy chắc chắn rằng bạn giới thiệu các sản phẩm tốt, có giá trị mà bạn sử dụng cho mình. Nếu bạn không sử dụng sản phẩm, đừng giới thiệu nó.

P/S: Ở Việt nam cũng khá nhiều nền tảng về affiliate như: accesstrade, masoffer, VNPT Freedoo.

Thứ ba: Bán sản phẩm của riêng bạn

Bán sản phẩm của riêng bạn trên blog của bạn đòi hỏi nhiều công việc nhất nhưng nó mang lại nhiều tiền nhất.

Sau khi bạn thiết lập các sản phẩm bạn muốn bán và làm mọi thứ cuối cùng, blog của bạn sẽ tiếp tục kiếm tiền một cách thụ động cho bạn.

Hãy chắc chắn rằng sản phẩm của bạn phù hợp với độc giả của bạn.

Sản phẩm của bạn nên có giá trị cho các lập trình viên và các nhà khoa học máy tính.

Ví dụ: bạn có thể bán sách về lập trình và nghề kỹ sư phần mềm, tài liệu,video các khóa học về lập trình, v.v

Hãy để tôi nói rõ ở đây, bán sản phẩm của riêng bạn sẽ không dễ dàng .

Trong số những thứ khác, bạn sẽ cần tìm hiểu về tiếp thị trực tuyến và những cách thích hợp để quảng bá sản phẩm của bạn.

Tuy nhiên, những kỹ năng này cực kỳ hữu ích cho bạn với tư cách là một người và là một kỹ sư phần mềm.

3. Fiverr

Một trong những cách dễ nhất để bắt đầu kiếm một vài đô la ở bên cạnh là thông qua freelancing on Fiverr .

Nếu bạn không biết Fiverr là gì , thì đây là một trong những thị trường trực tuyến lớn nhất dành cho những người làm việc tự do với các dịch vụ bắt đầu từ năm đô la.

Các dịch vụ này có thể thuộc nhiều loại khác nhau bao gồm lập trình, kinh doanh, tiếp thị, thiết kế, viết, dịch thuật, video, âm nhạc, và nhiều hơn nữa.

Vì vậy, cho dù bạn muốn sử dụng các kỹ năng lập trình hiện có của mình để kiếm tiền từ bên cạnh, hoặc bạn có các kỹ năng khác mà bạn muốn kiếm tiền, Fiverr có thể là cửa ngõ của bạn đến với thế giới tự do.

Và ngoài việc kiếm tiền trên Fiverr bằng cách trở thành một freelancer, bạn cũng có thể sử dụng trang này để thuê ngoài một số nhiệm vụ mà bạn muốn người khác làm, giải phóng thời gian quý báu của bạn để làm điều gì đó có giá trị hơn với nó.

4. Thương mại điện tử

Hãy đối mặt với nó, thương mại điện tử (còn gọi là bán sản phẩm trực tuyến) đang chiếm lĩnh thế giới bán lẻ .

Mỗi ngày, chúng tôi chứng kiến các cửa hàng bán lẻ gạch và vữa truyền thống sẽ ngừng hoạt động.

Một ý tưởng cho thu nhập phụ có thể là lấy một miếng bánh này và bắt đầu kinh doanh thương mại điện tử của riêng bạn.

Thiết lập cửa hàng trực tuyến của bạn và thậm chí tìm kiếm sản phẩm để bán, cực kỳ dễ dàng trong những ngày này với các nền tảng như Shopify .

Điều khó khăn là KHÔNG thực sự khiến cửa hàng của bạn được thiết lập (bạn thực sự có thể làm điều này trong một vài giờ), nhưng điều sẽ đòi hỏi nhiều nỗ lực và thời gian hơn từ phía bạn là để có thể tiếp thị và bán sản phẩm của bạn.

Bạn cần sáng tạo về những cách khác nhau để tiếp thị sản phẩm. Làm thế nào bạn sẽ tìm thấy đối tượng mục tiêu của bạn? Quảng cáo trả tiền hay lưu lượng truy cập không phải trả tiền? Làm thế nào cạnh tranh là thích hợp của bạn?

Sáng tạo và có một chiến lược tư duy vững chắc là điều sẽ làm bạn khác biệt với đối thủ cạnh tranh.

Tương tự như các ý tưởng thu nhập phụ khác trong bài đăng này, bài viết này cũng đòi hỏi công việc nhưng nếu bạn làm đúng, Thương mại điện tử có tiềm năng thay thế hoàn toàn công việc hiện tại của bạn.

Dưới đây là hướng dẫn toàn diện từng bước từ Shopify về cách xây dựng và phát triển doanh nghiệp Thương mại điện tử trực tuyến của bạn.

5. Bắt đầu Kênh YouTube của riêng bạn

Nếu bạn muốn tương tác cá nhân nhiều hơn với khán giả của mình và bạn có một tính cách thân thiện đáng yêu, bạn có thể bắt đầu kênh Youtube của riêng mình.

Dù bạn có tin hay không, hầu hết các kỹ sư phần mềm có thể sử dụng một số kinh nghiệm khi nói trước công chúng.

Rốt cuộc, có thể làm việc trên các kỹ năng nói và giao tiếp công khai của bạn có thể rất có lợi cho bạn và sự nghiệp của bạn.

Vì vậy, ngay cả khi chúng tôi hoàn toàn không quan tâm đến thu nhập tiềm năng (có thể là đáng kể), bắt đầu kênh youtube của bạn vẫn có giá trị.

Cá nhân tôi nghĩ rằng bắt đầu một kênh youtube hiệu quả hơn nhiều so với việc chỉ bắt đầu một blog.

Bởi vì Youtube cho phép bạn xây dựng mối quan hệ mạnh mẽ hơn nhiều với khán giả của mình ở mức độ sâu sắc hơn nhiều so với một blog lập trình.

Tất nhiên, chiến lược tốt nhất là có cả hai.

Bây giờ khi nói đến kiếm tiền, kiếm tiền trên youtube không khác lắm so với kiếm tiền từ blog của bạn.

Bạn cũng có thể kiếm tiền với quảng cáo youtube , liên kết liên kết hoặc bán sản phẩm của riêng bạn.

6. Tạo một khóa học video

Tại thời điểm này, thực sự có nhiều vị trí cho các lập trình viên có nhiều kỹ năng hơn là chỉ tuyển cho đủ người.

Với ý nghĩ đó, thật dễ dàng để kết luận rằng lập trình đang có nhu cầu cực kỳ cao ngay bây giờ, và sẽ trong nhiều năm tới .

Với nhu cầu lớn đó, bạn không chỉ có thể kiếm tiền thông qua lập trình mà còn có thể kiếm tiền từ việc dạy lập trình.

Có hàng trăm ngàn người trên thế giới muốn tìm hiểu những gì bạn đã biết.

Và nếu bạn là một giáo viên tài năng, đây có thể là một thu nhập phụ tuyệt vời cho bạn.

Bạn có thể dạy lập trình cho bất cứ ai trên thế giới . Đó là một thị trường lớn.

Các nền tảng như Udemy , Edumall  giúp dễ dàng tạo các khóa học của bạn và kiếm tiền từ chúng. Tất cả bạn phải làm là tạo ra một khóa học chất lượng cao.

Họ sẽ  tiếp thị và làm mọi thứ khác.

7. Xây dựng một phần mềm và bán nó

Để kết thúc danh sách, đây là một chiến lược đòi hỏi nhiều công sức nhất – tạo ra phần mềm của riêng bạn để bán nó.

Bạn là một lập trình viên. Bạn viết phần mềm. Đây là những gì bạn làm.

Ý tưởng ở đây rất đơn giản.

Thay vì viết phần mềm cho người khác bán, hãy tạo một số phần mềm mà bạn tự bán.

Điều này đòi hỏi nhiều hơn là kỹ năng lập trình của bạn, bạn cần phát triển một con mắt cho nhu cầu và cơ hội kinh doanh.

Xây dựng một sản phẩm phần mềm mà thị trường cần hoặc giúp người khác giải quyết vấn đề của họ và bạn sẽ ở trong tình trạng tốt.

Bạn cũng sẽ cần phải làm việc với các kỹ năng tiếp thị của mình để có thể quảng bá phần mềm của mình.

Tất cả những kỹ năng này, mặc dù cực kỳ quan trọng, là những kỹ năng mà lập trình viên trung bình không có và bạn sẽ có lợi thế rất lớn nếu bạn có thể học và sử dụng những kỹ năng này.

Điều đó nói rằng, không phải ai cố gắng làm cho phần mềm của riêng mình thành công.

Trong thực tế, xác suất là khá thấp. Nhưng nếu sản phẩm của bạn cất cánh, nó có thể rất sinh lợi.

Bạn có thể tạo một ứng dụng điện thoại, dịch vụ SAAS hoặc chỉ một phần mềm đơn giản.

8. Làm việc tự do

Ngoài Fiverr, Upwork còn là một cách khác để bạn có thể sử dụng các kỹ năng lập trình của mình là trở thành một freelancer trên Upwork.

Upwork cho phép khách hàng từ khắp nơi trên thế giới tìm và thuê bạn nếu bạn có những kỹ năng mà họ đang tìm kiếm.

Lập trình chắc chắn là một trong những kỹ năng cần thiết nhất được yêu cầu và bạn chắc chắn nên xem xét việc tự do nếu đây là điều bạn muốn làm.

Kết luận

Có nhiều cách bạn có thể kiếm thu nhập phụ như một lập trình viên.

Chọn bất cứ điều gì bạn quan tâm nhất và làm.

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

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

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

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

5 sai lầm của bản thân

sai lầm
5 sai lầm của bản thân

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

Bước ra khỏi căn phòng, nơi bản thân học code ngày qua ngày để đi tìm một công việc đầu tiên thực sự gian nan. Nhưng sau khi đã tìm được một nơi để chiến đấu tiếp thì gian nan còn nhiều hơn. Từ kinh nghiệm của bản thân mình muốn chia sẻ một vài sai nhầm mà mình đã mắc phải và thậm chí mình đến giờ vẫn chưa bỏ được.

  2 nhận định sai lầm về việc bắt đầu học lập trình

  3 sai lầm các iOS Developers thường mắc phải

1. Hỏi sai câu hỏi

Trước hết điều này không phải là mình hỏi câu hỏi sai mà là hỏi không đúng câu hỏi. Hay chính xác hơn là có thực sự biết mình đang hỏi cái gì không.

Khi đó người được nhận câu hỏi sẽ rất ức chế và không có cái nhìn đúng về vấn đề mình mắc phải, dẫn đến phải hỏi lại rất nhiều lần và kết quả không đi về đâu cả, mất thời gian của cả hai.

Một câu hỏi tốt là chìa khóa giải quyết được 50% vấn đề. Khi bạn nắm được chìa khóa này, không có gì có thể làm khó bạn được. Có những lúc khi mình liệt kê ra các thứ mình sẽ hỏi thì vô tình mình tự tìm được câu trả lời. Dẫn đến mình sẽ không làm phiền đồng nghiệp nữa.

2. Kĩ năng quản lí thời gian kém

Đó thực sự là vấn đề mình đang gặp phải. Khi phải làm việc với một dự án yêu cầu khắc khe về thời gian, quyết định việc nào không làm nó quan trọng hơn những việc sẽ làm. Một vài bug quan trọng trọng hơn bug khác, nếu dành thời gian quá nhiều cho một lỗi nhỏ thì bạn sẽ không có thời gian để hoàn thành và khiến cho đống code trở thành một app có thể chạy được.

3. Học không đủ

Không đủ ở đây không có nghĩa là bạn phải học và biết nhiều công nghệ mới, quan trọng hơn hết là phải hiểu rõ những thứ bạn đang làm, và chắc chắn 100% rằng nếu có sự cố thì sẽ xử lí được và biết được chính xác nó xuất phát từ đầu, phải học sâu nó vì những thứ bên ngoài thì không giải quyết được vấn đề( thank a Chuối nhiều vì lời dặn dò này).

Và ngoài việc học sâu thì cũng nên dành chút thời gian để tìm hiểu về công nghệ mới, đọc sách, bài viết các blog tin tức về công nghệ, bỏ một ít thời gian để làm site project. Lý thuyết là các bạn có 8 tiếng cho cty, 8 tiếng ngủ và 8 tiếng còn lại thì mình nghĩ là mình và các bạn có thừa thời gian để làm điều đó.

4. Học quá nhiều thứ

Điều này có vể mâu thuẫn với luận điểm trên nhưng thực sự là vậy, học nhiều đôi khi nó mang lại tác dụng phụ gây hại không ngờ tới, cái gì cũng biết nhưng không biết cái gì, thà một nghề cho cứng kiếm được tiền còn hơn 9 nghề mà không kiếm được tiền. Bạn có thể học nhiều thứ một lúc, có thể học React, VueJS hoặc Angular một lúc nhưng mình sẽ khó để thành thạo một trong 3 cái trên, tốt nhất là chọn rõ đồng minh, xác định điểm đến và đi thôi, đừng như con thỏ mải chơi mà cuối cùng lại về sau rùa.

5. Tránh nhận trách nhiệm

Là một junior không ai kì vọng nhiều ở bạn đâu, leader hiểu rằng bạn cần thời gian để học hỏi và phát triển, họ sẽ không đưa cho bạn một cái task vượt ra ngoài khả năng vì điều đó sẽ có thể làm hỏng kế hoạch của dự án nếu bạn thất bại. Nhưng bạn nên đứng ra chịu trách nhiệm và dám nhận cái task đó, thứ nhất leader, project managers sẽ rất thích điều đó, họ sẽ có cái nhìn tốt về sự cầu tiến của bạn. Và hơn cả bạn sẽ không thể học và dám nhận trách nhiệm cho tới khi bạn đủ dũng cảm,sẵn sàng chấp nhận rủi ro và hoàn toàn dấn thân trong nó.

Hơn hết

Trong năm điều kể trên thì nó đều xuất hiện và chưa thể biến mất, mình vẫn đang cố gắng ngày qua ngày để trở nên tốt hơn có thể, hi vọng các bạn có thể chia sẻ thêm những sai lầm đã gặp. Những bài học từ sai lầm của người khác luôn dễ tiếp thu và có giá trị.

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

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

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

Đo thời gian render bằng Chrome

render
Đo thời gian render bằng Chrome

Bài viết được sự cho phép của tác giả Lưu Bình An

Để thực hành bài này, bạn có thể sử dụng source code có sẵn này

Trên tab Performance của DevTools chúng ta có

  8 câu điều kiện khi render trong React
  Câu hỏi phỏng vấn mẹo về React: Component hay element được render trong browser?

https://github.com/nolanlawson/measure-style-and-layout

Đây là giá trị CPU đã tiêu tốn để render component, theo đơn vị là mili giây. Nó sẽ được thực hiện 4 bước

  • Thực thi javascript
  • Apply các format bằng CSS
  • Tính layout, trình duyệt tiếp tục tính toán để “đặt” các element trên màn hình ở chỗ nào
  • Render được thực hiện trên một thread riêng

Đa phần mọi người sẽ bỏ qua các bước 2, 3, 4 khi đo, chỉ tính toán thời gian thực thi javascript

Đo thời gian render bằng Chrome

Bước render rất khó có thể đo được chính xác, nó được thực hiện trên threat riêng và dùng GPU

Phần style và layout thì có thể đo chính xác hơn vì nó block lại main thread

Đo gì?

Chúng ta sẽ đánh dấu từ khi javascript bắt đầu chạy, đến hết phần render

Sử dụng requestAnimationFrame là chính, nó được gọi trước quá trình style và layout, nhưng thực tế trước Edge v18 và một số bản Safari thì không đúng, nên cũng có thể có chút sai xót

Đo thời gian render bằng Chrome

requestAnimationFrame(() => {
  setTimeout(() => {
    performance.mark('end')
  })
})

Phần code trong setTimeOut được gọi ngay sau bước paint

Đo thời gian render bằng Chrome

Đo thời gian render bằng Chrome

Một số vấn đề

  • setTimeOut đôi khi có sai lệch tầm 4ms trên một số trình duyệt
  • Nếu có một setTimeOut callback khác trong code, có thể không còn đúng
  • Sau này khi các trình duyệt đã hỗ trợ cách tốt hơn thì setTimeOut kiểu này là dư thừa

Accurately measuring layout on the web

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

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

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