Home Blog Page 182

Sự khác nhau giữa AI, Machine Learning và Deep Learning

su-khac-nhau-giua-ai-machine-learning-va-deep-learning

Cách phân biệt machine learning và deep learning là bài viết đầu tiên trong series nhiều phần giải thích các nguyên tắc cơ bản của deep learnining – nhà báo Michael Copeland.

Để biết cách phân biệt machine learning và deep learning là gì đầu tiên chúng ta phải hiểu khái niệm. Trí tuệ nhân tạo (AI) là tương lai. Trí tuệ nhân không chỉ là khoa học viễn tưởng mà còn là một phần của cuộc sống hàng ngày của chúng ta. Nó phụ thuộc vào mục tiêu phát triển AI của bạn

Ví dụ: Khi AlphaGo của Google đánh bại kì thủ cờ vây quốc tế người Hàn Quốc Lee Se-Dol vào năm 2016. Thuật ngữ AI, machine learning và deep learning được giới truyền thông sử dụng để mô tả chiến thắng của DeepMind. Cả AI, machine learning và deep learning đều góp phần tạo nên chiến thắng của AlphaGo trước kì thủ Se-Dol. Nhưng chúng không giống nhau, để biết cách phân biệt machine learning và deep learning, mời bạn đọc qua khái niệm dưới đây.

Cách đơn giản nhất để hình dung về mối quan hệ của 3 khái niệm trên là dùng sơ đồ Venn. AI – ý tưởng đầu tiên – lớn nhất, sau đó là machine learning, và cuối cùng là deep learning – yếu tố thúc đẩy sự bùng nổ của AI ngày nay .

 

Từ mờ nhạt đến sự bùng nổ

AI là một phần trong trí tưởng tượng của chúng ta và là chủ đề bàn luận sôi nổi trong các phòng thí nghiệm nghiên cứu kể từ khi một nhóm các nhà khoa học máy tính sử dụng thuật ngữ này tại Hội nghị Dartmouth vào năm 1956 – lĩnh vực AI bắt đầu từ đó. Trong nhiều thập kỷ sau đó, AI được dự đoán là chìa khóa mở ra một tương lai tươi sáng nhất của nền văn minh nhân loại, khái niệm harebrained của over-reach propellerheads sẽ bị vứt bỏ. Thành thật mà nói, cho đến năm 2012, nó có một chút là sự kết hợp cả hai.

Trong vài năm trở lại đây, AI thật sự bùng nổ, đặc biệt là từ năm 2015. Phần lớn trong số đó liên quan đến những tiện ích sẵn có của GPU khiến cho việc xử lý song song nhanh, rẻ và mạnh mẽ hơn. Nó cũng liên quan đến cả vấn đề lưu trữ vô hạn trong thực tiễn và nhóm dữ liệu trên mỗi vạch (toàn bộ quá trình Big Data) – hình ảnh, văn bản, giao dịch, sơ đồ dữ liệu…

Cùng điểm qua chặng đường các nhà khoa học máy tính đã phát triển AI từ mờ nhạt để trở thành một sự bùng nổ với các ứng dụng được sử dụng bởi hàng trăm triệu người mỗi ngày giúp mọi người biết cách phân biệt machine learning và deep learning.

Trí tuệ nhân tạo – trí tuệ con người được mô phỏng bởi máy móc

 

Trở lại mùa hè năm 1956, ước mơ của những nhà tiên phong về công nghệ bấy giờ là xây dựng các máy móc phức tạp – có đặc điểm giống với trí thông minh con người, biết cách phân biệt machine learning và deep learning. Đây là khái niệm mà chúng ta nghĩ là “General AI” – những thiết bị hoàn hảo có tất cả các giác quan của con người (có thể nhiều hơn), có khả năng suy đoán, suy nghĩ như chúng ta. Có thể bạn đã nhìn thấy nó trong một loạt các bộ phim như friend —  C-3PO —  and foe —  The Terminator. Tuy nhiên, General AI vẫn còn nằm trong các bộ phim và tiểu thuyết khoa học viễn tưởng vì lý do nhân đạo. Chúng ta không thể thực tế nó, hoặc ít nhất là chưa phải lúc này.

Những gì chúng ta có thể làm, rơi vào khái niệm “Narrow AI“. Các công nghệ có khả năng thực hiện các nhiệm vụ cụ thể tương đương, hoặc tốt hơn con người có thể làm để biết cách phân biệt machine learning và deep learning. Ví dụ về Narrow AI là những thứ như phân loại hình ảnh trên một dịch vụ như Pinterest và nhận dạng khuôn mặt trên Facebook.

Đó là những ví dụ về Narrow AI trong thực tế. Những công nghệ này thể hiện một số khía cạnh của trí thông minh con người. Nhưng bằng cách nào? Trí tuệ đó ​​đến từ đâu? Điều đó đưa chúng ta tới vòng tròn tiếp theo, Machine learning.

Machine learning – Cách tiếp cận để chinh phục  trí tuệ nhân tạo

phân biệt machine learning và deep learning

Machine learning theo định nghĩa cơ bản là ứng dụng các thuật toán để phân tích cú pháp dữ liệu, học hỏi từ nó, và sau đó thực hiện một quyết định hoặc dự đoán về các vấn đề có liên quan. Vì vậy, thay vì code phần mềm bằng cách thức thủ công với một bộ hướng dẫn cụ thể để hoàn thành một nhiệm vụ cụ thể, máy được “đào tạo” bằng cách sử dụng một lượng lớn dữ liệu và các thuật toán cho phép nó học cách thực hiện các tác vụ.

Machine learning bắt nguồn từ các định nghĩa về AI ban đầu, và các phương pháp tiếp cận thuật toán qua nhiều năm bao gồm:logic programming, clustering, reinforcement learning, and Bayesian networks. Như chúng ta đã biết, không ai đạt được mục tiêu cuối cùng của General AI, và thậm chí cả Narrow AI hầu hết là ngoài tầm với những phương pháp tiếp cận Machine learning sơ khai.

Một trong những lĩnh vực ứng dụng tốt nhất cho Machine learning trong nhiều năm qua là computer vision, mặc dù nó vẫn đòi hỏi rất nhiều kỹ năng code thủ công để có thể hoàn thành công việc. Mọi người vẫn sẽ viết các lớp phân loại bằng tay như các bộ lọc để chương trình có thể xác định nơi mà một đối tượng bắt đầu và kết thúc. Phát hiện hình dạng để xác định nếu nó có tám mặt. Một phân loại để nhận dạng các chữ cái “S-T-O-P”. Từ tất cả những ứng dụng phân loại, họ sẽ phát triển các thuật toán để làm cho hình ảnh và “học” khả năng nhận diện dấu hiệu liệu nó có phải là kí hiệu stop hay không? .

Tốt, nhưng không hoàn toàn hoàn hảo. Đặc biệt vào một ngày sương mù khi tầm nhìn không thấy rõ, hoặc cây che khuất một phần. Đó là lý do khiến computer vision và image detection không gây được thiện cảm, vì nó quá nhạy cảm và dễ phát sinh lỗi.

Thời gian, và ứng dụng đúng thuật toán đã tạo ra sự phân biệt machine learning và deep learning.

Tham khảo thêm các vị trí tuyển dụng Machine Learning cho bạn 3000 USD

Deep learning – Kỹ thuật để hiện thực hóa Machine learning

phân biệt machine learning và deep learning

 Lấy hình ảnh mèo ra khỏi video trên YouTube là một trong những đột phá đầu tiên của deep learning

Một phương pháp tiếp cận thuật toán khác từ cộng đồng machine-learning, Artificial Neural Networks, được nhắc đến nhiều thập kỷ qua. Neural Networks được lấy cảm hứng từ sự hiểu biết về sinh học của bộ não loài người – sự liên kết giữa các nơ-ron. Tuy nhiên, không giống như một bộ não sinh học nơi mà bất kỳ nơ-ron nào cũng có thể liên kết với các nơ-ron khác trong một khoảng cách vật lý nhất định, các mạng thần kinh nhân tạo này có các lớp rời rạc, các kết nối, và các hướng truyền dữ liệu.

Chẳng hạn, bạn có thể lấy một hình ảnh, cắt nó thành một nhóm được đặt vào lớp đầu tiên của mạng thần kinh nhân tạo. Trong lớp đầu tiên các nơ-ron cá nhân truyền dữ liệu đến lớp thứ hai. Lớp thứ hai của nơ-ron làm nhiệm vụ của nó, và như vậy, cho đến khi lớp cuối cùng và cho ra sản phẩm cuối cùng.

Mỗi nơ-ron đảm nhiệm một chức năng – làm thế nào để biết chính xác liệu rằng nó có liên quan đến nhiệm vụ đang được thực hiện. Vì vậy, suy nghĩ về điểm dừng là một dấu hiệu. Các thuộc tính của một hình ảnh dấu hiệu “dừng” được cắt nhỏ và được “kiểm tra” bởi các nơ-ron – dạng hình trụ, màu đỏ của các động cơ cháy, các chữ cái đặc trưng, ​​kích thước biển báo giao thông, và sự chuyển động hoặc sự thiếu hụt của nó. Nhiệm vụ của mạng thần kinh là để kết luận liệu đây có phải là dấu hiệu dừng hay không. Nó đi kèm với một “vector xác suất”. Trong ví dụ của chúng ta, hệ thống có thể xác định chắc chắn đến 86% một dấu hiệu dừng, 7% rằng đó là một dấu hiệu giới hạn tốc độ, và 5% còn lại là một con diều bị mắc kẹt trong cây,( hoặc cái gì đó tương tự)  vv … và kiến ​​trúc mạng sau đó sẽ thông báo đến mạng nơron cho dù đó là đúng hay sai.

Thậm chí ví dụ này cũng là một sự tiến bộ, bởi vì mạng lưới thần kinh đã có thể làm được tất cả nhưng bị xa lánh bởi cộng đồng nghiên cứu về AI. Nó đã có mặt từ những ngày đầu tiên của AI, và tạo ra rất ít sản phẩm “trí tuệ”. Vấn đề là ngay cả những mạng nơ-ron cơ bản nhất cũng có tính toán rất cao, nó không phải là cách tiếp cận thực tiễn. Tuy nhiên, một nhóm nghiên cứu nhỏ do Geoffrey Hinton thuộc trường đại học Toronto đứng đầu, cuối cùng đã parallelizing các thuật toán cho siêu máy tính để chạy và chứng minh khái niệm, nhưng nó không chính xác cho đến khi GPU được triển khai.

  Top những thuật toán machine learning mà bất cứ Data Scientist nào cũng cần phải biết (Phần 1)

Nếu chúng ta quay trở lại ví dụ “ký hiệu dừng”, rất có thể là khi mạng đang được điều chỉnh hoặc được “đào tạo” thì sẽ có câu trả lời sai – rất nhiều. Những gì nó cần là luyện tập. Nó cần phải nhìn thấy hàng trăm ngàn, thậm chí hàng triệu hình ảnh, cho đến khi trọng lượng của đầu vào nơ-ron được điều chỉnh chính xác đến mức nó có được câu trả lời ngay trong thực tế mọi lúc – sương mù hoặc không có sương mù, nắng hoặc mưa. Vào thời điểm đó mạng thần kinh đã tự dạy cho nó một dấu hiệu dừng như thế nào; Hoặc khuôn mặt của mẹ bạn trong trường hợp của Facebook. Hay một con mèo, đó là điều mà Andrew Ng đã làm trong năm 2012 tại Google.

Sự đột phá của Ng là đưa các mạng thần kinh này, và làm cho chúng trở nên to lớn, tăng số layer và các nơ-ron, sau đó chạy một khối lượng lớn dữ liệu thông qua hệ thống để huấn luyện nó. Trong trường hợp của Ng, đó là hình ảnh từ 10 triệu video trên YouTube. Ng đặt “deep” vào deep learning, mô tả tất cả các lớp trong các mạng nơron này.

Ngày nay, khả năng nhận dạng hình ảnh của máy móc được luyện tập thông qua deep learning trong một số tình huống tốt hơn so với con người. AlphaGo của Google đã được huấn luyện chơi cờ vay – nó điều chỉnh mạng lưới thần kinh của mình bằng cách tự mình chống lại chính mình.

Nhờ Deep learning, AI có một tương lai tươi sáng

Deep Learning đã cho phép ứng dụng nhiếu vấn đề thực tế của máy học và bằng cách mở rộng lĩnh vực tổng thể của AI. Deep learning phá vỡ các cách thức con người làm việc bằng cách làm cho tất cả các loại máy móc trợ giúp có thể thực hiện được, gần hoặc giống hệt con người.

Ô tô không người lài, chăm sóc sức khoẻ tốt hơn, thậm chí cả đề xuất về bộ phim tốt hơn, tất cả đều hiện thực trong thời đại ngày nay. AI là hiện tại và tương lai. Với sự trợ giúp của Deep Learning, AI có thể hiện thức hóa ước mơ khoa học giả tưởng mà chúng ta đã tưởng tượng từ rất lâu. Bạn có một C-3PO, tôi sẽ lấy nó. Bạn có thể giữ Terminator của bạn.

Có thể bạn muốn xem thêm:

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

                 TopDev via Blogs Nvidia

Mô hình 3 lớp (three-layer) có gì hay?

“Biết địch biết ta, trăm trận trăm thắng “. Vậy muốn biết có gì hay thì phải hiểu rõ về nó. Được rồi, nhân dịp đang học nhập môn công nghệ phần mềm ở trường, kiến thức còn nóng hổi nên mình sẽ phân tích về mô hình 3 lớp (3-layer).

Trước tiên, cần phân biệt 2 khái niệm tầng (tier) và lớp (layer)

3 lớp (three-layer) là gì?

3-tiers là một kiến trúc kiểu client/server mà trong đó giao diện người dùng (UI-user interface), các quy tắc xử lý (BR-business rule hay BL-business logic), và việc lưu trữ dữ liệu được phát triển như những module độc lập, và hầu hết là được duy trì trên các nền tảng độc lập, và mô hình 3 tầng (3-tiers) được coi là một kiến trúc phần mềm và là một mẫu thiết kế.” (dịch lại từ wikipedia tiếng Anh).

Đây là kiến trúc triển khai ứng dụng ở mức vật lý. Kiến trúc gồm 3 module chính và riêng biệt:

  • Tầng Presentation: hiển thị các thành phần giao diện để tương tác với người dùng như tiếp nhận thông tin, thông báo lỗi, …
  • Tầng Business Logic: thực hiện các hành động nghiệp vụ của phần mềm như tính toán, đánh giá tính hợp lệ của thông tin, … Tầng này còn di chuyển, xử lí thông tin giữa 2 tầng trên dưới.
  • Tầng Data: nơi lưu trữ và trích xuất dữ liệu từ các hệ quản trị CSDL hay các file trong hệ thống. Cho phép tầng Business logic thực hiện các truy vấn dữ liệu .

Mọi người vẫn hay nhầm lẫn giữa tier và layer vì cấu trúc phân chia giống nhau (presentation, bussiness , data). Tuy nhiên, thực tế chúng hoàn toàn khác nhau. Nếu 3 tiers có tính vật lí thì 3 layer có tính logic. Nghĩa là ta phân chia ứng dụng thành các phần (các lớp) theo chức năng hoặc vai trò một cách logic. Các layer khác nhau được thực thi trong 1 phân vùng bộ nhớ của process. Vì thế nên một tier có thể có nhiều layer.

TÌM VIỆC LÀM NGÀNH IT LƯƠNG CAO

Giới thiệu mô hình 3-layer ( 3 lớp)

Mô hình 3-layer gồm có 3 phần chính:

Presentation Layer (GUI) : Lớp này có nhiệm vụ chính giao tiếp với người dùng. Nó gồm các thành phần giao diện ( win form, web form,…) và thực hiện các công việc như nhập liệu, hiển thị dữ liêu, kiểm tra tính đúng đắn dữ liệu trước khi gọi lớp Business Logic Layer (BLL).

Business Logic Layer (BLL) : Layer này phân ra 2 thành nhiệm vụ :

  • Đây là nơi đáp ứng các yêu cầu thao tác dữ liệu của GUI layer, xử lý chính nguồn dữ liệu từ Presentation Layer trước khi truyền xuống Data Access Layer và lưu xuống hệ quản trị CSDL.
  • Đây còn là nơi kiểm tra các ràng buộc, tính toàn vẹn và hợp lệ dữ liệu, thực hiện tính toán và xử lý các yêu cầu nghiệp vụ, trước khi trả kết quả về Presentation Layer.

Data Access Layer (DAL) : Lớp này có chức năng giao tiếp với hệ quản trị CSDL như thực hiện các công việc liên quan đến lưu trữ và truy vấn dữ liệu ( tìm kiếm, thêm, xóa, sửa,…).

Ưu điểm

  • Việc phân chia thành từng lớp giúp cho code được tường minh hơn. Nhờ vào việc chia ra từng lớp đảm nhận các chức năng khác nhau và riêng biệt như giao diện, xử lý, truy vấn thay vì để tất cả lại một chỗ. Nhằm giảm sự kết dính.
  • Dễ bảo trì khi được phân chia, thì một thành phần của hệ thống sẽ dễ thay đổi. Việc thay đổi này có thể được cô lập trong 1 lớp, hoặc ảnh hưởng đến lớp gần nhất mà không ảnh hưởng đến cả chương trình.
  • Dễ phát triển, tái sử dụng: khi chúng ta muốn thêm một chức năng nào đó thì việc lập trình theo một mô hình sẽ dễ dàng hơn vì chúng ta đã có chuẩn để tuân theo. Và việc sử dụng lại  khi có sự thay đổi giữa hai môi trường ( Winform sang Webfrom ) thì chỉ việc thay đổi lại lớp GUI.
  • Dễ bàn giao. Nếu mọi người đều theo một quy chuẩn đã được định sẵn, thì công việc bàn giao, tương tác với nhau sẽ dễ dàng hơn và tiết kiệm được nhiều thời gian.
  • Dễ phân phối khối lượng công việc. Mỗi một nhóm, một bộ phận sẽ nhận một nhiệm vụ trong mô hình 3 lớp. Việc phân chia rõ ràng như thế sẽ giúp các lập trình viên kiểm soát được khối lượng công việc của mình.

Phân tích chi tiết từng layer trong mô hình 3 lớp. 

1. Presentation Layer (GUI):

Có hai thành phần chính sau đây với những tác vụ cụ thể :

  • UI Components : gồm các thành phần tạo nên giao diện của ứng dụng (GUI). Chúng chịu trách nhiệm thu nhận và hiển thị dữ liệu cho người dùng… Ví dụ : textbox, button, combobox, …
  • UI Process Components : là thành phần chịu trách nhiệm quản lý các quá trình chuyển đổi giữa các UI… Ví dụ : Sắp xếp quá trình kiểm tra thông tin khách hàng:

1.Hiển thị màn hình tra cứu ID

2.Hiển thị màn hình thông tin chi tiết khách hàng tương ứng

3.Hiển thị màn hình liên lạc với khách hàng.

2. Bussiness Layer (BLL) :

Lớp này gồm 4 thành phần:

  • Service Interface : là thành phần giao diện lập trình mà lớp này cung cấp cho lớp Presentation sử dụng.
  • Bussiness Workflows : chịu trách nhiệm xác định và điều phối các quy trình nghiệp vụ gồm nhiều bước và kéo dài. Những quy trình này phải được sắp xếp và thực hiện theo một thứ tự chính xác.
  • Ví dụ : Thực hiện mua một đơn hàng trên tiki qua nhiều bước : kiểm tra gói hàng còn không?, tính tổng chi phí, cho phép giao dịch và sắp xếp việc giao hàng.
  • Bussiness Components : chịu trách nhiệm kiểm tra các quy tắc nghiệp vụ, ràng buộc logic và thực hiện các công việc . Các thành phần này cũng thực hiện các dịch vụ mà Service Interface cung cấp và Business Workflows sẽ sử dụng nó.
  • Ví dụ : Tiếp tục ví dụ ở trên. Bạn sẽ cần một Bussiness Component để kiểm tra gói hàng có khả dụng không ? hay một component để tính tổng chi phí,…
  • Bussiness Entities : thường được sử dụng như Data Transfer Objects ( DTO ) . Bạn có thể sử dụng để truyền dữ liệu giữa các lớp (Presentation và Data Layer). Chúng thường là cấu trúc dữ liệu ( DataSets, XML,… ) hay các lớp đối tượng đã được tùy chỉnh.
  • Ví dụ : tạo 1 class Student lưu trữ các dữ liệu về tên, ngày sinh, ID, lớp.

 3. Data Layer (DAL) :

  • Data Access Logic Components : chịu trách nhiệm chính lưu trữ và truy xuất dữ liệu từ các nguồn dữ liệu (Data Sources) như XML, file system,… Hơn nữa còn tạo thuận lợi cho việc dễ cấu hình và bảo trì.
  •  Service Agents: giúp bạn gọi và tương tác với các dịch vụ từ bên ngoài một cách dễ dàng và đơn giản.

Cấu trúc mô hình 3 lớp

Để hiểu rõ hơn về cấu trúc và cách xây dựng của mô hình 3 lớp, chúng ta cùng tham khảo một ví dụ về mô hình quản lí công nhân gồm các lớp BUS, DAO, GUI. (Các đoạn code sẽ bị lược bỏ bớt )

Đầu tiên là GUI gồm các button insert, update, reset ,delete ,exit .Người dùng sẽ giao tiếp với màn hình giao diện này

Lớp DTO, đây không phải là layer, đây chỉ là 1 gói dữ liệu đươc trao đổi giữa các lớp. Gói dữ liệu này được xây dựng dưới dạng lớp đối tượng. Mỗi một công nhân sẽ mang những thuộc tính sau:

namespace DTO
{
    public class EmployeeDTO
    {
        #region Atrributes
        private String _employeeID;
        private String _name;
        private String _email;
        private float _salary;
        private int _employeeStyle;
        #endregion
        //.....

Các nghiệp vụ xử lý chính sẽ được đặt ở lớp BUS (hay là BLL)  gồm các nghiệp vụ insert, update, delete, retrieve

namespace BUS
{
    public class EmployeeBUS
    {
        #region 1. Inserting
        public static bool InsertEmployee(EmployeeDTO emp)
        {
            if (EmployeeDAO.CheckEmployeeByID(emp.EmployeeID)==true
                &&EmployeeStyleDAO.CheckEmployeeStyleByID(emp.EmployeeStyle)==false)
            {
                return false;               
            }
            return EmployeeDAO.InsertEmployee(emp);
        }
        #endregionhttps://techtalk.vn/wp-admin/post-new.php#
        //2. Updating
        //3. Deleting
        //4. Retrieving
    }
}

Và cuối cùng là lớp DAO ( hay là DAL ). Truy  vấn đến cơ sở dữ liệu

{
    public class EmployeeDAO
    {
        #region 1. Inserting
        public static bool InsertEmployee(EmployeeDTO emp)
        {
            bool result=false;
            try
            {
                // Create List Sql Parameter
                List sqlParams = new List();
                sqlParams.Add(new SqlParameter("@EmployeeID", emp.EmployeeID));
                sqlParams.Add(new SqlParameter("@Name", emp.Name));
                sqlParams.Add(new SqlParameter("@Email", emp.Email));
                sqlParams.Add(new SqlParameter("@Salary", emp.Salary));
                sqlParams.Add(new SqlParameter("@EmployeeStyle", emp.EmployeeStyle));
                // Call Store Procedure
                int n = SqlDataAccessHelper.ExecuteNoneQuery("spInsertEmployee", sqlParams);
                if (n == 1)
                    result = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }
#endregion
        // 2. Updating
        // 3. Deleting
        // 4. Retrieving

Vì đây là ví dụ mô phỏng nên tôi chỉ chú trọng đến cách cấu trúc một chương trình sử dụng mô hình 3 lớp. Cảm ơn đã đọc hết.

Đừng bỏ lỡ những bài viết hay về lập trình hướng đối tượng:

Xem thêm việc làm Web Developer mới nhất tại TopDev

  List các thuật ngữ căn bản .NET- Bách khoa toàn thư

Xây dựng ứng dụng realtime messaging bằng Firebase như TikTok, Bigo…

Xây dựng ứng dụng realtime messaging bằng Firebase

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

Hiện nay các ứng dụng live stream mọc lên như nấm, một trong số đó có thể được kể đến như Bigo, Facebook live, Tiktok, Youtube …

Trong khi live stream thì người dùng có thể thả tim, like, comment … Và tất cả những chức năng đó hoàn toàn là realtime.

Vậy làm thế nào có thể làm được tính năng realtime như thế? Và có thể xử lí được hàng triệu, hàng tỉ request/s như vậy chắc cũng nhiều người quan tâm, và bản thân mình cũng thế. Cũng muốn vọc vạch xem công nghệ đằng sau những ứng dụng đó như thế nào.

Trong lúc tìm hiểu thì đọc thấy 1 bài rất hay mà kĩ sư Mercari đã chia sẻ. Và bên họ sử dụng Firebase Realtime Database để giải quyết bài toán này.

Cùng nhau tìm hiểu xem cụ thể sẽ làm như thế nào để có thể xây dựng được ứng dụng realtime messaging xử lí được hàng tỉ request/s như vậy.

Phạm vi bài toán

Xây dựng ứng dụng realtime messaging bằng Firebase xử lí 100k request/s

Hình ảnh bên trên mình chụp được thông qua ứng dụng Bigo (thi thoảng ngắm gái :D).

Ai dùng Bigo hay Facebook live rồi cũng đều biết ngoài tính năng live stream ra thì còn 1 vài tính năng khác nữa như gửi comment, like, gửi tim, tặng coin … Và tất cả những thứ này đều realtime.

Nên hôm nay mình chỉ tập trung vào những tính năng realtime như comment, like, gửi tim …

Firebase Realtime Database là gì?

  • Là sản phẩm của Google (chính xác là được Google mua lại)
  • Là cơ sở dữ liệu NoSQL được lưu trữ và quản lí trên đám mây.
  • Dữ liệu được lưu đưới dạng JSON.
  • Client có thể subscribe dữ liệu 1 cách realtime.
  • Tại thời điểm hiện tại (2019/07/06) thì firebase realtime database xử lí được 1 triệu request đồng thời và 10k write/s. Tương lai số lượng này có thể tăng lên. Số liệu tham khảo ở đây.

Ngoài tính năng của 1 database ra thì nó còn có 1 số tính năng khác nữa như:

  • Tính năng Authentication thông qua Facebook, Google, Twitter …
  • Có thể cài đặt rule để phân quyền xem ai được read, write đến resource của database. Ví dụ như ai login mới có quyền read, write chẳng hạn.
  • Bởi vì Firebase được dùng ở phía client (web, mobile) nên việc decode để lấy ra key của firebase là điều hoàn toàn dễ dàng. Do đó nếu không cài đặt rule 1 cách cẩn thận thì có thể sẽ bị bên thứ 3 read, write tài nguyên 1 cách dễ dàng.

Kiến trúc hệ thống

Xây dựng ứng dụng realtime messaging bằng Firebase xử lí 100k request/s

Kiến trúc khá là simple phải không nào. Bây giờ mình sẽ đi giải thích từng bộ phận trong kiến trúc này.

Đầu tiên khi người dùng thực hiện comment, like thì khi đó sẽ gửi request đến API Server để xử lí. Tại sao ở bước này không gửi trực tiếp đến Firebase mà phải thông qua API Server để làm gì? Bởi vì ngoài mục đích insert data đến firebase database còn có 1 số nhiệm vụ khá quan trọng khác nữa như authentication người dùng, detect tấn công xâm nhập … Nên việc xử lí những logic phức tạp đó bắt buộc phải thông qua API Server.

Sau khi API Server nhận được request từ phía người dùng. Khi đó nó sẽ thực hiện việc chuyển data đó vào queue để xử lí thông qua worker.

Worker sẽ lấy dữ liệu từ queue ra và thực hiện insert data đến Firebase thông qua REST API của Firebase.

Tại sao từ API Server không gửi data trực tiếp đến Firebase?

Chúng ta hãy luôn luôn nhớ 1 điều là ngoài mình ra không bao giờ được tin tưởng bất kì thằng nào cả (Don’t trust each other).

Nếu API Server gửi request trực tiếp đến Firebase thì có vấn đề gì xảy ra ở đây? Chẳng may lúc này firebase database bị down. Khi đó API Server sẽ không thể gửi request được nữa và có thể gây ra lỗi. Khi đó phía client cũng bị lỗi theo. Và làm cho trải nghiệm người dùng bị gián đoạn.

Do đó mới thông qua queue để xử lí. Nếu mà Firebase Database có bị down đi chăng nữa thì job đó sẽ bị failed và sẽ được retries lại ngay sau đó. Hơn nữa nhờ cơ chế work-queue này giúp chúng ta scalable khá tốt ở chỗ này.

Về Queue thì hiện nay có rất nhiều như KafkaQ4M … Về cá nhân mình thích nhất thằng Kafka vì nó luôn luôn đảm bảo đúng thứ tự xử lí. Và hơn nữa nó lại phân tán nữa nên tính mở rộng của nó khá là cao.

Và cuối cùng phía Client chỉ cần Subscribe event từ Firebase Realtime Database là có thể nhận dữ liệu 1 cách realtime rồi.

Ở bước này chúng ta sẽ không xử lí gì cả và chỉ cho hiển thị dữ liệu thôi. Như thế tốc độ sẽ khá là nhanh.

Về tính mở rộng của Firebase Realtime Database

Đầu tiên mình muốn nhấn mạnh 1 điều là Firebase Realtime Database không thể scale up với scale out được nhé.

Do đó trước khi đưa nó vào hệ thống thì chúng ta cần test tải kĩ càng trước xem cần bao nhiêu con database thì hợp lí, dựa vào tuỳ tình hình mà sẽ tiến hành sharding để đáp ứng được số lượng request đề ra.

Như phần trên mình có nói, firebase realtime database hiện tại chỉ cho phép 1 triệu request đồng thời và 10k write/s. Do đó để không vượt quá ngưỡng này thì sharding là điều hoàn toàn cần thiết.

Xây dựng ứng dụng realtime messaging bằng Firebase xử lí 100k request/s

Chúng ta sẽ sharding database theo liveID. Như trong ví dụ trên thì với liveid=1 và 4 sẽ cho trong db1, liveid = 2 và 5 sẽ cho trong db2, và live_id=3 và 6 sẽ cho trong db3

Nếu chia như thế thì chúng ta có thể xử lí được 3 triệu request đồng thời và 30k write/s.

Ở đây có 1 điểm chắc nhiều người cũng đang thắc mắc. Ví dụ live_id=1 (của 1 em gái xinh xắn nào đó) có tới hàng triệu anh vào xem live và comment. Nếu số lượng request đó vượt quá 1 triệu thì sẽ bị block lại và không gửi đc nữa. Ví dụ như ai đó thả tim liên tục chăng hạn …

Vậy ở chỗ này nên làm thế nào để có thể hạn chế được điều đó?

Có 1 solution khá đơn giản. Ví dụ như chức năng like chẳng hạn. Khi ấn like chúng ta sẽ không send ngay đến firebase mà sẽ đợi khoảng 10s sau đó mới send chẳng hạn. (Cứ miễn làm sao mà không làm giảm trải nghiệm của người dùng là được).

Để thực hiện được logic này chúng ta có thể sử dụng Redis hoặc memcached để lưu lại live_id với timestamp tương ứng. Sau khoảng 10s từ lúc insert vào redis thì sẽ không làm gì cả, sau 10s thì sẽ insert data đến firebase.

<code><?php
$memcachd = new \Sample\MemcachedClient();
$firebase_client = new \Sample\FirebaseClient();
$like_counter = new \Sample\LikeCounter();
$live_id = \HttpParameter::get('live_id');

$like_count = $like_counter->increment($live_id);

if ($memcached->get('key-prefix-like-' . $live_id)) {
    // Skip
} else {
    $firebase_client->updateLikeCount($like_count);
    $memcached->add('key-prefix-like-' . $live_id, true, 10); // 10s
}</code>

Ngoài ra mình nhấn mạnh 1 điều là do Firebase được dùng phía client (như web, mobile) nên việc lộ key của firebase là điều không thể tránh khỏi. Do đó việc cài đặt rule để phân quyền người dùng access đến resource là điều vô cùng cần thiết và ở bài này mình sẽ không đi sâu vào nữa. Mọi người có thể tìm hiểu thêm về Firebase Realtime Database Rule ở đây nhé.

Xây dựng ứng dụng realtime messaging bằng Firebase xử lí 100k request/s

Như hình ảnh bên trên là 1 ví dụ về lộ key firebase ở phía javascript.

Kết luận

Theo như các anh Mercari chia sẻ thì sau khi release tính năng live stream đó thì đến bây giờ cũng được 2 năm rồi mà chưa lần nào Firebase bị down cả.

Firebase quả thực rất mạnh. Nếu ai muốn dev thật nhanh hoặc muốn làm bản prototype thì có lẽ Firebase là 1 sự lựa chọn đúng đắn.

Với loại truyền thống thì chúng ta sẽ cần phải có DB, và chuẩn bị API phía backend để thao tác với dữ liệu trong DB. Nhưng Firebase thì khác, nó cung cấp cho ta DB và API để thao tác đến DB rồi. Do đó không cần phải dev API làm gì cho mệt. Cứ dùng Firebase SDK là xong.

Ngoài ra mình nhấn mạnh 1 điều là do Firebase được dùng phía client (như web, mobile) nên việc lộ key của firebase là điều không thể tránh khỏi. Do đó việc cài đặt rule để phân quyền người dùng access đến resource là điều vô cùng cần thiết và ở bài này mình sẽ không đi sâu vào nữa. Mọi người có thể tìm hiểu thêm về Firebase Realtime Database Rule ở đây nhé.

Hiện tại sắp tới công ty mình cũng đang chuẩn bị làm 1 service mới và sếp yêu cầu 2 tháng phải xong. Team mình cũng quyết định chọn Firebase cho giải pháp lần này.

Xem thêm việc làm Software Developers tại TopDev

Bài viết gốc được đăng tải tại Nghệ thuật coding

  Sharding là gì? - Cách Instagram tạo ID trong database của họ bằng Sharding
  Các kĩ sư Grab thiết kế hệ thống "đàn hồi" sử dụng kĩ thuật Circuit Breaker như thế nào?

Cách mà một dòng code đã thay đổi cuộc đời tôi!

chuyện nghề lập trình

Năm 2012 là giai đoạn mà sự nghiệp của tôi không đi đến đâu cả. Một ngày đẹp trời, đồng nghiệp của tôi – Otto Lombardo, đã cho tôi xem một dòng code mà đã thay đổi cuộc đời tôi mãi mãi, và đây là câu chuyện nghề lập trình của tôi.

Tôi làm quen với máy tính nhờ vào người anh họ của mình qua con game Street Road vào năm 1992. Như là yêu chỉ bằng cái nhìn đầu tiên, tôi còn nhớ đã xin mẹ tôi đến nhà anh họ chơi hết lần này đến lần khác.

Không lâu sau, mẹ tôi đăng ký cho tôi học một khoá về máy tính, DOS, Windows 3.1, Lotus…, DBase! Tôi háo hức như một đứa trẻ 10 tuổi! Tôi đi học về máy tính sớm để tôi có thể có nhiều thời gian “vọc” máy tính hơn. Tôi còn nhớ chuỗi ngày không bao giờ kết thúc chơi con game Carmen San Diego khi ba mẹ có đủ khả năng mua cho tôi một chiếc.

Một vài năm sau đó, tôi chuyển từ Argentina đến US khi tôi 15 tuổi, và phải mãi một năm sau đó bố mẹ tôi mới cho tôi chiếc máy tính đầu tiên, một chiếc PC Sony màu đen, thật tuyệt vời! Năm 1999, khi Internet bắt đầu xuất hiện, tôi đã dành hàng đêm để làm web bằng Notepad và upload lên hosting AngelFire. Tôi còn được nhận một chiếc đĩa vàng (24k) do Bill Gates và Steve Ballmer ký tặng vì đã làm testing MSN. Đó là những tháng ngày hacking rất vui và tuyệt vời.

chuyện nghề lập trình

Vài năm sau, tôi quyết định đi sửa cái máy tính của mình, và tôi học được một ít thủ thuật và bất ngờ tôi có một buổi phỏng vấn với một công ty máy tính ở New York. Wow! Khi bước vào đó và thấy những cái thùng chứa đầy linh kiện máy tính, tôi biết mình đã đến thiên đường. Tôi trở thành một network engineer và phải nói là tôi có thể sửa mọi lỗi về máy tính và network, và mặc dù tôi giỏi việc đó nhưng tôi lại không thật sự hạnh phúc. Tôi luôn luôn thích những công việc liên quan đến sáng tạo, và giờ tôi nhận ra công việc 8 năm qua của tôi chỉ là về sửa chữa, không hề có sự sáng tạo.

Và đó là khi mọi thứ bắt đầu. Một đồng nghiệp của tôi cho tôi xem một dòng code ở Delphi, nó có thể tạo ra một tin nhắn “Hello Ricardo”. Thật kỳ diệu! Nó dành cho tôi, ngay lập tức tôi biết rằng mình muốn trở thành một lập trình viên. Tôi trở về nhà, download delphi và chỉ trong 1 tuần tôi đã tạo được một giao diện phần mềm tương tự mà chúng tôi có khi làm việc và bắt đầu chạy. Thậm chí tôi còn lừa đồng nghiệp và người lập trình cái phần mềm đó nghĩ rằng là tôi đã hack vào phần mềm và thay đổi menu. Thật sự rất vui! Nhưng giờ thì sao? Tôi có nên tiếp tục học Delphi?

Sau đó nếu tôi muốn bán thứ gì mà tôi lập trình được, tôi có thể ghi nó trong …? Thật may mắn khi một người bạn của tôi gợi ý cho tôi học code iOS. Tôi có thể build cái gì đó và đăng lên App Store.

Tôi mất gần một năm trời để học căn bản, nhớ là tôi không hề có background về lập trình. Tôi dành hàng giờ đồng hồ để đọc, xem video, viết stuff. Bạn của tôi và tôi bắt đầu sáng thứ 7 vào lúc 9h00 và làm việc không ngừng nghỉ đến 2h30 sáng Chủ Nhật (hoặc chỉ khi vợ tôi nói dừng lại!). Tôi build được một prototype cho một ứng dụng, và nó giúp tôi tìm được công việc đầu tiên cách nhà 3 tiếng di chuyển.

Trong khoảng 6 tháng đó tôi chỉ dành từ 5 đến 6 tiếng để đi lại. Tôi sống ở Queens, NY và công việc đầu tiên làm lập trình iOS thì ở Summit, NJ. Rất xứng đáng! Tôi dành một nửa thời gian để đọc về lập trình và nửa còn lại để cố gắng ngủ một chút. Tôi phải thừa nhận là nó rất mệt nhưng công việc đó lại giúp tôi tìm được một việc khác gần nhà tôi hơn, chỉ mất khoảng 40 phút đi từ Manhattan, NY. Trong khoảng thời gian đó tôi đã chiến thắng một cuộc thi về lập trình với giải thưởng không thể đòi hỏi thêm: $20,000 (Link)

Tôi nhận được chứng chỉ từ Đại học New York và sau đó được mời về làm diễn giả cũng như được thuê làm một số công việc về lập trình. Tôi đến các hội thảo và được nói chuyện với một vài người. Đây chính là cuộc sống mà tôi mơ ước, và tôi đang sống trong giấc mơ Mỹ của mình!

chuyện nghề lập trình

Hiện tôi đang làm việc tại MediPortal, chúng tôi đang cố gắng cải thiện ngành chăm sóc sức khoẻ. Tôi phụ trách mọi giải pháp mobile. Giờ đây không kể bao nhiêu giờ, tôi làm việc cả ngày lẫn đêm và cả vào cuối tuần. Khi bạn thực sự yêu thích công việc mà bạn đang làm, bạn sẽ không còn nhìn vào đồng hồ và nghĩ về việc về nhà nữa. Không dễ dàng để đến được thời điểm hiện tại nhưng mọi thứ đều xứng đáng.

Và bạn thấy đó, bí quyết chính là việc bạn đã sẵn sàng chưa? Mọi người đều có thể làm được! Tôi luôn nghĩ về câu mà Steve Jobs đã nói: “Cuộc sống sẽ mở rộng hơn chỉ khi bạn khám phá ra một sự thật đơn giản là: Mọi thứ xung quanh mà bạn gọi là cuộc sống được tạo nên bởi những người không hề thông minh hơn bạn và bạn có thể thay đổi điều đó, bạn có thể tác động đến nó, bạn có thể tự tạo nên những thứ mà người khác có thể dùng được. Và chỉ khi bạn học được điều đó, bạn sẽ không còn giống họ nữa.”

Nếu có điều gì tôi muốn đạt được, thì đó là tạo động lực cho mọi người như cách mà Otto đã tạo động lực cho tôi. Ra ngoài đó và bắt đầu sống với ước mơ của bạn đi. Không gì là không thể và chỉ có bạn là người cản trở bạn mà thôi. Hãy điên rồ và táo bạo lên. Và biến nó thành hiện thực!

Xin cảm ơn các bạn đã theo dõi bài viết!

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

Xem thêm việc làm Software Developers hot nhất tại TopDev

  5G & IoT hứa hẹn điều gì trong tương lai?
  Học lập trình thế nào để không thất nghiệp?

Vượt qua 7 sai lầm này để học JavaScript dễ thở hơn

7-sai-lam-trong-hoc-javascript

Giới thiệu

Đối với một số người, học JavaScript có vẻ không hứng thú lắm, đặc biệt là những ai thiếu kiên nhẫn. Thỉnh thoảng, bạn sẽ lại tự hỏi bản thân liệu mình đã chọn đúng con đường cho tương lai chưa…

JavaScript chưa bao giờ dễ dàng như đi dạo hồ con rùa cả!

Tin tốt là bạn có thể cải thiện quá trình học của mình bằng những lựa chọn và cách tiếp cận khác. Còn đợi gì nữa mà không tự thay đổi chính bản thân bạn?

Bài viết này sẽ chỉ ra 7 lỗi sai mà các lập trình viên học JavaScript thường mắc phải. Và cũng chính những lỗi này mà họ bị thụt lại phía sau so với người khác khi học JavaScript

Cùng tìm hiểu đó là 7 lỗi sai nào nhé!

Tuyển dụng Javascript lương cao cho SV mới ra trường

7 sai lầm trong học JavaScript lập trình viên cần tránh

Học cho qua với các khái niệm

học JavaScript

Khi bạn bắt đầu hiểu các khái niệm cơ bản như closures là gì hay các hàm bậc cao, đừng bao giờ chuyển sang các bài học tiếp theo mà bỏ qua các bài tập thực hành ở đầu.

Nhưng đã số với mọi người, chuyển sang học cái tiếp theo có vẻ hấp dẫn hơn nhiều. Tuy nhiên, nếu bạn dành thời gian luyện code sau khi học xong một kiến thức, chỉ cần 5 phút thôi, cũng đủ giúp bạn dễ thở hơn rất nhiều với các project trong tương lai. Luôn luyện code sau khi học một khái niệm sẽ giúp bạn nhớ lâu hơn.

Nếu bạn chỉ học cho qua các khái niệm cơ bản, một lúc nào đó khi gặp phải nó trong lúc đang code, bạn sẽ tốn nhiều thời gian tìm kiếm lại nó trên mạng. Và sẽ thật tệ khi phải mất đi những giây phút quý báu, chỉ để tìm lại cái mình đã học rồi. Tới lúc đó bạn sẽ còn stress hơn rất nhiều.

Và thực tế là có nhiều lập trình viên rời project chỉ vì lý do không đủ thời gian.

Vậy nên, đừng bao giờ bỏ qua một kiến thức nào, dù chỉ là đơn giản nhất nhé!

Không tự viết code

học JavaScript

Vấn đề gần đây xảy ra với rất nhiều lập trình viên, đó là họ phụ thuộc quá nhiều vào code của người khác, như việc copy file của người khác trên các bài hướng dẫn, hay dùng thư viện Lodash trong mọi tình huống…

Xem thêm Lodash là gì.

Mặc dù không có gì sai khi dùng thư viện Lodash, nhưng bạn có thể bị thụt lại phía sau, nếu cứ lạm dụng nó trong thời gian dài. Lâu dần, bạn sẽ không nắm được khái niệm cơ bản về tools, frameworks, ngôn ngữ,… đều là những thứ giúp bạn tư duy lập trình.

Đó cũng là lý do vì sao nhiều cuộc phỏng vấn có thử thách code. Họ muốn xem cách bạn tư duy và cách bạn vận dụng kiến thức để giải quyết tình huống khi lập trình. Bạn có thể dùng các thư viện component để làm UI tốt hơn và xử lý Lodash với các thuật toán. Nhưng khi có vấn đề xảy ra, họ sẽ cần bạn vận dụng kiến thức, khái niệm để giải quyết. Họ không cần một người cài đặt npm vào thư viện khác để giải quyết vấn đề. Họ chỉ cần bạn.

Bạn sẽ không muốn kết thúc cuộc đời với những tình huống mà bạn đã từng dành thời gian ra học cực khổ. Vậy nên hãy luyện tập tự viết code của bạn thường xuyên nhé.

Làm quá một việc gì đó

học JavaScript

Với tất cả thông tin bạn kiếm được trên mạng, bạn cần bình tĩnh ngồi xuống, thu thập và chọn lọc các tài nguyên bạn cần trước khi học topic mới trong JavaScript.

Nhưng hiếm ai biết được đó là cách học tốt hơn rất nhiều.

Nhiều bạn thường nghĩ rằng nếu chúng ta chỉ cần có tất cả thông tin cần thiết, mọi thứ sẽ dễ dàng hơn. Nhưng đó chỉ là bạn nghĩ mà thôi.

Đừng cố gắng kiếm 80 cái tutorial, 6 cái ebook, một bộ 50 bookmark về nguồn, và cố gắng bắt đầu giải quyết đống đó một lúc như thể bạn là “Master of Lập trình web”.

Nếu bạn đang học JavaScript, thì hãy nhớ học đi đôi với hành. Cứ thế mà viết mọi thứ thôi. Dùng bất cứ thứ gì bạn học được trong quá khứ, tổng hợp chúng lại để làm những ví dụ nhỏ. Việc này sẽ giúp bạn nhớ lâu hơn thay vì đọc toàn bộ tài liệu mà bạn kiếm được trong cùng một lúc.

Choáng ngợp bởi quá nhiều thông tin

học JavaScript

Nếu bạn dành nhiều thời gian kiếm thông tin thay vì tự code, bạn sẽ rất nhanh quên và lại phải đi tìm kiếm tư liệu sau này.

Sẽ thật đáng sợ nếu bạn dành nhiều thời gian để học vì bạn nghĩ mình thích. Nhưng điều gì sẽ xảy ra khi bạn quên hết mọi thứ sau vài tháng? Bạn sẽ nhận ra được một vài lý do tại sao mình không thể dùng những kiến thức và tài liệu đã học lúc trước nữa.

Nếu bạn cần lời khuyên, hãy dành ít nhất 15 phút mỗi giờ bạn tìm kiếm thông tin để code.

So sánh bản thân với người khác

học JavaScript

Khi bạn so sánh bản thân với người khác, bạn sẽ không bao giờ biết cách họ làm, mà chỉ biết thứ họ đạt được.

Khi người ta nhìn vào những lập trình viên thành công, họ sẽ tự động cho rằng quá trình học của họ bắt đầu viết clean code.

Chỉ tập trung vào những gì bạn học ở hiện tại và tiếp tục đi lên khi bạn sẵn sàng. Rồi bạn sẽ sớm đạt được những thứ mà người ta đang ao ước.

Học các công cụ và Framework được xây dựng dựa trên JavaScript

học javascript

Bạn cho là học JavaScript bằng cách học React/jQuery/Angular/Vue đúng không? Điều gì sẽ xảy ra nếu có một công cụ mới xuất hiện và bạn phải thay đổi? Cuối cùng, bạn sẽ phải trông đợi người khác bày cách tốt hơn và chia sẻ cho cộng đồng, vì họ đã học JavaScript còn bạn thì không.

Nếu bạn chưa học Vanilla JavaScript, bạn nên bắt đầu học nó đi. Vì nó sẽ giúp bạn hiểu cách các tool được xây dựng như thế nào, tại sao chúng được build và vấn đề chúng giải quyết là gì. Bằng cách học các lý do trong JavaScript, bạn sẽ tránh được việc code xấu sau này.

Xem thêm lý do học Vanilla JavaScript

Trong các công cụ hay framework JavaScript, rất nhiều bits quan trọng được ẩn đi mà bạn cần phải biết. 

Không chia nhỏ kiến thức ra để học

học JavaScript

Học JavaScript cũng như học môn toán lúc trước vậy. Khi bạn học căn bản về phép cộng, nhân, chia… bạn sẽ chuyển sang học so sánh lớn hơn, nhỏ hơn, phép chia nhiều chữ số, đại số cơ bản,… Bạn thường gặp khó khăn trong việc học là vì bạn nhảy cóc quá xa, mà không đi những bước ngắn. Tất nhiên học thẳng vào đại số mà không học cơ bản là điều không thể rồi.

Bằng cách đi từng bước nhỏ, khi gặp những khái niệm bạn không biết, sẽ dễ dàng hơn rất nhiều để tìm kiếm trợ giúp vì bạn đã thu hẹp chủ đề lại.

Kết luận

Trên đây là 7 sai lầm sẽ làm bạn thụt lại phía sau khi học JavaScript. Hy vọng các bạn có thể tránh được và phát triển hơn trong việc học JavaScript. Cảm ơn các bạn đã theo dõi bài viết!

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

Xem thêm việc làm JavaScript Developer hot nhất tại TopDev

Kỹ thuật phần mềm vs Khoa học máy tính – Nên chọn ngành nào/

chọn chuyên ngành IT nào

Xin chào mọi người! Tên tôi là YK, hiện đang quản lí CS Dojo, một kênh YouTube giáo dục lập trình với hơn 200.000 người đăng ký. Tôi cũng từng là một nhà phát triển phần mềm tại Google.

Trong quá trình làm ra các video, tôi thường được hỏi hai câu hỏi phổ biến:

   “Sự khác biệt giữa khoa học máy tính và phần mềm kỹ thuật phần mềm là gì?”

Và …

   “Tôi có nên chọn khoa học máy tính hay kỹ thuật phần mềm để trở thành một kỹ sư phần mềm?”

Trong bài viết này, tôi sẽ trả lời các câu hỏi trên và đưa cho bạn phân tích nhanh về những chuyên ngành này.

Tổng quan nhanh về hai chuyên ngành này

Khoa học máy tính là nghiên cứu về cách các máy tính hoạt động, chủ yếu từ quan điểm lý thuyết và toán học.

Bạn nên chọn Khoa học máy tính nếu bạn thích toán học, logic hoặc nếu bạn muốn tham gia vào một lĩnh vực chuyên biệt trong CS chẳng hạn như trí tuệ nhân tạo, học máy, an ninh, hoặc đồ họa.

Kỹ thuật phần mềm là nghiên cứu về cách thức các hệ thống phần mềm được xây dựng, bao gồm các chủ đề như quản lý dự án, đảm bảo chất lượng và kiểm tra phần mềm.

Bạn nên chọn kỹ thuật phần mềm nếu bạn quan tâm nhiều hơn đến cách thực hành và nếu bạn muốn tìm hiểu chu kỳ sống chung của phần mềm được xây dựng và duy trì như thế nào.

Cả Khoa học máy tính và kỹ thuật phần mềm đều dạy các nguyên tắc cơ bản của lập trình và khoa học máy tính, vì vậy bạn vẫn có thể chọn một trong hai để trở thành một nhà phát triển phần mềm.

Để hiểu được sự khác biệt giữa khoa học máy tính và kỹ thuật phần mềm, chúng ta hãy cùng xem chương trình giảng dạy của họ tại Đại học Waterloo ở Canada.

Tôi đã chọn Đại học Waterloo vì nó có một trong những chương trình khoa học máy tính tốt nhất ở Bắc Mỹ

  Cách tiếp cận công nghệ và ngôn ngữ mới cho những lập trình viên non trẻ

Triển vọng nghề nghiệp

Đầu tiên chúng ta hãy so sánh các loại công việc và thực tập mà bạn có thể có được thông qua mỗi chương trình.

Rất may, trang web của Đại học Waterloo có cung cấp một số ví dụ cụ thể.

Khoa học máy tính

  • Nhà phát triển Web / Kiến trúc sư Desinger
  • Lập trình viên
  • Nhà phát triển điện thoại di động Moblie / đám mây Cloud
  • Kỹ thuật Phần mềm
  • Kỹ thuật phát triển phần mềm
  • Kỹ sư Agile
  • Chuyên viên Phân tích Kinh doanh
  • Quản lý sản phẩm
  • Hỗ trợ công nghệ IT Support
  • Nhà phát triển phần mềm
  • Quản lý Phần mềm
  • Kỹ sư phần mềm
  • Quản lý Sản phẩm Kỹ thuật
  • Tư vấn, Giải pháp Tài chính
  • Tư vấn thực hiện

Như bạn thấy, không có sự khác biệt lớn giữa các loại công việc mà bạn có thể có được.

Đa phần các sinh viên sau khi tốt nghiệp đều làm Software Developer hoặc Software Engineer

Cũng có những lựa chọn liên quan khác như quản lý sản phẩm, nhà phân tích QA và tư vấn công nghệ. Nó hoàn toàn tùy thuộc vào khả năng của bạn.

Các khóa học năm thứ nhất:

Bây giờ, chúng ta hãy xem các khóa học bắt buộc của mỗi chương trình. Trước tiên chúng ta hãy so sánh một số các khóa học bạn cần phải thực hiện trong năm đầu tiên của bạn.

  • Khoa học máy tính

   CS 135 – Thiết kế các chương trình chức năng

   CS 136 – Thuật toán và khai thác dữ liệu

   MATH 135 – Đại số

   MATH 136 – Đại số tuyến tính 1

   MATH 137 – Calculus 1

   MATH 138 – Calculus 2

   Cộng thêm một vài môn phụ

  • Kỹ thuật phần mềm

   CS 137 – Nguyên tắc lập trình

   CS 138 – Thu thập và thực hiện dữ liệu

   MATH 115 – Đại số tuyến tính cho kỹ thuật

   MATH 117 – Calculus 1 cho Kỹ thuật

   MATH 119 – Calculus 2 cho Kỹ thuật

   ECE 105 – Vật lý Kỹ thuật Điện 1

   ECE 106 – Điện và Từ

   ECE 124 – Các mạch và hệ thống số

   ECE 140 – Mạch tuyến tính

   SE 101 – Phương pháp kỹ thuật Phần mềm

Như bạn thấy, các khóa học năm đầu cũng tương tự như vậy. Cả hai đều bao gồm một vài khóa học về khoa học máy tính cơ bản, và một vài môn toán trong đại số tuyến tính và tính toán.

Sự khác biệt lớn duy nhất là phần mềm Kỹ thuật có thêm vật lý và các thành phần kỹ thuật điện, trong khi Khoa học Máy tính có thêm một số môn tự chọn.

Các khoá học sau năm đầu tiên:

Các khóa học bắt buộc và tự chọn sau năm đầu tiên như thế nào? Chúng ta hãy xem xét một số ví dụ ở đây:

  • Khoa học máy tính:

   MATH 239 Giới thiệu tổng hợp

   STAT 230 Xác suất

   STAT 231 Thống kê

   CS 240 Cấu trúc dữ liệu và Quản lý dữ liệu

   CS 241 Các cơ sở của các chương trình tuần tự

   CS 245 Logic và Tính toán

   CS 246 Phát triển phần mềm hướng đối tượng <- không bắt buộc đối với các chuyên ngành Kỹ thuật phần mềm

   CS 251 Tổ chức và thiết kế Máy tính

   Thuật toán CS 341

   CS 350 Hệ điều hành

   Thêm vào đó, một số môn Khoa học máy tính

  • Kỹ thuật phần mềm:

   CHE 102 Hóa học cho kỹ sư

   ECE 222 Máy vi tính số (bao gồm ngôn ngữ lắp ráp)

   ECE 358 Mạng máy tính

   MATH 213 Toán cao cấp cho kỹ sư phần mềm

   MATH 239 Giới thiệu tổng hợp

   STAT 206 Thống kê cho Kỹ thuật Phần mềm

   MSCI 261 Kinh tế Kỹ thuật: Quản lý Tài chính cho Kỹ sư

   CS 241 Các cơ sở của các chương trình tuần tự

   CS 240 Cấu trúc dữ liệu và Quản lý dữ liệu

   CS 247 Nguyên tắc Kỹ thuật Phần mềm <- không bắt buộc đối với các chuyên ngành Khoa học máy tính

   Thuật toán CS 341

   Giao diện Người dùng CS 349 <- không bắt buộc đối với các chuyên ngành Khoa học máy tính

   CS 343 Lập trình song song và song song <- không bắt buộc đối với các chuyên ngành Khoa học máy tính

   CS 348 Giới thiệu về Quản lý Cơ sở dữ liệu

   SE 212 Logic và Tính toán

   SE 350 Hệ điều hành

   SE 465 Kiểm thử phần mềm và đảm bảo chất lượng

   SE 464 Thiết kế và Kiến trúc phần mềm

   SE 463 Yêu cầu phần mềm Yêu cầu kỹ thuật và phân tích

   Dự án Thiết kế SE 490

   Thêm vào đó, một vài môn khoa học máy tính và các môn kỹ thuật điện

Tôi đã cung cấp cho bạn rất nhiều thông tin để tiêu hóa ở đây. Nhưng ngắn gọn thì:

Khi nói đến các yêu cầu trong toán học và thống kê, Khoa học máy tính và Kỹ thuật phần mềm gần như giống hệt nhau. Chúng bao gồm tổ hợp, xác suất và thống kê.

Các yêu cầu về khoa học máy tính cốt lõi cũng tương tự nhau, bao gồm các thuật toán, cấu trúc dữ liệu và các hệ điều hành.

Sự khác biệt chính là:

  • Kỹ thuật phần mềm có nhiều yêu cầu hơn về kỹ thuật điện và các nguyên tắc cơ bản về phần mềm, chẳng hạn như kiểm tra phần mềm, thiết kế và yêu cầu phần mềm.
  • Khoa học Máy tính cho phép nhiều môn tự chọn trong các khóa học khoa học máy tính cấp cao hơn. Bạn có thể chọn từ một loạt các chủ đề như an ninh, nguyên tắc cơ bản về công nghệ phần mềm, tầm nhìn máy tính, học máy và quản lý cơ sở dữ liệu.

Vậy, bạn nên chọn chuyên ngành IT nào nào?

Tôi nghĩ rằng nó chủ yếu phụ thuộc vào sở thích của bạn. Nói ngắn gọn:

Bạn nên chọn Khoa học máy tính nếu bạn thích toán học, logic, hoặc nếu bạn muốn tham gia vào một lĩnh vực chuyên biệt trong CS chẳng hạn như trí tuệ nhân tạo, học máy, an ninh hoặc đồ họa.

Bạn nên chọn Kỹ thuật phần mềm nếu bạn quan tâm nhiều hơn đến cách tiếp cận thực hành và nếu bạn muốn tìm hiểu chu kỳ sống chung của phần mềm được xây dựng và duy trì như thế nào.

  Cách tiếp cận công nghệ và ngôn ngữ mới cho những lập trình viên non trẻ

Nhưng ngành nào thì thích hợp cho software engineer?

Thông thường, các công ty thường tìm kiếm trong một ứng cử viên kỹ sư phần mềm là khả năng viết code tốt và xây dựng các dự án thú vị, cũng như những nguyên tắc cơ bản về khoa học máy tính bao gồm các cấu trúc dữ liệu và thuật toán.

Tôi nghĩ cách tốt nhất để trau dồi kỹ năng này là nhanh chóng học thật vững về nguyên tắc cơ bản về máy tính, và dành thời gian riêng của mình để thực hành viết code.

Dựa trên chương trình học cho kỹ thuật phần mềm và mức độ bận rộn của sinh viên, tôi nghĩ rằng sẽ khó thực hiện việc này nếu bạn theo học kỹ thuật phần mềm hơn là khoa học máy tính.

Một lợi ích khác của chương trình khoa học máy tính này là nó cho phép nhiều môn tự chọn hơn. Điều này khá tuyệt vời vì tùy thuộc vào nhu cầu thị trường lao động, bạn có thể điều chỉnh các khóa học của mình. Ví dụ: nếu phát triển ứng dụng di động, bạn có thể tìm hiểu điều đó. Và nếu tính toán song song là nhu cầu, bạn có thể tập trung vào nó thay cho những khóa khác.

Tôi chắc chắn rằng có một số lợi ích để học các nguyên tắc cơ bản về công nghệ phần mềm (quản lý dự án, thiết kế, thử nghiệm, v.v.). Nhưng tôi cá nhân sẽ linh hoạt hơn đối với các kỹ năng được xác định trước. Đó là lý do tại sao tôi nghĩ rằng khoa học máy tính là một lựa chọn tốt hơn để trở thành một kỹ sư phần mềm.

Tất nhiên, đó chỉ là ý kiến ​​của tôi, và đây nó dựa trên chương trình từ một trường đại học cụ thể. Tôi rất muốn nghe ý kiến ​​của bạn và kinh nghiệm của bạn về hướng chọn chuyên ngành này.

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

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

Xem thêm tuyển dụng ngành cntt hot nhất trên TopDev

Những ngày đen tối nhất của Vue

RFC

Vừa qua cộng đồng VueJS đã có khoảng thời gian khá dậy sóng. Mới đây, người tạo ra Vue, Evan You đã phát hành RFC (Request for Comment) để viết component dựa trên chức năng trong phiên bản Vue 3.0 sắp tới.

Trên Reddit Thread và cả Hacker News xuất hiện rất nhiều bình luận phê bình và chỉ trích, hàng loạt các developer đổ xô vào RFC và bày tỏ sự phẫn nộ của họ, một số còn đi quá giới hạn với nhiều lời bình luận gay gắt.

  Unit testing các component Vue.js bằng các tool Vue testing và Jest (P2): Test Vue.js Components deep render trong Jest
  API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth

Cộng đồng Vue dậy sóng với nhiều comment như:

  • Toàn bộ code Vue phải được biết lại theo cách hoàn toàn mới vì cách viết hiện tại đã bị xoá và thay thế bằng một cái gì đó mới;
  • Thời gian người ta dành ra để học Vue đã thành tro bụi vì mọi thứ sắp thay đổi;
  • Cách viết mới tệ hơn cách cũ, không thực thi cấu trúc, và sẽ dẫn đến spaghetti code;
  • Team Vue Core đã bất ngờ thực hiện một thay đổi lớn mà không hề có tham vấn;
  • Vue đang biến thành React!
  • Không, Vue đang biến thành AngularJS/Angular!
  • Giờ thì HTML phải được viết dưới dạng một string khổng lồ rồi!

Mặc dù có nhiều comment tiêu cực trên Reddit Thread, tỉ lệ reaction tích cực và tiêu cực cho RFC của You rất cao trên trang RFC, và đa phần ý kiến ban đầu khá tích cực.

Và thực tế, phiên bản RFC mới có rất nhiều ưu điểm. Nhưng trước tiên, cùng phân tích và giải quyết những lời chỉ trích tiêu cực trước đã.

Có khá nhiều người đã vội vàng bình luận tiêu cực và gay gắt trên Hacker News hoặc Reddit Thread mà không đọc kĩ các đề xuất ban đầu. Evan You cũng đã có đăng Q&A nhằm giải đáp nhiều vấn đề mọi người gặp phải:

  • Bạn không cần viết lại code nếu bạn không muốn. Cách viết mới chỉ là “thêm mắm thêm muối”, cách viết cũ vẫn có thể được sử dụng trong Vue 3.0 và miễn là còn nhiều người sử dụng cách cũ đó. Thậm chí nếu nó có bị gỡ ra khỏi Core code, các plugin có thể dễ dàng cho phép cách viết cũ còn hiệu lực 100%.
  • Thời gian học Vue của bạn không hề lãng phí. Cú pháp component mới sử dụng chung hình thức mà bạn học, và những hình thức khác như Component single file, template, và phạm vi hoạt động cũng như nhau.
  • Sự thay đổi này không phải là không có tham vấn. RFC là tham vấn. Cú pháp mới vẫn còn lâu mới được phát hành.
  • Và chắc chắn không, HTML không cần viết theo kiểu string khổng lồ rồi.

Một nhận định khá chủ quan là cách viết mới sẽ kém hơn cách viết cũ, và ít code cấu trúc hơn. Cùng xem 1 ví dụ tại saoRFC mới lại tuyệt vời hơn và có cấu trúc code tốt hơn nhé.

Ví dụ component vui, cho phép người dùng nhập thông tin về thú cưng của họ.

Lưu ý:

  • Một thông báo sẽ hiện ra khi người dùng nhập xong tên thú cưng của họ;
  • Sẽ có thông báo khác hiện lên sau khi họ chọn kích cỡ của thú cưng;

VÍ dụ RFC

Ví dụ RFC

Bạn có thể thử demo của component này tại đây và có thể xem toàn bộ code dùng Vue 2.x tại đây. (see components/Vue2.vue)

Một chút JavaScript nào:

export default {
  data() {
    return {
      petName: "",
      petNameTouched: false,
      petSize: "",
      petSizeTouched: false
    };
  },
  computed: {
    petNameComment: function() {
      if (this.petNameTouched) {
        return "Hello " + this.petName;
      }
      return null;
    },
    petSizeComment: function() {
      if (this.petSizeTouched) {
        switch (this.petSize) {
          case "Small":
            return "I can barely see your pet!";
          case "Medium":
            return "Your pet is pretty average.";
          case "Large":
            return "Wow, your pet is huge!";
          default:
            return null;
        }
      }
      return null;
    }
  },
  methods: {
    onPetNameBlur: function() {
      this.petNameTouched = true;
    },
    onPetSizeChange: function() {
      this.petSizeTouched = true;
    }
  }
};

Về cơ bản, chúng ta có một số dữ liệu, các thuộc tính được tính toán từ các dữ liệu đó và các phương thức sẽ thao túng dữ liệu đó. Chú ý là Vue 2.x không có cách nào để giữ những thứ liên quan lại với nhau. Chúng ta không thể để petName khai báo dữ liệu cạnh petNameComment hay phương thức onPetNamBlur được vì trong Vue 2.x nhóm theo loại.

Tất nhiên là điều này không quá quan trọng đối với một ví dụ nhỏ như vậy. Nhưng bạn hãy tưởng tượng với những ví dụ lớn hơn, có nhiều chức năng cần data, computed, methods và thậm chí một hoặc hai watcher. Hiện tại không có cách nào khả quan để giữ những thứ liên quan cùng một chỗ.

Bạn có thể sử dụng một vài thứ như Mixins hay Higher Order Components nhưng có một vấn đề là, rất khó để thấy các thuộc tính đến từ đâu và có những vấn đề gì với xung đột namespace. (Và chắc chắn rồi, trong trường hợp này chúng ta có thể chia ra nhiều component, nhưng hãy xem một ví dụ tương tự không làm cách đó.)

Thay vì sắp xếp các component theo từng loại, đề xuất mới cho phép ta sắp xếp component theo chức năng thực tế. Cũng tương tự cách bạn sắp xếp file cá nhân trên máy tính của mình vậy. Bạn không cần có folder “spreadsheets” hay folder “word documents”, thay vào đó bạn có một folder “work” và một folder “kế hoạch đi chơi”.

Hãy xem component ở trên được viết theo cách mới:

import { state, computed } from "vue";
export default {
  setup() {
    // Pet name
    const petNameState = state({ name: "", touched: false });
    const petNameComment = computed(() => {
      if (petNameState.touched) {
        return "Hello " + petNameState.name;
      }
      return null;
    });
    const onPetNameBlur = () => {
      petNameState.touched = true;
    };

    // Pet size
    const petSizeState = state({ size: "", touched: false });
    const petSizeComment = computed(() => {
      if (petSizeState.touched) {
        switch (this.petSize) {
          case "Small":
            return "I can barely see your pet!";
          case "Medium":
            return "Your pet is pretty average.";
          case "Large":
            return "Wow, your pet is huge!";
          default:
            return null;
        }
      }
      return null;
    });
    const onPetSizeChange = () => {
      petSizeState.touched = true;
    };

    // All properties we can bind to in our template
    return {
      petName: petNameState.name,
      petNameComment,
      onPetNameBlur,
      petSize: petSizeState.size,
      petSizeComment,
      onPetSizeChange
    };
  }
};

Lưu ý là:

  • Rất dễ để nhóm mấy thứ liên quan lại với nhau;
  • Bằng cách xem những gì được trả về bởi chức năng thiết lập, chúng ta có thể dễ dàng thấy những gì được quyền truy cập trong template của mình;
  • Thậm chí ta có thể tránh lộ state nội bộ (“touched”) mà template không cần truy cập;

Trên hết là cách mới dễ dàng cho phép hỗ trợ đầy đủ TypeScript, điều mà khó có thể làm được trong cách cũ ở Vue 2.x. Giờ chúng ta có thể dễ dàng trích xuất logic tái sử dụng thành các chức năng tái sử dụng.

Ví dụ:

import { state, computed } from "vue";

function usePetName() {
  const petNameState = state({ name: "", touched: false });
  const petNameComment = computed(() => {
    if (petNameState.touched) {
      return "Hello " + petNameState.name;
    }
    return null;
  });
  const onPetNameBlur = () => {
    petNameState.touched = true;
  };
  return {
    petName: petNameState.name,
    petNameComment,
    onPetNameBlur
  };
}

function usePetSize() {
  const petSizeState = state({ size: "", touched: false });
  const petSizeComment = computed(() => {
    if (petSizeState.touched) {
      switch (this.petSize) {
        case "Small":
          return "I can barely see your pet!";
        case "Medium":
          return "Your pet is pretty average.";
        case "Large":
          return "Wow, your pet is huge!";
        default:
          return null;
      }
    }
    return null;
  });
  const onPetSizeChange = () => {
    petSizeState.touched = true;
  };
  return {
    petSize: petSizeState.size,
    petSizeComment,
    onPetSizeChange
  };
}

export default {
  setup() {
    const { petName, petNameComment, onPetNameBlur } = usePetName();
    const { petSize, petSizeComment, onPetSizeChange } = usePetSize();
    return {
      petName,
      petNameComment,
      onPetNameBlur,
      petSize,
      petSizeComment,
      onPetSizeChange
    };
  }
};

Trong Vue 2.x, component thường rất khó để chia thành nhiều phần nhỏ. Không thể phân tách thành các component khác vì sẽ có rất nhiều thứ xảy ra trên một lượng nhỏ state.

Tuy nhiên sử dụng phương pháp mới sẽ dễ dàng để thấy cách các component lớn được chia tách thành các phần nhỏ hơn, chuyển chúng vào các file riêng biệt nếu cần thiết, và cho bạn những chức năng cũng như component nhỏ và dễ hiểu hơn.

Liệu đây có phải là ngày đen tối nhất của Vue? Có vẻ đúng vậy đấy. Đến bây giờ, cả một cộng đồng đã hiểu sai định hướng của project mới này. Hy vọng người ta sẽ có cái nhìn khác về phiên bản mới.

RFC mới vẫn cho phép họ nhóm mọi thứ theo loại tuỳ chọn nếu họ thích, nhưng nó còn cho phép nhiều hơn thế nữa. Code clear hơn, clean hơn, thư viện có nhiều khả năng thú vị hơn, và hỗ trợ TypeScript đầy đủ.

Cuối cùng, khi bạn dùng phần mềm mã nguồn mở, bạn nên biết ơn những người maintain đang nỗ lực rất nhiều vào một thứ gì đó cho bạn sử dụng free. Một số lời chỉ trích gay gắt thật sự không có lý. Rất may là những comment tiêu cực đó vẫn còn ít và đã có nhiều người thể hiện ý kiến tích cực và tôn trọng hơn cho tác giả và cả phiên bản mới này.

Cảm ơn các bạn đã theo dõi bài viết!

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

Xem thêm việc làm Software Developers hot nhất trên TopDev

  Unit testing các component Vue.js bằng các tool Vue testing và Jest (P3): Test các Style and cấu trúc của các Vue.js Component trong Jest
  Call API trong VueJS theo cách thông minh nhất

Lập trình viên và hội chứng Tự kỷ

Khi tôi đọc bài viết của Wesner Moise về hội chứng Asperger (một dạng tự kỷ nhẹ), tôi đã không cảm thấy ngạc nhiên. Nhiều người trong số các nhà phát triển phần mềm giỏi nhất mà tôi từng biết đều có một vài đặc điểm đi kèm với hội chứng tự kỷ (Asperger):

1. Khiếm khuyết về mặt xã hội

Điều đáng chú ý bởi vì nó được phân loại là một dạng rối loạn, một số người bị hội chứng tự kỷ (Asperger) gần như bình thường trong khả năng đọc và sử dụng nét mặt cũng như các hình thức tinh tế khác của giao tiếp. Tuy nhiên, khả năng này không tự nhiên đến với hầu hết những người có hội chứng tự kỷ. Những người như vậy thường bị chậm phát triển các kỹ năng xã hội và phải học để có thể phát triển được những kỹ năng đó.

  Tự học một cách chủ động từ dự án và đồng nghiệp

  Con đường sự nghiệp của một Lập trình viên!

2. Có những mối quan tâm trong phạm vi hẹp và mãnh liệt

Hội chứng tự kỷ có thể liên quan đến một mức độ ám ảnh tập trung dữ dội vào những mối quan tâm. [.. ] Những mối quan tâm đặc biệt phổ biến là phương tiện vận tải (như tàu hỏa), máy tính, toán học (đặc biệt là các khía cạnh cụ thể, chẳng hạn như số pi), wikipedia, và khủng long. Lưu ý rằng một số trong những điều kể trên là mối quan tâm thông thường ở những trẻ em bình thường; sự khác biệt ở trẻ em tự kỷ đó là là cường độ bất thường trong mối quan tâm của chúng.

3. Lời nói và ngôn ngữ khá lập dị

Việc giải thích ngữ nghĩa là một dấu hiệu phổ biến khác nhưng không hoàn toàn xác định cho hội chứng này. Attwood đưa ra ví dụ về một cô gái bị hội chứng tự kỷ, một ngày nọ cô trả lời điện thoại gọi đến từ một người lạ hỏi là “Có Paul đó không?”. Mặc dù Paul trong câu hỏi là người có mặt ở trong nhà, nhưng anh ta không ở cùng phòng với cô, vì vậy sau khi nhìn xung quanh để khẳng định điều này, cô ta chỉ đơn giản nói “không” và dập máy. Người ở đầu bên kia đã gọi trở lại và giải thích với cô rằng ông muốn nhờ cô tìm Paul và chuyển điện thoại cho anh ta.

Tôi thường nói đùa rằng bạn phải có một chút ám ảnh mới có thể trở thành một lập trình viên giỏi được. Phát triển phần mềm thì ..

  • chủ yếu là nam giới
  • luôn gắn chặt với thứ tự, cú pháp, và giải thích chính xác
  • cho phép bạn giao tiếp với máy tính chứ không phải con người
  • đòi hỏi sự tập trung gần như ám ảnh

.. cũng giống như hội chứng tự kỷ.

Đây không phải là một ý tưởng mới; có một bài báo kinh điển trên tạp chí Wired về mối liên quan đáng lo ngại giữa lập trình và hội chứng tự kỷ:

Đó là một câu chuyện đùa vui quen thuộc trong ngành công nghiệp này, khi mà rất nhiều các lập trình viên lão làng trong các công ty lớn như Intel, Adobe, và Silicon Graphics – đến làm việc rất sớm, và về nhà rất muộn, luôn uống những chai nước ngọt Big Gulp loại lớn trong ô làm việc của họ trong khi ngồi viết code liên tục trong nhiều giờ liền – họ cũng thuộc diện nào đó trong hội chứng tự kỷ. Kathryn Stewart, giám đốc Học viện Orion, một trường trung học dành cho trẻ em bị bệnh tăng động ở California, đã gọi hội chứng tự kỷ là bệnh “rối loạn của các kỹ sư”. Bill Gates cũng thường xuyên được chẩn đoán trên báo chí là: luôn tập trung đầu óc của ông duy nhất vào các chi tiết kỹ thuật nhỏ nhất. Nhiều đồng nghiệp trong Thung lũng Silicon “có thể được chẩn đoán bị hội chứng ODD (Hội chứng rối loạn chống đối và thách thức) – họ là những kẻ lập dị”. Trong tác phẩm Microserfs, tiểu thuyết gia Douglas Coupland cũng nhận xét, “Tôi nghĩ rằng tất cả mọi người làm việc liên quan đến công nghệ đều mắc chứng tự kỷ ở dạng nhẹ.”

Mặc dù không có ai cố gắng thuyết phục những bộ óc thông minh và giỏi nhất của Thung lũng Silicon đăng ký tham gia vào các bài test về căn bệnh này, văn hóa của khu vực này đã phát triển một cách tinh tế để đáp ứng nhu cầu xã hội của những người trưởng thành bị mắc chứng tự kỷ nhẹ. Trong cộng đồng những kỹ sư và nhà nghiên cứu R&D, thái độ xã hội bị gạt sang một bên. Bạn có thể lập dị như bạn muốn, nhưng nếu code của bạn là quan trọng, thì không ai sẽ chỉ ra rằng bạn đã được mặc một chiếc áo sơ-mi liên tục trong 2 tuần liền. Những người tự kỷ gặp khó khăn trong việc làm nhiều nhiệm vụ cùng một lúc (đa nhiệm) – đặc biệt là khi một trong các kênh giao tiếp là kiểu mặt đối mặt. Thay thế sự huyên náo của các văn phòng kiểu truyền thống bằng một màn hình máy tính và một địa chỉ email, chèn vào một giao diện điều khiển được giữa một lập trình viên và sự hỗn loạn của cuộc sống hàng ngày. Việc làm phẳng sự phân cấp thứ bậc ở nơi làm việc sẽ tạo ra sự thoải mái hơn cho những ai thấy khó khăn trong việc giao tiếp xã hội. Trong một thế giới WYSIWYG (What You See Is What You Get), nơi sự tôn trọng và phần thưởng được dựa hoàn toàn vào công sức họ bỏ ra, thì đó là giấc mơ của một người mắc hội chứng tự kỷ.

Có một yếu tố di truyền đã được ghi nhận trong hội chứng rối loạn phát triển này, nhưng điều không may là nó có nhắm đến khu vực mà các kỹ sư phần mềm tập trung sinh sống:

Những điểm nóng công nghệ cao như Thung lũng Silicon, và vành đai Route 128 bao quanh Boston, là một nghịch lý gây tò mò: Chúng là nơi tập hợp của những người cô đơn. Ở những nơi này, nếu bạn là một người đam mê công nghệ (geek) và mắc hội chứng tự kỷ nhẹ, thì nhiều khả năng bạn sẽ gặp một ai đó có cùng nỗi ám ảnh dai dẳng giống như bạn (ví dụ về Linux hay Star Trek). Khi mà ngày càng nhiều phụ nữ bước chân vào lĩnh vực IT, thì những gã trước đây chưa bao giờ có một lời cầu nguyện để tìm kiếm một người bạn đời đồng cảm đột nhiên phát hiện ra rằng cô ấy đang ngôi viết code ngay trong ô làm việc bên cạnh.

Các nhà di truyền học đã suy đoán về một giả thuyết hấp dẫn có thể giải thích cho sự gia tăng của các rối loạn trong cộng đồng kỹ sư lão luyện ở Thung lũng Silicon, đó là sự gia tăng về sự phối ngẫu giữa những cá thể trong cộng đồng này. Bình thường các quý ông tóc vàng sẽ thích các cô gái tóc vàng; người trí thức thường gặp bạn đời của mình trong phòng chờ của bác sĩ chuyên khoa. Có những áp lực bổ sung và các biện pháp khuyến khích cho những người tự kỷ tìm thấy bạn tâm giao – nếu họ muốn làm như vậy – với một người nào đó cũng có hội chứng tự kỷ. Grandin viết, “Hôn nhân diễn ra tốt nhất khi hai người tự kỷ kết hôn hoặc khi một người tự kỷ kết hôn với một người bạn đời tàn tật hoặc lập dị…. Họ bị hấp dẫn nhau bởi vì trí tuệ của họ làm việc trên cùng một bước sóng giống nhau.”

Tại các trạm y tế và trường học trong Thung lũng Silicon, người ta quan sát thấy rằng hầu hết các bậc cha mẹ của những đứa trẻ mắc chứng tự kỷ là những kỹ sư và lập trình viên có biểu hiện mắc hội chứng tự kỷ dạng nhẹ. Và đó có thể không phải là tin tức gì mới mẻ đối với cộng đồng này. Tháng Giêng vừa rồi, Microsoft đã trở thành công ty lớn của Mỹ đầu tiên cung cấp quyền lợi bảo hiểm cho nhân viên của mình để trang trải chi phí đào tạo hành vi cho những đứa con mắc chứng tự kỷ của họ. Một bà mẹ ở khu vực Bay Area nói với tôi rằng khi bà đang có kế hoạch chuyển tới Minnesota với con trai mình, người có hội chứng tự kỷ, bà đã hỏi trường học ở quận xem liệu họ có thể đáp ứng được nhu cầu của con trai bà. “Họ nói với tôi rằng góc phần tư phía Tây Bắc của Rochester, nơi các nhân viên hãng IBM tụ tập sinh sống, có một số lượng lớn các trẻ em mắc chứng tự kỷ,” bà nhớ lại. “Đó cũng là lời đề xuất để tôi chuyển nhà đến khu vực này sinh sống.”

Nhưng cuối cùng một câu hỏi quan trọng là về mức độ; điều gì sẽ quyết định xem đâu là người tự kỷ và đâu là người bình thường? Hans Asperger, vị bác sĩ tâm thần người Áo lần đầu tiên xác định các điều kiện để xác định đâu là người mắc bệnh tự kỷ, đã từng viết rằng để thành công trong khoa học và nghệ thuật, một chút tự kỷ là điều cần thiết.

TopDev via Vinacode

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

Những lý do ảnh hưởng đến ReactNative performance của bạn

lý do ảnh hưởng đến ReactNative performance

Đối với các bạn mới bắt đầu làm quen React Native thì việc tối ưu performance là điều không cần thiết. Các bạn nên dành thời gian để tìm hiểu xem props/state là gì, tạo style thế nào, tạo component ra sao, blabla…

Nhưng khi đã thành thạo những kiến thức cơ bản và bắt đầu làm 1 sản phẩm hoàn chỉnh thì việc quan tâm đến performance là điều cực kỳ quan trọng, đặc biệt trong những view phức tạp hoặc có dữ liệu lớn.

Nguyên tắc chung khi lập trình giao diện là: render càng nhiều, performance càng thấp (app càng lag). Vậy nên để cải thiện performance, việc đầu tiên chúng ta phải xem xét là có xử lý nào gây ra những render không cần thiết hay không?

Tuy nhiên, có những thói quen lập trình tưởng chửng rất đơn giản nhưng lại là nguyên nhân của những render không mong muốn. Cùng thử xem các lý do ảnh hưởng đến ReactNative performance của bạn để khắc phục nhé!

Sử dụng literal object làm props

Literal object là gì?

Nó đơn giản chỉ là các JS object như {a:1, b:2} hoặc [1, 2, 3]…

Ví dụ:

<MyView style={{flex: 1}} /> // <== literal object for style props

Vậy tại sao lại có vấn đề với cách viết super basic này? Thậm chí trên trang chủ của facebook cũng có sample kiểu như vậy!!!

Tất cả đều do cách làm việc của Shallow Compare của React.

Quay lại phân tích ví dụ trên có thể thấy mỗi lần được Component cha của MyView được render, nó sẽ tạo ra 1 literal object {flex: 1} và gán vào props style của MyView => props style bị thay đổi!

oldProps.style = {flex: 1}
newProps.style = {flex: 1}
// Nhìn thì giống nhau, nhưng thực tế lại khác nhau!!!
shallowEqual(oldProps, newProps) // = false

Nếu component MyView không phải kế thừa từ React. Component và implement phương thức shouldComponentUpdate để lờ đi sự thay đổi của props này, hoặc sử dụng Function Component mà không có biện pháp xử lý phù hợp thì chắc chắn MyView sẽ bị re-render!

Cách đơn giản nhất để giải quyết vấn đề này đó là:

Không sử dụng literal object làm props

class ParentView extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: ["a", "b", props.name],
    };
  }
  render() {
    return <MyView style={styles.myView} data={this.state.data} />
  }
}

const styles = {
  myView: { flex: 1 }
}

Nếu ParentView là 1 function component thì sao? Câu trả lời là Hooks

const ParentView = (props) => {
  // useMemo sẽ tạo ra 1 object data
  // và chỉ tạo object khác khi nào props.name thay đổi
  const data = useMemo(() => ["a", "b", props.name], [props.name])
  
  return <MyView style={styles.myView} data={data} />
}

const styles = {
  myView: { flex: 1 }
}

Sử dụng arrow function làm props

Thói quen phổ biến thứ 2 gây ra những re-render vô nghĩa là sử dụng arrow function làm props.

<MyView onUpdate={(data) => OtherModule.update(data, this.props.name)} />

hoặc

<TextInput
  value={this.state.name}
  onValueChange={(name) => this.setState({name})}
/>

Khi sử dụng cách viết code này, props của component có sử dụng arrow function sẽ luôn được gán 1 function mới (do arrow function sinh ra) mỗi lần component cha của nó re-render. Có props mới truyền vào, component này sẽ bị re-render theo đúng cơ chế giống như literal object ở trường hợp đầu tiên!

Vì vậy, hãy tử bỏ ngay thói quen sử dụng arrow function làm props.

class ParentView extends React.Component {
  updateData = (data) => OtherModule.update(data, this.props.name); 

  render() {
    return <MyView onUpdate={this.updateData} />
  }
}

Nếu ParentView là function component, hãy nghĩ ngay đến Hooks.

const ParentView = (props) => {

  // useCallback sẽ tạo ra 1 function updateData
  // và chỉ tạo function khác khi nào props.name thay đổi
  const updateData = useCallback((data) => {
    OtherModule.update(data, props.name);
  }, [props.name]);

  return <MyView onUpdate={updateData} />
}

Sử dụng hàm bind() khi tạo props

Về cơ bản, hàm bind hoạt động giống với arrow function khi nó luôn tạo ra 1 function mới mỗi khi được gọi.

<MyView onUpdate={this.update.bind(this)} />

Chính vì sự tương đồng với arrow function nên cách giải quyết nó cũng giống với arrow function như đã trình bày ở phần 2.

Có thể bạn chưa biết, 1 arrow function đã tự động bind con trỏ this trong scope mà function đó được sinh ra, nên trong nhiều trường hợp, việc bind là không cần thiết.

class ParentView extends Component {
  
  update = (data) => this.updateData(data);
  
  render() {
    // không cần bind this nữa vì đã được auto bind từ arrow function rồi
    return <MyView onUpdate={this.update} /> 
  }
}

Nếu thực sự phải bind (do không muốn sửa code hiện tại để tránh sinh ra nhiều different khi commit code chẳng hạn), thì có thể bind trước ở construtor:

class ParentView extends Component {
  constructor(props) {
    ..
    this.update = this.update.bind(this)
  }

  function update(data) {
    this.updateData(data);
  }

  render() {
    // this.update ở đây là kết quả của hàm bind ở constructor,
    // không phải là "function update(data) {...}" ban đầu
    return <MyView onUpdate={this.update} /> 
  }
}

Lời kết

Hãy luôn luôn nhớ rằng, render càng nhiều, performance càng thấp. Vì vậy, khi cảm thấy ứng dụng của bạn chạy không mượt mà, hãy điều tra ngay xem có xử lý nào gây nên tình trạng re-render ngoài ý muốn hay không.

Tối ưu performance là công việc quan trọng, đòi hỏi nhiều thời gian và kinh nghiệm. Chúng tôi sẽ tiếp tục đề cập đến vấn đề này trong những bài viết tiếp theo. Nếu có ý kiến đóng góp cho bài viết, vui lòng để lại bình luận cho chúng tôi.

Thanks for reading!

Xem thêm việc làm React Native hấp dẫn nhất trên TopDev

Người viết: Nguyen Duc Binh

TopDev via blog.icts.vn

Bài viết liên quan:

  9 ứng dụng tuyệt vời được viết bằng React Native

  React Native là gì? Kiến thức tổng quan về React Native

  Tạo slider component trong React Native bằng PanResponder

Cách Engineer Nhật Bản thực hiện test như thế nào

cach-engineer-nhat-ban-thuc-hien-test-nhu-the-nao

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

Hôm qua mình đọc được bài khá hay về 1 thanh niên nhật (tên miwa) chia sẻ cách engineer Nhật Bản thực hiện test như thế nào.

Đọc xong thấy công nhận khâm phục thật. Công ty họ chạy theo cách đó được gần hơn chục năm rồi. Và gần như sản phẩm chạy rất khó ra bug.

Cùng nhau đọc xem họ làm kiểu gì nhé.

  Doanh nhân kiên nhẫn nhất Nhật Bản: Năm nào cũng viết thư hỏi mua các công ty trên khắp thế giới, có khi chờ tới 16 năm để đối tác gật đầu bán mình
  Test tải hệ thống thực sự cần thiết?

Bối cảnh

Công ty này chuyên phát triển về các phần mềm cho lĩnh vực y tế và cũng chạy được gần 30 năm rồi.

Hiện tại anh Miwa cũng đã từng tham gia vào nhiều dự án, làm với rất nhiều các kĩ sư nhưng team hiện tại mà a đang làm thì quả thực năng lực test của các engineer khá là đỉnh.

Vậy tại sao họ lại test đỉnh như vậy?

Có rất nhiều yếu tố giúp họ làm được điều đó, nhưng mà trong những thứ đó có 1 thứ làm mình thực sự ấn tượng đó là: Mỗi ngày mọi kĩ sư bỏ ra 1 tiếng để test hệ thống.

Từ trước đến giờ quả thực chưa gặp công ty nào kiên trì như công ty này. Kĩ sư thì mình nghĩ ai ai cũng ghét test cả, ai cũng muốn làm cho xong. Nhưng mà công ty này đã làm được, và làm được trên 15 năm mới kinh khủng.

Mọi engineer mỗi ngày phải dành ra 1 tiếng để test hệ thống

Hằng ngày, bất kì ai trong team cũng phải bỏ ra 1 tiếng để test.

Thời gian test thì sẽ từ 10:00 ~ 17:00 mỗi ngày. Không phải là trong khoảng thời gian đó ai thích test lúc nào thì test mà thời gian này sẽ được fix từ trước cùng với PC để test.

Ví dụ như A sẽ test từ 10:00 ~ 11:00 sử dụng PC-01. B sẽ test từ 11:00 ~ 12:00 sử dụng PC-02. Và cứ thế cho đến hết member thì thôi.

PC test ở đây được cài đặt sẵn chương trình để test rồi. Việc test này cũng giống như khách hàng đang sử dụng sản phẩm thật vậy.

Test case thì đã được chuẩn bị từ trước và cứ thế làm theo. Test từng case 1 và xác nhận xem kết quả có như mong đợi hay không và ghi lại kết quả đã test. Đương nhiên có thể free test. Cứ miễn là tìm ra bug thì thôi.

Cứ hết thời gian là kết thúc quá trình test, kể cả chưa test xong đi chăng nữa.

Kết quả thu được sau quá trình test hệ thống

  • Có thể biết được những chức năng hay sản phẩm mà bản thân mình không tham gia phát triển.
  • Biết được workflow mà khách hàng sử dụng hệ thống.
  • Có thể phát hiện được những bug tiềm tàng.
  • Biết được quá trình phát triển phần mềm như thế nào? ai là người đảm nhiệm, ai thiết kế…
  • Ngoài những test case được ghi trong bản đặc tả ra thì có thể test tự do. Do đó có thể tìm ra được những bug mà ít ai để ý đến.

Kết luận

Ai ai cũng ghét test nhưng mà nếu làm theo cách này quả thực chất lượng sản phẩm theo mình nghĩ sẽ được cải thiện rõ rệt.

Một mình tester thì có thể không cover đủ hết tất tần tật các trường hợp nhưng nếu có sự giúp đỡ của các engineer thì điều đó là hoàn toàn có thể.

Nếu dự án nào đang gặp phải vấn đề về chất lượng thì hy vọng qua bài này sẽ có chút giải pháp gì đó cho các bạn.

Xem thêm việc làm Software Developers hot nhất trên TopDev

Bài viết gốc được đăng tải tại Nghệ thuật coding

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

Sự thật về nghề lập trình

nghề lập trình

Giới thiệu

Phải nói rằng công việc của developer chúng ta là một trong những công việc bí ẩn, “nguy hiểm” nhất thế giới. Ai cũng biết một anh thợ điện thì hay leo cột điện, một anh thợ sửa ống nước thì hay vào nhà mấy chị gái để thông ống, nhưng một lập trình viên thì chính xác là làm gì? À, nghe bảo là nó lập trình. Vậy nghề lập trình là gì?

Thuở hàn vi, khi mới bắt đầu theo học ngành này, thậm chí là đến năm 2 đại học mình vẫn chưa biết nghề lập trình thật sự là làm cái gì. Dẫn đến mình có rất nhiều ngộ nhận, mình tin rằng mấy đứa xung quanh mình thời điểm đó cũng thế.

Vì thế hôm nay mình sẽ bật mí cho các bạn một vài sự thật về nghề lập trình mà mình đã rút ra được qua vài năm lăn lộn, đặc biệt là cho các bạn mới nhé.

  Những góc khuất "đeo bám" người làm nghề lập trình
  Vì miếng ăn mà phá cả nồi cơm – Thực tại đáng lo của nghề lập trình

Sự thật về nghề lập trình

Toán học và lập trình

nghề lập trình

Mình đã nghe, đọc ở đâu đó về nhận định này từ hồi cấp 3, rằng muốn lập trình giỏi bạn cần cực kì giỏi toán. Lên đại học, trước khi học lập trình mình đã được học các môn về toán như: toán cao cấp 1, 2, đại số tuyến tính, toán rời rạc… Phải chăng chúng ta cần thật sự giỏi toán để có thể code giỏi?

Câu trả lời là: nó còn tùy. Tùy thuộc vào chuyên ngành, hướng đi mà bạn chọn.

Giả sử như bạn muốn làm game 2d, game 3d, các thể loại game liên quan đến hình ảnh nhiều chiều, chuyển động, rõ ràng bạn cần nắm các kiến thức về toán học để có thể tính toán tọa độ, khung hình cho các đối tượng trong game. Hoặc là bạn muốn làm việc thiên về nghiên cứu, các lĩnh vực như trí tuệ nhân tạo, deep learning…, rõ ràng là bạn cần kiến thức chuyên sâu về toán học để có thể giải quyết các vấn đề.

Nhưng nếu bạn đi theo hướng “bình thường”, bạn muốn làm web, làm ứng dụng di động…, thì mình có thể khẳng định rằng bạn không cần giỏi toán. Không cần giỏi toán ở đây có nghĩa là bạn không cần giỏi về nhị thức newton, tích phân mở rộng, nguyên hàm gì gì đấy mình không nhớ, nói chung là các kiến thức toán chuyên sâu. Thứ duy nhất về toán bạn cần giỏi là toán logic, dùng để phân tích, mổ xẻ vấn đề khi bạn lập trình.

Tất nhiên cũng còn tùy vào loại dự án mà bạn tham gia. Vừa rồi mình có làm một trang web giúp trẻ em học toán thông qua hình ảnh, trong đó có một số chỗ áp dụng các kiến thức về đường tròn, ellipse để vẽ ra các hình ảnh, cuối cùng mình mất cả đêm vẫn chưa thể làm xong vì mình không thể nhớ tan=sin/cos.

Thế đấy, tất cả mọi thứ đều liên quan đến chữ “tùy”, tuy nhiên, nếu bạn không tập trung vào những ngóc ngách đặc biệt của ngành lập trình thì đừng quá lo lắng về kiến thức toán học nhé.

Tham khảo thêm các vị trí tuyển IT:

Lập trình = gõ phím?

nghề lập trình

Một developer dùng phần lớn thời gian để gõ code?

Nghe có vẻ hợp lý, developer không code thì làm gì nữa? Qua đôi ba năm cày ải mình nhận ra nhận định này có vẻ không đúng lắm.

Những ngày đầu tiên mình đi làm, mình thường quan sát các anh senior xung quanh xem họ làm việc như thế nào. Lạ ở chỗ là mình thấy họ không tập trung code mà cứ ngồi vẽ vẽ, viết viết gì đấy giống như là viết văn.

Tại sao lại như vậy? Tại sao senior trình code cao lại không code nhiều? Lý do là bởi lập trình không phải là gõ phím, để lập trình hiệu quả, bạn cần dành thời gian phân tích yêu cầu, suy nghĩ hướng làm, research hướng làm hiệu quả, đôi lúc là phác họa luồng chạy của code… Viết code gần như là một trong những bước cuối cùng của quá trình lập trình.

Thế nhé, chỉ mấy đứa gà mới code như một cái máy thôi.

Biết nhiều ngôn ngữ, công nghệ = code giỏi?

nghề lập trình

Đây là một trong những nhận định sai lầm nhất về lập trình, các bạn mới học rất dễ ngộ nhận điều này, đặc biệt là các anh chàng mới lớn.

Ngày xưa mấy đứa bạn mình trong trường hay bàn tán về một thằng tên S: “ôi thằng S nó biết PHP, C#”, “ôi thằng S nó biết cả Nodejs”, “ôi nó lại còn biết cả Java nữa”. Cuối cùng S được gọi là “S master“. S cũng tưởng mình master thật, ra oai ghê lắm. Thằng S này ngày càng cố gắng học nhiều ngôn ngữ lập trình mới vì nó nghĩ biết nhiều ngôn ngữ đồng nghĩa với code giỏi, đồng nghĩa với master.

Lúc đấy mình cũng nghĩ giống như thằng S kia, cũng muốn được như nó lắm. Nhưng không lâu sau thì nghe bảo S vào một công ty nọ bị hành ghê lắm, nó chẳng làm được gì với đống ngôn ngữ nó học cả. Bởi vì mấy cái trong thực tế cái nào cũng phức tạp, rối rắm, S thì chỉ biết code ứng dụng CRUD (ứng dụng thêm xóa sửa). Thế là mình thôi không bắt chước thằng S master nữa.

Sau này thằng S nó nói với mình là nó nhận ra rằng, hóa ra không phải cứ biết nhiều ngôn ngữ, công nghệ thì sẽ đồng nghĩa với code giỏi. Hóa ra kĩ năng giải quyết vấn đề, phân tích chương trình, thiết kế chương trình, clean code, kinh nghiệm… mới là những vũ khí tối thượng.

Cần nhớ mọi thứ để có thể lập trình?

nghề lập trình

Bắt đầu từ năm 2 đại học mình bắt đầu được học một loạt các kiến thức mới. Nào là các kĩ thuật lập trình như kĩ thuật vét cạn, quay lui…, các loại giải thuật khác nhau như: search, sort… Nói chung là rất nhiều thứ cần nhớ. Vậy chúng ta có cần nhớ hết mọi thứ đã được học hay không?

Câu trả lời là không. Không ai có thể nhớ hết mọi thứ được. Mình đã từng cố gắng nhớ hết gần chục cái thuật toán sort, cuối cùng sau vài tháng mình đã quên hơn một nửa.

Ngày nay chúng ta may mắn có internet, mọi thứ đều có thể được tìm kiếm dễ dàng. Vì vậy bạn có thể sử dụng internet như một bộ nhớ ngoài để lưu trữ những thông tin ít quan trọng hơn. Chúng ta chỉ nên sử dụng hàng xịn để lưu những thông tin quan trọng nhất mà thôi.

Cái gì search cũng có thì không cần học nữa hay sao? Không, có một thứ bạn không thể search đó là kĩ năng. Kĩ năng là một trong những thứ quan trọng cần dùng não để lưu. Giả sử như bạn đã code, rèn luyện rất nhiều các thuật toán search khác nhau, như vậy là bạn đã có kĩ năng với các thuật toán search. Sau này mặc dù bạn đã quên đi cách search cụ thể cho từng thuật toán nhưng kĩ năng thì vẫn còn đó, bạn có thể dễ dàng tìm kiếm google và học lại nhanh chóng.

Để có thể lập trình hiệu quả, bạn cần hiểu, nhớ mọi thứ ở mức trừu tượng nhất. Giả sử như bạn học lập trình kết nối cơ sở dữ liệu với C#, bạn không cần nhớ cụ thể cú pháp, syntax như thế nào, cái bạn cần nhớ là cơ chế hoạt động của nó, khi nào thì nên sử dụng… Có những thứ bạn chỉ cần nhớ rằng nó có tồn tại trên đời là đủ, khi gặp các bài toán cụ thể chúng ta sẽ tìm hiểu sâu hơn về nó sau.

Tóm lại, cái bạn cần nhớ là hệ thống kiến thứcliên kết giữa các mảng kiến thứckĩ năng (thông qua rèn luyện).

Kĩ năng tìm kiếm thông tin vô cùng quan trọng

nghề lập trình

Như mình nói ở trên, bạn không thể nhớ mọi thứ được. Vì vậy kĩ năng tìm kiếm thông tin là kĩ năng quan trọng mà bạn cần giỏi để có thể lập trình.

Kĩ năng tìm kiếm thông tin là gì? Là kĩ năng google, đôi khi còn là kĩ năng đi hỏi người khác sao cho không bị chửi.

Google thì cứ thế search thôi chứ cần gì kĩ năng? Không đúng, cùng 2 đứa search một vấn đề nhưng đứa có kĩ năng sẽ ra ngay, đứa không có kĩ năng có thể mất cả ngày vẫn không ra. Kĩ năng sẽ giúp bạn chọn keyword phù hợp cho từng vấn đề, đôi khi chỉ cần đúng keyword là vấn đề sẽ được giải quyết.

Ngoài ra, để có thể tìm kiếm thông tin phù hợp, nhanh chóng, bạn cần có một hệ thống kiến thức rộng lớn trong đầu, đó là những thứ mà mình đã nói chúng ta cần nhớ ở phần trên. Tưởng tượng bạn cần tìm kiếm một viên ngọc màu đen nằm sâu trong lòng đại dương. Một gã thất phu sẽ nhảy ngay ra lòng biển để tìm kiếm một cách vô vọng, người có kiến thức trong đầu sẽ biết được ngọc màu đen sẽ nằm ở Thái Bình Dương, ngọc màu đỏ sẽ nằm ở Đại Tây Dương. Vậy ai sẽ là người tìm kiếm hiệu quả hơn?

Kĩ năng tìm kiếm thông tin = Kĩ năng tìm kiếm + hệ thống kiến thức.

Trên đây mình đã chia sẻ một số sự thật về nghề lập trình mà mình thấy được. Cảm ơn các bạn đã theo dõi bài viết!

Xem thêm việc làm hot nhất trên TopDev

Người viết: Võ Cao Sơn via thedarkknighttech.com

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

OOP là gì? Giải thích dễ hiểu về lập trình hướng đối tượng

Lập trình hướng đối tượng là gì?

Lập trình hướng đối tượng (Object Oriented Programming – OOP) là một trong những kỹ thuật lập trình rất quan trọng và sử dụng nhiều hiện nay. Hầu hết các ngôn ngữ lập trình hiện nay như Java, PHP, .NET, Ruby, Python… đều hỗ trợ OOP. Vậy lập trình hướng đối tượng là gì? Và các nguyên lý cơ bản trong OOP cần biết là gì?

Lập trình hướng đối tượng (OOP) là gì?

Lập trình hướng đối tượng (OOP) là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng.

Đối tượng là những sự vật, sự việc mà nó có những tính chất, đặc tính, hành động giống nhau và ta gom góp lại thành đối tượng giống trong thực tế cuộc sống. Khi lập trình OOP, chúng ta sẽ định nghĩa các lớp (class) để gom (mô hình) các đối tượng thực tế.

Đối tượng

Một đối tượng bao gồm 2 thông tin: thuộc tính và phương thức.

  •  Thuộc tính chính là những thông tin, đặc điểm của đối tượng. Ví dụ: con người có các đặc tính như mắt, mũi, tay, chân…
  •  Phương thức là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: một người sẽ có thể thực hiện hành động nói, đi, ăn, uống, . . .

Lớp

Một lớp là một kiểu dữ liệu bao gồm các thuộc tính và các phương thức được định nghĩa từ trước. Đây là sự trừu tượng hóa của đối tượng. Khác với kiểu dữ liệu thông thường, một lớp là một đơn vị (trừu tượng) bao gồm sự kết hợp giữa các phương thức và các thuộc tính. Hiểu nôm na hơn là các đối tượng có các đặc tính tương tự nhau được gom lại thành một lớp đối tượng.

Sự khác nhau giữa đối tượng và lớp

Lớp bạn có thể hiểu nó như là khuôn mẫu, đối tượng là một thực thể thể hiện dựa trên khuôn mẫu đó. Ví dụ: Ta nói về loài chó, bạn có thể hiểu nó là class (lớp) chó có:

  • Các thông tin, đặc điểm: 4 chân, 2 mắt, có đuôi, có chiều cao, có cân nặng, màu lông…
  • Các hành động như: sủa, đi, ăn, ngủ…

Đối tượng thì chính là con chó Phú Quốc ta đang nuôi trong nhà cũng mang đặc tính của lớp chó.

Các nguyên lý cơ bản của OOP

Tính đóng gói (Encapsulation)

Note:

  • Các dữ liệu và phương thức có liên quan với nhau được đóng gói thành các lớp để tiện cho việc quản lý và sử dụng. Tức là mỗi lớp được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng lớp đó.
  •  Ngoài ra, đóng gói còn để che giấu một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không thể nhìn thấy.

Các thuộc tính và phương thức của đối tượng cần cho việc giải quyết bài toán đã được chọn ra sẽ được đóng gói vào một kiểu dữ liệu gọi là class. Nhằm che dấu thông tin khỏi các đối tượng bên ngoài, thuộc tính nào thì phương thức nấy. Tức là code bên ngoài không trực tiếp nhìn thấy và thay đổi trạng thái của đối tượng đó.

OOP-Encapsulation

Nói chung trạng thái đối tượng không hợp lệ thường do: chưa được kiểm tra tính hợp lệ, các bước thực hiện không đúng trình tự hoặc bị bỏ qua nên trong OOP có một quy tắc quan trọng cần nhớ đó là phải luôn khai báo các trạng thái bên trong của đối tượng là private và chỉ cho truy cập qua các public/protected method/property.

Ví dụ ta thấy một viên thuốc chữa cảm. Chúng ta chỉ biết nó chữa cảm sổ mũi nhức đầu và một số thành phần chính, còn cụ thể bên trong nó có những hoạt chất gì thì hoàn toàn không biết.

Tính kế thừa (Inheritance)

Nó cho phép xây dựng một lớp mới dựa trên các định nghĩa của lớp đã có. Có nghĩa là lớp cha có thể chia sẽ dữ liệu và phương thức cho các lớp con. Các lớp con khỏi phải định nghĩa lại, ngoài ra có thể mở rộng các thành phần kế thừa và bổ sung thêm các thành phần mới. Tái sử dụng mã nguồn 1 cách tối ưu, tận dụng được mã nguồn. Một số loại kế loại kế thừa thường gặp: đơn kế thừa, đa kế thừa, kế thừa đa cấp, kế thừa thứ bậc.

Khi bắt đầu xây dựng ứng dụng chúng ta sẽ bắt đầu thiết kế định nghĩa các lớp trước. Thông thường một số lớp có quan hệ với những lớp khác, chúng có những đặc tính giống nhau.

VD: 2 lớp Android, iPhone

Mỗi lớp đều đại diện cho một loại smartphone khác nhau nhưng lại có những thuộc tính giống nhau như gọi điện, nhắn tin, chụp hình. Thay vì sao chép những thuộc tính này, ta nên đặt chúng vào một lớp chung gọi là lớp cha. Chúng ta có thể định nghĩa lớp cha – trong trường hợp này là Smartphone và có những lớp con kế thừa từ nó, tạo ra một mối quan hệ cha/con.

Tính đa hình (Polymorphism)

Tính đa hình là một hành động có thể được thực hiện bằng nhiều cách khác nhau. Đây lại là một tính chất có thể nói là chứa đựng hầu hết sức mạnh của lập trình hướng đối tượng.

Hiểu một cách đơn giản hơn: Đa hình là khái niệm mà hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau.

Ví dụ như ở phần trên, mỗi một smartphone kế thừa từ lớp cha Smartphone nhưng có thể lưu trữ dữ liệu trên cloud theo những cách khác nhau. Android lưu trữ bằng Google Drive iPhone lưu trên iCloud.

Một ví dụ về đa hình trong thực tế. Ta có 2 con vật: chó, mèo. Cả 2 con vật này đều là lớp động vật. Nhưng khi ta bảo cả 2 động vật kêu thì con chó sẽ kêu gâu gâu, con mèo sẽ kêu meo meo.

Vậy trong ví dụ chó, mèo xem như là các đối tượng. 2 con vật có thể hiểu cùng kêu nhưng theo các cách khác nhau.

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

Trừu tượng có nghĩ là tổng quát hóa một cái gì đó lên, không cần chú ý chi tiết bên trong. Nó không màng đến chi tiết bên trong là gì và người ta vẫn hiểu nó mỗi khi nghe về nó.

Ví dụ: Bạn chạy xe tay ga thì có hành động là tăng ga để tăng tốc, thì chức năng tăng ga là đại diện cho trừu tượng (abstraction). Người dùng chỉ cần biết là tăng ga thì xe tăng tốc, không cần biết bên trong nó làm thế nào.

Ở đây trong lập trình OOP, tính trừu tượng nghĩa là chọn ra các thuộc tính, phương thức của đối tượng cần cho việc giải quyết bài toán đang lập trình. Vì một đối tượng có rất nhiều thuộc tính phương thức, nhưng với bài toán cụ thể không nhất thiết phải chọn tất cả.

Ví dụ: Bài toán quản lý sinh viên chúng ta chỉ cần quản lý các thông tin như

  • Họ tên
  • Ngày sinh
  • Giới tính
  • Điểm thi

mà lại không cần quản lý thêm các thông tin:

  • Màu tóc
  • Sở thích
  • Chiều cao

Tại vì chúng thực sự không cần thiết.

Các ưu điểm của lập trình hướng đối tượng

  • Dựa trên nguyên lý kế thừa, trong quá trình mô tả các lớp có thể loại bỏ những chương trình bị lặp, dư. Và có thể mở rộng khả năng sử dụng các lớp mà không cần thực hiện lại. Tối ưu và tái sử dụng code hiệu quả.
  • Đảm bảo rút ngắn thời gian xây dựng hệ thống và tăng năng suất thực hiện.
  • Sự xuất hiện của 2 khái niệm mới là lớp và đối tượng chính là đặc trưng của phương pháp lập trình hướng đối tượng. Nó đã giải quyết được các khuyết điểm của phương pháp lập trình hướng cấu trúc để lại. Ngoài ra 2 khái niệm này đã giúp biểu diễn tốt hơn thế giới thực trên máy tính.

Một số bài viết bạn có thể quan tâm:

Đừng bỏ lỡ các việc làm lập trình OOP hấp dẫn trên TopDev

JavaScript Closures là gì?

JavaScript Closures là gì

Bài viết này mình sẽ giới thiệu với bạn về JavaScript closures là gì. Việc hiểu closures sẽ giúp bạn viết code tốt hơn (ngắn gọn, súc tích hơn và thậm chí dễ hiểu hơn,…).

Tuy nhiên, trước khi đi vào những ưu, nhược điểm của việc sử dụng closures, chúng ta sẽ xem JavaScript closures là gì và cách sử dụng nó như thế nào nhé!

Cùng bắt đầu nào!

  Socket là gì? WebSocket là gì? Hiểu hơn về Websocket

JavaScript closures là gì?

JavaScript Closures là tập hợp bao gồm một hàm và môi trường nơi hàm số đó được khai báo. Ở đây, môi trường bao gồm tất cả những biến cục bộ trong phạm vi hàm số được khai báo. (Để đơn giản, từ nay mình sẽ sử dụng hàm closures khi nói về JavaScript closures).

Hàm closures có thể truy cập biến số ở 3 phạm vi khác nhau là:

  • Biến toàn cục (global)
  • Biến được khai báo ở hàm số chứa hàm closures (outer function)
  • Biến ở trên trong hàm closures

Ví dụ:

function adder(n){
 var intro = 'This answer is ';
 var local = n;
 return function(number){
   var result = number + local;
   console.log(intro + result);
 }
}
var adder2 = adder(2);
adder2(10);
// => This answer is 12

Trong ví dụ trên, hàm closures là một hàm số không tên function (number). Hàm closures này sử dụng biến cục bộ của outer function là intro và local.

Khi mình gọi hàm adder(2), hàm số này thực hiện và kết quả trả về được gán vào biến adder2. Khi gọi adder2(10), kết quả trả về là 12, chứng tỏ hàm closures vẫn có thể truy cập tới biến cục bộ của outer function khi hàm đó thực hiện xong.

Hàm closures lưu trữ biến số của outer function theo kiểu tham chiếu

Xét ví dụ dưới đây:

function ObjId(){
    var id = 1;
    return {
        getId: function(){
           return id;
        },
        setId: function(_id){
           id = _id;
        }
    }
}

var myObject = ObjId();
console.log(myObject.getId());  // => 1
myObject.setId(10);
console.log(myObject.getId());  // => 10

Hàm objId trả về một đối tượng bao gồm 2 hàm closures là getId và setId. Các hàm closures này sử dụng chung một biến cục bộ là id.

Ban đầu, mình gọi myObject.getId() thì kết quả trả về là 1 (giá trị của biến cục bộ). Sau đó, mình gọi myObject.setId(10). Nếu hàm closures chỉ lưu biến cục bộ theo giá trị thì nghĩa là giá trị của biến cục bộ id sẽ không thay đổi.

Nhưng khi mình gọi tiếp myObject.getId() thì giá trị trả về là 10. Chứng tỏ, hàm closures phải lưu biến cục bộ theo kiểu tham chiếu.

Bây giờ đọc lại ví dụ trên một lần nữa, bạn có thấy nó giống với cách sử dụng class (lớp) trong C++ hay Java không? Mình thì thấy có giống. Thực ra đây là một trong những cách tạo đối tượng (object) trong JavaScript.

So sánh hiệu năng giữa việc sử dụng closures và prototype

Ví dụ trên minh hoạ cách sử dụng closures. Bây giờ mình sẽ viết lại nó theo cách sử dụng prototype:

function ObjId(){
    this.id = 1;
}

ObjId.prototype.getId = function(){
    return this.id;
};

ObjId.prototype.setId = function(_id){
    this.id = _id;
};

var myObject = new ObjId();
console.log(myObject.getId());  // => 1
myObject.setId(10);
console.log(myObject.getId());  // => 10

Kết quả trả về vẫn giống y hệt như trên. Tuy nhiên, cách nào sẽ chạy nhanh hơn? Closures hay Prototype?

Dựa theo kết quả so sánh tại bài viết Performance of prototype vs closure code in JavaScript, mình tóm tắt lại như sau:

  • Định nghĩa đối tượng: JavaScript closures nhanh hơn.
  • Khả năng tiết kiệm bộ nhớ và khởi tạo đối tượng mới: Prototype nhanh hơn.
  • Truy cập hàm (getter, setter): Prototype nhanh hơn.

Một cách khách quan, việc sử dụng prototype sẽ nhanh hơn và tiết kiệm bộ nhớ hơn việc sử dụng closures. Tuy nhiên, mình vẫn không phủ nhận vai trò của closures trong việc giúp bạn viết code ngắn gọn và rõ ràng hơn. Và dù sao, việc sử dụng closures là không bắt buộc. Tất cả tuỳ thuộc vào bạn. Xem thêm JavaScript prototype là gì?

Kết luận

Bài viết trên là khá ngắn gọn. Hy vọng nó phần nào giúp bạn hiểu được JavaScript closures là gì và cách sử dụng closures.

Tham khảo:

  • Closures
  • Understand JavaScript Closures With Ease

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

Xem thêm việc làm JavaScript Developer hot nhất tại TopDev

TopDev via CompleteJavaScript.com

Kinh nghiệm vận hành MySQL – Chú ý khi chọn MySQL làm database

kinh nghiệm vận hành MySQL

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

Đến với lập trình web thì chắc hẳn ai cũng đã từng làm việc với database. Đặc biệt là hệ quản trị cơ sở dữ liệu như MySQL, PostgreSQL…

Với trường hợp nào thì nên dùng MySQL và trường hợp nào không nên? Khi vận hành MySQL cần chú ý những thứ gì? …

Hôm nay mình chia sẻ với mọi người kinh nghiệm vận hành MySQL mà mình đã học được qua nhiều năm.

Scaling khá vất vả

Mặc dù khi release xong chạy rất nhanh nhưng …

Để dễ hiểu thì mình lấy ra 1 ví dụ đã dùng MySQL vào trong hệ thống chat với dữ liệu message cực lớn. (Ví dụ như Facebook Messenger chẳng hạn).

Khi đó bảng để lưu message mình đoán sẽ kiểu như này:

messages (id, room_id, sender_id, message_body, created_at)

Đương nhiên không chỉ có mỗi bảng này mà còn rất nhiều bảng khác nữa. Ví dụ như bảng users để lưu thông tin người dùng. Bảng attachments để quản lý thông tin file được đính kèm khi gửi. Bảng tags để lưu thông tin tag của người dùng…

Ngoài ra không chỉ có tính năng chat, đôi khi cũng cần có cả tính năng phân tích hành vi của người dùng nữa. Nên lúc đó có thể chúng ta sẽ lưu access_log của người dùng vào MySQL. (Hoặc có thể lưu ở 1 số bộ phận storage bên ngoài như S3 chẳng hạn)

1 dãy các luồng xử lí như thế thì quả thực khi release xong, với số lượng người dùng ít thì tốc độ query sẽ rất nhanh. Và ít ai để ý đến vấn đề scaling sau này.

Vậy vấn đề ở đây là gì?

Dữ liệu to dần và không thể cache hết lên memory, dẫn đến phải read từ disk và làm tốc độ giảm xuống

Giai đoạn đầu khi release, lượng dữ liệu sử dụng trên MySQL còn nhỏ, memory cấp phát cho cache có nhỏ đi chăng nữa thì cũng có thể đẩy dữ liệu lên đó được.

Thế nhưng sau 1 thời gian vận hành, lượng dữ liệu tăng khủng khiếp, số lượng access của người dùng cũng tăng lên. Dẫn đến tỉ lệ cache hit trên MySQL sẽ giảm xuống (vì không dủ memory để cache). Kết quả là phải đọc dữ liệu từ disk thay vì từ cache. Và làm cho tốc độ giảm xuống. (Đọc data trên memory nhanh gấp 200 lần HDD, và gấp 10 lần SSD).

Để giải quyết vấn đề này trong thời gian ngắn thì có 2 cách:

  • Tăng memory lên để có thể cache được nhiều dữ liệu trên memory hơn. Cách này được gọi là scale up.
  • Áp dụng cơ chế master slave vào hệ thống. Master sẽ đảm nhiệm việc ghi. Slave sẽ đảm nhiệm việc đọc. Mỗi khi dữ liệu trên master bị thay đổi thì sẽ replication sang các con slave để đồng bộ dữ liệu. Cách này còn được gọi là scale out.

Cho dù thực hiện cách nào đi chăng nữa thì cost vận hành trên MySQL sẽ càng ngày càng tăng lên.
Đến 1 lúc nào đó cost này sẽ tăng đến 1 mức độ mà có khi tiền doanh thu hàng tháng không trả nổi tiền nuôi server.

Với tình trạng như này thì các bạn sẽ suy nghĩ gì?

  • Tốc độ đọc ghi sẽ chậm hơn, làm cho trải nghiệm người dùng bị giảm xuống.
  • Muốn tung ra nhiều campaign để thu hút người dùng. Thế nhưng MySQL bị bottleneck và không thể thực hiện campaign được.
  • Thay đổi sang 1 loại database mới. Thế nhưng do tính chất của nó khác nhau dẫn đến bắt buộc phải sửa logic phía application. Hơn thế nữa việc migration big data từ server này sang server khác có thể mất rất nhiều ngày. (1 ngày application maintain có thể làm doanh thu giảm xuống khá nhiều).

Xem thêm việc làm mysql, việc làm database hấp dẫn trên TopDev

Tính bảo trì, failover khá lớn

Khi MySQL đang được chạy dưới cơ chế master-slave (dữ liệu luôn luôn được đồng bộ từ master sang slave). Chẳng may vì 1 lí do nào đó mà con master bị down. Khi đó MySQL sẽ thực hiện failover (chuyển con master bị down sang 1 con master dự phòng khác). Quá trình này sẽ mất vài phút (với trường hợp RDS của aws).

Với business yêu cầu khắt khe về mặt downtime (ví dụ như game chẳng hạn) thì có lẽ với case mất vài phút để thực hiện failover thì chắc khó có thể chấp nhận được.

Vậy thì ta nên giải quyết vấn đề đó như thế nào?

Chọn database thích hợp hơn?

Để giải quyết được vấn đề này thì có lẽ ta nên chọn loại database khác không phải MySQL. Ví dụ như NoSQL chẳng hạn.

Nhưng khi dữ liệu của hệ thống đã to rồi thì việc chọn 1 database khác không phải là sự lựa chọn đúng đắn lắm vì có thể sẽ phải sửa code khá nhiều, thời gian migration từ database này sang database khác sẽ mất khá nhiều thời gian (có thể mấy ngày đến 1 tuần).

Do đó ngay trong giai đoạn thiết kế thì việc suy nghĩ chọn database nào phù hợp là 1 điều vô cùng quan trọng, đặc biệt cần suy nghĩ xem tương lai dữ liệu sẽ lớn đến mức độ nào.

Với NoSQL thì có vô số loại, ví dụ như Cassandra, DynamoDB.

Cả 2 loại này tính scalable của nó cực lớn, các ông lớn như Facebook, Discord, Instagram hiện tại cũng đang dùng nó.

Mình xin kể 1 số tính năng chính của 2 loại này:

Cassandra:

  • Được phát triển bởi Facebook, sau đó tặng cho bên Apache.
  • Cassandra là hệ cơ sở dữ liệu phân tán, kết hợp những gì tinh tuý nhất của Google Bigtable và Amazon DynamoDB. Ngôn ngữ phát triển Cassandra là Java.
  • Dữ liệu được dàn trải sang nhiều node, nên 1 node có chết đi chăng nữa thì vẫn có thể query lấy được dữ liệu trên node khác. Do đó tính chịu lỗi của nó cực lớn.
  • Throughput của nó tăng theo số lượng node. Nếu muốn nó xử lí được nhiều request hơn thì chỉ cần tăng số node lên.
  • Tốc độ write luôn luôn nhanh hơn read. Bởi vì write chỉ cần append vào đít file. Trong khi read cần phải check tính CAP (có thể hiểu đây là tính toàn vẹn dữ liệu) giữa các node nữa nên thời gian sẽ lâu hơn. Mặc dù nói là lâu nhưng mà thời gian của read hay write cũng chỉ tính bằng ms.

DynamoDB:

  • DynamoDB là hệ cơ sở dữ liệu phân tán, được phát triển bởi Amazon.
  • Có thể setting thông số throughput của read và write riêng. Và Amazon sẽ tự động scale để đáp ứng được số throughput đó.
  • Ví dụ như tại thời điểm peak time thì chúng ta setting cho số throughput của read cao hơn chút, ở thời điểm ít access thì setting throughput thấp xuống. Để tiết kiệm cost.

==> Tóm lại việc chọn database nào đi chăng nữa thì điều quan trọng nhất là nó không làm mất đi tính trải nghiệm của người dùng.

Quay lại bài toán về hệ thống chat như ở bên trên. Nếu số lượng người dùng tăng lên mà để trải nghiệm người dùng không bị mất đi thì chúng ta cần thiết kế hệ thống có tính scalable. Đặc biệt với database thì không nên chọn MySQL, mà nên chọn loại database khác tốt hơn.

Kết luận

Các bạn thấy thế nào? Đã hình dùng được sự khác nhau giữa MySQL và NoSQL chưa?

Dựa vào từng bài toán mà chúng ta nên nghiên cứu và đưa ra quyết định đúng đắn. Để về sau maintain sẽ đơn giản hơn.

Nói thì dễ nhưng quả thực chưa 1 hệ thống to nào trên thế giới mà thiết kế 1 phát chạy được cả đời cả. Hầu như hệ thống nào cũng có cải tiến về mặt hệ thống cả. Ví dụ như Chatwork lúc đầu code bằng PHP sau đó đã chuyển sang Scala để hiệu năng tốt hơn…

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

TopDev via Nghệ Thuật Coding

  Nuxt.js là gì? Một vài lưu ý khi sử dụng Nuxt.js

Javascript Prototype là gì?

javascript-prototype-la-gi

Mở đầu

Prototype là khái niệm cốt lõi cơ bản trong JavaScript khá quan trọng để thực thi OOP trong JavaScript. Vì JavaScript là một prototype-based language, không có khái niệm class như các ngôn ngữ hướng đối tượng khác hướng đối tượng khác. Trong bài viết này, ta sẽ tìm hiểu cách làm việc của prototype có thể hiểu nôm na là kế thừa (inheritance) ở javascript.

Prototype là gì?

Prototype là cơ chế mà các object trong javascript kế thừa các tính năng từ một object khác. Tất cả các object trong javascript đều có một prototype, và các object này kế thừa các thuộc tính (properties) cũng như phương thức (methods) từ prototype của mình.

Bạn cần chú ý rằng bản thân prototype là một object trong JS, được gọi là prototype object (đối tượng prototype). Chúng ta cần biết điều này để tránh nhầm lẫn với thuộc tính prototype của function.

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Vài điều cần lưu ý:

  1. Trong Javascript, một hàm (function) cũng được coi là 1 object. Và hàm có một thuộc tính gọi là thuộc tính prototype, bản thân thuộc tính prototype này mang giá trị là 1 object.
  2. Nếu ta dùng hàm để tạo ra 1 mẫu khởi tạo đối tượng, thì bạn có thể thêm được các thuộc tính hoặc phương thức vào thuộc tính prototype của hàm khởi tạo để thực hiện kế thừa. Tất cả các đối tượng con tạo ra bởi hàm khởi tạo đều mang các giá trị trong thuộc tính prototype của hàm này.
  3. Các object trong Javascript có một khái niệm gọi là prototype attribute, đặc tính này có giá trị trỏ tới prototype object mà nó kế thừa thuộc tính. Ta dùng thuộc tính __proto__ để truy cập tới prototype object.

Tạo ra Prototype như thế nào?

Ta khai báo một hàm khởi tạo:

//Tạo ra 1 mẫu khởi tạo, cũng là tạo ra 1 prototype object
function Person(_age, _name){
   this.age = _age;
   this.name = _name;
}
 
//Có thể thêm thuộc tính vào thuộc tính prototype của hàm khởi tạo
Person.prototype.height = 0;
 
//Tạo ra 1 instance của Person
//Có cả 3 thuộc tính của mẫu khởi tạo Person
var jack_person = new Person(10, "Jack");
for (var att in jack_person){
   console.log(att);
}
 
//Xem đối tượng prototype của instance vừa tạo
jack_person.__proto__;

prototype là gì

Đoạn ví dụ trên vừa tạo ra một function khởi tạo là hàm Person(_age, _name). Thuộc tính prototype của hàm này lại chứa thuộc tính height. Cho nên một object được tạo ra từ function khởi tạo này ta sẽ có 3 thuộc tính: age, name, và height.

Ta có thể truy cập prototype object của đối tượng vừa tạo (instance vừa tạo) để xem object này là một object chứa 1 hàm khởi tạo và 1 thuộc tính height.

Tại sao prototype lại quan trọng trong Javascript?

Sự kế thừa trong Javascript

Để thực hiện kế thừa trong Js, bạn chỉ cần tạo 1 hàm khởi tạo. Sau đó thêm các thuộc tính và phương thức vào thuộc tính prototype của hàm khởi tạo này.

Các instance tạo ra bởi hàm khởi tạo này sẽ chứa các thuộc tính và phương thức được định nghĩa ở trên. Do Javascript không có khái niệm class nên để thực hiện việc kế thừa để mở rộng ứng dụng như các ngôn ngữ OOP khác, chúng ta cần Prototype.

//Tạo ra 1 hàm khởi tạo cơ sở
function Animal(_age){
   this.age = _age;
}
 
//Có thể thêm thuộc tính vào thuộc tính prototype của hàm khởi tạo
Animal.prototype.showAge = function(){
   console.log( this.age );
};
 
//Tạo ra 1 hàm khởi tạo con (sẽ dùng để kế thừa hàm cơ sở)
function Dog(_color){
   this.color = _color;
}
//Thực hiện kế thừa, gán hàm khởi tạo của Animal cho prototype của Dog
Dog.prototype = new Animal();
Dog.prototype.showColor = function(){
   console.log( this.color );
};
 
//Kiểm tra sự kế thừa
var chophuquoc = new Dog('yellow');
chophuquoc.age = 3;
chophuquoc.showAge();       //3
chophuquoc.showColor();     //yellow

Đoạn code trên thì object chophuquoc sử dụng hàm showAge() thuộc Animal prototype vì ta đã gán hàm khởi tạo của Animal vào prototype của Dog. Như vậy bạn có thể thấy rõ sự kế thừa trong js. Object chophuquoc đã kế thừa những gì đã có trong Dog.prototype và kế thừa luôn những thuộc tính mà Animal.prototype có.

Truy cập vào các thuộc tính của đối tượng: Prototype chain

  24 code ES6 tân tiến để khắc phục các lỗi thực hành JavaScript

Prototype rất quan trọng trong việc giúp ta truy cập tới các thuộc tính và phương thức của đối tượng. Khi chúng ta truy cập vào một Property của một Object, JavaScript sẽ tìm Property đó bên trong chính Object. Nếu không có nó sẽ tiếp tục tìm lên trên Prototype của Object và cứ tiếp tục như thế cho đến khi gặp Object.prototype thì dừng và cho ra kết quả (undefined nếu không tìm thấy).

Quá trình lặp lại này được gọi là chuỗi prototype (prototype chain) trong Javascript. Chính điều này cộng thuộc tính prototype của function tạo nên cơ chế kế thừa prototype-based cho Javascript.

Có thể bạn muốn xem thêm:

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

Socket là gì? WebSocket là gì? Hiểu hơn về Websocket

socket là gì?

socket là gì? – Socket là một điểm cuối (end-point) của liên kết giao tiếp hai chiều (two-way communication) giữa hai chương trình chạy trên mạng. Nghĩa là một socket được sử dụng để cho phép 1 process nói chuyện với 1 process khác.

Các lớp Socket được sử dụng để tiến hành kết nối giữa client và server. Nó được ràng buộc với một cổng port (thể hiện là một con số cụ thể) để các tầng TCP (TCP Layer) có thể định danh ứng dụng mà dữ liệu sẽ được gửi tới.

Socket sử dụng như thế nào?

Sau khái niệm socket là gì? Thì mình sẽ giới thiệu đến chức năng của socket, nó được áp dụng trong quá trình làm việc, nếu có thể chạy nhiều socket cùng một lúc nên công việc của bạn sẽ nhanh hơn, nâng cao hiệu suất làm việc.

Socket được hỗ trợ trong hầu hết các hệ điều hành như Windows, Linux. Và được sử dụng trong nhiều ngôn ngữ lập trình khác nhau.

Socket hoạt động như thế nào?

Socket giúp lập trình viên kết nối các ứng dụng để truyền và nhận dữ liệu trong môi trường có kết nối Internet bằng cách sử dụng phương thức TCPIP và UDP.

Khi cần trao đổi dữ liệu cho nhau thì 2 ứng dụng cần phải biết thông tin IP và port bao nhiêu của ứng dụng kia.

Có rất nhiều dạng socket khác nhau phụ thuộc vào sự khác biệt giữa cách truyền dữ liệu (protocol). Dạng phổ biến nhất là TCP và UDP.

Phân loại Socket

Stream Socket là gì?

Dựa trên giao thức TCP( Tranmission Control Protocol), stream socket thiết lập giao tiếp 2 chiều theo mô hình client và server. Được gọi là socket hướng kết nối.

socket là gì?

Giao thức này đảm bảo dữ liệu được truyền đến nơi nhận một cách đáng tin cậy, đúng tuần tự nhờ vào cơ chế quản lý luồng lưu thông trên mạng và cơ chế chống tắc nghẽn.

Chúng cung cấp luồng dữ liệu không trùng lặp và có cơ chế được thiết lập tốt để tạo và hủy kết nối và phát hiện lỗi. Nếu việc gửi các gói dữ liệu là không thể, người gửi sẽ nhận được một chỉ báo lỗi.

Đặc điểm tóm gọn:

  • Có một đường kết nối (địa chỉ IP) giữa 2 tiến trình.
  • Một trong hai tiến trình kia phải đợi tiến trình này yêu cầu kết nối.
  • Mô hình client /sever thì sever lắng nghe và chấp nhận từ client.
  • Mỗi thông điệp gửi phải có xác nhận trả về.
  • Các gói tin chuyển đi tuần tự.

 Datagram Socket

Dựa trên giao thức UDP( User Datagram Protocol) việc truyền dữ liệu không yêu cầu có sự thiết lập kết nối giữa 2 process. Tức là nó cung cấp connection-less point cho việc gửi và nhận packets. Gọi là socket không hướng kết nối

socket là gì?

Do không yêu cầu thiết lập kết nối, không phải có những cơ chế phức tạp. Nên tốc độ giao thức khá nhanh, thuận tiện cho các ứng dụng truyền dữ liệu nhanh như chat, game online…

Đặc điểm tóm gọn:

  • Hai tiến trình liên lạc với nhau không kết nối trực tiếp
  • Thông điệp gửi đi phải kèm theo thông điệp người nhận
  • Thông điệp có thể gửi nhiều lần
  • Người gửi không chắc chắn thông điệp đến tay người nhận.
  • Thông điệp gửi sau có thể đến trước và ngược lại.
  • Để có thể thực hiện các cuộc giao tiếp, một trong 2 quá trình phải công bố port của socket mà mình đang sử dụng.

Web socket là gì?

Websocket là giao thức hỗ trợ giao tiếp hai chiều giữa client và server để tạo một kết nối trao đổi dữ liệu. Giao thức này không sử dụng HTTP mà thực hiện nó qua TCP. Mặc dù được thiết kế để chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa chúng vào bất kì loại ứng dụng nào.

Ưu điểm

WebSocket cung cấp giao thức giao tiếp hai chiều mạnh mẽ. No có độ trễ thấp và dễ xử lý lỗi. Websocket thường được sử dụng cho những trường hợp yêu cầu real time như chat, hiển thị biểu đồ hay thông tin chứng khoán.

Các gói tin (packets) của Websocket nhẹ hơn HTTP rất nhiều. Nó giúp giảm độ trễ của network nhiều lần.

Cấu trúc WebSocket

socket là gì?

Giao thức chuẩn thông thường của WebSocket là ws:// , giao thức secure là wss:// . Chuẩn giao tiếp là String và hỗ trợ buffered arrays và blobs.

Các thuộc tính của WebSocket

THUỘC TÍNH MÔ TẢ
readyState Diễn tả trạng thái kết nối. Nó có các giá trị sau:

  • Giá trị 0: kết nối vẫn chưa được thiết lập (WebSocket.CONNECTING)
  • Giá trị 1: kết nối đã thiết lập và có thể giao tiếp (WebSocket.OPEN)
  • Giá trị 2: kết nối đang qua handshake đóng (WebSocket.CLOSING)
  • Giá trị 3: kết nối đã được đóng (WebSocket.CLOSED)
bufferedAmount Biểu diễn số byte của UTF-8 mà đã được xếp hàng bởi sử dụng phương thức send()

 

Ví dụ:

switch (socket.readyState) {
  case WebSocket.CONNECTING:
    // do something
    break;
  case WebSocket.OPEN:
    // do something
    break;
  case WebSocket.CLOSING:
    // do something
    break;
  case WebSocket.CLOSED:
    // do something
    break;
  default:
    // this never happens
    break;
}

Các sự kiện WebSocket

SỰ KIỆN EVENT HANDLER MÔ TẢ
open onopen Khi một WebSocket chuyển sang trạng thái mở, “onopen” sẽ được gọi.
message onmessage Khi WebSocket nhận dữ liệu từ Server.
error onerror Có bất kỳ lỗi nào trong giao tiếp.
close onclose Kết nối được đóng. Những sự kiện được truyền cho “onclose” có ba tham số là “code”, “reason”, và “wasClean”.

Event handlers có thể được tạo ra bằng cách sử dụng phương thức addEventListener(). Ví dụ:

onopen

socket.onopen = function(event) {
  // handle open event
};

Sử dụng addEventListener()

socket.addEventListener("open", function(event) {
  // handle open event
});

onmessage

socket.onmessage = function(event) {
  var data = event.data;
  // process data as string, blob, or ArrayBuffer
};

Sử dụng addEventListener()

socket.addEventListener("message", function(event) {
  var data = event.data;
  // process data as string, blob, or ArrayBuffer
});

onerror

socket.onerror = function(event) {
  // handle error event
};

Sử dụng addEventListener()

socket.addEventListener("error", function(event) {
  // handle error event
});

onclose

socket.onclose = function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  // handle close event
};

Thực hiện handler onClose sự kiện sử dụng addEventListener()

socket.addEventListener("close", function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  // handle close event
});

 

Các phương thức của WebSocket

PHƯƠNG THỨC MÔ TẢ
send() send(data) gửi dữ liệu tới server. Message data là string, ArrayBuffer, blob.
close() Đóng kết nối đang tồn tại.

 

Ví dụ:

var data = new ArrayBuffer(1000000);

// perform some operations on the ArrayBuffer
socket.send(data);

if (socket.bufferedAmount === 0) {
  // data sent
}
else {
  // data did not send
}

Có thể bạn muốn xem thêm:

Xem thêm việc làm IT tại TopDev!

Bootstrap là gì? Tặng 20 Templates Bootstrap miễn phí

Bootstrap là gì

Bootstrap là gì?

Bootstrap là gì? – Nó là một framework HTML, CSS, và JavaScript cho phép lập trình viên dễ dàng xây dựng website theo tiêu chuẩn nhất định. Tạo các website thân thiện với nhiều thiết bị khác nhau.

Bạn đang muốn tạo cho mình một website hỗ trợ tất cả các màn hình bao gồm desktop, mobile…một cách nhanh chóng. Đó là lúc bạn nên sử dụng Bootstrap để giảm thiểu thời gian và công sức nhất.

Bootstrap bao gồm những cái cơ bản như: row, column, typography, forms, buttons, tables, navigation, modals, image carousels… Trong bootstrap có thêm nhiều component, Javascript hỗ trợ cho việc xây dựng reponsive cho web dễ dàng, thuận tiện và nhanh chóng hơn.

Bootstrap là gì

Tại sao bạn lại chọn sử dụng Bootstrap?

Sau khái niệm Bootstrap là gì thì bạn sẽ đến vói lí do chúng ta nên dùng Bootstrap, bạn biết chính xác những gì bạn sẽ nhận được.

Đây là một framework mobile-first (được thiết kế ưu tiên từ mobile rồi mới đến các thiết bị khác) tương đối dễ tùy chỉnh.

  10 Frameworks tốt nhất hiện nay cho PHP
  Cách Google tạo ra frameworks cho Web

Bao gồm nhiều design pattern có sẵn, đi kèm với một thư viện components và widgets “khổng lồ”. Và có lẽ quan trọng hơn cả là, với Bootstrap của bạn sẽ dễ dàng thống nhất giao diện trên tất cả các độ phân giải và giao diện màn hình.

Vì thế việc xây dựng dashboard, hay một admin panel cho web app của mình bằng framework này cực kỳ hiệu quả.

Tính năng vượt trội của Bootstrap

Với cấu trúc khá đơn giản và gọn gàng khiến các chức năng của Bootstrap linh hoạt và nhanh chóng hơn. Như đã trình bày ở trên, trong Bootstrap có thể chứa đc các tệp nén của JvScript, CSS và các font.

Bên cạnh đó, Bootstrap có ưu điểm là không kén chọn, nó có thể tích hợp với phần lớn các mã nguồn một cách dễ dàng như Joomla, WP, Magento với nhiều chức năng vượt trội khác nhờ được thiết kế giống các dạng module.

Để tạo thành một website toàn chỉnh từ font đến form, table, grib, typography…thông thường khá phức tạp, nhưng với Bootstrap bạn chỉ cần vào thư viện và lựa chọn tùy ý các giao diện mà bạn thích. Bootstrap cho phép bạn có thể dễ dàng lựa chọn giao diện cũng như framework của web.

Ngoài ra, nếu bạn tích hợp Bootstrap với jQuery, bạn thậm chí có thể sử dụng lại các thành phần trên trang web, để làm được điều đó bạn chỉ cần khai báo các tính nặng trong thời gian bạn tạo web. Để tăng tốc độ tải trang, bạn có thể sử dụng Glyphicons.

Hướng dẫn cài đặt Bootstrap

Để có thể sử dụng Bootstrap, bạn cần tải nó về máy. Đầu tiên, bạn có thể tải Bootstrap từ trang chủ của Bootstrap https://getbootstrap.com/.

Sau đó bạn sẽ nhận được 2 tệp là thư mục JS và CSS, bạn chỉ cần giải nén chúng và cài đặt nó vào web bạn thông qua giao thức FTP. Sau những bước trên là bạn đã có thể sử dụng được Bootstrap một cách đơn giản và dễ dàng.

Nhúng Bootstrap vào Web:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Bootstrap example</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
</head>
<body>
    <h1>Learning Bootstrap</h1>
    <script src="http://code.jquery.com/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</body>
</html>

Hướng dẫn nhúng Bootstrap từ CDN

Thay vì phải tải và lưu trữ file từ trang chủ Bootstrap, để tiết kiệm băng thông các lập trình viên thường sử dụng Bootstrap thông qua Content Delivery Network – mạng phân phối nội dung (CDN) một cách nhanh chóng và tiện lợi. Với cách này bạn cũng có thể tích hợp JS, CSS, jQuerry như khi tải thông thường.

Nhúng Bootstrap vào Web:

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

Hướng dẫn sử dụng Bootstrap là gì?

Bootstrap 4 mobile-first

Để đáp ứng nhu cầu sử dụng của thiết bị di động, Bootstrap 4 đã được cho ra mắt. Tính năng Mobile-first Index là điểm mạnh đặc biệt nhất của Bootstrap 4. Nó giúp hỗ trợ hiển thị đúng và thu phóng khung trang web linh hoạt bằng khung browser, để làm được điều đó bạn cần thêm thẻ <meta> sau vào bên trong phần tử <head>:

<meta name="viewport" content="width=device-width, initial-scale=1">

Định nghĩa Device-width dùng cho thiết lập chiều rộng của trang theo chiều rộng màn hình của thiết bị hay browser.

Định nghĩa Initial-scale có thể hiểu là 1 phần đặt mức thu phóng ban đầu khi trang được trình duyệt tải ban đầu.

Bootstrap 4 containers

Khi tạo Web, các lập trình viên nên bọc tất cả nội dung trong web bằng thẻ container (class container hoặc container-fluid). Có thể hiểu là:

  • Container-fluid class sẽ cung cấp một container có chiều rộng đầy đủ, trải rộng toàn bộ chiều rộng của khung nhìn (full width container)
  • Còn Container class thì cung cấp một container với chiều rộng tương thích (responsive fixed width container)

Bootstrap 4 Grid System

Nó rất quan trọng và đóng vai trò chủ đạo cho khả năng tương thích giao diện (web responsive) của Bootstrap.

Khi các lập trình viên khởi động Bootstrap, giao diện của Bootstrap 4 Grid System sẽ hiển thị dưới dạng grid – lưới.

Bootstrap sẽ được chia thành 12 cột đặt trong một class row. Khi đó, bắt buộc mỗi cột sẽ bao gồm các Padding tương ứng với từng độ phân giải của mỗi thiết bị (điện thoại, tablet, máy tính).

tuyển it

Cấu trúc Bootstrap 4 Grid System:

<!-- Control the column width, and how they should appear on different devices -->
<div class="row">
  <div class="col-*-*"></div>
  <div class="col-*-*"></div>
</div>
<div class="row">
  <div class="col-*-*"></div>
  <div class="col-*-*"></div>
  <div class="col-*-*"></div>
</div>

<!-- Or let Bootstrap automatically handle the layout -->
<div class="row">
  <div class="col"></div>
  <div class="col"></div>
  <div class="col"></div>
</div>
  1. Tạo dòng: <div class=”row”>
  2. Thêm số lượng cột theo nhu cầu (tags phù hợp cho lớp .col-*-* ). Với (*) đầu tiên bạn xem lại các lớp của Grid System để đảm bảo sự chính xác (sm, md, lg hay xl). Dấu (*) thứ 2 đại diện cho số khung bạn muốn chia từ 1 – 12.
  3. Thay vì thêm số cho từng col, bootstrap có thể giúp bạn chia nhanh chóng hơn. Ví dụ muốn chia 2 “col” bạn có thể thêm thuộc tính width = 50%. Tương tự với 3 “col” bạn sẽ có width = 33.33%. Để làm điều này bạn cần có hiểu biết về CSS.
  4. Dùng .col-sm|md|lg|xl để dễ tương thích hơn.

5 lớp tiêu biểu trong Bootstrap 4 Grid System

  1. .col- (extra small devices – chiều rộng màn hình < 576px)
  2. .col-sm- (small devices – chiều rộng màn hình >= 576px)
  3. .col-md- (medium devices – chiều rộng màn hình >= 768px)
  4. .col-lg- (large devices – chiều rộng màn hình >= 992px)
  5. .col-xl- (xlarge devices – chiều rộng màn hình >= 1200px

20 mẫu Templates Bootstrap cho Admin Dashboard

Trong quá khứ, admin dashboard của một trang web chỉ chứa các tính năng là chính. Còn về phần giao diện không được cân nhắc nhiều vì vậy trông nó khô khan và không thân thiện lắm đối với user.

May mắn thay, mọi sự đã thay đổi, ngày nay có rất nhiều opensource đi cùng những tính năng vượt trội cùng với thiết kế đẹp mắt, hài hòa.

Cùng với độ phổ biến ngày một tăng của framework Boostrap, việc tạo nên một admin panel đẹp mắt và đa tính năng cho admin chưa bao giờ dễ dàng đến vậy.

Tất cả các giao diện admin và dashboard Boostrap miễn phí dưới đây đã được xây dựng lại để sử dụng như một giải pháp hoàn thiện giúp bạn nhanh chóng tạo nên một dashboard front-end cho web app của mình.

Cũng như những bộ sưu tập widgets của Bootstrap, chúng đều bao gồm nhiều các addon, plugin và feature khác (plugins cho biểu đồ & bảng biểu, lịch trình, quản lý file, và nhiều hơn thế nữa). Tất cả những thứ bạn cần để xây dựng dashboard.

Và bên cạnh những tính feature tuyệt vời, các giao diện này cũng rất đẹp mắt. Tất cả đều ở dưới đây:

CoreUI Bootstrap 4 Admin Template miễn phí tại coreui.io

topdev

 

Light Bootstrap Dashboard miễn phí tại creative-tim.com

topdev

 

Material Dashboard – Bootstrap Material Design dành cho Admin miễn phí tại creative-tim.com

topdev

 

Laravel Admin Bootstrap Template miễn phí tại coreui.io

topdev

 

Material Design dành cho Bootstrap 4 miễn phí tại mdbootstrap.com

tuyển dụng it

 

Bộ Flat UI dành cho BootFlat Admin Dashboard Open-Source miễn phí tại themesseo.com

tuyển dụng it

 

Startmin Admin Dashboard Template miễn phí tại themesseo.comtuyển dụng it

 

  Framework là gì? Tìm hiểu về các Framework
  Framework có đang giết chết sự sáng tạo trong thiết kế Web?

Paper Dashboard Bootstrap Admin Template miễn phí tại creative-tim.com

tuyển dụng it

Blocks – A Single-Page Widgetised Admin Template miễn phí tại prepbootstrap.com

tuyển dụng it

 

AdminLTE – A Clean Admin Theme miễn phí tại adminlte.io

tuyển dụng it

 

Gentelella Bootstrap Admin Template miễn phí tại graygrids.com

Bootstrap là gì

 

Responsive Dashboard (AngularJS & Bootstrap) miễn phí tại github.com/invertase/rdash-angular

Bootstrap là gì

 

Metis – Template Bootstrap Admin miễn phí tại colorlib.com

Bootstrap là gì

 

SB Admin v.2 – A Minimal Bootstrap Dashboard Theme miễn phí tại startbootstrap.com

Bootstrap là gì

 

TemplateVamp – Bootstrap Admin Theme miễn phí tại www.egrappler.com

Bootstrap là gì

 

Clean Bootstrap Dashboard Theme miễn phí tại startbootstrap.com

Bootstrap là gì

 

Charisma Responsive Admin Template miễn phí tại usman.it

Bootstrap là gì

 

HTML5 Admin Template miễn phí tại themeforest.net

Bootstrap là gì

 

Hierapolis – A Bold Bootstrap Admin Template miễn phí tại github.com/lab2023/hierapolis

Bootstrap là gì

Bootstrap Admin Theme miễn phí tại github.com/invertase/rdash-angular

Bootstrap là gì

 

Tổng kết Bootstrap là gì?

Có thể hiểu Bootstrap là một framework khá đơn giản, dễ sử dụng là cực kì tối ưu và chắc hẳn Bootstrap sẽ được nhiều lập trình viên ứng dụng nhiều trong tương lai vì tính tiện lợi.

Có thể bạn muốn xem thêm:

Xem thêm Top Việc làm Developer trên TopDev

Dữ liệu lớn (Big Data) là gì? Đặc điểm và ứng dụng của Big Data

big data là gì

Có data, và sau đó có big data. Vậy, sự khác biệt là gì? Big data – Dữ liệu lớn ra đời mang đến nhiều ứng dụng trong các lĩnh vực như công nghệ, y tế, giáo dục,… Hãy cùng TopDev tìm hiểu khái niệm Dữ liệu lớn là gì? Đặc điểm và vai trò của big data trong thời đại số hiện nay.

Big Data là gì?

Big Data (Dữ liệu lớn) là thuật ngữ dùng để mô tả một lượng dữ liệu khổng lồ và phức tạp đến mức các công cụ quản lý dữ liệu truyền thống không có khả năng thu thập, quản lý và xử lý dữ liệu trong một khoảng thời gian hợp lý.

Big Data không chỉ đề cập đến kích thước của dữ liệu mà còn bao gồm tốc độ, sự đa dạng và tính xác thực của dữ liệu.

Việc làm Data Analytics lương cao cho bạn

Những tập dữ liệu lớn này có thể bao gồm các dữ liệu có cấu trúc, không có cấu trúc và bán cấu trúc, mỗi tập có thể được khai thác để tìm hiểu insights.

Bao nhiêu dữ liệu để đủ gọi là “big” vẫn còn được tranh luận, nhưng nó có thể là các bội số của petabyte – và các dự án lớn nhất với phạm vi exabytes.

Dữ liệu tạo thành các kho dữ liệu lớn có thể đến từ các nguồn bao gồm các trang web, mạng xã hội, ứng dụng dành cho máy tính để bàn và ứng dụng trên thiết bị di động, các thí nghiệm khoa học, và các thiết bị cảm biến ngày càng tăng và các thiết bị khác trong internet (IoT).

7 đặc điểm và tính chất quan trọng của Big Data

Big Data không chỉ đơn thuần là dữ liệu lớn mà còn bao gồm nhiều đặc điểm và tính chất quan trọng giúp hiểu rõ hơn về cách quản lý, phân tích và khai thác dữ liệu. Dưới đây là 7V đặc điểm và tính chất quan trọng của Big Data

7 đặc điểm và tính chất quan trọng của Dữ liệu lớn - Big Data
7 đặc điểm và tính chất quan trọng của Big Data

1. Volume (Khối lượng)

Khối lượng dữ liệu trong Big Data rất lớn, thường là hàng terabyte (TB), petabyte (PB) hoặc thậm chí exabyte (EB). Khối lượng dữ liệu khổng lồ này đến từ nhiều nguồn khác nhau như mạng xã hội, cảm biến, giao dịch thương mại điện tử và các thiết bị IoT. Việc xử lý và lưu trữ lượng dữ liệu lớn đòi hỏi các công nghệ và cơ sở hạ tầng đặc biệt.

2. Velocity (Tốc độ)

Tốc độ xử lý và truyền tải dữ liệu là một yếu tố quan trọng của Big Data. Dữ liệu được tạo ra và truyền tải với tốc độ rất nhanh từ các nguồn trực tuyến, mạng xã hội, cảm biến và hệ thống giao dịch. Khả năng xử lý dữ liệu theo thời gian thực hoặc gần thời gian thực là một yêu cầu quan trọng để khai thác giá trị từ Big Data.

3. Variety (Đa dạng)

Dữ liệu trong Big Data đến từ nhiều nguồn khác nhau và ở nhiều định dạng khác nhau, bao gồm dữ liệu có cấu trúc (structured), dữ liệu bán cấu trúc (semi-structured) và dữ liệu phi cấu trúc (unstructured). Các dạng dữ liệu bao gồm văn bản, hình ảnh, video, âm thanh, log files, và nhiều loại dữ liệu khác. Sự đa dạng này đòi hỏi các kỹ thuật và công cụ đặc biệt để phân tích và xử lý.

4. Veracity (Tính xác thực)

Tính xác thực của dữ liệu đề cập đến chất lượng và độ tin cậy của dữ liệu. Dữ liệu từ nhiều nguồn khác nhau có thể không nhất quán hoặc không chính xác. Việc đảm bảo tính xác thực của dữ liệu là quan trọng để có được kết quả phân tích đáng tin cậy. Các kỹ thuật làm sạch và xác thực dữ liệu được sử dụng để cải thiện chất lượng dữ liệu.

5. Value (Giá trị)

Giá trị là mục tiêu cuối cùng của việc khai thác Big Data. Dữ liệu lớn có thể mang lại những hiểu biết và thông tin giá trị giúp các tổ chức và doanh nghiệp đưa ra các quyết định chiến lược, tối ưu hóa hoạt động và tạo ra lợi thế cạnh tranh. Việc khai thác giá trị từ Big Data đòi hỏi các công cụ và kỹ thuật phân tích mạnh mẽ.

6. Variability (Biến động)

Biến động đề cập đến sự không nhất quán của dữ liệu. Lưu lượng dữ liệu có thể thay đổi đáng kể theo thời gian, làm cho việc quản lý và phân tích dữ liệu trở nên phức tạp hơn. Việc xử lý các khối lượng dữ liệu biến động đòi hỏi các hệ thống linh hoạt và có khả năng mở rộng.

7. Visualization (Trực quan hóa)

Trực quan hóa dữ liệu là khả năng trình bày dữ liệu một cách trực quan và dễ hiểu. Việc sử dụng các công cụ trực quan hóa giúp biến dữ liệu phức tạp thành các biểu đồ, đồ thị và báo cáo dễ hiểu, hỗ trợ quá trình ra quyết định. Trực quan hóa dữ liệu là một phần quan trọng của Big Data, giúp các nhà phân tích và người ra quyết định hiểu rõ hơn về dữ liệu và các kết quả phân tích.

Các ứng dụng đang sử dụng Big data

Big data và phân tích có thể được áp dụng trong nhiều vấn đề kinh doanh và nhiều trường hợp sử dụng khác nhau. Dữ liệu lớn (Big Data) trên thực tế đang được ứng dụng vào rất nhiều lĩnh vực của nền kinh tế, tạo những chuyển biến ấn tượng, giúp tăng hiệu quả và năng suất của doanh nghiệp.

1. Ngành Ngân hàng

Các ứng dụng đang sử dụng Big data
Các ứng dụng đang sử dụng Big data

Trong hệ thống ngân hàng, Big Data đã và đang được ứng dụng hiệu quả thể hiện vai trò quan trọng của mình trong mọi hoạt động của ngân hàng: từ thu tiền mặt đến quản lý tài chính.

Ngân hàng ứng dụng Big Data như thế nào:

  • Sử dụng các kỹ thuật phân cụm giúp đưa ra quyết định quan trọng. Hệ thống phân tích có thể xác định các địa điểm chi nhánh nơi tập trung nhiều nhu cầu của khách hàng tiềm năng, để đề xuất lập chi nhánh mới.
  • Kết hợp nhiều quy tắc được áp dụng trong các lĩnh vực ngân hàng để dự đoán lượng tiền mặt cần thiết sẵn sàng cung ứng ở một chi nhánh tại thời điểm cụ thể hàng năm.
  • Khoa học dữ liệu hiện đang là nền tảng của hệ thống ngân hàng kĩ thuật số.
  • Machine learning và AI đang được nhiều ngân hàng sử dụng để phát hiện các hoạt động gian lận và báo cáo cho các chuyên viên liên quan.
  • Khoa học dữ liệu hỗ trợ xử lý, lưu trữ và phân tích lượng dữ liệu khổng lồ từ các hoạt động hàng ngày và giúp đảm bảo an ninh cho ngân hàng.

Các ngân hàng nổi bật: tuyển dụng ACB, VP Bank tuyển dụng, MSB tuyển dụng

2. Ngành y tế

Khoa học dữ liệu đang dần khẳng định vai trò khá quan trọng trong việc cải thiện sức khỏe con người ngày nay. Big Data không chỉ được ứng dụng để xác định phương hướng điều trị mà giúp cải thiện quá trình chăm sóc sức khỏe.

Big Data từ lúc được ứng dụng vào lĩnh vực chăm sóc sức khỏe, đã tạo nên nhiều tác động lớn trong việc giảm lãng phí tiền bạc và thời gian. Ở một số quốc gia, chính phủ đã tài trợ các dự án ứng dụng Big Data để phát triển cơ sở hạ tầng mới và các dịch vụ y tế khẩn cấp.

Ngành y tế ứng dụng Big Data:

  • Cho phép người quản lý ca dự đoán các bác sĩ cần thiết vào những thời điểm cụ thể
  • Theo dõi tình trạng bệnh nhân bằng để theo dõi hồ sơ sức khỏe điện tử.
  • Sử dụng các thiết bị kỹ thuật số có thể đeo, hệ thống Big Data có thể theo dõi bệnh nhân và gửi báo cáo cho các bác sĩ liên quan.
  • Big Data có thể đánh giá các triệu chứng và xác định nhiều bệnh ở giai đoạn đầu.
  • Có thể lưu giữ các hồ sơ nhạy cảm được bảo mật và lưu trữ lượng dữ liệu khổng lồ một cách hiệu quả.
  • Các ứng dụng Big Data cũng có thể báo trước khu vực có nguy cơ bùng phát dịch như: sốt xuất huyết hoặc sốt rét.

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

Các ứng dụng đang sử dụng Big data - Ngành thương mại điện tử
Các ứng dụng đang sử dụng Big data – Ngành thương mại điện tử

Thương mại điện tử không chỉ tận hưởng những lợi ích của việc điều hành trực tuyến mà còn phải đối mặt với nhiều thách thức để đạt được các mục tiêu kinh doanh. Lý do là bởi các doanh nghiệp dù là nhỏ hay lớn, khi đã tham gia vào thị trường này đều cần đầu tư mạnh để cải tiến công nghệ. Big Data có thể tạo lợi thế cạnh tranh cho doanh nghiệp bằng cách cung cấp thông tin chuyên sâu và các bản báo cáo phân tích xu hướng tiêu dùng.

Thương mại điện tử ứng dụng Big Data:

  • Có thể thu thập dữ liệu và yêu cầu của khách hàng ngay cả trước khi khách thực sự bắt đầu giao dịch.
  • Tạo ra một mô hình tiếp thị hiệu suất cao.
  • Nhà quản lý trang thương mại điện tử có thể xác định các sản phẩm được xem nhiều nhất và tối ưu thời gian hiển thị của các trang sản phẩm này.
  • Đánh giá hành vi của khách hàng và đề xuất các sản phẩm tương tự. Điều này làm tăng khả năng bán hàng, từ đó tạo ra doanh thu cao hơn.
  • Nếu bất kỳ sản phẩm nào được thêm vào giỏ hàng nhưng cuối cùng không được khách hàng mua, Big Data có thể tự động gửi code khuyến mại cho khách hàng cụ thể đó.
  • Các ứng dụng Big Data còn có thể tạo một báo cáo tùy chỉnh theo các tiêu chí: độ tuổi, giới tính, địa điểm của khách truy cập, v.v.
  • Xác định các yêu cầu của khách hàng, những gì họ muốn và tập trung vào việc cung cấp dịch vụ tốt nhất để thực hiện nhu cầu của họ.
  • Phân tích hành vi, sự quan tâm của khách hàng và theo xu hướng của họ để tạo ra các sản phẩm hướng đến khách hàng.
  • Cung cấp các sản phẩm tốt hơn với chi phí thấp hơn.
  • Có thể thu thập nhiều dữ liệu về hành vi khách hàng để thiết kế mô hình tiếp thị tối ưu dành được tùy biến theo đối tượng hoặc nhóm đối tượng, tăng khả năng bán hàng.
  • Tìm ra sự tương đồng giữa khách hàng và nhu cầu của họ. Từ đó, việc nhắm mục tiêu các chiến dịch quảng cáo có thể được tiến hành dễ dàng hơn dựa trên những phân tích đã có trước đó.

Công ty thương mại điện từ nổi bật: fpt shop tuyển dụng it, juno tuyển dụng,….

4. Ngành bán lẻ

Big Data mang lại cơ hội cho lĩnh vực bán lẻ bằng cách phân tích thị trường cạnh tranh và sự quan tâm của khách hàng. Nó giúp xác định hành trình trải nghiệm, xu hướng mua sắm và sự hài lòng của khách hàng bằng cách thu thập dữ liệu đa dạng. Từ những dữ liệu thu thập được có thể cải thiện hiệu suất và hiệu quả bán hàng.

Ngành bán lẻ ứng dụng Big Data:

  • Big data giúp nhà quản lý xây dựng mô hình chi tiêu của từng khách hàng.
  • Với sự trợ giúp của các phân tích dự đoán, ngành công nghiệp có thể so sánh tỷ lệ cung – cầu và có thể tránh tiếp tục tung ra thị trường các sản phẩm không được hầu hết khách hàng đón nhận.
  • Ngành bán lẻ có thể xác định vị trí bố trí sản phẩm trên kệ hàng tùy thuộc vào thói quen mua hàng và nhu cầu của khách hàng và đưa ra các chiến lược kinh doanh mới để cải thiện.
  • Kết hợp phân tích cùng lúc các dữ liệu về thời điểm, dữ liệu giao dịch, dữ liệu truyền thông xã hội, dự báo thời tiết để xác định chính xác nhất sản phẩm phù hợp để luôn sẵn sàng cung ứng cho khách hàng.

5. Digital Marketing

Các ứng dụng đang sử dụng Big data - Digital Marketing
Các ứng dụng đang sử dụng Big data – Digital Marketing

Digital Marketing là chìa khóa để cánh cửa thành công cho bất kỳ doanh nghiệp nào. Giờ đây, không chỉ các công ty lớn có thể điều hành các hoạt động quảng cáo tiếp thị mà cả các doanh nhân nhỏ cũng có thể chạy các chiến dịch quảng cáo thành công trên các nền tảng truyền thông xã hội và quảng bá sản phẩm của họ. Big Data đã tiếp sức cho Digital Marketing phát triển thực sự mạnh mẽ, và nó đã trở thành một phần không thể thiếu của bất kỳ doanh nghiệp nào.

Digital Marketing ứng dụng Big Data:

  • Phân tích thị trường, đối thủ cạnh tranh và đánh giá mục tiêu kinh doanh. Điều này giúp cho doanh nghiệp xác định rõ hơn, đâu là cơ hội tốt để tiếp tục tiến hành các kế hoạch kinh doanh tiếp theo.
  • Có thể xác định người dùng trên các phương tiện truyền thông xã hội và nhắm mục tiêu cho họ dựa trên nhân khẩu học, giới tính, thu nhập, tuổi tác và sở thích.
  • Tạo báo cáo sau mỗi chiến dịch quảng cáo bao gồm hiệu suất, sự tham gia của khán giả và những gì có thể được thực hiện để tạo kết quả tốt hơn.
  • Khoa học dữ liệu được sử dụng cho các khách hàng nhắm mục tiêu và nuôi dưỡng chu trình khách hàng.
  • Tập trung vào các chủ đề được tìm kiếm cao và tư vấn cho các chủ doanh nghiệp thực hiện chúng trên chiến lược nội dung để xếp hạng trang web doanh nghiệp trên cao hơn trên google (SEO).
  • Có thể tạo đối tượng tương tự bằng cách sử dụng cơ sở dữ liệu đối tượng hiện có để nhắm mục tiêu các khách hàng tương tự và kiếm được lợi nhuận.

Còn rất nhiều ngành đang áp dụng rất mạnh mẽ Bigdata như nông nghiệp, giáo dục…cho phép chúng ta có insight ngày càng tốt để ra quyết định nhanh chóng và chính xác.

6. Ngăn chặn nội dung đen

Ví dụ cụ thể như là Extension (Chrome, Firefox, Safari…) Có nhiều addon phục vụ cho việc content filtering miễn phí sử dụng Bigdata để thu thập và dự đoán xem nội dung đó có phù hợp không. Ví dụ chức năng Ad Block nhanh chóng block các banner, pop ups, video ads gây phiền nhiễu một lần và mãi mãi. Sau đó nó lập tức thu thập và gửi về server blacklist những yếu tố này. Data càng nhiều thì tỷ lệ nhận diện và block ngày càng chính xác.

  Big data là gì? Trò chuyện cùng CTO của Datamart Solutions để hiểu hơn về data

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Big data và analytics

Điều thực sự mang lại giá trị từ các tổ chức dữ liệu lớn là phân tích dữ liệu. Nếu không có phân tích, nó chỉ là một tập dữ liệu với việc sử dụng hạn chế trong kinh doanh.

Bằng cách phân tích dữ liệu lớn, các công ty có thể có những lợi ích như tăng doanh thu, dịch vụ khách hàng được cải thiện, hiệu quả cao hơn và tăng khả năng cạnh tranh.

Phân tích dữ liệu liên quan đến việc kiểm tra bộ dữ liệu để thu thập thông tin chi tiết hoặc rút ra kết luận về những gì chúng chứa, chẳng hạn như các xu hướng và dự đoán về hoạt động trong tương lai.

Bằng cách phân tích dữ liệu, các tổ chức có thể đưa ra các quyết định kinh doanh tốt hơn như khi nào và ở đâu nên chạy chiến dịch tiếp thị hoặc giới thiệu một sản phẩm hoặc dịch vụ mới.

  Tổng hợp Cheat Sheets cho AI, Neural Networks, Machine Learning, Deep Learning và Big Data

Sự phân tích có thể tham khảo các ứng dụng kinh doanh thông minh hay tiên tiến hơn. Phép phân tích dự đoán như ứng dụng được các tổ chức khoa học sử dụng.

Loại phân tích dữ liệu cao cấp nhất là data mining, nơi các nhà phân tích đánh giá các bộ dữ liệu lớn để xác định mối quan hệ, mô hình và xu hướng.

Phân tích dữ liệu có thể bao gồm phân tích dữ liệu thăm dò ( để xác định các mẫu và mối quan hệ trong dữ liệu) và phân tích dữ liệu xác nhận ( áp dụng các kĩ thuật thống kê để tìm ra giả thiết về một bộ dữ liệu có đúng hay không).

Một mảng khác là phân tích dữ liệu định lượng ( hoặc phân tích dữ liệu số có các biến có thể so sánh theo thống kê) so với phân tích dữ liệu định tính ( tập trung vào các dữ liệu không phải là dữ liệu cá nhân như video, hình ảnh và văn bản).

Cơ sở hạ tầng IT để hỗ trợ big data

Đối với khái niệm big data để làm việc, các tổ chức cần phải có cơ sở hạ tầng để thu thập và chứa dữ liệu, cung cấp quyền truy cập và đảm bảo thông tin trong khi lưu trữ và chuyển tiếp.

Ở cấp độ cao, bao gồm hệ thống lưu trữ và máy chủ được thiết kế cho big data, phần mềm quản lý và tích hợp dữ liệu, thông tin kinh doanh và phần mềm phân tích dữ liệu, và các ứng dụng big data.

Phần lớn các cơ sở hạ tầng này sẽ tập trung một chỗ, vì các công ty muốn tiếp tục tận dụng các khoản đầu tư vào trung tâm dữ liệu của mình. Nhưng ngày càng có nhiều tổ chức dựa vào các dịch vụ điện toán đám mây để xử lý nhiều yêu cầu big data của họ.

  Lương IT nghìn USD nếu thành thạo Cloud, Big Data, AI

Thu thập dữ liệu đòi hỏi phải có nguồn. Rất nhiều trong số những ứng dụng sau đây, như các ứng dụng web, các kênh truyền thông xã hội, ứng dụng di động và lưu trữ email đã được cài sẵn.

Nhưng khi IoT trở nên phổ biến hơn, các công ty có thể cần phải triển khai cảm biến trên tất cả các loại thiết bị, phương tiện và sản phẩm để thu thập dữ liệu, cũng như các ứng dụng mới tạo ra dữ liệu người dùng. Phân tích dữ liệu theo định hướng IoT có các kỹ thuật và công cụ chuyên biệt của nó.

Để lưu trữ tất cả các dữ liệu đến, các tổ chức cần phải có đủ dung lượng lưu trữ tại chỗ. Các tùy chọn lưu trữ bao gồm kho dữ liệu truyền thống, data lakes và lưu trữ trên đám mây.

Các công cụ cơ sở hạ tầng bảo mật có thể bao gồm việc mã hóa dữ liệu, xác thực người dùng và các điều khiển truy cập khác, hệ thống giám sát, tường lửa, quản lý di động của doanh nghiệp và các sản phẩm khác để bảo vệ hệ thống và dữ liệu.

big data

Nhưng với khối lượng dữ liệu khủng, 1 team Big Data cũng đặc biệt cần đến một phần mềm quản lý dự án và công việc để hỗ trợ trong quá trình cộng tác và thúc đẩy hiệu suất làm việc. Toàn bộ thông tin và quy trình của team được số hoá và tích hợp tại 1 không gian, hỗ trợ giao – nhận việc, giao tiếp và chia sẻ tài liệu nhanh chóng. 

Theo đó, một phần mềm quản lý dự án và công việc với gói dùng miễn phí như Cleeksy là lựa chọn lý tưởng cho các team Big Data đang tìm kiếm một giải pháp quản lý công việc linh hoạt và tiết kiệm chi phí. Phiên bản Free không giới hạn thời gian.

Các công nghệ đặc biệt dành cho Big data

Ngoài cơ sở hạ tầng IT được sử dụng cho dữ liệu nói chung, có một số công nghệ cụ thể dành cho big data mà cơ sở hạ tầng IT của bạn nên hỗ trợ.

Hệ sinh thái Hadoop

Hadoop là một trong những công nghệ liên quan chặt chẽ nhất với big data. Dự án Apache Hadoop phát triển phần mềm mã nguồn mở cho máy tính có khả năng mở rộng và phân tán.

Thư viện phần mềm Hadoop là một khuôn mẫu cho phép xử lý phân tán các bộ dữ liệu lớn trên các nhóm máy tính sử dụng các mô hình lập trình đơn giản. Nó được thiết kế để mở rộng từ một máy chủ duy nhất sang hàng ngàn máy khác, mỗi máy cung cấp tính toán và lưu trữ cục bộ.

Dự án bao gồm rất nhiều phần:

  • Hadoop Common, các tiện ích phổ biến hỗ trợ các phần Hadoop khác
  • Hadoop Distributed File System, cung cấp khả năng truy cập dữ liệu ứng dụng cao
  • Hadoop YARN, một khuôn mẫu cho kế hoạch làm việc và quản lý tài nguyên cụm
  • Hadoop MapReduce, một hệ thống dựa trên YARN để xử lý song song bộ dữ liệu lớn.

Apache Spark

Một phần của hệ sinh thái Hadoop, Apache Spark là một khuôn mẫu tính toán cụm nguồn mở được sử dụng làm công cụ xử lý big data trong Hadoop.

Spark đã trở thành một trong những khuôn mẫu xử lý big data quan trọng, và có thể được triển khai theo nhiều cách khác nhau. Nó cung cấp các phương thức hỗ trợ đối với Java, Scala, Python (đặc biệt là Anaconda Python distro ), và ngôn ngữ lập trình R (R đặc biệt phù hợp với big data) và hỗ trợ SQL, streaming data, machine learningxử lý đồ thị.

Data lakes

Data lakes là các kho lưu trữ chứa khối lượng dữ liệu thô rất lớn ở định dạng gốc của nó cho đến khi những người dùng doanh nghiệp cần dữ liệu.

Các yếu tố giúp tăng trưởng data lakes là những phong trào kỹ thuật số và sự phát triển của IoT. Các data lakes được thiết kế để giúp người dùng dễ dàng truy cập vào một lượng lớn dữ liệu khi có nhu cầu.

NoSQL Databases

Các cơ sở dữ liệu SQL thông thường được thiết kế cho các transaction đáng tin cậy và các truy vấn ngẫu nhiên.

Nhưng chúng có những hạn chế như giản đồ cứng nhắc làm cho chúng không phù hợp với một số loại ứng dụng. Cơ sở dữ liệu NoSQL nêu ra những hạn chế, và lưu trữ và quản lý dữ liệu theo những cách cho phép tốc độ hoạt động cao và sự linh hoạt tuyệt vời.

Nhiều cơ sở dữ liệu đã được phát triển bởi các công ty để tìm cách tốt hơn để lưu trữ nội dung hoặc xử lý dữ liệu cho các trang web lớn. Không giống như các cơ sở dữ liệu SQL, nhiều cơ sở dữ liệu NoSQL có thể được mở rộng theo chiều ngang trên hàng trăm hoặc hàng ngàn máy chủ.

In-memory databases

Cơ sở dữ liệu trong bộ nhớ (IMDB) là một hệ thống quản lý cơ sở dữ liệu chủ yếu dựa vào bộ nhớ chính (Ram), thay vì HDD, để lưu trữ dữ liệu. Cơ sở dữ liệu trong bộ nhớ nhanh hơn các cơ sở dữ liệu được tối ưu hóa trong đĩa, một điểm quan trọng để sử dụng phân tích big data và tạo ra các kho dữ liệu và các siêu dữ liệu. Đọc thêm Redis là gì?

Các kĩ năng Big data

Big data và các nỗ lực phân tích big data yêu cầu kĩ năng cụ thể, dù là từ bên trong tổ chức hay thông qua các chuyên gia bên ngoài.

Nhiều kĩ năng có liên quan đến các thành phần công nghệ dữ liệu quan trọng như Hadoop, Spark, NoSQL, cơ sở dữ liệu trong bộ nhớ và phần mềm phân tích.

Các lĩnh vực khác cụ thể là về các nguyên tắc như khoa học dữ liệu, khai thác dữ liệu, phân tích thống kê và định lượng, hình dung dữ liệu, lập trình mục đích chung, và cấu trúc dữ liệu và các thuật toán. Ngoài ra cũng cần có những người có kĩ năng quản lý tổng thể để quản lý tiến độ của các dự án big data.

Với độ phổ biến của các dự án phân tích dữ liệu và sự thiếu hụt nhân lực về các kĩ năng trên, việc tìm kiếm các chuyên gia có kinh nghiệm có thể là một trong những thách thức lớn nhất đối với các tổ chức.

So sánh giữa Data và Big Data

Đặc điểm Data Big Data
Khái niệm Tập hợp các thông tin, dữ liệu có thể ở dạng số, văn bản, hình ảnh, âm thanh, video, v.v. Tập hợp dữ liệu khổng lồ và phức tạp, không thể xử lý hiệu quả bằng các công cụ truyền thống.
Khối lượng Vừa phải, dễ quản lý và xử lý Rất lớn, thường là terabyte (TB) hoặc petabyte (PB)
Tốc độ Tạo ra và xử lý với tốc độ chậm hoặc trung bình Tạo ra và cập nhật với tốc độ rất cao, yêu cầu xử lý gần thời gian thực hoặc thời gian thực
Đa dạng Có thể có cấu trúc hoặc không cấu trúc, thường không quá phức tạp Đến từ nhiều nguồn khác nhau, ở nhiều định dạng như văn bản, hình ảnh, video, dữ liệu cảm biến, log files
Tính xác thực Độ tin cậy và tính xác thực cao, dễ dàng xác minh và quản lý Có thể không nhất quán, không đầy đủ hoặc không chính xác, đòi hỏi các phương pháp làm sạch và xác thực phức tạp hơn
Công cụ xử lý Excel, SQL databases (MySQL, PostgreSQL), các phần mềm phân tích đơn giản Apache Hadoop, Apache Spark, NoSQL databases (MongoDB, Cassandra), Apache Kafka
Công nghệ lưu trữ Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) Hệ thống lưu trữ phân tán như Hadoop Distributed File System (HDFS), Amazon S3, Google Cloud Storage
Ứng dụng Quản lý kinh doanh, quản lý khách hàng, phân tích đơn giản Phân tích nâng cao, ứng dụng thời gian thực, AI và Machine Learning
Ví dụ ứng dụng Dữ liệu doanh thu, chi phí, tồn kho; dữ liệu khách hàng, giao dịch, phản hồi; báo cáo tài chính, thống kê cơ bản Phân tích hành vi khách hàng, dự đoán xu hướng thị trường, tối ưu hóa quảng cáo; giám sát hệ thống, phân tích dữ liệu cảm biến; huấn luyện mô hình AI, phát triển hệ thống học máy

 

Trên đây là một số thông tin cung cấp những khái niệm cơ bản cũng như đặc điểm và tính ứng dụng cao của Big data – Dữ liệu lớn. Big Data đã mở ra nhiều cơ hội mới trong các lĩnh vực phân tích nâng cao, AI và Machine Learning, mang lại giá trị lớn cho doanh nghiệp và xã hội. Theo dõi TopDev để cập nhật liên tục về xu hướng công nghệ mới nhất hiện nay!

Có thể bạn muốn xem những kiến thức xoay quanh Big Data:

Tại sao nguồn nhân lực lập trình ở Việt Nam lại đứng đầu Đông Nam Á

lập trình ở Việt Nam

Nói về cuộc cách mạng 4.0 và lập trình ở Việt Nam, nhiều người cho rằng Việt Nam có lợi thế về nguồn nhân lực công nghệ cao trong khu vực. Điều này có thể là vì Việt Nam có nền giáo dục thiên về các môn học tự nhiên như toán học và khoa học trong nhiều năm qua.

Đây chính là nền tảng giúp các lập trình viên, nhà phát triển, có thể nhanh chóng bắt kịp với các xu hướng công nghệ mới.

  Tình hình tuyển dụng IT Việt Nam 2019: Nhu cầu nhân sự CNTT cao nhất trong lịch sử!
  Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Học sinh lớp 11 tại Việt Nam có thể vượt qua quá trình phỏng vấn nổi tiếng của Google mà không gặp vấn đề gì

“Không còn nghi ngờ gì khi một nửa số học sinh lớp 11 đó có thể vượt qua quá trình phỏng vấn của Google”, Neil Neil Fraser – kỹ sư phần mềm tại Goolge, đã viết trên blog của mình.

Để hiểu được câu nói đó, chúng ta cần tìm hiểu một chút. Gần đây, trong một chuyến đi đến Việt Nam, Fraser đã đi vào một số phòng học từ lớp 2 đến lớp 11 để hiểu rõ hơn về chương trình giảng dạy khoa học máy tính của nước ta.

Những gì anh khám phá ra, không cần phải nói, vừa gây sốc vừa ấn tượng mạnh với anh ấy.

Đến lớp 3, mọi đứa trẻ đều được học cách sử dụng Windows. Fraser đề xuất một cách nghiêm túc: “Việt Nam nên có một hệ thống Windows XP và Windows 7 độc quyền 100%” vì chi phí phần mềm khá cao đối với hầu hết các gia đình.

Nhưng điều đó cũng không gây khó khăn cho học sinh trong việc học đánh máy bằng tiếng Anh thông qua sử dụng Microsoft Word.

Đến lớp 4, học sinh được học code bằng Logo, một ngôn ngữ lập trình máy tính đa mô hình thường được dùng trong hệ thống giáo dục. Đến lớp 5, các em đã có thể viết các phương thức chứa vòng lặp.

lập trình ở Việt Nam

Trẻ em tại Việt Nam đam mê lập trình

Điều đó tuy đơn giản nhưng thật sự rất đáng kinh ngạc, vượt xa các quốc gia phương Tây, kể cả Hoa Kỳ về kỹ năng và chương trình giảng dạy. Fraser rất muốn xem những đứa trẻ này có thể phát triển nhanh như thế nào, và anh ta cần làm gì để hỗ trợ chúng nhiều hơn.

Và đó cũng là lý do để anh thiết kế ra một phần mềm tùy chỉnh có tên là Blockly Maze, và một series hướng dẫn tự học. Ông cũng thuê thêm một giáo viên nữa, để toàn trường có thể học về khoa học máy tính.

Chuyển nhanh đến lớp 11, các em được giao một bài tập: “Đưa một tệp dữ liệu mô tả về một mê cung có các tường chéo nhau”, và đề yêu cầu “đếm số lượng các khu vực kèm theo đó là đo kích thước của khu vực lớn nhất”.

Sau này Fraser có quay trở lại Mỹ và hỏi một senior engineer tại Google, để xem anh ta so sánh thế nào giữa câu hỏi này với quy trình phỏng vấn cực kỳ khó khăn của Google. “Mặc dù không biết nguồn gốc của câu hỏi từ đâu ra, nhưng ông đánh giá rằng nó sẽ nằm trong top 3.”, Fraser nói.

Quay trở lại với lớp học hôm đó, bài tập này không phải chỉ dành cho top 5% học sinh giỏi của lớp. Hầu hết học sinh đều làm xong trong vòng 45 phút và một vài em thì cần thêm 5 phút nữa để hoàn thành nó.

Vậy câu nói ban đầu của Fraser: “Không còn nghi ngờ gì về việc nửa số học sinh lớp 11 ở Việt Nam có thể vượt qua quá trình phỏng vấn của Google”. Câu nói này cũng chỉ là một sự suy đoán. Không có cách nào để biết liệu câu hỏi trong bài tập đó có bao giờ xuất hiện trong bài kiểm tra của Google hay không, hay liệu các em học sinh có thực sự vượt qua các phần khác của bài kiểm tra hay không.

Đây cũng chỉ là kết quả tương đối của một lớp, biết đâu các học sinh ấy có thể có trình độ và kỹ năng thấp hơn hoặc cao hơn học sinh trung bình ở Việt Nam.

Nhưng cũng chẳng sao cả. Điều quan trọng là nó vừa có chút đáng sợ nhưng cũng đầy cảm hứng và vô cùng ấn tượng, để biết rằng hệ thống giáo dục Việt Nam đang sản sinh ra những lập trình viên đẳng cấp thế giới với rất ít tài nguyên.

Một ví dụ khác là vào năm 2017, PwC đã phát biểu về ngành công nghiệp gia công đầy triển vọng tại Việt Nam: “Không có gì ngạc nhiên khi Việt Nam đang dần được nhiều nước trên thế giới lựa chọn, vì các quốc gia đã “quen mặt” như Trung Quốc và Ấn Độ có chi phí vượt trội, cao hơn mặt bằng chung”. Nhìn chung, Hà Nội và Thành phố Hồ Chí Minh là 2 khu vực gia công phần mềm lớn, PwC dành nhiều lời khen ngợi cho Việt Nam.

Các báo cáo cũng chỉ ra rằng những gã khổng lồ công nghệ như Samsung, Microsoft, LG, Intel cũng đang đầu tư mạnh vào Việt Nam. Cùng với đó, một thế mạnh của người Việt Nam là bản chất không ngừng học hỏi để cải thiện bản thân. Đất nước này đã và đang thay đổi, nhờ vào một thế hệ trẻ tuổi làm việc chăm chỉ và tận tụy.

Lập trình viên Việt Nam làm việc 6 ngày 1 tuần, trong khi ở phương Tây thời gian làm việc mỗi tuần chỉ là 5 ngày. Ở thế hệ nhân sự trước đây tại Việt Nam, làm việc 12 giờ một ngày và 6-7 ngày mỗi tuần vẫn rất là bình thường.

Nhìn chung, mặc dù việc phát triển gia công phần mềm ở Việt Nam vẫn còn ở giai đoạn sơ khai, nhưng tất cả những dấu hiệu trên đều hướng đến tương lai tươi sáng.

Lên đến đỉnh trong ngành gia công, cạnh tranh với Trung Quốc và Ấn Độ

Tất cả các câu trả lời sau đây sẽ dần giải đáp cho bạn rằng: Học sinh Việt Nam “cày” rất nhiều môn toán và khoa học từ nhỏ, đó là lý do tại sao các lập trình viên Việt Nam được đánh giá cao trong khu vực Đông Nam Á.

Say Keng Lee, một người Singapore, nói rằng các sinh viên ở các nước Đông Nam Á rất “nể” sinh viên Việt Nam về môn toán học và khoa học. Tôi tới Việt Nam từ năm 2010. Là một giáo viên tiếng Anh, tôi thường xuyên tiếp xúc với nhiều học sinh cấp 3 Việt Nam, bao gồm cả hai đứa con nuôi của tôi hiện cũng đang học đại học.

Nói về Toán học và Vật lý, tôi tin chắc rằng các môn này ở đây cũng được dạy tốt như Singapore, nếu không muốn nói là tốt hơn. Bằng chứng là học sinh trung học ở Việt Nam thường đạt được kết quả rất cao trong các kỳ thi Olympic Toán học và Vật lý quốc tế.

“Hệ thống giáo dục ở Việt Nam tập trung vào toán học và khoa học. Việt Nam thực sự giành được nhiều vị trí trong bảng xếp hạng PISA và trong một số cuộc thi Olympic quốc tế.” – Khanh Luu, một nhà báo Việt Nam , cho biết.

Tất nhiên, thực tế là trên bản đồ công nghệ thế giới, Việt Nam vẫn là ‘ngôi sao tiềm năng’ chứ không phải “siêu cường quốc”, vì vậy những bình luận ‘có cánh’ của ông Pontus B hay Google Neil Fraser chỉ nên nghe để biết mà thôi.

Tại Việt Nam, ngành công nghiệp BPO đã phát triển đáng kể. Theo số liệu của Hiệp hội dịch vụ CNTT và phần mềm Việt Nam (VINASA), gia công phần mềm CNTT đã tăng 20%-​​35% hàng năm trong thập kỷ qua, với doanh thu ngành công nghiệp năm ngoái đạt 2,2 tỷ USD.

“Việt Nam thực sự là một trong những lựa chọn cạnh tranh nhất trên thế giới về gia công phần mềm”, theo Gartner. Lợi thế lớn của đất nước này là chi phí lao động ở Việt Nam chỉ bằng một nửa so với Ấn Độ.

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

Xem thêm việc làm Software Developers hot nhất trên TopDev

Người viết: Kevin Nguyen

TopDev via Medium

  Vietnam Mobile Day lần thứ 9 - Kỳ lân công nghệ sẽ xuất hiện tại Việt Nam trong một năm nữa
  Market Place Platform tại Việt Nam 2019 - Cuộc cách mạng nền tảng

Ethereum là gì? Tìm hiểu cơ bản về Blockchain (P2)

ethereum là gì

Bài trước chúng ta đã nói khá nhiều về lập trình Ethereum trong blockchain là gì và cách dùng Truffle cũng như command line Ganache. Bài này chúng ta sẽ dùng environment này để nói về 2 concept khác của Solidity: Interface và các Function Modifier.

  Ethereum là gì? Tìm hiểu cơ bản về Blockchain (P1)

Cài đặt sẵn sàng

Sau khi bạn đã cài Truffle và ganache-cli, tạo một folder mới và chạy truffle init. Chúng ta sẽ tạo 2 contract trong folder truffle mới tạo.

  • Answers.sol
pragma solidity ^0.4.18;

contract Answers {
    uint answerUniverse;

    function setAnswerUniverse(uint _answer) external {
        answerUniverse = _answer;
    }

    function getAnswerUniverse() public view returns (uint){
        return answerUniverse;
    }
}
  • Questions.sol
pragma solidity ^0.4.18;

contract AnswersInterface {
    function getAnswerUniverse() public view returns (uint);
}

contract Questions {
    AnswersInterface answersContract;

    function setAnswersContractAddress(address _address) external{
        answersContract = AnswersInterface(_address);
    }

    function whatIsTheAnswerUniverse() public view returns (uint){
        uint answer = answersContract.getAnswerUniverse();
        return answer;
    }

}

Contract Answers.sol rất đơn giản. Một variable answerUniverse có cả getter và setter. Lưu ý rằng, bởi vì nó quan trọng rằng setter là nhân tố ngoài, nghĩa là nó phải được call từ ngoài contract, còn getter thì public nghĩa là ai call nó cũng được.

Contract Questions.sol gồm 2 thứ: contract Questions, và interface AnswersInterface.

Vậy, interface là gì? Một interface cho phép chúng ta nói về một contract khác trên blockchain. Như bạn có thể thấy, để xác định một interface, bạn phải bắt đầu từ một contract bình thường, với keyword contract.

>>> Xem thêm Interface và Abstract là gì?

Trong contract này, bạn chỉ xác định các function bạn muốn tương tác không cần phần thân. Các function này cần là public hoặc từ bên ngoài để có thể call chúng từ ngoài contract gốc. Bạn không thể tương tác với các function riêng hoặc nội bộ course được.

Bên trong contract Questions, chúng ta sẽ tạo một interface mẫu trong answersContract. Function setAnswersContractAddress sẽ cho contract biết chỗ tìm được contract Answer gốc. Function whatIsTheAnswerUniverse thu về variable answerUniverse trong contract Answers.

Note: Dĩ nhiên chúng ta cần phải set địa chỉ contract trước khi lấy variable. Nếu không chúng ta sẽ chả biết nó ở đâu trên blockchain!

  • Tiếp đến, trong file truffle-config.js:
module.exports = {
    networks: {
            development: {
                    host: '127.0.0.1',
                    port: 7545,
                    network_id: '*'
            }
    }
};

Với người dùng Windows, bạn sẽ phải remove file truffle.js để tránh mâu thuẫn. Với hệ khác, bạn có thể giữ lại cả hau và bỏ vào code trong truffle.js, hoặc lằm giống như user Windows chẳng sao cả.

  • Trong folder migrations, tạo 2 file: 2_deploy_questions.js và 3_deploy_answers.js.
  • 2_deploy_questions.js
var Questions = artifacts.require("Questions")

module.exports = function(deployer) {
    deployer.deploy(Questions)
};
var Questions = artifacts.require("Questions")

module.exports = function(deployer) {
    deployer.deploy(Questions)
};
  • 3_deploy_answers.js
var Answers = artifacts.require("./Answers.sol")

module.exports = function(deployer) {
  deployer.deploy(Answers)
}

Triển khai

Mở một cửa sổ terminal mới và chạy ganache-cli -p 7545. Quay lại folder của project và chạy:

  • truffle compile
  • truffle migrate --network development
  • truffle console --network development

Bây giờ chúng ta có thể chơi với các contract và interface của nó. Đầu tiên, tạo một instance cho mỗi contract.

truffle(development)> Questions.deployed().then(inst => Questions = inst)
truffle(development)> Answers.deployed().then(inst => Answers = inst)

Sau khi launch Answers instance, bạn sẽ thấy vài thứ mới xuất hiện trong console. Sẽ có cả field address. Đây là address của contract Answers. Đây có thể là những gì ta cần để call setAnswersContractAddress function:

truffle(development)> Questions.setAnswersContractAddress('0x2e91a07090cfbbc0839e0d76d8110e2518bae18c')

Note: Hãy thế address bằng bất cứ address nào bạn thấy trong field.

Hãy xem answersUniverse variable trong Answers contract:

truffle(development)> Answers.setAnswerUniverse(76)

Và lấy nó từ contract Questions:

truffle(development)> Questions.whatIsTheAnswerUniverse().then(answer => answer.toNumber())
76

Hãy chỉnh lại answer và retrieve lần nữa:

truffle(development)> Answers.setAnswerUniverse(42)
truffle(development)> Questions.whatIsTheAnswerUniverse().then(answer => answer.toNumber())
42

Và bạn đã có một interface rồi.

Các function modifier

Có thể dễ thấy một vấn đề về bảo mật trong project của chúng ta: function setAnswersContractAddress là yếu tố từ bên ngoài, nghĩa là bất kì ai từ ngoài contract cũng gọi nó được, cũng có nghĩa là ai cũng có thể call function và đổi address được cả. Để giải quyết được việc này, chúng ta phải add một function modifier, sẽ được call khi function được thực hiện.

Căn bản là, nó sẽ chạy một vài đợt check để đảm bảo rằng mọi thứ vẫn ổn. Trong trường hợp này, chúng ta phải đảm bảo rằng chỉ có người sở hữu mới gọi được function. Để vậy chúng ta sẽ dùng contract từ thư viện OpenZeppelin Solidity gọi là OwnableCopy và dán nó vào.

Đừng hoảng lên nếu bạn không hiểu gì trong contract. Chỉ cần biết rằng nó sẽ đảm bảo cho function chỉ có thể kích hoạt được bởi chủ.

  • Tạo một file Ownable.sol trong các contract
/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }
}
  • Import contract Ownable vào Questions và xác định function modifier cho setAnswersContractAddress:
pragma solidity ^0.4.18;

import "./Ownable.sol";

contract AnswersInterface {
    function getAnswerUniverse() public view returns (uint);
}

contract Questions is Ownable{
    AnswersInterface answersContract;

    function setAnswersContractAddress(address _address) external onlyOwner{
        answersContract = AnswersInterface(_address);
    }

    function whatIsTheAnswerUniverse() public view returns (uint){
        uint answer = answersContract.getAnswerUniverse();
        return answer;
    }

}

Relaunch command ganache-cli, và các command truffle. Deploy các contract Answers và Questions. Mặc định chủ contract sẽ là account đầu tiên được tạo bởi  ganache-cli. Sau đó lấy một account khác:

truffle(development)> account = web3.eth.accounts[3]

Bây giờ, nếu chúng ta set interface address từ account này, bạn sẽ bị lỗi:

truffle(development)> Questions.setAnswersContractAddress('0x37eba1bb7d4c779474a4955437e524fbdbac0dc2', {from: account})
Error: VM Exception while processing transaction: revert

Nếu bạn remove cái object argument, hoặc dùng accounts[0] address trong key, bạn vẫn có thể set address ổn thoả.

Kết luận

Hy vọng qua 2 bài viết này các bạn có thể hiểu hơn về Ethereum trong Blockchain là gì.

Cảm ơn các bạn đã theo dõi bài viết!

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

Xem thêm việc làm blockchain hot nhất trên TopDev