Home Blog Page 194

Top 10 thuật toán machine learning dành cho newbie

Top 10 thuật toán machine learning dành cho newbie

Trong machine learning, có một thứ gọi là định luật ” No Free Lunch “. Nói một cách ngắn gọn, điều đó cho rằng không có một thuật toán nào là tốt nhất trong mọi vấn đề và nó đặc biệt phù hợp với supervised learning – việc học dưới sự giám sát ( ví dụ là predictive modeling – mô hình tiên đoán).

Ví dụ, bạn không thể nói rằng các kết nối nơ-ron luôn tốt hơn cây quyết định – decision trees (hay ngược lại). Có rất nhiều yếu tố ảnh hưởng chẳng hạn như kích thước và cấu trúc của bộ dữ liệu.

Do đó, bạn nên thử nhiều thuật toán khác nhau cho vấn đề của bạn, trong khi sử dụng một “ tập kiểm tra ” còn lại để đánh giá hiệu suất và chọn ra giải pháp tối ưu nhất.

Tất nhiên, các thuật toán bạn thử phải phù hợp với vấn đề của bạn, đó là việc bạn chọn đúng công việc cho machine learning. Tương tự, nếu bạn cần dọn dẹp nhà cửa, bạn có thể sử dụng máy hút bụi, một cây chổi hoặc một cái giẻ lau, nhưng bạn sẽ không sử dụng một cái xẻng và đào.

The Big Principle

Tuy nhiên, có một nguyên tắc chung là cơ sở cho mọi thuật toán machine learning được giám sát cho mô hình tiên đoán.

Các thuật toán machine learning được mô tả như việc học một target function (f) để biến bản đồ đầu vào (X) thành biến xuất (Y): Y = f (X)

Đây là một nhiệm vụ học tập tổng quát mà chúng ta muốn đưa ra những tiên đoán trong tương lai (Y) với các ví dụ mới về các biến đầu vào (X). Chúng ta không biết chức năng (f) trông như thế nào hoặc dạng của nó. Nếu chúng ta làm như vậy, chúng ta sẽ sử dụng nó trực tiếp và không cần phải học nó từ dữ liệu bằng cách sử dụng các thuật toán machine learning.

Phương thức phổ biến nhất của machine learning là học cách lập bản đồ Y = f (X) để đưa ra dự đoán của Y cho biến X mới. Điều này được gọi là mô hình tiên đoán hoặc phân tích tiên đoán và mục tiêu của chúng ta là làm cho các dự đoán chính xác nhất có thể được.

Đối với những người mới học về machine learning muốn hiểu được cơ bản của nó, đây sẽ là một chuyến khám phá nhanh về 10 thuật toán machine learning hàng đầu được các nhà khoa học dữ liệu sử dụng.

1. Linear Regression – Hồi quy tuyến tính

Hồi quy tuyến tính có lẽ là một trong những thuật toán nổi tiếng nhất và được hiểu rõ nhất trong thống kê và machine learning.

Mô hình tiên đoán chủ yếu quan tâm đến việc giảm thiểu sai sót của mô hình hoặc đưa ra các dự đoán chính xác nhất có thể, với một chi phí giải trình. Chúng tôi sẽ mượn, sử dụng lại và lấy các thuật toán từ nhiều lĩnh vực khác nhau, bao gồm số liệu thống kê và sử dụng chúng cho những mục đích này.

Biểu diễn hồi quy tuyến tính là một phương trình mô tả một đường thẳng mô tả phù hợp nhất mối quan hệ giữa các biến đầu vào (x) và các biến đầu ra (y), bằng cách tìm các trọng số cụ thể cho các biến đầu vào được gọi là các hệ số (B).

Top 10 thuật toán machine learning dành cho newbie

Ví dụ: y = B0 + B1 * x

Chúng ta sẽ dự đoán y với biến x cho trước và mục tiêu của thuật toán hồi quy tuyến tính là tìm các giá trị cho các hệ số B0 và B1.

Các kĩ thuật khác nhau có thể được sử dụng để tìm mô hình hồi quy tuyến tính từ dữ liệu, chẳng hạn như một giải pháp đại số tuyến tính cho Ordinary least square và việc tối ưu hóa Gradient descent.

Hồi quy tuyến tính đã được phát minh khoảng hơn 200 năm và đã được nghiên cứu rộng rãi. Một số quy tắc tốt khi sử dụng kĩ thuật này là loại bỏ các biến tương tự nhau (correlated) và để loại bỏ bớt yếu tố sao lãng từ dữ liệu của bạn, nếu có thể. Đây là một kĩ thuật đơn giản và nhanh chóng, và là thuật toán tốt đầu tiên để thử.

2. Logistic Regression – Hồi quy logistic

Hồi quy logistic là một thuật toán khác được mượn bởi machine learning từ lĩnh vực thống kê. Đây là phương thức tốt nhất cho các vấn đề phân loại nhị phân (vấn đề với hai lớp giá trị).

Hồi quy logistic giống như hồi quy tuyến tính với mục đích là để tìm ra các giá trị cho các hệ số mà trọng lượng mỗi biến đầu vào. Không giống như hồi quy tuyến tính, dự đoán đầu ra được chuyển đổi bằng cách sử dụng một hàm không tuyến tính được gọi là hàm logistic.

Hàm logistic trông giống như một S lớn và sẽ biến đổi bất kỳ giá trị nào thành 0-1. Điều này rất hữu ích bởi vì chúng ta có thể áp dụng một quy tắc cho đầu ra của hàm logistic để tăng giá trị cho 0 và 1 (ví dụ IF ít hơn 0.5 sau đó đầu ra 1) và dự đoán một lớp giá trị.

Top 10 thuật toán machine learning dành cho newbie

Vì cách mô hình được học, các dự đoán thực hiện bởi hồi quy logistic cũng có thể được sử dụng như là xác suất của một ví dụ dữ liệu nhất định thuộc lớp 0 hoặc lớp 1. Điều này có thể hữu ích cho các vấn đề khi bạn cần đưa ra nhiều lý do cho một dự đoán.

Giống như hồi quy tuyến tính, hồi quy logistic hoạt động tốt hơn khi bạn loại bỏ các thuộc tính không liên quan đến biến đầu ra cũng như các thuộc tính tương tự nhau (correlated). Đó là một mô hình có thể học hỏi nhanh và có hiệu quả với các vấn đề phân loại nhị phân.

Tham khảo thêm các bài viết về Machine learning:

  Chia sẻ cơ bản sử dụng machine learning để giải quyết bài toán.
  Hiểu sâu về trí tuệ nhân tạo & Machine Learning tại Apple

3. Linear Discriminant Analysis – Phân tích phân loại tuyến tính

Hồi quy Logistic là một thuật toán phân loại truyền thống giới hạn vào các vấn đề phân loại hai lớp. Nếu bạn có nhiều hơn hai lớp thì thuật toán phân tích phân loại tuyến tính nên được ưu tiên.

Sự biểu hiện của LDA khá đơn giản. Nó bao gồm các thuộc tính thống kê của dữ liệu của bạn, được tính cho mỗi lớp. Đối với một biến đầu vào duy nhất, nó bao gồm:

  1. Giá trị trung bình cho mỗi lớp.
  2. Phương sai được tính trên tất cả các lớp.

Top 10 thuật toán machine learning dành cho newbie

Dự đoán được thực hiện bằng cách tính giá trị phân biệt cho mỗi lớp và dự đoán cho lớp đó có giá trị lớn nhất. Kĩ thuật giả định rằng dữ liệu có một phân bố Gaussian (bell curve), do đó tốt hơn là bạn nên loại bỏ các giá trị ngoại vi khỏi dữ liệu của bạn trước. Đây là một phương pháp đơn giản và mạnh mẽ để phân loại các vấn đề mô hình dự báo.

4. Classification and regression trees – Cây phân loại và hồi quy

Decision trees là một loại thuật toán quan trọng cho mô hình tiên đoán machine learning.

Sự biểu diễn của mô hình decision tree là một cây nhị phân. Đây là cây nhị phân của bạn từ các thuật toán và cấu trúc dữ liệu, không có gì quá ưa thích. Mỗi node đại diện cho một biến đầu vào duy nhất (x) và một điểm phân chia trên biến đó (giả sử biến đó là số).

Top 10 thuật toán machine learning dành cho newbie

Các node lá của cây chứa một biến đầu ra (y) được sử dụng để dự đoán. Các tiên đoán được thực hiện bằng cách đi trên các nhánh của cây cho đến khi đến một node lá và đưa ra lớp giá trị tại node lá đó.

Cây có thể học rất nhanh và có thể dùng để dự đoán rất nhanh. Chúng thường chính xác cho nhiều loại vấn đề và dữ liệu của bạn không cần bất kỳ sự chuẩn bị đặc biệt nào.

Tham khảo thêm: Tuyển lập trình viên Machine Learning lương cao

5. Naive Bayes

Naive Bayes là một thuật toán đơn giản nhưng mạnh mẽ về mô hình tiên đoán.

Mô hình bao gồm hai loại xác suất có thể được tính trực tiếp từ dữ liệu của bạn:

1) Xác suất của mỗi lớp;

2) Xác suất có điều kiện cho mỗi lớp với mỗi giá trị x.

Sau khi tính, mô hình xác suất có thể được sử dụng để đưa ra dự đoán cho dữ liệu mới bằng Định lý Bayes. Khi dữ liệu của bạn có giá trị thực, giả sử một phân phối Gaussian (bell curve) khá phổ biến nên bạn có thể dễ dàng ước tính được các xác suất này.

Top 10 thuật toán machine learning dành cho newbie

Naive Bayes được gọi là naive vì nó giả định rằng mỗi biến đầu vào là độc lập. Đây là một giả định mạnh mẽ và không thực tế đối với dữ liệu thực, tuy nhiên, kĩ thuật này rất hiệu quả trên một phạm vi rộng lớn với các vấn đề phức tạp.

6. K – Nearest Neighbors – KNN

Thuật toán KNN rất đơn giản và rất hiệu quả. Mô hình đại diện cho KNN là toàn bộ dữ liệu tập huấn. Đơn giản phải không?

Dự đoán được thực hiện cho một điểm dữ liệu mới bằng cách tìm kiếm thông qua toàn bộ tập đào tạo cho hầu hết các ví dụ K giống nhau (hàng xóm) và tóm tắt biến đầu ra cho các ví dụ K. Đối với các vấn đề hồi quy, đây có thể là biến đầu ra trung bình, đối với các vấn đề phân loại, đây có thể là mode (hoặc phổ biến nhất) của lớp.

Bí quyết là làm thế nào để xác định sự giống nhau giữa các trường hợp dữ liệu. Kĩ thuật đơn giản nhất nếu các thuộc tính của bạn có cùng kích cỡ (ví dụ tất cả đều là inch) là sử dụng khoảng cách Euclide, một con số bạn có thể tính toán trực tiếp dựa trên sự khác biệt giữa mỗi biến đầu vào.Top 10 thuật toán machine learning dành cho newbie có thể yêu cầu rất nhiều bộ nhớ hoặc không gian để lưu trữ tất cả dữ liệu, nhưng chỉ thực hiện tính toán (hoặc học) khi một dự báo là cần thiết, chỉ vừa đúng lúc. Bạn cũng có thể cập nhật và tổ chức các bài tập đào tạo theo thời gian để giữ các dự đoán chính xác.

Ý tưởng về khoảng cách hoặc độ gần có thể bị phá vỡ với các quy mô rất cao (rất nhiều biến đầu vào) có thể ảnh hưởng tiêu cực đến hiệu suất của thuật toán đối với vấn đề của bạn. Đây được gọi là lời nguyền của quy mô. Nó cho thấy bạn chỉ sử dụng những biến đầu vào có liên quan nhất đến dự đoán biến đầu ra.

7. Học Vector Quantization

Nhược điểm của K- Nearest Neighbors là bạn cần phải giữ nguyên bộ dữ liệu đào tạo của mình. Thuật toán Quantization về Vector (hay LVQ) là một thuật toán mạng thần kinh nhân tạo cho phép bạn chọn có bao nhiêu trường hợp đào tạo để treo lên và tìm hiểu chính xác những trường hợp này sẽ như thế nào.

Top 10 thuật toán machine learning dành cho newbie

Sự biểu diễn cho LVQ là một tập hợp các codebook vector. Chúng được lựa chọn ngẫu nhiên từ đầu và thích nghi để tóm tắt tốt nhất tập dữ liệu đào tạo qua một số lần lặp của thuật toán. Sau khi học được, các vector mã có thể được sử dụng để tạo ra các dự đoán giống như K- Nearest Neighbors. Các hàng xóm tương tự nhất ( phù hợp với codebook vector nhất ) được tìm thấy bằng cách tính toán khoảng cách giữa mỗi vector và ví dụ dữ liệu mới. Lớp giá trị hoặc (giá trị thực trong trường hợp hồi quy) cho đơn vị kết hợp tốt nhất sau đó sẽ được trả về như dự đoán. Kết quả tốt nhất đạt được khi bạn thay đổi dữ liệu của mình để có cùng phạm vi, chẳng hạn như giữa 0 và 1.

Nếu bạn phát hiện ra rằng KNN mang lại kết quả tốt trên tập dữ liệu của bạn, hãy thử sử dụng LVQ để giảm yêu cầu về bộ nhớ để lưu trữ toàn bộ tập dữ liệu đào tạo.

8. Support Vector machines

Support vector machines có lẽ là một trong những thuật toán machine learning phổ biến nhất và được nói về nhiều nhất.

Một hyperplane là một đường phân chia không gian biến đầu vào. Trong SVM, một hyperplance được chọn để phân tách tốt nhất các điểm trong không gian các biến đầu vào theo lớp của chúng, hoặc là lớp 0 hoặc lớp 1. Trong hai chiều, bạn có thể hình dung nó như một đường thẳng và giả sử rằng tất cả các biến đầu vào của chúng ta có thể được tách hoàn toàn bằng dòng này. Thuật toán SVM tìm ra các hệ số dẫn đến sự phân tách tốt nhất của các lớp theo hyperplance.

Top 10 thuật toán machine learning dành cho newbieKhoảng cách giữa hyperplane và điểm dữ liệu gần nhất được gọi là biên. Hyperplane tốt nhất hoặc tối ưu có thể tách riêng hai lớp là dòng có biên lớn nhất. Chỉ những điểm này có liên quan đến việc xác định hyperplane và trong việc xây dựng các điểm phân loại. Những điểm này được gọi là các vector hỗ trợ. Chúng hỗ trợ hoặc xác định hyperplane. Trong thực tế, một thuật toán tối ưu được sử dụng để tìm các giá trị cho các hệ số tối đa hóa biên.

SVM có thể là một trong những phương pháp phân loại hàng đầu mạnh mẽ nhất và đáng thử trên tập dữ liệu của bạn.

9. Bagging and Random Forest

Random Forest là một trong những thuật toán machine learning phổ biến nhất và mạnh nhất. Nó là một loại thuật toán machine learning được gọi là Bootstrap Aggregation hoặc Bagging.

Bootstrap là một phương pháp thống kê mạnh mẽ để ước lượng số lượng từ một mẫu dữ liệu. Chẳng hạn như một giá trị trung bình. Bạn lấy rất nhiều mẫu dữ liệu của bạn, tính giá trị trung bình, sau đó trung bình tất cả các giá trị trung bình của bạn để bạn ước lượng tốt hơn giá trị trung bình thật sự.

Trong bagging, cách tiếp cận tương tự được sử dụng, nhưng thay vì để ước lượng toàn bộ mô hình thống kê, thường là decision trees. Nhiều mẫu dữ liệu đào tạo của bạn được lấy sau đó các mô hình được xây dựng cho mỗi mẫu dữ liệu. Khi bạn cần dự đoán dữ liệu mới, mỗi mô hình sẽ dự đoán và các dự đoán được tính trung bình để ước lượng tốt hơn giá trị đầu ra thật sự.

Top 10 thuật toán machine learning dành cho newbie

Random forest là một sự tinh chỉnh trên phương pháp tiếp cận này, nơi các decision trees được tạo ra để thay vì chọn các điểm phân chia tối ưu, việc phân chia tối ưu được thực hiện bằng cách đưa ra sự ngẫu nhiên.

Các mô hình được tạo cho mỗi mẫu dữ liệu khác biệt nhiều so với chúng lẽ ra phải như thế, tuy nhiên vẫn chính xác theo những cách độc đáo và khác biệt. Kết hợp dự đoán của chúng dẫn đến một ước tính tốt hơn về giá trị đầu ra cơ bản.

Nếu bạn nhận được kết quả tốt với một thuật toán có độ biến thiên cao (như decision trees), bạn thường có thể nhận được kết quả tốt hơn bằng cách bagging thuật toán đó.

10. Boosting và AdaBoost

Boosting là một kĩ thuật đồng bộ nhằm cố gắng tạo ra một phương pháp phân loại mạnh từ một số phương pháp phân loại yếu. Điều này được thực hiện bằng cách xây dựng mô hình từ dữ liệu đào tạo, sau đó tạo ra một mô hình thứ hai cố gắng sửa lỗi từ mô hình đầu tiên. Các mô hình được thêm vào cho đến khi tập đào tạo được dự đoán hoàn hảo hoặc thêm một số mô hình tối đa.

AdaBoost là thuật toán boosting thành công đầu tiên được phát triển để phân loại nhị phân. Đây là điểm khởi đầu tốt nhất để hiểu về boosting. Các phương pháp boosting hiện đại xây dựng trên AdaBoost, đáng chú ý nhất là các máy boosting gradient ngẫu nhiên.

Top 10 thuật toán machine learning dành cho newbie

AdaBoost được sử dụng với các decision trees ngắn. Sau khi cây đầu tiên được tạo ra, hiệu suất của cây trên mỗi trường hợp huấn luyện được sử dụng để đo độ chú ý của cây kế tiếp được tạo nên chú ý đến từng trường hợp đào tạo. Dữ liệu đào tạo khó dự đoán sẽ có trọng lượng hơn, trong khi những trường hợp dễ dự đoán có ít trọng lượng hơn. Các mô hình được tạo theo thứ tự tuần tự, mỗi lần cập nhật các trọng số trên các trường hợp đào tạo ảnh hưởng đến việc học được thực hiện bởi cây kế tiếp trong chuỗi. Sau khi tất cả các cây được xây dựng, dự đoán được thực hiện cho dữ liệu mới, và hiệu suất của mỗi cây được đo lường bằng cách nó đã được về dữ liệu đào tạo.

Bởi vì rất nhiều sự chú ý được đưa ra để sửa sai lầm theo thuật toán, điều quan trọng là bạn phải có dữ liệu sạch với các giá trị biên.

Last Takeaway

Một câu hỏi điển hình được hỏi bởi những người mới bắt đầu, khi phải đối mặt với rất nhiều thuật toán machine learning, là “Tôi nên sử dụng thuật toán nào?” Câu trả lời cho câu hỏi thay đổi tùy thuộc vào nhiều yếu tố, bao gồm:

1) Kích thước, chất lượng và tính chất của dữ liệu;

2) Thời gian tính toán;

3) Tính cấp bách của nhiệm vụ;

4) Bạn muốn làm gì với dữ liệu.

Ngay cả một nhà khoa học dữ liệu giàu kinh nghiệm cũng không thể biết được thuật toán nào sẽ thực hiện tốt nhất trước khi thử các thuật toán khác nhau. Mặc dù có nhiều thuật toán machine learning khác, đây là những thuật toán phổ biến nhất. Nếu bạn là một newbie trong mảng machine learning, đây sẽ là một điểm khởi đầu tốt để tìm hiểu.

Tham khảo thêm: Tuyển lập trình viên Machine Learning lương cao

Topdev via Towardsdatasience

Update 10 Xu hướng tuyển dụng IT năm 2019 mà bạn không thể bỏ lỡ

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

“Có thể bạn chưa biết theo báo cáo thị trường IT do TopDev nghiên cứu có đến 58% các nhà tuyển dụng IT tiếp cận ứng viên tiềm năng qua kênh giới thiệu nội bộ (referral), 51% các nhà tuyển dụng sẽ sử dụng các kênh chính thống ( TopDev, VietnamWorks, ITViec,..). Hiện nay ngành tuyển dụng không đơn giản chỉ là đăng tin, chờ CV của ứng viên là phỏng vấn sẽ thành công. Năm 2019 sẽ mang đến một loạt xu hướng tuyển dụng IT mới có tác động đáng kể đến quá trình tuyển dụng của các công ty trong ngành. Bạn đã sẵn sàng cập nhật 10 xu hướng tuyển dụng IT này hay sẽ bị bỏ lại phía sau, hãy cân nhắc trước khi tiếp tục đọc!”

Xu hướng đầu tiên: Tiếp thị tuyển dụng (Recruitment marketing)

Một cách hiểu đơn giản, trong bán hàng marketing là chìa khóa mang lại số lượng đơn hàng lớn, doanh thu cao, và lợi nhuận tăng vọt,… Vậy đối với thị trường tuyển dụng recruitment marketing sẽ là quá trình nuôi dưỡng và thu hút các cá nhân tài năng vào tổ chức của anh/chị thông qua nhiều phương pháp và chiến thuật không khác gì một marketer đích thực.

Recruitment Marketing bao gồm việc áp dụng tất cả các nguyên tắc của marketing hiện đại như: truyền thông đa kênh, phân tích dữ liệu cùng các công nghệ tự động hóa để củng cố thương hiệu tuyển dụng và quảng bá EVP,..Chúng ta sẽ mô phỏng quá trình tuyển dụng dưới dạng “cuộc phiêu lưu đến miền đất hứa” của các ứng viên – việc này tương tự như lý thuyết về quy trình mua hàng trong marketing. Anh/chị sẽ có 3 giai đoạn chính lần lượt được gọi là:

Awareness (Thu hút nhận thức): Nhà tuyển dụng phải chủ động để tạo ra những điểm thu hút sự chú ý của ứng viên nhờ vào xây dựng thương hiệu tuyển dụng mạnh và các EVP hấp dẫn. Vậy vấn đề ở đây là nếu bạn đã có đội ngũ HR “xịn” và phúc lợi tốt cho ứng viên thì việc xây dựng thương hiệu cho nhà tuyển dụng có còn cần thiết?

  Xây dựng thương hiệu cho nhà tuyển dụng - Nên hay không?

Consideration (Sàng lọc): Từ nhóm các đối tượng quan tâm nhất định, nhà tuyển dụng cần có các tiêu chí sàng lọc theo đúng chuẩn mục tiêu và nhu cầu công việc sau đó hình thành từng chiến lược tiếp cận và chăm sóc phù hợp.

Interest (Duy trì): Anh/chị cần tối ưu các trải nghiệm của ứng viên trong quá trình tuyển dụng để duy trì tốt mối quan hệ lâu dài. Việc duy trì mối quan hệ với các ứng viên sẽ giúp bạn tạo ra cơ hội hợp tác trong tương lai và có một cơ sở dữ liệu giá trị.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Xu hướng thứ 2: Talent Pool

Talent pool đề cập đến một “danh sách” cơ sở dữ liệu nơi các nhà tuyển dụng và quản lý nhân sự có được một bảng danh sách tất cả các ứng cử viên tiềm năng hàng đầu của mình. Một talent pool tổng của doanh nghiệp bao gồm tất cả các hồ sơ ứng viên với nhiều Pools khác nhau mỗi Pool là một tiêu chí để phân loại ứng viên, có bốn pool tiêu biểu được đặt ra là địa điểm, vị trí công việc, năng lực và thời gian làm việc.

Hãy tưởng tượng nếu mỗi lần công ty open một công việc, anh/chị có sẵn một dữ liệu talent pool trong đó có thể chọn một người phù hợp nhất! Nghe thật tuyệt phải không? Đây là lý do tại sao nhiều nhà tuyển dụng đã áp dụng xu hướng này và bắt đầu xây dựng cơ sở dữ liệu ứng viên chất lượng cao cho nhu cầu hiện tại và tương lai.

Xu hướng thứ 3: Xây dựng thương hiệu nhà tuyển dụng

Thương hiệu nhà tuyển dụng là thuật ngữ thường được sử dụng để mô tả danh tiếng và sự phổ biến của một tổ chức bạn. Tên thương hiệu của bạn xuất hiện càng nhiều sẽ là nỗi ám ảnh lớn với đối thủ cũng là sức hấp dẫn mạnh cho các Developer. Đó là lý do rất nhiều doanh nghiệp trong ngành thường xuyên tham gia tài trợ hoặc đặt booth tại các sự kiện về công nghệ, hội chợ tuyển dụng IT,.. để truyền thông và thu hút nhân tài. Ý tưởng xây dựng thương hiệu tốt, là rất cần thiết để xây dựng một thương hiệu nhà tuyển dụng mạnh mẽ và hấp dẫn.

Nghiên cứu của LinkedIn đã chứng minh rằng hơn 75% người tìm việc nghiên cứu về uy tín của công ty và thương hiệu nhà tuyển dụng trước khi họ nộp đơn. Các công ty có tiếng xấu không chỉ phải đấu tranh để thu hút các ứng cử viên, mà họ còn đấu tranh để giữ “chân” nhân viên của mình. Và điều ngược lại sẽ đến với những công ty xây dựng được lợi thế từ thương hiệu tuyển dụng mạnh.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Một số sự kiện lớn dùng để làm Employer Branding tốt trong ngành IT là Vietnam Mobile Day 2019, Vietnam Web Summit 2019, TechExpo,..

Xu hướng thứ 4: Hợp tác tuyển dụng

Hợp tác với mệt kênh tuyển dụng IT chính thống (TopDev, ITViec, VietnamWorks…) là một phương thức tuyển dụng tiết kiệm thời gian và tăng năng suất. Trong đó phòng nhân sự sẽ làm việc cùng một kênh tuyển dụng uy tín để cùng tìm ra những ứng viên phù hợp nhất. Tất nhiên sẽ phải có sự chọn lựa và sàng lọc đối tác hợp lý thông qua nhiều lợi thế cạnh tranh mà họ cung cấp cho công ty bạn.

Bí quyết tuyển dụng IT thành công luôn quan trong nguồn CV “chất lượng” hơn “số lượng”, để tìm ứng viên tốt cũng giống như “vạch lá tìm sâu” điều này sẽ phụ thuộc vào cam kết và trách nhiệm của đối tác. Vì thế anh/chị cần sáng suốt trong vấn đề sàng lọc và lựa chọn những offer mang lại nhiều giá trị nhất cho công ty anh/chị. Hiện nay hợp tác tuyển dụng vẫn còn nhiều đất dụng võ vì nó cải thiện đáng kể chất lượng ứng viên, tiết kiệm thời gian và chi phí cơ hội.

Xu hướng thứ 5: Trải nghiệm ứng viên

Trải nghiệm ứng viên là tất cả những cảm nhận về ứng viên đối với công ty bạn từ lần tương tác đầu tiên. Nó dựa trên các cảm xúc, hành vi và thái độ mà ứng viên trải nghiệm trong toàn bộ quá trình tuyển dụng, từ tìm nguồn cung ứng và sàng lọc đến phỏng vấn và cuối cùng là gia nhập.

Bởi vì những ứng viên có trải nghiệm tích cực trong quá trình tuyển dụng sẽ có nhiều khả năng chấp nhận lời mời làm việc của bạn, và giới thiệu đến những mối quan hệ về công ty bạn. Mặt khác, một trải nghiệm ứng viên tiêu cực có thể khiến bạn tốn kém hơn khi mất nhiều thời gian và chi phiếu để tuyển lại ứng viên mới. Bạn có thể tham khảo “7 thủ thuật bỏ túi không thể bỏ qua khi tuyển dụng IT” để làm tăng tính trải nghiệm cho ứng viên.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Xu hướng thứ 6: Quản lý quan hệ ứng viên (CRM)

CRM là một hệ thống quản trị mối quan hệ khách hàng. Trong tuyển dụng CRM được xem là phương pháp để quản lý và cải thiện mối quan hệ với các ứng viên trong công việc hiện tại và tiềm năng trong tương lai. Nói một cách dễ hiểu các nhà tuyển dụng phải xây dựng và làm mới quy trình tuyển dụng của mình trong đó CRM là giai đoạn then chốt để thu hút và thuyết phục ứng viên tiềm năng đến với công ty họ.

Xu hướng thứ 7: Recruitment automation tools

Nói một cách đơn giản, các công cụ tự động hóa tuyển dụng là phần mềm sử dụng công nghệ mới giúp hợp lý hóa, đơn giản hóa và tự động hóa quá trình tuyển dụng, làm cho nó nhanh hơn và hiệu quả hơn. Tự động hóa quy trình tuyển dụng đã xuất hiện được một thời gian, nhưng bây giờ nó sẽ vượt xa HRIS, hệ thống theo dõi người nộp đơn (ATS) và Phần mềm tiếp thị tuyển dụng. Xu hướng mới là phần mềm cung cấp các công cụ 2 trong 1 – tích hợp cả giải pháp tiếp thị tuyển dụng và ATS dưới cùng một nền tảng. Đây là một lợi thế so với đối thủ cạnh tranh giúp bạn tiến bộ hơn và chiếm lợi thế hơn trong cuộc chiến tuyển chọn “nhân tài”.

Xu hướng thứ 8: Phỏng vấn cấu trúc

Trong ngành tuyển dụng chúng ta thường sử dụng phỏng vấn Face to Face có thể trực tiếp tại công ty hoặc qua Skype đối với các công ty nước ngoài. Anh/chị sẽ có một bảng hỏi hoàn thiện và đặt ra các câu hỏi đã được chuẩn hóa sau đó ghi nhận thông tin từ ứng viên. Phỏng vấn có cấu trúc đang trở thành loại phỏng vấn phổ biến nhất trong số nhiều nhà tuyển dụng. Tại sao? Đơn giản vì nó đem lại hiệu quả cao, có tính khách quan trong việc đánh giá, thể hiện sự công bằng giữa các ứng viên và được pháp luật bảo vệ.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Xu hướng thứ 9: Data-driven recruiting and HR Analytics

Đây là các biểu thức được sử dụng để thể hiện các phương pháp tuyển dụng trong đó lập kế hoạch và ra quyết định dựa trên dữ liệu có được thông qua HR technology như hệ thống theo dõi ứng viên (Applicants Tracking Systems) và nền tảng tiếp thị tuyển dụng (Recruitment Marketing Platforms).

Tương tự như hoạt động Marketing đang chuyển đổi mạnh mẽ sang hướng số hóa dữ liệu, hoạt động tuyển dụng nói riêng và nhân sự nói chung sẽ phụ thuộc ngày càng nhiều vào các cơ sở dữ liệu. Josh Bersin – một chuyên gia nhân sự hàng đầu thế giới nhận định: “Những gì chúng ta không đo lường được, chúng ta sẽ không thể quản lý được”. Việc chú ý đến các phân tích dữ liệu của HR và sử dụng data-driven recruiting đã được chứng minh để cải thiện một số chỉ số tuyển dụng quan trọng nhất như thời gian, chi phí và chất lượng tuyển dụng.

Xu hướngthứ 10: Giới thiệu nội bộ

Đã có rất nhiều số liệu chứng minh hiệu quả vượt trội của việc tuyển dụng nhân viên thông qua giới thiệu từ nội bộ. Họ cho biết họ phương thức giới thiệu nội bộ (Referral) rất phổ biến và được HR áp dụng cho tất cả các vị trí, đặc biệt là các vị trí IT. Tuyển dụng IT từ nguồn CV giới thiệu nội bộ nghe có vẻ truyền thống nhưng luôn mang lại hiệu quả nhất định vì thế trong suốt nhiều năm qua nguồn nội bộ luôn nằm trong top xu hướng tuyển dụng nhân sự mới. Để kích thích được sự chủ động từ các nhân viên tài năng trong công ty bạn có thể đưa ra những đề nghị chiết khấu hấp dẫn nếu giới thiệu được ứng viên thành công.

Từ 10 xu hướng tuyển dụng trên bạn có thể nghiên cứu và ứng dụng những phương thức phù hợp với quy trình tuyển dụng của công ty mình.

Deep learning là gì? Những quan niệm sai lầm về Deep Learning

deep-learning-la-gi

Machine Learning đang rất được cộng đồng quan tâm. Theo trang towardsdatascience Sự bão hòa thông tin trên các phương tiện truyền thông, đang che dấu những sự thật đằng sau đó.

Hy vọng bài viết này có thể làm sáng tỏ một số những quan niệm sai lầm về ML. Quan trọng hơn là làm rõ một số quy trình của deep learning cũng như nguyên nhân tại sao nó hoạt động tốt trong một số lĩnh vực như xử lý ngôn ngữ tự nhiên (NLP), nhận diện hình ảnh, và dịch ngôn ngữ trong khi lại không thành công ở những mảng khác.

Deep Learning không phải là phép thuật

Truyền thông thường miêu tả deep learning như là một công thức ma thuật cho tất cả các vấn đề của cuộc sống. Trong thực tế, nó hoàn toàn ngược lại. Hơn nữa, deep learning luôn có những hành vi kỳ lạ mà tới giờ chúng ta vẫn không giải thích hết được.

Bằng cách yêu cầu bằng chứng và lập luận trong quá trình phát triển của mình, bạn có thể xây dựng một framework mạnh mẽ từ hằng hà các mô hình khác nhau.

Những Quan Niệm Sai Lầm Về Deep Learning

Mọi thứ đều có mục đích

Một trong những vấn đề đầu tiên mà những người mới hay mắc phải là việc cứ gộp chung LSTM (Long Short-Term Memory) layers, GRU (Gated Recurrent Unit) layer và vài layer lẻ tẻ khác lại với nhau rồi chờ kết quả xảy ra một cách thần kì. Họ cần phải nhận ra rằng deep learning đòi hỏi cách tiếp cận hợp lý hơn nhiều.

Bằng cách áp dụng một phương pháp dựa trên sự tích hợp của dữ liệu, network design và sự tò mò, bạn sẽ tạo ra các kết quả phi thường. Tôi dành thời gian mỗi ngày để đọc các bài báo về những phương pháp mới nhất và liên tục nhìn thấy rất nhiều thiết kế vô cùng thông minh.

Trong deep learning, layer khác nhau có các mục đích khác nhau. Đây là một khái niệm đơn giản mà thường bị quên bởi những người mới biết về deep learning. Hơn nữa, trong khi tôi có thử nghiệm rất nhiều trong quá trình thiết kế, tôi luôn luôn kiểm tra chúng rất kĩ lưỡng.

Cần có một lý do (hoặc ít nhất là một giả thuyết) hợp lý cho việc bạn thêm một yếu tố mới. Nó nên được kiểm tra với một thước đo rõ ràng, và chỉ sau đó tôi mới chấp nhận đưa nó vào phiên bản chính thức. Ngoài ra, bạn nên lựa chọn các mô hình đơn giản thay vì phức tạp nếu chúng đều đạt được những kết quả tương tự. Các hệ thống nhỏ và đơn giản hơn cũng có nghĩa là quá trình đào tạo chúng sẽ nhanh hơn cũng như là kết quả thu được sẽ rất tối ưu.

Có những công cụ mà bạn có thể tạo ra để thử nghiệm những ý tưởng cho network design, và nó sẽ giúp bạn hiểu rõ hơn về bản chất của chúng. Khi bạn làm việc nhiều hơn với Neural Networks, bạn cũng đang bắt đầu nắm rõ hơn về những gì thúc đẩy hành vi của nó đối với một hành động cụ thể. Mọi thứ chỉ thật sự rõ ràng khi bạn có phương pháp đo đạc chính xác.

Quá trình thiết kế

Tôi nghĩ về quá trình thiết kế cũng giống như cách một đứa trẻ cố gắng xây dựng một cái tháp bằng lego. Thử – ghép – thất bại – thử ( luôn luôn test liệu nó có phù hợp không)

Liệu rằng là layer thứ hai có lay?  Có nên thay đổi phần cơ cấu không? Sẽ rất hữu ích khi bạn nghĩ đến việc tối ưu hóa lượng mảnh ghép. Bởi quy mô càng nhỏ, thì bạn càng có thể thực hiện nó nhanh hơn cũng như kiểm tra dễ dàng hờn. Vì vậy chỉ thêm khi bạn thật sự cần thiết.

Trong deep learning, một vấn đề có vô số các giải pháp giải quyết – Sự phức tạp có khuynh hướng khiến cho ứng dụng bị “bùng nổ” nhanh chóng, và sự gia tăng yêu cầu phức tạp cũng sẽ dẫn tới gia tăng sự kiểm soát. Ví dụ, một pipeline phân tích dữ liệu thăm dò đơn giản có thể là:

NHẬP DỮ LIỆU → LÀM SẠCH DỮ LIỆU → CHUYỂN DỮ LIỆU → HIỂN THỊ DỮ LIỆU

Mỗi bước trên có thể bao gồm nhiều bước nhỏ khác nhau trong đó. Nếu tôi không đảm bảo chất lượng của các quy trình trước thì toàn bộ hệ thống sẽ thất bại bởi data nhận được sai hoàn toàn. Vì vậy, luôn phải kiểm tra từng bước trong quá trình.

Nói cách khác, phải test tất cả mọi thứ – inputs, outputs, classes, functions. Mục tiêu đặt ra là phải đảm bảo mọi thứ hoạt động tốt dù là độc lập hay cùng nhau. Đây không phải là một ý tưởng đột phá gì, nhưng nó thật sự cần được chỉ ra để mọi người hiểu rõ tầm quan trọng của việc này.

Trong deep learning, tôi bắt đầu bằng cách tạo ra mô hình đơn giản nhất. Khi phải dụng tới task phân loại văn bản, tôi sẽ bắt đầu với phiên bản đơn giản nhất của mô hình Embed-Encode-Attend-Predict.

Sau khi nhìn thấy mô hình nền tảng này hoạt động như thế nào, tôi mới bắt đầu xây dựng dựa trên nó. Có thể là tăng kích thước của các layers ẩn, làm sâu thêm network, hay nhập với các network mới cũng như là thay đổi tags và các dữ liệu số khác. Danh sách cứ thế kéo dài tới gần như là vô tận.

Với từng bước, tôi thử để nó chống lại mô hình ban đầu của mình. Quá trình này cho phép tôi nhìn lại sự thay đổi của mô hình, hiểu được nó tốt hơn ở đâu và đưa ra các thay đổi phù hợp cho phiên bản tương lai cũng như đạt tiêu chuẩn đặt ra.

Hãy làm chủ dữ liệu của bạn

Trước khi bạn bắt đầu thử nghiệm với mô hình deep learning của mình, bạn cần hiểu rõ giá trị của nó nằm ở đâu. Có một hệ thống phân chia cấp bậc đơn giản như sau:

Dữ liệu quan trọng hơn model design, và model design quan trọng hơn tối ưu hóa thông số.

Nếu công ty A có mười lần dữ liệu của công ty B, không có mô hình nào trong thế giới này sẽ cho phép công ty B vượt mặt công ty A. Điều này cũng tương tự với chất lượng dữ liệu.

Nếu tôi dành hàng tuần để phát triển mô hình dựa trên dữ liệu có chất lượng thấp, nó sẽ kém hơn mô hình mà tôi đã xây dựng trong vài ngày sau khi có dữ liệu chất lượng cao. Luôn tự hỏi rằng liệu mình có thể nhận được nhiều dữ liệu hơn hay không trước khi dành thời gian cho việc tạo mô hình. Có lẽ bạn có thể thay đổi các bước tiền xử lý để nâng cao chất lượng dữ liệu. Điều này thường dẫn đến hiệu suất nhanh hơn so với việc chỉ điều chỉnh mô hình thôi.

Bạn không chỉ cần dữ liệu có chất lượng cao, mà bạn cũng cần phải hiểu rõ về nó. Bạn nên dành thời gian phát triển các công cụ để phân tích và nghiên cứu dữ liệu nhập của mình. Tránh lối mòn trong suy nghĩ về dữ liệu như là một đầu vào.

Tất cả dữ liệu có các tính năng ẩn chứa sức mạnh dự đoán to lớn nếu bạn có thể trích xuất chúng. Đôi khi bạn phải tự làm điều này, đôi khi bạn có thể phát triển mô hình deep learning theo cách mà nó có thể làm được điều này một mình. Hãy suy nghĩ về dữ liệu của bạn như là một đầu vào cho một thuật toán mật mã – nhưng thay vì mã hóa một văn bản hoặc email, nó là mã hóa cách thế giới hoạt động. Mỗi điểm dữ liệu là một đầu mối để hiểu rõ hơn.

Phân loại văn bản trong NLP là một ví dụ hoàn hảo. Bạn được cung cấp hàng trăm hoặc hàng ngàn từ, và mỗi văn bản có một class hoặc nhiều class. Có lẽ class này là tích cực, tiêu cực, hoặc trung lập, và có lẽ bạn có hàng trăm class phức tạp. Dù bằng cách nào, văn bản sẽ là code mà chúng tôi sử dụng để xác định kết quả đầu ra.

Khi bạn thật sự suy nghĩ về dữ liệu và hiểu được giá trị của chúng thì kết quả đạt được sẽ rất phi thường. Bởi suy cho cùng deep learning là dựa trên mức độ hiểu biết của chúng ta về dữ liệu.

Dành thời gian với các chuyên gia về Domain

Điều này có liên quan đến phần trước và thậm chí còn quan trọng hơn – dành thời gian để nói chuyện với những người có kiến ​​thức về tên miền. Thảo luận kết quả của bạn với họ, thảo luận về dữ liệu với họ. Thu hút sự chú ý của họ trong quá trình thiết kế.

Bạn sẽ bị sốc khi biết việc này sẽ có ích tới dường nào. Bởi những insight cũng như ý kiến từ họ luôn có độ chính xác cao đến kinh ngạc. Nếu bạn không có chuyên gia về miền, hãy dành thời gian để tự học. Tránh cố gắng xây dựng một mô hình deep learning cho một vấn đề bạn không hiểu.

Loại bỏ ý tưởng rằng deep learning giống như việc đi qua một mê cung dựa vào linh tính. Trong thực tế, bạn có thể đặt được sự “hoàn hảo” trong  deep learning bằng cách làm theo đúng phương pháp và cố gắng giải quyết những vấn đề chính xác. Hãy luôn tự hỏi bản thân vì sao lại như vậy?

Mặc dù phương pháp tôi mô tả có thể trái ngược với ý tưởng thiết kế dựa trên số liệu, nhưng tôi thấy nó lại thật sự rất hiệu quả khi bạn bắt tay vào làm. Đôi khi chỉ có thực hành mới đem lại cho ta sự hiểu biết tường tận hơn là chỉ nhìn vào số liệu.

Học như trẻ nhỏ

Khi tôi kiểm tra một thay đổi trong thiết kế, tôi cố gắng tìm ra lý do tại sao nó hoạt động. Phương pháp này cho phép tôi tiếp tục nâng cao hiểu biết của mình. Tôi có thể không phải là một chuyên gia, nhưng với thời gian, mọi chuyện điều có thể miễn bạn luôn cố gắng bám theo nó.

Tôi tiếp tục hỏi lý do tại sao cho đến khi cảm thấy đã thực sự hiểu tường tận cho quyết định đó. Thường thì một câu hỏi luôn dẫn đến câu hỏi khác, và vài ngày sau bạn có một sự hiểu biết mới và sâu sắc về một loạt các khái niệm. Sau đây là một ví dụ khá điển hình cho trường hợp trên:

  •    Tại sao nên sử dụng một LSTM để mã hóa các câu của tôi?
  •    Làm thế nào để một LSTM hoạt động?
  •    Cách tốt nhất để regularize một LSTM là gì?
  •    Tôi nên decode các trình tự từ đầu ra LSTM như thế nào?
  •    Liệu một GRU có thể hoạt động tốt hơn hay nhanh hơn LSTM? Tại sao?
  •    Tôi nên khởi tạo các layer LSTM theo cách nào? Tại sao?
  •    LSTM này chậm, liệu tôi có thể tăng tốc độ nó lên không?
  •    Tại sao một LSTM truyền thống lại hoạt động chậm hơn nhiều so với một layer LSTM tối ưu hóa Cuda trên GPU?

Tôi gọi chúng là những lỗ thỏ vì con đường học tập là ngẫu nhiên và không chắc chắn ngay từ đầu. Đã từng tôi chỉ để cho bản thân mình khám phá những câu hỏi tôi có. Thật ra tôi không lo lắng rằng nó là lộn xộn. Phương pháp này là cách tôi đã học được mọi thứ từ trước tới nay trongcuộc đời của mình, và nó luôn luôn đưa tôi đến đúng nơi.  Tuy vậy, cách tiếp cận này có nhược điểm là mất nhiều thời gian, nhưng phần lớn các nhà khoa học dữ liệu sẽ không hề ngại vấn đề này.

Hỏi đúng câu hỏi

Xác định đúng vấn đề trong deep learning là điều thiết yếu. Deep learning rất giỏi về ngôn ngữ, phân loại hình ảnh, dịch lời nói, thông dịch cho máy và game (cờ tướng, Starcraft). Nó kém hiệu quả hơn ở các lĩnh vực machine learning truyền thống như phát hiện gian lận trong thẻ tín dụng, định giá tài sản và chấm điểm tín dụng.

Có lẽ trong tương lai, chúng ta sẽ có các mô hình hoàn hảo hơn, với những phương pháp tối ưu hóa để làm cho deep learning được áp dụng rộng rãi hơn nhưng hiện tại nó vẫn còn rất giới hạn.

Lý do mà deep learning có khả năng thực hiện những task phức tạp là nhờ vào các mô hình. Với tất cả các bước trong phân tích và liên kết dữ liệu. Một mạng thần kinh nhân tạo sẽ tìm ra và khai thác những dữ liệu này theo cách mà không con người nào có thể làm được.

Hơn nữa, trong khi machine learning truyền thống cũng có thể được áp dụng cho các lĩnh vực này, chúng lại rất hạn chế và không có hiệu quả cao. Đó là lí do vì sao network của machine learning không có được khả năng phân tích tốt với số lượng dữ liệu lớn như deep learning.

Những Quan Niệm Sai Lầm Về Deep Learning

 

Hoang tưởng đôi khi cũng là cần thiết

Chủ đề cuối cùng và có lẽ là quan trọng nhất – Làm thế nào để đảm bảo mô hình của bạn hoạt động tốt? Thật không may bởi không có một giải pháp duy nhất nhưng có những tiêu chí mà bạn có thể dựa vào đó để đánh giá.

Khi thiết kế một mạng lưới, tôi thường nghĩ là nó không hoạt động chính xác. Tôi liên tục tự hỏi liệu các điểm số có đang đánh lừa mình, hoặc có những lỗi hiếm gặp mà tôi không lường trước được. Kết quả là, tôi xây dựng các công cụ xem xét và kiểm tra theo nhiều cách.

Vấn đề là phải nhận ra rằng mô hình của bạn sẽ rất phức tạp cũng như là ta sẽ chỉ hiểu được một phần của quá trình đưa ra quyết định. Đôi khi bạn học được một ít về mô hình của mình và cách kiểm soát chúng.

Đôi khi bạn phải chấp nhận rằng nó không phải lúc nào cũng hiệu quả. Vấn đề thường là giảm nhẹ chứ không phải là loại bỏ. Bất kỳ hệ thống deep learning nào cũng có hệ thống kiểm soát chất lượng thông minh (QA) đứng phía sau. Hệ thống kiểm soát chất lượng đó hoạt động như là hàng phòng vệ cuối.

Bằng cách sử dụng các quy trình QA thích hợp, bạn sẽ có được các số liệu cần thiết cũng như là liên tục cải tiến bản thân và mô hình của bạn. Và như vậy, tỷ lệ thành công của chúng ta sẽ tăng lên rõ rệt.

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

  Muốn biết cách thức hoạt động của Deep Learning? Hãy đọc hướng dẫn nhanh sau!
  5 cách mà Deep Learning ảnh hưởng đến cuộc sống của bạn
  Hiểu thêm về Deep Learning thông qua 12 khóa học online miễn phí

10 thói quen của một lập trình viên thành công

10-thoi-quen-cua-lap-trinh-vien-thanh-cong

Tôi có may mắn được trò chuyện với một số lập trình viên vĩ đại. Tôi gặp họ tại các hội nghị hay trong các buổi ăn tối dành cho nhà tài trợ – nơi mà người tham dự bình thường không được vào. Họ là những người bạn theo dõi trên Twitter. Trong những buổi ấy, họ thoải mái chia sẻ ý kiến ​​và bàn luận về các những câu chuyện thời chiến đại – những thói quen developer thành công.

Qua những buổi nói chuyện cộng thêm những quan sát cá nhân của tôi qua nhiều năm, đã khiến tôi tin rằng chắc chắn có một số bí mật tạo nên thành công của các lập trình xuất sắc. Cùng TopDev lắng nghe chia sẽ của một trong những lập trình viên vĩ đại trên  Webapplog mà tôi được biết.

Bây giờ, bạn có muốn trở thành lập trình viên xuất sắc, tạo ra những sản phẩm để đời được mọi người yêu thích, hay muốn tự giết bản thân bằng việc bằng lòng với chính mình?  nếu vậy hãy bỏ qua bài viết này và tự tìm cách của riêng bạn.

1. Chia sẻ công khai code do bạn viết càng nhiều càng tốt

Bằng cách chia sẻ công khai code của bạn, bạn trở nên đáng tin hơn trong mắt của mọi người (ít nhất là đối với những người đang sử dụng GitHub) và giúp code của bạn tốt hơn từng ngày.

2. Sử dụng Command-line khi có thể

Thông thường, giao diện command-line cung cấp cho bạn nhiều tính năng hơn bất kỳ GUI nào. Hơn nữa, nếu ứng dụng yêu thích của bạn không được hỗ trợ nữa, bạn sẽ cần phải tìm hiểu một công cụ mới; trong khi với CLIs, thường không thể thay đổi. Ngoài ra, bạn có thể làm trên nhiều servers. Một điểm nữa: Nếu làm được, cấp dưới của bạn có thể sẽ nghĩ bạn là một hacker thật sự đấy.

3. Đọc sách làm một thói quen developer

Hầu hết mọi người không đọc nhiều sách, các lập trình viên không phải là ngoại lệ. Một cuốn sách là một là một hình thức ôn tập kiến ​​thức. Tôi thích sách hơn video vì tôi có thể đọc với tốc độ nhanh hơn và không bị phân tâm bởi các video nhảm nhí khác trên YouTube luôn chạy dọc theo các video công nghệ mà tôi đang xem, hay những nhân vật hoạt hình ngớ ngẩn trong một số khóa học Udemy hoặc thậm chí đường truyền (voice, chất lượng video , v.v…).

Do đó, tôi thường đọc hay nghe ít nhất 1 cuốn sách một tuần.

4. Viết nhật kí làm việc

Viết nhật ký làm việc, giúp ghi lại những thành tích của bạn cũng như các bài học kinh nghiệm. Hay tốt hơn, bạn nên để một quyển tạp chí code tại nơi bạn ghi chép lại những điều bạn đã làm và không làm. Viết nhật kí làm việc thật sự rất rẻ và tốt đấy các ông.

5. “Chăm chỉ” giao tiếp hơn

Email là một sự lựa chọn tệ trong giao tiếp. Các ứng dụng nhắn tin còn tệ hơn rất nhiều lần. Emoji giúp người chat biểu lộ nhiều cảm xúc hơn nhưng hiệu quả không lớn. Ngược lại, giao tiếp trực tiếp có thể giúp bạn dễ dàng truyền tải ý tưởng của bạn một cách rõ ràng nhất, kể cả những nội dung phức tạp nhất cũng có thể được giải thích rõ ràng để cho một bé học sinh lớp 5 hiểu “ gật gù “. Giả sử bạn gặp một người đang bị phân tâm, chịu áp lực, hay thiếu ngủ, hãy trò chuyện với họ bằng ngôn ngữ đơn giản nhất có thể. Hãy liệt kê các ý theo gạch đầu dòng và nhấn mạnh những điểm quan trọng bằng cách in đậm và TL; DRs.

Thay vì gửi email, đặc biệt khi bạn biết rằng vấn đề ấy có thể mất nhiều hơn 1 email để trình bày, hãy thường xuyên nói chuyện với mọi người qua điện thoại hoặc đi đến bàn làm việc của họ nếu hai bạn ở cùng một văn phòng, (Đôi khi bạn có thể cài đặt lại email của bạn để chỉ nhận được một phản hồi từ người khác thay vì 7 email qua lại … Bạn không nên xem email như một ứng dụng nhắn tin và cố gắng giữ chúng ngắn gọn nhất có thể).

  Đằng sau thành công của một Tập đoàn Tech: Xem trọng Software developer hơn cả tiền bạc

6. Luôn có một lịch trình cho mọi buổi họp

Mọi người thường xuyên nhắn cho tôi trên LinkedIn hoặc qua email để hẹn tôi uống cà phê hoặc một buổi trò chuyện qua điện thoại. Tất cả họ đều là người lạ. Tôi hầu như luôn luôn hỏi lịch trình để tôi tự đặt ra những kì vọng và mục tiêu cho dù mục đích mời tôi của chương trình là tuyển dụng cho Capital One, giúp đỡ sự nghiệp của họ hoặc cùng họ xây dựng một dự án.

7. Tìm hiểu về Touch Typing

Điều này quá rõ ràng. Chúng ta đang dành thời gian cho những việc gì? Gần như 70-90% ngày làm việc (và kể cả những ngày nghỉ) của chúng ta đều phải đánh máy? Tôi phải há hốc mồm mỗi khi nhìn thấy các đồng nghiệp IT hay tech không đánh máy, thậm chí bằng bàn phím QWERTY. Nếu bạn muốn giỏi hơn những người khác, hãy học Colemak. Đó là thứ tôi đã sử dụng.

8. Sử dụng những công cụ tốt nhất

Bạn phải sử dụng các công cụ tốt nhất. Những thứ như editor, IDEs, thư viện, thiết bị (máy tính), bàn + ghế, WiFi, v.v… Nếu những thứ bạn đang sử dụng không thực sự tốt, bạn sẽ không tài nào có thể tập trung và làm việc hiệu quả trong nhiều giờ.

9. Tránh bị sao nhãng

Tránh theo đuổi những công cụ hào nhoáng được PR là giúp giảm khối lượng công việc khổng lồ của bạn. Bạn nên sử dụng các editor siêu cũ hoặc WiFi cực chậm nhưng vẫn có thể truyền tải hàng tấn code , thay vì sử dụng các công cụ có nền tảng siêu lớn và không thể làm được gì hữu ích.

10. “Làm chủ” các phím tắt

Mỗi giây bạn rút ngắn được có thể giúp bạn tiết kiệm được hàng giờ đồng hồ mỗi ngày . Bạn sẽ đỡ mệt mỏi hơn và có thể làm được nhiều thứ hơn khi sử dụng các phím tắt trong các hoạt động thường ngày như sao chép / dán, tạo mới, tìm, v.v..

Bonus: Tắt thông báo

Mỗi trường hợp ở trên làm bạn mệt mỏi hơn, đồng thời cũng làm giảm chất lượng code của chúng tôi. Chúng ta gần như không thể giải quyết các vấn đề phức tạp và trừu tượng nếu không tập trung cao độ.

Thôi được rồi, bài viết đã hơn 10 điều nhưng … tôi thích thế 🙂 Vậy bí quyết (hoặc thói quen không bí mật lắm) của bạn là gì? Hãy nhận xét bên dưới để chúng tôi biết nhé.

  29 đầu sách mà bất cứ lập trình viên nào cũng phải đọc qua

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

FabricJS (Canvas library) và xây dựng tool chế ảnh – thư viện Javascript

fabric-javscript

Yeah, quay lại series Javascript World đầy hào hứng thật ra thất nghiệp ở nhà viết bậy bạ chơi.  Nay mình giới thiệu cho các bạn 1 library thao tác trên Canvas – FabricJS. Rồi sử dụng thư viện này làm tool chế ảnh đơn giản như Haivl ngày xưa!

Bài viết này không có nhận được xu nào từ FabricJS, Nếu ai đó làm ở FabricJS đọc được tiếng Việt thì có thể liên hệ tui quảng cáo nhé.

Lên kế hoạch thao tác Fabric Javascript

Các nhân vật xuất hiện

  • Bootstrap – Hậu cần xây dựng hậu trường, bối cảnh
  • FabricJS – Nhân vật chính
  • Google & Stackoverflow – Đạo diễn

Tìm hiểu nhân vật chính

Trang chủ : http://fabricjs.com/
Trước khi đọc dòng này thì chắc chắn rằng bạn đã vào trang chủ của nhân vật chính để hiểu sơ sơ về nhân vật chính tham gia bộ tool chế ảnh này nhé. Hehe

Lên kịch bản

Sản phẩm cuối cùng giống giống cái tool chế ảnh này: http://xem.vn/builder/meme/6
Link để chơi thôi không coi cũng không sao đâu! Đây giao diện cuối cùng của app

Hơi xấu, nhưng chịu khó nhìn cũng được

Tiến hành thôi

Chương trình khá lớn nên tui chia ra 1 file HTML (index.html), 1 file JS để xử lý (tool.js), 1 đống file hình ảnh làm Background cho Canvas. Hình là nguồn tài nguyên quý giá và vô tận bạn có thể tìm kiếm trên google mà chưa phải trả phí. Nếu bạn muốn trả phí thì nó không thuộc phạm trù bài viết này

Dựng hậu trường (index.html)

Khúc đầu

Một số thư viện và style nho nhỏ

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <link type="text/css" rel="stylesheet" href="http://getbootstrap.com/dist/css/bootstrap.min.css" />
    <script src="https://code.jquery.com/jquery-1.11.3.js"></script>
    <script src="http://fabricjs.com/lib/fabric.js"></script>
    <style>
        canvas{
            border: 1px solid #ccc;
            margin: auto;
        }
        .canvas-container{
           margin: auto;
        }
        .thumbnail{
         height: 163px;
        }
    </style>
</head>

Khúc body 6 múi

Giao diện, chia

<body>
<h1 class="text-center">Tool chế ảnh</h1>
<div class="container">
<div class="row">
<div class="col-lg-8">
<h2>Canvas</h2>
<div>
                <canvas width="600" height="400"  id="canvas"></canvas>
            </div>
</div>
<div class="col-lg-4">
<div class="row">
<h2>Editor <a  id="ctrlSave" href="#"><i class="glyphicon glyphicon-save"></i></a></h2>
</div>
<div class="row">
<h3>Text</h3>
<div class="row">
<div class="col-lg-12">  
                         <div class="input-group">
                          <input id="ctrlText" type="text" class="form-control" placeholder="Text">
                          <div id="ctrlAddText" class="input-group-addon"><i class="glyphicon glyphicon-send"></i></div>
                        </div>
                    </div>
 
</div>
</div>
 
<div class="row">
<h3>Background</h3>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg1.jpg" />
</div>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg2.jpg" />
</div>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg3.jpg" />
</div>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg4.jpg" />
</div>
</div>
</div>
</div>
</div>
<script src="js/tool.js"></script>
</body>
</html>

Ta sẽ tập trung vào một số đối tượng class thumbnail, id : canvas, ctrlText, ctrlAddText, ctrlSave

Click thumbnail -> set background Canvas
Click ctrlAddText -> lấy text (value) của ctrlText thêm vào Canvas
Rồi kéo thả chữ vào vị trí các kiểu =))
Click ctrlSave -> Canvas chuyển thành file Hình ảnh rồi tải xuống máy người dùng

Xem việc làm javascript đãi ngộ tốt trên TopDev

Action (tool.js)

Khởi tạo đối tượng Canvas

var canvas = new fabric.Canvas('canvas', {});

Hãy tưởng tượng fabric là nhà máy sản xuất người mẫu. Canvas là người mẫu, còn các hoạt động khác nhằm lên đồ, trang điểm, trang phục các kiểu cho người mẫu này.

Đối tượng xử lý phần Background

var BackgroundImage = {
setEvent: function(){
$('.thumbnail').click(function(){
BackgroundImage.handleEvent(this)
})
},
handleEvent: function(imgElement) {
var src = $(imgElement).attr('src')
    fabric.Image.fromURL(src, function(oImg) {
       canvas.setBackgroundImage(oImg, canvas.renderAll.bind(canvas))
       canvas.setWidth(oImg.width);
       canvas.setHeight(oImg.height);
    });
}
}

Đây là phần mặc đồ cho người mẫu canvas. Ta sẽ chọn những bộ đồ từ mấy .thumbnail. Có cái hơi kỳ, đồ thì nhiều size, nhưng người mẫu thì chỉ có 1 nên người mẫu phải ăn uống tăng giảm ký (setWidth), giảm chiều cao (setHeight) cho vừa với bộ đồ! Haha

Đối tượng xử lý Text

Đối tượng xử lý Download

Lưu ý nhỏ : #ctrlSave phải là thẻ a, chỉ có thể là thẻ a, không gì khác ngoài thẻ a. Vì thế mới set vào thuộc tính href + download.

Khởi tạo Chương trình

Lời kết

Source code thì mình có để ở đây, bạn nào lười đọc có thể vào đây coi, cứ vào đây: Link 16 phút

Mình cũng có viết 1 tool chế ảnh tương tự cũng trên thư viện này, cũng phong cách code này, nhưng bự và bừa bãi hơn nhiều! ( Nên nay mình cũng muốn chia sẽ nhẹ thôi, không muốn phức tạp hóa công cụ gì hết, các bạn cứ thỏa sức tỏa sáng tạo trong việc lập trình. Hehe.

TopDev Via Codedem

Tham khảo các vị trí tuyển dụng lập trình viên hấp dẫn tại Topdev

Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains

symphony-docker

Tác giả: Artem Henvald

Có những tình huống khi Symfony cần định tuyến dựa trên tên miền phụ. Ví dụ, khi chúng ta phân phối các cụm chức năng khác nhau trong một dự án hoặc một kho lưu trữ. Giả sử, ngoài API, có một phần quản trị được viết trong các gói Symfony hoặc một số chức năng cho các url truy cập công khai từ phía máy khách.

Dưới đây là một số tùy chọn:

  • api.project-name.work: một máy chủ API cho các ứng dụng khách (web và các máy khách di động).
  • hub.project-name.work: một máy chủ được sử dụng để kết nối ngược với một máy khách di động khi một số tính năng cần có sẵn URL từ trình duyệt. Ví dụ: trong trường hợp tính năng đặt lại mật khẩu, tính năng xác nhận email, tính năng hủy đăng ký email, xử lý móc nối web từ hệ thống thanh toán, xử lý chuyển hướng hệ thống thanh toán và các trang như thỏa thuận người dùng hoặc điều khoản và điều kiện sẽ mở từ trình duyệt hoặc từ chế độ xem web trong ứng dụng dành cho thiết bị di động. Bạn có thể chia tất cả chức năng này thành các tên miền phụ nếu bạn cần. Nhưng nó là không hợp lý để lưu trữ tất cả các công cụ này trên tên miền phụ API vì nó không liên quan đến các truy vấn của khách hàng và trong hầu hết các trường hợp có một phương thức xác thực khác với API. Các tên miền con với tên ‘hub’ rất phổ biến trên các dịch vụ khác nhau cho các tính năng cùng loại.
  • admin.project-name.work: một máy chủ nơi phần quản trị được lưu trữ. Thật thuận tiện khi bảng quản trị viên được thực hiện bằng văn bản trong Symfony trong cùng một kho lưu trữ với mã API. Các thực thể phổ biến được sử dụng, và cả Symfony thuần hoặc một số gói quản trị có sẵn (như SonataAdminBundle, EasyAdminBundle, vv) đều có thể thực hiện được. Nó rất tiện lợi khi bạn phân phối với các công ty khởi nghiệp nhỏ hoặc trung bình với ngân sách hạn chế.

 

Tùy thuộc vào lĩnh vực của dự án, có thể sử dụng các tên miền phụ khác, như ‘my’, ‘stats’, ‘legacy’,…

Khi bạn cần các tên miền phụ riêng biệt

Có tên miền phụ riêng biệt cho các chức năng khác nhau, việc định tuyến và cân bằng lưu lượng truy cập dễ dàng hơn khi bạn cần tăng băng thông của dịch vụ. Nó cũng cho phép bạn triển khai thực hiện front-end với sự trợ giúp của bất kỳ công nghệ hoặc framework nào khác và đặt nó trên miền gốc project-name.work. Ví dụ: khi khách hàng muốn đặt đích cho ứng dụng dành cho thiết bị di động trên miền gốc. Việc kết thúc có thể được phát triển bởi một nhóm khác mà không có sự tham gia của bạn. Và sau đó dự án Symfony của bạn chỉ sẽ được tách ra từ việc định tuyến tên miền gốc và sẽ chỉ chia sẻ với các tên miền phụ có liên quan.

Cách tùy chỉnh Project với Subdomains cho Docker

Để tùy chỉnh dự án trong Symfony cho Docker, bạn cần một số cấu hình bổ sung. Trong Docker, bạn có thể tạo định tuyến dựa trên các cổng khác nhau, nhưng bạn không thể áp dụng định tuyến từ gói cho các tên miền phụ vì theo mặc định, Docker hoạt động trong phạm vi của một máy chủ.

Với Symfony, có một vấn đề khác: nó không hỗ trợ định tuyến bằng port, nhưng nó hỗ trợ định tuyến phụ. Đó là, cho đến nay, bạn không thể thiết lập Symfony để nó gọi điều này hoặc bộ điều khiển phụ thuộc vào cổng. Và triển khai tùy chọn hỗ trợ này không được mong đợi trong tương lai gần (bạn có thể đăng ký về vấn đề này để theo dõi tất cả các sửa đổi: có thể, họ sẽ quay lại một số điểm của tính năng này).

Từ hai tùy chọn: tùy chỉnh Symfony Router component hoặc thêm hỗ trợ cho các tên miền phụ trong Docker, sau này dễ dàng hơn và nó đã có sẵn một cài đặt sẵn sàng.

Lưu ý: Nó có thể được áp dụng chỉ trong môi trường phát triển cục bộ cho Docker và nó không phải là một giải pháp phổ quát có thể được sử dụng trong thực tế.

Để thêm sự hỗ trợ subdomain trong Docker, bạn cần phải thêm một container dựa trên image jwilder/nginx-proxy và cấu hình cho nó trong file Docker-compose.yml . Hãy xem ví dụ về một phần của cấu hình docker-compose.yml cho hai container: nginxnginx-proxy . Rõ ràng, sẽ có các container khác ngoài những thứ này trong dự án của bạn. Trong ví dụ này, jekakm/nginx-core:201802261 là image của chúng tôi mà chúng tôi sử dụng để phát triển.

docker-compose.yml

version: '2'
services:
    nginx_proxy:
        image: jwilder/nginx-proxy
        ports:
            - "80:80"
        volumes:
            - /var/run/docker.sock:/tmp/docker.sock:ro
 
    nginx:
        image: jekakm/nginx-core:201802261
         environment:
            - "VIRTUAL_HOST=hub.project-name.work,admin.project-name.work,api.project-name.work"
        volumes:
            - "./docker-configs/nginx.conf:/etc/nginx/sites-enabled/default"
            - ".:/app:cached"
        expose:
            - 80
        depends_on:
            - "php"

nginx_proxy sẽ nghe port 80 và đi qua nó vào Docker. Ngoài ra, biến môi trường VIRTUAL_HOST được thêm vào nginx container. Trong đó, phân cách bằng dấu phẩy, bạn cần phải đề cập đến tất cả các máy chủ (có tên miền phụ và không có) nên được proxy vào nginx container. Thông qua proxy này, Symfony sẽ nhận được các yêu cầu từ các host đã được đề cập mà không sửa đổi, và nó sẽ có thể, theo các quy tắc định tuyến, để xác định bộ điều khiển nào sẽ xử lý yêu cầu dựa trên các tên miền phụ.

Ví dụ nhanh về định tuyến Symfony dựa trên miền phụ

easy_admin_bundle:
    resource: "@EasyAdminBundle/Controller/AdminController.php"
    type: annotation
    host: "%admin_host%" # <-- admin panel host
 
api_fos_oauth_server_token:
    resource: "@FOSOAuthServerBundle/Resources/config/routing/token.xml"
    host: "%api_host%" <--  API host
    methods: POST #
 
api:
    resource: ../src/Controller/API
    type: annotation
    host: "%api_host%" <-- API host
    prefix: /v1.0
 
hub:
    resource: ../src/Controller/Hub
    type: annotation
    host: "%hub_host%" <-- host for all "frontend features"
 
admin:
    resource: ../src/Controller/Admin
    type: annotation
    host: "%admin_host%" <-- host for admin panel, the processing of all custom actions which were implemented from the admin panel  
admin_logout:
    path: /logout
    host: "%admin_host%"

Trong cấu hình cho nginx container, có cấu hình máy chủ ./docker-configs/nginx.conf được thay thế vào container. Trong cấu hình này, tham số SERVER_NAME có giá trị tên dự án-docker. Nó quan trọng là vì giá trị này sau này sẽ được sử dụng để thiết lập XDebug trong PhpStorm (chúng tôi sẽ trình bày vấn đề này sau). Tôi cũng đưa ra ví dụ về một cấu hình đầy đủ cho máy chủ nginx để có thể kiểm tra sự khác biệt nếu cần thiết.

Chú ý! Cấu hình được trình bày dành cho Symfony 4 và các phiên bản mới hơn vì nó sử dụng đường dẫn public/index.php đến frontend controller:

server {
        gzip            	on;
        gzip_types      	text/plain text/css application/x-javascript text/xml application/xml application/rss+xml text/javascript image/x-icon application/json;
        gzip_min_length     1000;
        gzip_comp_level     6;
        gzip_http_version   1.0;
        gzip_vary       	on;
        gzip_proxied    	expired no-cache no-store private auth;
        gzip_disable    	msie6;
 
        listen 80;
 
        client_max_body_size 50M;
 
        root /app/public;
 
        rewrite ^/index\.php/?(.*)$ /$1 permanent;
 
        location / {
                index index.php;
                try_files $uri @rewriteapp;
        }
 
        location @rewriteapp {
                rewrite ^(.*)$ /index.php/$1 last;
        }
 
        location ~ ^/(index|config)\.php(/|$) {
                fastcgi_pass   php:9001;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param  SERVER_NAME    	project-name-docker;
                fastcgi_param  SCRIPT_FILENAME	$document_root$fastcgi_script_name;
                fastcgi_param  HTTPS          	off;
        }
 
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|htc)$ {
                expires 	31d;
                add_header  Cache-Control private;
 
                error_page 404 = @rewriteapp;
        }
 
        location ~* \.(css|js)$ {
                expires 	7d;
                add_header  Cache-Control private;
        }

Sau khi bạn đã thêm một container nginx-proxy vào tệp docker-compose.yml , đừng quên build các container mới và khởi động lại các container đang chạy.

$ docker-compose build
$ docker-compose down && docker-compose up -d

Thêm điều hướng

Điều cuối cùng bạn cần làm là thêm điều hướng cho máy chủ cục bộ của mình để các máy chủ bạn sử dụng (hoặc máy chủ có tên miền phụ) chuyển hướng đến máy chủ cục bộ. Bạn có thể làm điều đó bằng cách chỉnh editing /etc/hosts và thêm các dòng sau vào nó:

127.0.0.1   api.project-name.work
127.0.0.1   hub.project-name.work
127.0.0.1   admin.project-name.work

Hoặc bạn có thể sử dụng tiện ích dnsmasq và cấu hình một quy tắc chung trong nó. Ví dụ: nếu bạn sử dụng  tên miền .work cho máy chủ cục bộ, nó được định cấu hình theo quy tắc sau:

address = /. work / 127.0.0.1

Việc thêm các điều hướng cho các máy chủ ảo cục bộ là xa từ những gì được coi là thực hành tốt nhất Docker (cụ thể là khi bạn triển khai môi trường làm việc mà không có bất kỳ lệnh bổ sung nào cho máy cục bộ). Nhưng thật không may, không có giải pháp nào khác cho vấn đề này đối với các miền phụ Symfony trong Docker. Và đây là một giải pháp thỏa hiệp. Nó vẫn còn tốt hơn để sử dụng tiện ích dnsmasq để thiết lập một quy tắc chung cho máy cục bộ.

Để PhpStorm thiết lập kết nối XDebug, bạn cần thêm máy chủ cục bộ vào PHP->Servers configuration:

Để PhpStorm thiết lập kết nối XDebug, bạn cần thêm máy chủ cục bộ vào PHP->Servers configuration

  Sử dụng Docker (và cả Docker Compose) cho dự án Django

Tên của máy chủ phải giống với giá trị của tùy chọn SERVER_NAME từ nginx. Trong trường hợp của chúng ta, nó là project-name-docker.

Vì thế,

Chúng tôi đã thực hành cách thiết lập dự án trong Symfony để làm việc với các tên miền phụ Docker. Hy vọng bài viết sẽ hữu ích cho bạn.

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

9 công cụ siêu tiện lợi cho cả Developer và Designer

9 công cụ siêu tiện lợi cho cả Developer và Designer

Tiếp nối sự thành công của bài viết 30 tiện ích Chrome cho designer và developer, chúng ta sẽ lại tiếp tục điểm qua những công cụ tiện dụng có thể giúp ích rất nhiều cho công việc thiết kế và lập trình của bạn.


Atom

Atom là text editor nguồn mở do Github phát triển. Hỗ trợ nhiều tính năng toàn diện, nổi bật là package manager built-in, auto-completion thông minh, và theme siêu đẹp.

Được phát triển từ Sublime, package manager chính là một làn gió mới. Với Atom, Bạn có thể dùng APM hoặc giao diện GUI. Chả cần phải điều chỉnh file config cứ thích thì dùng thôi.

Thông tin thêm về vấn đề hiệu năng. Khi mới ra mắt, Atom chậm như sên, nhưng giờ lại trái ngược hoàn toàn, chỉ bị chậm khi mở file quá mức lớn mà thôi.


DragDis

Là designer, tôi phải luôn luôn tìm nguồn cảm hứng. DragDis là công cụ cho phép tôi lưu lại bất kỳ nguồn cảm hứng nào mình tìm được. Dễ dùng lắm, chỉ việc cài đặt tiện ích mở rộng Chrome và bắt đầu thả kéo thôi.

DragDis folder của tôi được sắp xếp theo tuần. Mỗi tuần tôi sẽ tạo một inspiration folder mới. Đây là một cách rất hay để theo dõi sự thay đổi trong “thị hiếu nghệ thuật” của bản thân.

DragDis còn có giao diện grid full-page, cơ sở tuyệt vời cho moodboards.


iTerm 2

iTerm là công cụ thay thế đẹp cho Terminal. iTerm 2 có rất nhiều tính năng hay, có thể kể đến split panels không giới hạn, hình ảnh nội dòng, và search. Tuy Terminal có nhiều tính tương tự, nhưng iTerm 2 vẫn đang liên tục cải tiến.


Muzli

Muzli là tiện ích mở rộng cho Chrome giúp tổng hợp các nội dung liên quan đến thiết kế từ các nguồn nổi tiếng: Designer News, Dribbble, Behance,…

Mỗi lần mở tab mới trong Chrome, Muzli sẽ liệt kế những nội dung hay cho từng site.

Một tính năng rất hay nữa là phần staff picks. Giống như bạn có một người trợ lý giúp bạn ghi lại những bài viết hay nhất vậy.


Noiz.io

Với công việc phụ thuộc nhiều vào cảm hứng, người ta thường tìm đến các quán cà phê yên tĩnh cùng không gian nghệ thuật. Noizio sẽ giúp bạn mang không gian này về nhà, bạn có thể chọn một loạt background noise đa dạng như October Rain, Coffee House, Thunderstorm, và Sea Waves. Rất phù hợp để bạn tập trung vào công việc.


Invision

Invision là nền tảng cho workflow và prototyping, môi trường cộng tác hoàn hảo giữa front-ends và designers. Designers có thể upload một loạt màn hình lên một project, sau đó ta lại có thể hot link screens với nhau.

Phần tô xanh là các khi vực được hot linked. Nếu chạm hay click lên đó, bạn sẽ được chuyển đến screen tiếp theo. Đây là một cách rất hay để lập trình viên hướng dẫn clients và developers khi cần thiết. Công cụ cũng tỏ ra rất hữu ích khi thực hiện một số hoạt động test định tính sơ bộ với người dùng.

Invision cũng vừa mới ra mắt tính năng mang lên Boards. Boards cho phép bạn thu thập nguồn cảm hứng và xây dựng moodboards. Khác biệt lớn nhất giữa công cụ này với với DragDis là các Boards cho phép cộng tác làm việc với các thành viên khác.


What the Font

Typography là một phần rất quan trọng trong thiết kế. Bởi lẽ này, What the Font là một trong những chrome extension tôi thích nhất. Công cụ giúp bạn biết được site đó đang dùng loại font gì chỉ qua việc point và click.


Postman

Trong quá trình làm front end developer của mình, chúng tôi thường phải query API hoặc tương tác với API của chính mình. Postman chính là công cụ tiện lợi giúp bạn thực hiện request đến API.

Hãy tưởng tượng phải làm việc với API endpoint. Thay vì phải viết một query front-end tương ứng hay request cURL, Postman có thể trực tiếp query endpoint.


Wappalyzer

Wappalyzer là công cụ giúp bạn xác định một site đang sử dụng thư viện và framework nào. Công cụ có thể được sử dụng ở dạng Chrome extension và là một trong những trợ thủ cực kỳ đắc lực cho front-end developer.

30 tiện ích Chrome (extensions) cho Designer và Developer

30 tiện ích Chrome (extensions) cho Designer và Developer

Với tốc độ ưu việt và nhiều developer tool built-in, Chrome dần phổ biến hơn trong giới designer và developer bên cạnh Firefox. Và cũng chính vì lý do này, số lượng tiện ích Chrome đang gia tăng ngày càng chóng mặt.

1. CSS-Shack

Công cụ mạnh mẽ này cho phép bạn design thoải mái, và suất thành file CSS dùng được ngay cho web. CSS shack có hỗ trợ layer và hầu hết các tính năng thường thấy của một photo editor.

  CSS là gì?

2. Marmoset

Với tiện ích này, bạn có thể xuất code snapshots đẹp lung linh để đưa vào demo và mockup. Bạn cũng có thể thêm theme và nhiều hiệu ứng hình ảnh cho promo và portfolio online.

3. iMacros for Chrome

Với một web developer, công việc test có thể sẽ lặp đi lặp lại rất nhàm chán. Đây chính là cứu tinh của bạn, iMacros sẽ ghi lại và lưu thao tác của bạn. Những công việc lặp lại dài lê thê giờ đây chỉ cần được thực hiện một lần duy nhất. Chỉ với một cú click chuột, bạn có thể test page bao nhiêu lần cũng được.

4. Font Playground

Một tiện ích hoàn hảo cho (web) designer và developer. Với Font Playground, bạn có thể “đùa nghịch” thỏa thích với các font bạn hiện có và thư viện Google font đồ sộ. Font sẽ được áp thẳng lên web mà không cần phải thao tác phức tạp. Không chỉ đơn thuần áp font, tiện ích còn cho phép bạn thử nghiệm thay đổi weight, style và effect tùy thích.

5. Window Resizer

Tiện ích làm việc đúng như tên, resize lại cửa sổ trình duyệt, từ đó giúp bạn theo dõi design của mình chuẩn xác hơn. Bạn có thể chọn từ một danh sách chuẩn màn hình phổ biến có sẵn, hoặc theo thiết lập tùy chỉnh.

6. Project Naptha

Nhờ vào công nghệ OCR thông minh, tiện ích cho phép người dùng highlight, copy, paste, và thậm chí dịch text ra từ ảnh.

7. What Font

What Font giúp developer và designer xác định font dùng cho một web nhất định. Vì vậy, nếu bạn hay thi thoảng bắt gặp vài font đẹp hay ho mà muốn “tái sử dụng”, bạn chỉ cần hơ chuột vào text để biết được.

8. Yslow

Công cụ không chỉ kiểm tra tốc độ load của web, mà còn cho biết lý do web chạy chậm, nếu có. Yslow sẽ kiểm tra đối chiếu với 23 trong số 34 quy luật của Yahoo’s performance team. Đây cũng là công cụ phân tích và tối ưu web vô cùng hiệu quả.

9. Web Developer

“Không dùng cái này thì dev sống sao đây.” Tiện ích thêm hẳn một toolbar vào Chrom với nhiều công cụ lập trình mạnh mẽ.

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

10. Page Ruler

Page ruler là công cụ đo lường các thành phần trên web “chuẩn từng li”, bạn chỉ việc đặt thước và lấy thông tin của thành phần đó.

11. Web Developer checklist

Công cụ này sẽ kiểm tra web của bạn từ trên xuống dưới (tất nhiên chỉ khi web của bạn là theo chuẩn) về mọi mặt: SEO, khả năng khả dụng, khả năng truy cập, tốc độ,… Ví dụ như, nếu bạn thiếu tag H1 trên page hoặc page thiếu meta title hay meta description, công cụ sẽ thông báo bạn ngay. Nếu bạn click vào link  ‘more info and help’ ở cuối tiện ích, bạn sẽ thấy checklist chi tiết hơn.

12. DevTools Autosave

DevTools AutoSave cho phép tự động lưu bất cứ thay đổi của trang CSS và JS thông qua môi trường Chrome Dev Tools vào file nguồn. Công cụ rất dễ thiết đặt và sử dụng.

13. Instant Wireframe

Biến bất cứ web nào thành wireframe chỉ với một cú click chuột. Bạn giờ đây có thể kiểm tra web, local lẫn live, qua wireframe nhanh chóng.

14. ColorZilla

Tiện ích ColorZillar là một tập hợp eyedropper (đo màu), colour picker(bảng màu), gradient generator (đổ bóng) cùng nhiều công cụ khác cho công việc design.

15. Ripple Emulator

Ripple Emulator là một công cụ giả lập môi trường mobile đa nền tảng giúp test ứng dụng web trên một số thiết bị và màn hình hiển thị. Rippe có thể kết hợp với các công cụ lập trình hiện có để thực hiện debug, kiểm tra DOM và test tự động.

16. Streak

Streak là công cụ quản lý CRM mạnh mẽ có hỗ trợ email trong Gmail. Công cụ biến một hoặc một loạt email thành ticket dễ theo dõi, quãn lý và chia sẻ.

17. Search Stackoverflow

Nếu đã là web developer, chắc hẳn bạn đã nghe qua về Stack Overflow, địa chỉ phải đến khi vấp phải bất cứ vấn đề lập trình nào. Nếu chưa nghe qua, bạn nên vào xem thử ngay đi, cộng đồng Stack Overflow đang phát triển mạnh mẽ với một loạt chủ đề đa dạng từ C#, Java đến PHP và jQuery. Tiện ích này sẽ thêm một search box trực tiếp lên trình duyệt giúp bạn tìm kiếm kho kiến thức khổng lồ của Stack Overflow mọi lúc, mọi nơi.

  Một số mẹo vặt dành cho Developer trên Chrome

18. PHP Ninja Manual

Việc nhớ hết tất cả các hàm gần như là không thể, và đây là công cụ giúp bạn giải quyết vấn đề này. The PHP Ninja Manual là kho tài liệu PHP 5.5 kèm theo ví dụ (của 8 loại ngôn ngữ) ngay trên trình duyệt.

19. PerfectPixel

Design rất bực mình khi thấy sản phẩm sau code lại không đẹp “choáng váng” như thiết kế của mình. Perfect pixel thực sự là công cụ hỗ trợ hay cho các designer đang phát triển web đúng theo như thiết kế. Tiện ích sẽ đặt một hình ảnh mờ chồng lên web như hình, đồng thời so sánh giữa hai ảnh để đảm bảo độ chính xác đến từng pixel.

20. Code Cola

Bên cạnh khả năng hiển thị mã nguồn của đối tượng, công cụ còn một CSS editor cho phép bạn chỉnh sửa CSS style và xem kết quả tại chỗ.

21. Chrome Sniffer

Tiện ích này giúp kiểm tra, xác địch thư viện JavaScript và ứng dụng đang chạy trên web. Cách sử dụng không thể dễ hơn được nữa: một icon sẽ xuất hiện trên thanh địa chỉ cho thấy phiên bản CMS và framework được sử dụng.

22. User Agent Switcher

Một công cụ hay nếu muốn thấy giao diện của web trên nhiều thiết bị truy cập khác nhau như: iPad, iPhone, Android,…

23. IE tab

IE tab là một trong những giả lập IE hàng đầu hiện nay. Cộng cụ giúp developer test page cho nhiều phiên bản IE trực tiếp trên trình duyệt Chrome.

24. PicMonkey

Một tiện ích photor editor cho phép bạn chỉnh sửa hành ảnh và screenshots của web. Nhưng đây chưa phải là tính năng làm ứng dụng nổi tiếng. PicMonkey cho phép bạn tải tất cả hình ảnh và screenshot của cả một trang web trong một cú click chuột. Khi đã lựa chọn một hình ảnh, bạn có thể điều chỉnh tùy thích từ thêm hiệu ứng đến phơi sáng,…

25. Chrome Daltonize

Colour Vision Deficiency (CVD) – khiếm khuyết về thị giác hoặc mù màu đang gây nhiều vấn đề cho hàng triệu người trên thế giới. Tiện ích này sử dụng daltonization, một công cụ cho phép tạo ảnh phù hợp hơn cho người có CVD. Công cụ này sẽ tái thể hiện hình ảnh theo cách nhìn của người có CDV, giúp bạn điều chỉnh thiết kế phù hợp hơn.

26. Appspector

Tiện ích giúp developer kiểm tra thư viện javascript và ứng dụng web. Một icon sẽ hiện trên thanh địa chỉ hiển thị framework được kiểm tra. Tiện ích có khả năng xác định đến hơn 100 thư viên CSS và JS.

27. Check My Links

Bạn đã build xong page? Vậy bạn đã kiểm tra lại đường dẫn chưa? Dù bạn có cẩn thận đến mức nào, bạn sẽ không cách nào đảm bảo được tất cả các link, và kiểm tra lại từng cái một là một công việc kinh khủng. Với Check My Links , bạn chỉ việc chạy tiện ích và ngồi chờ.

28. Flickr Tab

Bạn có phát chán trước những phông tab Chrome đơn điệu? Với, Flickr Tab bạn sẽ không còn chán nữa.

Tiện ích gọn nhẹ này sẽ hiển thị một hình ảnh Flickr nổi tiếng mỗi khi bạn mở một cửa sổ mới. bạn có thể click vào ảnh để xem trên Flickr hoặc username để xem thêm ảnh của người dùng đó.

29. Google Art Project

Nếu bạn không thích thú với Flickr Tab và những hình ảnh màu mè. Bạn có thể sẽ thích Google’s Art Project.

Với mỗi tab mới mở, bạn sẽ được chiêm ngưỡng những kiệt tác phân giải cao từ Van Gogh hay Monet. Nếu bạn muốn tìm hiểu thêm, chỉ việc click vào ảnh và bạn sẽ được dẫn đến website Google Cultural Institute với đầy đủ thông tin của tác phẩm và họa sĩ.

30. Data Saver (Beta)

Data Saver, sẽ giảm lượng dữ liệu tiêu thụ khi duyệt web. khi kích hoạt, Chrome sẽ dùng máy chủ Google nén trang web trước khi bạn tải trang. Tuy nhiên vẫn có hạn chế: các trang SSL và ẩn danh sẽ không được hỗ trợ.

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

Truy cập ngay các công việc IT đãi ngộ tốt trên TopDev

Roadmap Frontend Developer – “Con đường tắt” để trở thành cao thủ Frontend Developer

roadmap front end

Dưới đây là roadmap hiển thị những bước cần thiết để bạn có thể học và trở thành một Frontend Developer thực thụ từ con số không

Bước học nền cơ bản
Nền tảng cơ bản đầu tiên mà bạn phải học qua

Đi sâu hơn với framework và library

Đi sâu vào framework

Sau một chặng đường, bạn đã là 75% Frontend Developer

Chặng cuối roadmap frontend developer

Chặng đường cuối cùng nhưng vẫn còn rất nhiều thứ để bạn có thể phát triểnTiếp tục khám phá

Xem thêm: Roadmap cho các Backend Developer

TopDev via kamranahmedse

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

Học ngay Javascript đi vì nó vẫn sẽ là ngôn ngữ phổ biến nhất 2024

Javascript-hackerrank

Theo một báo cáo gần đây của HackerRank cho thấy JS (Javascript) vẫn là ngôn ngữ phổ biết nhất trong năm 2024. Tuy nhiên GO vẫn là ngôn ngữ được học nhiều nhất. Thống kê cũng chỉ ra AngularJS là framework phổ biến nhất, tuy nhiên thống kê này còn bao gồm cả Angular và AngularJS. VueJS có vẻ thành công trên mặt trận truyền thông nhưng thực tế vẫn kém hấp dẫn hơn so với ReactJS

Javascript vẫn sẽ là ngôn ngữ lập trình mạnh nhất 

Một khảo sát chi tiết từ hơn 100,000 lập trình viên trên thế giới đã chỉ ra rằng, Javascript hiện vẫn đang chiếm một phần quan trọng trên thị trường lập trình thế giới. Dù rất phổ biến, nhưng Javascript ít được phổ biến rộng rãi trong các chương trình đạo tạo chính quy ở các trường đại học trên thế giới.

Ngoài ra, Angular JS và các framework khác cũng vẫn đang nắm thế dẫn đầu trong làng sóng công nghệ năm nay, như React JS và Vue JS. Để có được lợi thế cũng như cơ hội việc làm tốt, các lập trình viên cần nghiên cứu thêm những framework này. Hệ sinh thái của JS đã thật sự trở nên ngày càng vững mạnh hơn.

Xem thêm: 6 thư viện Javascript tốt nhất cho người dùng

Hiện nay, ngoài Python là một công nghệ và ngôn ngữ hấp dẫn nhất cho năm 2022, được nhiều không ít người hướng tới, thì IOT và deep learning cũng đang là một công nghệ mà các lập trình viên cũng như các doanh nghiệp cho là khả dụng và thực tế nhất để có thể theo đuổi. Nhiều chuyên gia dự đoán IOT sẽ là một mũi nhọn không thể thiếu của các công ty công nghệ trong thời gian tới.

Các bạn có thể tham khảo và xem đầy đủ báo cáo của hacker rank, tại đây

Xem thêm các vị trí Tuyển dụng Javascript lương cao mới nhất

5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin

Trong năm 2018, chúng ta đã chứng kiến ngôn ngữ Kotlin ngày càng trở nên phổ biến hơn bao giờ hết. Nó được sử dụng rộng rãi không chỉ trong phát triển ứng dụng di động, mà còn cho các hệ thống server. Như bạn đã biết, Kotlin là một ngôn ngữ lập trình statically-typed trên JVM. Đó là lý do tại sao nó thường được so sánh với ngôn ngữ Java.

Có thể nói, một trong những lý do chính cho sự phổ biến của Kotlin là ở sự đơn giản. Nó thật sự rất tinh gọn và loại bỏ những phần thừa thãi từ Java. Tuy nhiên, Kotlin vẫn cũng  rất giống với Java để bất kỳ nhà phát triển Java có kinh nghiệm nào đều có thể làm quen với Kotlin chỉ trong vài giờ.

Trong bài viết này, tôi sẽ thảo luận về một số tính năng thú vị của Kotlin được sử dụng để phát triển phía server so với Java. Xin lưu ý rằng đây là danh sách cá nhân của tôi về các tính năng yêu thích của Kotlin mà Java không hề có.

Giải quyết vấn đề với mà Java thường gặp phải với các Collections

Tôi thực sự thích Java, nhưng đôi khi phải làm việc với các collection chung chung có thể là một trải nghiệm vô cùng khó chịu, đặc biệt nếu bạn phải sử dụng các loại type lạ. Tin tốt là Kotlin không có bất kỳ loại type nào như vậy. Thay vào đó, nó cung cấp hai tính năng khác được gọi là declaration-site variance và type projection. Bây giờ, hãy xem xét hệ thống phân cấp class sau:

abstract class Vehicle {
}
class Truck extends Vehicle {
}
class PassengerCar extends Vehicle {
}

Tôi defined một repository có chứa mọi objects với một type được cho trước

public class Repository<T> {
  List<T> l = new ArrayList();
  public void addAll(List<T> l) {
    l.addAll(l);
  }
  public void add(T t) {
    l.add(t);
  }
}

Bây giờ, tôi muốn lưu trữ tất cả các vehicle trong repository đó, vì vậy tôi khai báo   Repository r = new Repository().  Tuy nhiên, khi gọi phương thức repository  addAll với List a là một tham số sẽ nhận được lỗi sau:

Ngay cả khi bạn thay đổi khai báo `addAll` bên trong `Repository`, bạn vẫn sẽ nhận được lỗi sau:

Tất nhiên, tình huống này có một lời giải thích hợp lý. Đầu tiên, các kiểu type chung trong Java là bất biến, nói cách khác,  List không phải là một subtype của  List , mặc dù  Truck  là một subtype của f Vehicle. Phương thức addAll  sẽ dựa vào type được cho và mở rộng T làm tham số, qua đó nó chấp nhận một tập hợp các objects của T hoặc một số subtype của T – chứ không chỉ T

List  là một subtype của List<? extends Vehicle>,nhưng list bạn nhắm tới thì vẫn là  List . Tôi không muốn đi vào chi tiết về vấn đề này – Điều quan trọng đối là ta biết được Kotlin giải quyết vấn đề này bằng cách sử dụng một tính năng được gọi là Declaration-site variance. Nếu chúng ta thêm phần `out` modifier vào tham số  MutableList  bên trong khai báo phương thức addAll , trình biên dịch sẽ cho phép thêm một danh sách các objects  Truck

class Repository<T> {
    var l: MutableList<T> = ArrayList()
    fun addAll(objects: MutableList<out T>) {
        l.addAll(objects)
    }
    fun add(o: T) {
        l.add(o)
    }
}
fun main(args: Array) {
    val r = Repository<Vehicle>()
    var l1: MutableList<Truck> = ArrayList()
    l1.add(Truck())
    r.addAll(l1)
    println("${r.l.size}")
}
  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
Ebook Kotlin for Android Developers”]

Data Classes

Bạn có thể biết các POJO của Java (Plain Old Java Object – các object Java cũ và nhàm chán). Nếu bạn đang theo các thực hành tốt nhất của Java, một class như vậy nên thực hiện các phương thức getters, setters,  hashCode, và  equals , cũng như  toString  cho các nhu cầu cho log. Việc triển khai như vậy có thể chiếm nhiều không gian dữ liệu, ngay cả đối với một lớp đơn giản chỉ có bốn field như dưới đây (các phương thức được tạo tự động bằng cách sử dụng IDE Eclipse):

public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private int age;
  public Person(Integer id, String firstName, String lastName) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Person other = (Person) obj;
    if (firstName == null) {
      if (other.firstName != null)
        return false;
    } else if (!firstName.equals(other.firstName))
      return false;
    if (id == null) {
      if (other.id != null)
        return false;
    } else if (!id.equals(other.id))
      return false;
    if (lastName == null) {
      if (other.lastName != null)
        return false;
    } else if (!lastName.equals(other.lastName))
      return false;
    return true;
  }
  @Override
  public String toString() {
    return "Person [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
  }
}

Để tránh nhiều dòng mã bổ sung bên trong các lớp POJO, ta có thể sử dụng project Lombok. Nó cung cấp một tập các chú thích có thể được sử dụng trên class để phân phối và triển khai các phương thức getters / setters, equals,  và hashCode . Ngoài ra, bạn cũng có thể chú thích class của mình bằng  @Data, bao gồm tất cả các tính năng của  @ToString@EqualsAndHashCode@Getter/@Setter,  @RequiredArgsConstructor cùng nhau. Vì vậy, với @Data,  của Lombok, POJO sẽ trông giống như hình dưới đây:

@Data
public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private int age;
}

Việc bao gồm và sử dụng Lombok với một ứng dụng Java thật ra khá đơn giản và được hỗ trợ bởi tất cả các IDE của các nhà phát triển chính, nhưng Kotlin giải quyết vấn đề này một cách sáng tạo hơn. Nó cung cấp một tính năng gọi là data classes, được kích hoạt sau khi thêm  keyword  data vào định nghĩa class. Trình biên dịch sẽ tự động lấy ra các phương thức từ tất cả các properties được khai báo trong hàm khởi tạo chính:

  • Phương thứctoString()
  • Các hàm componentN() tương ứng với các properties theo thứ tự khai báo của chúng
  • Hàm copy()

Vì Kotlin tạo getter và setter mặc định cho các thuộc tính có thể thay đổi (được khai báo là  var)  và getter cho các thuộc tính chỉ đọc (được khai báo là  var), việc thực hiện tương tự  Person Java POJO trong Kotlin sẽ giống như hình dưới đây.

data class Person(val firstName: String, val lastName: String, val id: Int) {
    var age: Int = 0
}

Điều đáng nói ở đây là trình biên dịch chỉ sử dụng các thuộc tính được định nghĩa bên trong hàm chính cho các hàm được tạo tự động. Vì vậy, trường  age, vốn được khai báo bên trong phần thân của class, sẽ không được sử dụng bởi  toStringequalshashCode, và copy

Tìm Java job lương cao trên TopDev ngay!

Đặt tên cho một số phương pháp Test

Bây giờ, chúng ta hãy thực hiện một số test thử nghiệm để chứng minh rằng các tính năng hoạt động đúng cách. Ba bài kiểm tra sau đây so sánh hai object với các giá trị khác nhau của property  age, cố gắng thêm cùng một object vào Java  HashSet hai lần và kiểm tra xem phương thức  componentN của data class có trả về các properties theo đúng thứ tự hay không.

@Test fun `Test person equality excluding "age" property`() {
  val person = Person("John", "Smith", 1)
  person.age = 35
  val person2 = Person("John", "Smith", 1)
  person2.age = 45
  Assert.assertEquals(person, person2)
}
@Test fun `Test person componentN method for properties`() {
  val person = Person("John", "Smith", 1)
  Assert.assertEquals("John", person.component1())
  Assert.assertEquals("Smith", person.component2())
  Assert.assertEquals(1, person.component3())
}
@Test fun `Test adding and getting person from a Set`() {
  val s = HashSet()
  val person = Person("John", "Smith", 1)
  var added = s.add(person)
  Assert.assertTrue(added)
  added = s.add(person)
  Assert.assertFalse(added)
}

Như bạn có thể thấy trên đoạn mã trên, Kotlin chấp nhận sử dụng các tên phương thức với những khoảng trống được bao quanh trong các dấu gạch chéo ngược. Nhờ đó, tôi có thể lập ra tên khá đầy đủ và chi tiết cho các test để giúp bạn biết rõ chuyện gì đang xảy ra.

Extensions

Hãy xem xét tình huống mà chúng ta có một thư viện chứa các định nghĩa class, vốn không thể thay đổi được, và chúng ta cần thêm một số phương thức. Trong Java, chúng ta có một số lựa chọn để thực hiện điều đấy. Chúng ta chỉ có thể mở rộng lớp hiện có, thực hiện một phương thức mới, hoặc, ví dụ, thực hiện nó với Decorator pattern.

Bây giờ, chúng ta hãy giả định rằng chúng ta có lớp Java sau đây có chứa danh sách những người tham gia sự kiện với getters / setters.

public class Organization {
  private List<Person> persons;
  public List<Person> getPersons() {
    return persons;
  }
  public void setPersons(List<Person> persons) {
    this.persons = persons;
  }
}

Nếu bạn muốn có phương thức để thêm một đối tượng  Person đơn vào danh sách, ta sẽ phải mở rộng Organization  và thực hiện một phương thức mới ở đó.

public class OrganizationExt extends Organization {
  public void addPerson(Person person) {
    getPersons().add(person);
  }
}

Kotlin cung cấp khả năng mở rộng một class với một chức năng mới mà không cần phải kế thừa từ class cơ sở. Điều này được thực hiện thông qua các khai báo đặc biệt với tên gọi là extensions. Đây là khai báo tương tự với Java class Organization Java  trong Kotlin. Bởi vì Kotlin xem một class  List đơn giản là không thể thay đổi, chúng ta sẽ cần định nghĩa  MutableList.

class Organization(val persons: MutableList = ArrayList()) {
}

Bạn có thể dễ dàng mở rộng nó bằng phương thức  addPerson như hình dưới đây. Các phần mở rộng được giải quyết triệt để và chúng không hề sửa đổi các class mở rộng.

class OrganizationTest {
    fun Organization.addPerson(person: Person) {
        persons.add(person)
    }
    @Test
    fun testExtension() {
        val organization = Organization()
        organization.addPerson(Person("John", "Smith", 1))
        Assert.assertTrue(organization.persons.size == 1)
    }
}

String Templates

Sau đây là một điều nho nhỏ sẽ làm bạn khá vui  mà Java không hề có

println("Organization ${organization.name} with ${organization.persons.size} persons")
  Kotlin - Phiên bản nâng cấp của Java

TopDev via dzone

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Top 8 công cụ thiết kế web và page cho năm 2024

Nếu bạn chưa có sẵn một list tổng hợp, việc tìm kiếm những website hay công cụ thiết kế web tốt nhất có thể tốn rất nhiều thời gian. Hiện nay có khá nhiều giải pháp phần mềm ” tạm được nhưng không phải thứ tôi cần ” đầy rẫy trên thị trường. Ngoài ra, giá cả cũng có thể là một trở ngại với bạn.

100++ cơ hội lập trình Web với offer cực cao

Vì vậy, chúng tôi đã tạo ra danh sách những công cụ thiết kế website và page tốt nhất trên thị trường. Chúng tôi đã xem xét đến các yếu tố như sức mạnh, hiệu suất và giá cả.

Chúng tôi tin rằng: Bạn sẽ thích những thứ bạn đọc trong bài này.

  1. Mobirise Website Builder

Có nhiều điểm thú vị xoay quanh Mobirise Website Builder. Thứ nhất, nó miễn phí cho tất cả người dùng, cả mục đích cá nhân và thương mại. Cho dù bạn đang xây dựng một trang web cho riêng mình, cho doanh nghiệp của bạn, hoặc cho khách hàng, tất cả đều miễn phí; Bạn hoàn toàn có thể thiết kế theo sở thích của bạn và host nó ở bất cứ nơi nào bạn muốn.

Một điểm nổi bật khác là nó có hơn 800 website blocks và template theo xu hướng của thế giới, bao gồm một thư viện hình ảnh với lightbox, full-screen intro, video backgrounds và parallax scrolling để đặt tên.

Dĩ nhiên còn nhiều điểm thú vị nữa. Thiết kế web ở đây chỉ cần kéo và thả, không yêu cầu kĩ năng code, và bạn có quyền truy cập vào thư viện 7.000 biểu tượng, 100.000 hình ảnh miễn phí và 800 font chữ của Google. Vì các templates của Mobirise dựa trên AMP hoặc Bootstrap framework mới nhất của Google, bạn sẽ được trải nghiệm hiệu suất cực nhanh và có thể thao tác ngay trên điện thoại.

Tải phiên bản miễn phí của Mobirise cho Windows hoặc MacOS ngay. Ngoài ra còn có phiên bản premium.

2.Visual Composer Website Builder 

Mặc dù Visual Composer Builder được thiết kế bởi WPBakery, nó không giống công cụ WPBakery Builder. Hai công cụ thiết kế trang web trên khác nhau hoàn toàn, và độc lập với nhau.

Bạn có thể chọn phiên bản miễn phí hay Premium của Composer Builder. Chúng tôi khuyến khích bạn nên chọn phiên bản miễn phí trước tiên. Tất cả những việc bạn cần làm là vào trang web và tải xuống. Bạn sẽ hài lòng với các tính năng mà Builder cung cấp, cũng như hiệu suất của nó. Sau đó, bạn có thể quyết định xem bạn muốn chuyển và khi nào chuyển sang phiên bản Premium.

Trình thiết kế này không yêu cầu kĩ năng code. Nó tương thích với mọi theme của WordPress, bạn cũng có nhiều tùy chọn thiết kế và nhiều yếu tố khác nhau bao gồm các tiện ích và shortcodes của WordPress.

Hãy thử phiên bản miễn phí của Visual Composer. Bạn sẽ thích nó.

3. Portfoliobox

Nếu bạn quá chán nản với những ràng buộc của các chủ đề tiêu chuẩn, Portfoliobox sẽ cho phép bạn thiết kế theo bất kỳ phong cách nào với mọi trang web. Với Portfoliobox, bạn sẽ dễ dàng xây dựng được một trang web không giống của bất kỳ ai và nổi bật lên giữa đám đông. Bạn không cần phải biết code, và một dự án có thể hoàn thành trong vòng vài giờ.

Portfoliobox cũng cung cấp cho bạn tùy chọn phiên bản Free hoặc Pro. Công cụ thiết kế trang web này cũng có một tuỳ chọn đặc biệt dành cho sinh viên. Tài khoản sinh viên của Porfoliobox cung cấp tất cả các tính năng và templates của phiên bản Pro, với domain cá nhân có giá từ 19 USD / năm.

Phiên bản miễn phí cung cấp hosting cho 30 hình ảnh, 10 sản phẩm, và 10 pages. Bạn cũng có quyền truy cập vào bất kỳ template nào của phiên bản Pro trong 30 ngày. Phiên bản Pro cung cấp hosting cho 1000 hình ảnh, không giới hạn số lượng các page và sản phẩm, một domain cá nhân, tích hợp Easy Google, và được tùy chỉnh CSS / JS.

4. uKit 

uKit là một trình thiết kế web rất linh hoạt dành riêng cho các doanh nghiệp nhỏ. Có hơn 200 templates để bạn lựa chọn triển khai dự án. Bạn chỉ cần kéo và thả các yếu tố cùng nội dung vào từng trang là xong.

Khi xử lý tất cả các trang, bạn có thể hoàn tất dự án chỉ trong vài cú nhấp chuột.

5. Elementor Page Builder 

Elementor là một công cụ thiết kế page chỉ cần kéo và thả. WordPress plugin cho phép bạn thiết kế và xây dựng mọi thứ, mà lại hoàn toàn miễn phí!

Elementor có lẽ là cách dễ dàng nhất để tạo ra một trang web trên WordPress. Nền tảng này chỉnh sửa hình ảnh rất nhanh, trực quan và không yêu cầu kĩ năng coding. Thiết kế các trang pixel landing page với tính năng chỉnh sửa trên thiết bị di động sẽ nâng WordPress lên một tầm mới. Bạn cũng có thể truy cập vào thư viện template đồ sộ của Elementor và các tính năng độc đáo khác.

6. Themify Builder 

Themify Builder giúp bạn tạo layouts dễ dàng và thiết thực hơn. Trình thiết kế này cho phép bạn xem trước những thay đổi trực tiếp và tính năng styling cho phép bạn tùy chỉnh bố cục cho cả phiên bản máy tính để bàn và thiết bị di động.

Themify Builder hoạt động với bất kỳ theme nào và hầu hết các plugins.

7. Pixpa 

Nền tảng ” tất cả trong một ” Pixpa sẽ giúp bạn tiết kiệm thời gian và tiền bạc bởi bạn không phải sử dụng nhiều dịch vụ khác nhau. Giá cả rất phải chăng. Các themes thân thiện với điện thoại di động và các tính năng phong phú có trong cửa hàng eCommerce sẽ giúp bạn tạo ra các trang web và portfolio chuyên nghiệp một cách dễ dàng. Nhiếp ảnh gia, nghệ sỹ, và nhà thiết kế đều thích những thứ trình thiết kế này cung cấp.

Bạn có thể dùng thử Pixpa hoàn toàn miễn phí.

8. IM Creator 

Bạn có thể xây dựng trang web của riêng bạn ngay từ bây giờ mà không còn trở ngại nào – giả sử phương pháp Lego block hấp dẫn bạn. Phương pháp IM Creator dùng để thiết kế page bao gồm việc sử dụng các stripes có sẵn và polydoms. Bạn hoàn toàn có thể trộn, kết hợp và tùy chỉnh chúng theo ý bạn, sau đó thêm nội dung vào là xong.

Một giải pháp eCommerce cũng đi kèm theo gói của nền tảng này. IM Creator hoàn toàn miễn phí cho các nghệ sĩ, tổ chức phi lợi nhuận và sinh viên. Ngoài ra còn có thêm một phiên bản white label.

Phần kết luận

Khi hầu hết các sản phẩm đều miễn phí hoặc miễn phí với một số điều kiện nhất định, hãy xem xét và lựa chọn sản phẩm tốt nhất theo nhu cầu của bạn.

Một trong 8 sản phẩm này đều có thể làm cho ngày làm việc của bạn tuyệt vời hơn. Nền tảng nào cũng có thể đáp ứng nhu cầu và giúp bạn hoàn thành công việc nhanh hơn. Ngoài ra, mỗi sản phẩm đều có thể giúp bạn làm hài lòng khách hàng hơn bằng cách mang lại trải nghiệm web tốt hơn và sáng tạo hơn.

TopDev via

  Các nền tảng tuyển dụng tốt nhất dành cho Software Engineer l Cập nhật năm 2022

Source: Speckyboy

Git là gì? Các lệnh git cơ bản mà mọi lập trình viên nên biết

Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), nó là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git cung cấp cho mỗi lập trình viên kho lưu trữ (repository) riêng chứa toàn bộ lịch sử thay đổi.

>>> Xem thêm: GitHub là gì? Những lợi ích GitHub mang lại cho lập trình viên

Version Control System – VCS là gì?

VCS là viết tắt của Version Control Systemhệ thống kiểm soát các phiên bản phân tán mã nguồn mở. Các VCS sẽ lưu trữ tất cả các file trong toàn bộ dự án và ghi lại toàn bộ lịch sử thay đổi của file. Mỗi sự thay đổi được lưu lại sẽ được và thành một version (phiên bản).

VCS nghĩa là hệ thống giúp lập trình viên có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên local sẽ có thể ủy thác (commit) rồi đưa lên server nơi đặt kho chứa chính.

Và một máy tính khác nếu họ có quyền truy cập cũng có thể clone lại mã nguồn từ kho chứa hoặc clone lại một tập hợp các thay đổi mới nhất trên máy tính kia.

Lập trình viên có thể xem lại danh sách các sự thay đổi của file như xem một dòng thời gian của các phiên bản. Mỗi phiên bản bao gồm: nội dung file bị thay đổi, ngày giờ sửa đổi, người thay đổi là ai, lý do thay đổi hay tên phiên bản…

Tìm việc làm GIT lương cao tại Topdev

VCS có tác dụng như thế nào?

  1. Lưu lại lịch sử các version của bất kỳ thay đổi nào của dự án. Giúp xem lại các sự thay đổi hoặc khôi phục (revert) lại sau này.
  2. Việc chia sẻ code trở nên dễ dàng hơn, lập trình viên có thể để public cho bất kỳ ai, hoặc private chỉ cho một số người có thẩm quyền có thể truy cập và lấy code về.

Vốn là một VCS nên Git cũng ghi nhớ lại toàn bộ lịch sử thay đổi của source code trong dự án. Lập trình sửa file, thêm dòng code tại đâu, xóa dòng code ở hàng nào…đều được Git ghi nhận và lưu trữ lại.

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

Sự khác biệt chính giữa Git và bất kỳ VCS nào khác (bao gồm Subversion…) là cách Git nghĩ về dữ liệu của nó.

Về mặt khái niệm, hầu hết các hệ thống khác đều lưu trữ thông tin dưới dạng danh sách các thay đổi dựa trên file. Các hệ thống này (CVS, Subversion, Perforce, Bazaar, v.v.) coi thông tin chúng lưu giữ dưới dạng một tập hợp các file và những thay đổi được thực hiện đối với mỗi file theo thời gian.

 

git
Image Credit: Stackoverflow

Git không nghĩ đến hoặc lưu trữ dữ liệu của mình theo cách này. Thay vào đó, Git coi thông tin được lưu trữ là một tập hợp các snapshot – ảnh chụp toàn bộ nội dung tất cả các file tại thời điểm.

Mỗi khi bạn “commit”, Git sẽ “chụp” và tạo ra một snapshot cùng một tham chiếu tới snapshot đó. Để hiệu quả, nếu các tệp không thay đổi, Git sẽ không lưu trữ lại file — chỉ là một liên kết đến tệp giống file trước đó mà nó đã lưu trữ. Git nghĩ về dữ liệu của nó giống như dưới đây:

git
Image Credit: Stackoverflow

Đây là điểm khác biệt quan trọng giữa Git và gần như tất cả các VCS khác. Nó khiến Git phải xem xét lại hầu hết mọi khía cạnh của kiểm soát phiên bản mà hầu hết các hệ thống khác đã sao chép từ thế hệ trước. Điều này làm cho Git giống như một hệ thống tệp nhỏ với một số công cụ cực kỳ mạnh mẽ được xây dựng trên nó, thay vì chỉ đơn giản là một VCS.

Git có lợi ích gì?

Các dự án thực tế thường có nhiều lập trình viên làm việc song song. Vì vậy, một hệ thống kiểm soát phiên bản như Git là cần thiết để đảm bảo không có xung đột code giữa các lập trình viên.

Ngoài ra, các yêu cầu trong các dự án như vậy thay đổi thường xuyên. Vì vậy, một hệ thống kiểm soát phiên bản cho phép các nhà phát triển revert và quay lại phiên bản cũ hơn của code.

Cuối cùng, đôi khi một số dự án đang được chạy song song liên quan đến cùng một cơ sở code. Trong trường hợp như vậy, khái niệm phân nhánh trong Git là rất quan trọng.

  • Dễ sử dụng, thao tác nhanh, gọn, lẹ và rất an toàn.
  • Sễ dàng kết hợp các phân nhánh (branch), có thể giúp quy trình làm việc code theo nhóm đơn giản hơn rất nhiều.
  • Chỉ cần clone mã nguồn từ kho chứa hoặc clone một phiên bản thay đổi nào đó từ kho chứa, hoặc một nhánh nào đó từ kho chứa là bạn có thể làm việc ở mọi lúc mọi nơi.
  • Deployment sản phẩm của bạn một cách không thể nào dễ dàng hơn.

Các thuật ngữ Git quan trọng

1. Branch

Các Branch (nhánh) đại diện cho các phiên bản cụ thể của một kho lưu trữ tách ra từ project chính của bạn.

Branch cho phép bạn theo dõi các thay đổi thử nghiệm bạn thực hiện đối với kho lưu trữ và có thể hoàn nguyên về các phiên bản cũ hơn.

2. Commit

Một commit đại diện cho một thời điểm cụ thể trong lịch sử dự án của bạn. Sử dụng lệnh commit kết hợp với lệnh git add để cho git biết những thay đổi bạn muốn lưu vào local repository.

3. Checkout

Sử dụng lệnh git checkout để chuyển giữa các branch. Chỉ cần nhập git checkout theo sau là tên của branch bạn muốn chuyển đến hoặc nhập git checkout master để trở về branch chính (master branch).

4. Fetch

Lệnh git fetch tìm nạp các bản sao và tải xuống tất cả các tệp branch vào máy tính của bạn. Sử dụng nó để lưu các thay đổi mới nhất vào kho lưu trữ của bạn. Nó có thể tìm nạp nhiều branch cùng một lúc.

5. Fork

Một fork là một bản sao của một kho lưu trữ (repository). Các lập trình viên thường tận dụng lợi ích của fork để thử nghiệm các thay đổi mà không ảnh hưởng đến dự án chính.

6. Head

Các commit ở đầu của một branch được gọi là head. Nó đại diện cho commit mới nhất của repository mà bạn hiện đang làm việc.

7. Index

Bất cứ khi nào bạn thêm, xóa hoặc thay đổi một file, nó vẫn nằm trong chỉ mục cho đến khi bạn sẵn sàng commit các thay đổi. Nó như là khu vực tổ chức (stagging area) cho Git. Sử dụng lệnh git status để xem nội dung của index của bạn.

Stagging là một bước trước khi commit trong git.

Một commit trong git được thực hiện theo hai bước: Stagging và commit thực tế. Miễn là những thay đổi nằm trong khu vực tổ chức (stagging area), git cho phép bạn chỉnh sửa nó theo ý muốn (thay thế các tệp được phân đoạn bằng các phiên bản khác của các tệp được phân loại, loại bỏ các thay đổi khỏi phân đoạn, v.v.)

Những thay đổi được tô sáng bằng màu xanh lá cây đã sẵn sàng để được commit trong khi những thay đổi màu đỏ thì chưa.

8. Master

Master là nhánh chính của tất cả các repository của bạn. Nó nên bao gồm những thay đổi và commit gần đây nhất.

master-branch-git
Nhánh Master

9. Merge

Lệnh git merge kết hợp với các yêu cầu kéo (pull requests) để thêm các thay đổi từ nhánh này sang nhánh khác.

10. Origin

Origin là phiên bản mặc định của repository. Origin cũng đóng vai trò là bí danh hệ thống để liên lạc với nhánh chính.

Lệnh git push origin master để đẩy các thay đổi cục bộ đến nhánh chính.

11. Pull

Pull requests thể hiện các đề xuất thay đổi cho nhánh chính. Nếu bạn làm việc với một nhóm, bạn có thể tạo các pull request để yêu cầu người bảo trì kho lưu trữ xem xét các thay đổi và hợp nhất chúng.

Lệnh git pull được sử dụng để thêm các thay đổi vào nhánh chính.

12. Push

Lệnh git push được sử dụng để cập nhật các nhánh từ xa với những thay đổi mới nhất mà bạn đã commit.

13. Rebase

Lệnh git rebase cho phép bạn phân tách, di chuyển hoặc thoát khỏi các commit. Nó cũng có thể được sử dụng để kết hợp hai nhánh khác nhau.

14. Remote

Một Remote (kho lưu trữ từ xa) là một bản sao của một chi nhánh. Remote giao tiếp ngược dòng với nhánh gốc (origin branch) của chúng và các Remote khác trong kho lưu trữ.

15. Repository

Kho lưu trữ Git chứa tất cả các tệp dự án của bạn bao gồm các branch, tags và commit.

16. Stash

Lệnh git stash sẽ loại bỏ các thay đổi khỏi chỉ mục của bạn và xóa stashes chúng đi sau.

Nó có ích nếu bạn muốn tạm dừng những gì bạn đang làm và làm việc khác trong một khoảng thời gian. Bạn không thể đặt stash nhiều hơn một bộ thay đổi ở cùng một thời điểm.

17. Tags

Tags cung cấp cho bạn một cách để theo dõi các commit quan trọng. Các tags nhẹ chỉ đơn giản đóng vai trò là con trỏ trong khi các tags chú thích được lưu trữ dưới dạng các đối tượng đầy đủ.

19. Upstream

Trong ngữ cảnh của Git, upstream đề cập đến nơi bạn push các thay đổi của mình, thường là nhánh chính (master branch).

Xem Git docs reference để biết thêm chi tiết về thuật ngữ liên quan đến Git.

Các lệnh git cơ bản

1) git config

Tác dụng : Để set user name và email của bạn trong main configuration file.
Cách xài : Để kiểm tra tên và kiểu email trong cấu hình dùng git config -- global user.namegit config -- global user.email. Để set email hoặc tên mới git config -- global user.name = “Hải Nguyễn”git config -- global user.email = “hainguyen@gmail.com”

2) git init

Tác dụng : Khởi tạo 1 git repository 1 project mới hoặc đã có.

Cách xài: git init trong thư mục gốc của dự án.

3) git clone

Tác dụng: Copy 1 git repository từ remote source.

Cách xài: git clone <:clone git url:>

4) git status

Tác dụng: Để check trạng thái của những file bạn đã thay đổi trong thư mục làm việc. VD: Tất cả các thay đổi cuối cùng từ lần commit cuối cùng.

Cách xài: git status trong thư mục làm việc.

5) git add

Tác dụng: Thêm thay đổi đến stage/index trong thư mục làm việc.

Cách xài: git add

6) git commit

Tác dụng: commit nghĩa là một action để Git lưu lại một snapshot của các sự thay đổi trong thư mục làm việc. Và các tập tin, thư mục được thay đổi đã phải nằm trong Staging Area. Mỗi lần commit nó sẽ được lưu lại lịch sử chỉnh sửa của code kèm theo tên và địa chỉ email của người commit. Ngoài ra trong Git bạn cũng có thể khôi phục lại tập tin trong lịch sử commit của nó để chia cho một branch khác, vì vậy bạn sẽ dễ dàng khôi phục lại các thay đổi trước đó.

Cách dùng: git commit -m ”Đây là message, bạn dùng để note những thay đổi để sau này dễ dò lại”

  5 tip về GitHub cho lập trình viên

7) git push/git pull

Tác dụng: Push hoặc Pull các thay đổi đến remote. Nếu bạn đã added và committed các thay đổi và bạn muốn đẩy nó lên hoặc remote của bạn đã update và bạn apply tất cả thay đổi đó trên code của mình.

Cách dùng: git pull <:remote:> <:branch:> and git push <:remote:> <:branch:>

8) git branch

Tác dụng: liệt kê tất cả các branch (nhánh).

Cách dùng: git branch hoặc git branch -a

9) git checkout

Tác dụng: Chuyển sang branch khác

Cách dùng: git checkout <: branch:> hoặc ** _ git checkout -b <: branch:> nếu bạn muốn tạo và chuyển sang một chi nhánh mới.

10) git stash

Tác dụng: Lưu thay đổi mà bạn không muốn commit ngay lập tức.

Cách dùng: git stash trong thư mục làm việc của bạn.

11) git merge

Tác dụng: Merge 2 branch lại với nahu.

Cách dùng: Chuyển tới branch bạn muốn merge rồi  dùng git merge <:branch_ban_muon_merge:>

12) git reset

Tác dụng: Bạn đã đưa một tập tin nào đó vào Staging Area nhưng bây giờ bạn muốn loại bỏ nó ra khỏi đây để không phải bị commit theo.

Cách dùng: git reset HEAD tên_file

13) git remote

Tác dụng: Để check remote/source bạn có hoặc add thêm remote

Cách dùng: git remote để kiểm tra và liệt kê. Và git remote add <: remote_url:> để thêm.

14) git add

Tác dụng: Để đưa một tập tin vào Staging Area

Cách dùng: git add tên_file hoặc muốn thêm hết file của thư mục thì git add all

Lời khuyên khi thao tác thường xuyên với Git trong công việc

  1. Git Cheet Sheets

Bạn không thể nào nhớ được hết các lệnh, lúc này bạn nên sử dụng các Git Cheet Sheets để dễ dàng tìm được lệnh Git bạn cần:

2. Nên commit thương xuyên

Tách nhỏ commit của bạn và commit thường xuyên nhất có thể. Điều này giúp các thành viên trong nhóm dễ dàng tích hợp công việc của họ hơn mà không gặp phải xung đột hợp nhất.

3. Test rồi mới commit

Không bao giờ commit nếu chưa hoàn tất process. Cần phải test các thay đổi của bạn trước khi chia sẻ chúng với người khác.

4. Viết ghi chú khi commit

Viết ghi chú khi commit để cho các thành viên khác trong nhóm biết loại thay đổi bạn đã thực hiện. Hãy mô tả càng nhiều càng tốt.

5. Thử nghiệm Branch khác

Tận dụng lợi thế của các branch để giúp bạn theo dõi các dòng phát triển khác nhau.

6. Theo một Git Workflow

Bạn nên chọn theo một Git Workflow để đảm bảo cả nhóm của bạn đều cùng thực hiện như nhau.

Hy vọng với bài viết này bạn sẽ có thêm những thông tin hữu ích về GIT là gì? Và Các lệnh git cơ bản mà mọi lập trình viên nên biết. TopDev Blog sẽ tổng hợp thêm các kiến thức hữu ích hơn tới các bạn đọc. Mong các bạn luôn ủng hộ và yêu thương chúng mình nha

Đừng quên, xem các vị trí tuyển dụng it tại HCM, Hà Nội, Đà Nẵng hấp dẫn tại đây nhé!

6 điều tôi vỡ lẻ khi tự học code (P1)

Tôi được khuyến khích và muốn chia sẻ kinh nghiệm tự học code của mình để bản thân vui hơn, vì vậy tôi viết bài này để các bạn đến sau hiểu được nhiều hơn con đường mình đi. Hãy lưu ý rằng chuyên ngành của tôi là phát triển web, vì vậy stack của tôi phản ánh điều đó.

1. Hãy sẵn sàng vứt bỏ tất cả mọi thứ, kể cả những thứ tốt nhất, giải pháp hợp lí mới giải quyết mọi vấn đề.

Điều này đúng với mọi khía cạnh từ code đến các ngôn ngữ lập trình đến ý tưởng. Lập trình thay đổi rất nhanh và có rất nhiều cách hay để tiếp cận các vấn đề, nhưng cần nhớ rằng tìm ra giải pháp mới là lý do của lập trình. Mục đích chính là giải quyết vấn đề thành công chứ không phải về quá trình tìm ra cách giải quyết. Bạn chắc hẳn sẽ rất tức giận hoặc có những hành động bồng bột khi gặp tình huống sau: Bạn dành 2 ngày để viết code hoặc xây dựng một page, bỗng nhiên có người bước ngang qua và chỉ ra một giải pháp nhanh hơn / tốt hơn?!

Nếu bạn tập trung vào giải pháp tốt nhất, nó sẽ giúp bạn giải quyết code dễ dàng hơn. Gần đây, tôi đã dành 2 ngày xử lý một số flexbox cho một dự án và đối tác kinh doanh của tôi ( họ không phải là dân tech) đã quyết định rằng không có tính năng đó sẽ tốt hơn cho chiến lược phát triển của họ. Trực giác của tôi mách bảo rằng tôi sẽ phát điên lên và không muốn thay đổi code cho dù có chuyện gì xảy ra, nhưng sau khi hít thở sâu vài lần và nghĩ thật thông, tôi nhận ra đối tác của tôi đã nói đúng.

Hơn nữa, nếu tôi trung thực, khách hàng của tôi có thể tiết kiệm được một khoảng thời gian quan tâm đến số giờ tôi đã làm việc để tạo ra widget x hoặc code của y đẹp đến mức nào. Họ chỉ muốn sản phẩm của họ tốt nhất có thể.

2. Ngôn ngữ lập trình bạn đang học không quan trọng bằng ý kiến của mọi người

Tôi chưa bao giờ là fanboy của một công nghệ cụ thể nào, và yêu thích Windows 10. Chưa kể có một máy tính xách tay khác chạy Kubuntu mà tôi rất thích. Ngoài ra tôi cũng thích sử dụng MacBook của vợ tôi.

Tôi đã tiếp cận nhiều ngôn ngữ lập trình cùng một cách. Tôi đã quyết định học vài ngôn ngữ lập trình để phục vụ cho việc kinh doanh của tôi (HTML / CSS / JS * Tôi biết html và css không hẳn là ngôn ngữ lập trình.) và sau đó tôi chọn một vài thứ tôi muốn học, (SQL, Python, Perl, Java), rồi tôi học thêm C vì tôi muốn bổ sung vào trình độ compsci thấp của mình với một ngôn ngữ cơ bản hơn.

Sau khi học xong, tôi đã học được rằng mọi thứ mình học đều có giá trị về lâu về dài. Nếu bạn không có nhu cầu cấp bách học một ngôn ngữ cụ thể nào, hãy thử nhiều thứ cùng lúc và tìm ra ngôn ngữ phù hợp nhất. Hãy tìm hiểu về ngôn ngữ bạn sử dụng nhiều nhất, và quyết tâm học nó bất kể mọi người nói gì. Nếu bạn đam mê ngôn ngữ assembly, nó sẽ giúp bạn đi rất xa trong mảng này.

3. Lập trình (và tự học code) thực sự khó như mọi người nói.

Khi tôi mới bắt đầu, tôi thực sự nghĩ rằng tôi là một thiên tài có thể hiểu mọi thứ trong vài giờ học. C và CSS đã khiến tôi tỉnh mộng. Tôi đã dành rất nhiều thời gian để hiểu các khái niệm trong CSS khiến tôi có chút thất vọng về bản thân, vì thế tôi đã thay đổi phương châm thành ” Dành đủ thời gian, stack overflow, ghi chép lại để tìm hiểu sâu hơn.”

Nếu bạn hiểu rằng lập trình là khó để theo đuổi, và khi đó bạn sẽ tiếp cận nó với tâm thế sẽ rất khác, bạn sẽ cố gắng hơn, khi gặp khó bạn sẽ coi đó là điều đương nhiên và ít nản lòng hơn, thậm chí xác suất bỏ cuộc giữa chừng cũng thấp hơn. Thay vì thất vọng khi gặp bug hoặc trang bị sập, tôi đã hiểu ra nó là một phần của quá trình và khiến tôi đỡ đau đớn hơn. Đó là sự thật sau một sự kiện không thể tìm ra một dấu chấm phẩy sau hơn 4 tiếng tìm kiếm vào lúc 3 giờ sáng.

Phần 2: 6 điều tôi vỡ lẻ khi tự học code (P2)

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

Khi Python ngày càng nhận được nhiều sự quan tâm của cộng đồng Data Science trong những năm gần đây, tôi đã muốn tổng hợp cho các data scientists và engineers những thư viện được sử dụng nhiều nhất, dựa trên kinh nghiệm làm việc của bản thân.

Và vì tất cả các thư viên đều là nguồn mở, nên chúng tôi đã thêm các commits, số lượng các contributors và các chỉ số khác từ Github với vai trò là các chỉ số proxy thể hiện mức độ nổi tiếng của thư viện đó.

1. NumPy (Commits: 15980, Contributors: 522)

Khi bắt đầu giải quyết task về khoa học bằng Python, tập hợp phần mềm được thiết kế riêng cho scientific computing trong Python sẽ không thể không hỗ trợ SciPy Stack của Python (đừng nhầm lẫn với thư viện SciPy – là 1 phần của stack này, và cộng đồng của stack này). Tuy nhiên, stack này khá rộng, có hơn cả tá thư viện trong nó và chúng ta thì lại muốn tập trung vào các core packages (đặc biệt là những packages quan trọng nhất).

Package cơ bản nhất, khi computation stack về khoa học được xây dựng là NumPy (viết tắt của Numerical Python), cung cấp rất nhiều tính năng hữu ích cho các phần operations trong n-arrays & matrics trong Python. Thư viện này cung cấp khả năng vector hóa các vận hành về toán trong type array NumPy, giúp cải thiện hiệu suất và theo đó là tốc độ execution.

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

2. SciPy (Commits: 17213, Contributors: 489)

SciPy là 1 thư viện phần mềm cho engineering và khoa học. Một lần nữa bạn cần phải hiểu sự khác biệt giữa SciPy Stack và thư viện SciPy. SciPy gồm các modules cho đại số tuyến tính, optimization, tích hợp và thống kế. Chức năng chính của thư viện SciPy được xây dựng trên NumPy, và arrays của nó sẽ tận dụng tối đa NumPy. Nó mang đến rất nhiều hoạt động hữu ích liên quan đến số như tích hợp số, optimization… qua các submodules chuyên biệt. Các hàm trong tất cả các submodules của SciPy đều được document tốt.

3. Pandas (Commits: 15089, Contributors: 762)

Pandas là 1 package Python được thiết kế để làm việc với dữ liệu đơn giản, trực quan, được “gắn nhãn” và có liên hệ với nhau. Pandas là công cụ hoàn hảo để tinh chỉnh và làm sạch dữ liệu. Pandas được thiết kế hỗ trợ cho các thao tác, tập hợp và visualize dữ liệu.

Có 2 data structure chính trong thư viện này:

“Series” — 1 chiều

“Data Frames”, 2 chiều

Ví dụ, khi muốn nhận Dataframe mới 2 loại structure này, bạn sẽ nhận DF bằng cách nối 1 hàng đơn với 1 DataFrame bằng cách đem tới 1 Series:

Danh sách những thứ bạn có thể làm với Pandas:

  • Dễ dàng xóa và thêm cột từ DataFrame
  • Chuyển data structures đến các objects DataFrame
  • Xử lý các data bị mất, như NaNs
  • Khả năng bhóm lại theo chức năng

Lịch sử Google Trends

trends.google.com

Lịch sử pull requests của GitHub

datascience.com/trends

4. Matplotlib (Commits: 21754, Contributors: 588)

Một core package của SciPy Stack và 1 thư viện Python khác được xây dựng riêng cho việc generation các visualizations mạnh mẽ, đơn giản là Matplotlib. Matplotlib là 1 phần của phần mềm giúp cho Python (cùng với sự hỗ trợ của NumPy, SciPy và Pandas) trở thành đối thủ nổi bật với các công cụ khoa học như MatLab hoặc Mathematica.

Tuy nhiên, thư viện này ở cấp độ thấp, đồng nghĩa là bạn sẽ cần phải viết nhiều code hơn để tiếp cận các cấp độ visualization cao cấp và bạn sẽ phải nỗ lực hơn so với khi sử dụng các công cụ cấp cao, tuy nhiên nỗ lực này là hoàn toàn xứng đáng.

Chỉ cần nỗ lực 1 chút, bạn có thể tạo được các visualization bất kì:

  • Line plots;
  • Scatter plots;
  • Bar charts và Histograms;
  • Pie charts;
  • Stem plots;
  • Contour plots;
  • Quiver plots;
  • Spectrograms.

Có rất nhiều công cụ để tạo nhãn, lưới, các biểu tượng/ kí hiệu/ chú giải và rất nhiều yếu tố format khác với Matplotlib. Về cơ bản, mọi thứ đều có thể custom được.

Thư viện này còn được rất nhiều platform hỗ trợ và tận dụng các GUI kít khác nhau để mô tả các visualizations kết quả. Thay đổi các IDEs (như IPython) sẽ hỗ trợ chức năng của Matplotlib.

Có vài thư viện bổ sung giúp việc visualization trở nên dễ dàng hơn.

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

5. Seaborn (Commits: 1699, Contributors: 71)

Seaborn hầu như tập trung vào việc visualization của các models thống kê; các visualizations như thế gồm heat maps tổng hợp dữ liệu nhưng vẫn mô tả được toàn bộ mức độ phân tán. Seaborn được phát triển dựa trên Matplotlib.

  Sự khác nhau giữa Method và Function trong Python

6. Bokeh (Commits: 15724, Contributors: 223)

Một thư viện visualization cực hay khác là Bokeh, hướng đến các visualization tương tác. Trái ngược với thư viện trước, Bokeh hoàn toàn độc lập so với Matplotlib. Bokeh tập trung chính vào tính tương tác và nó tạo các presentations qua các hệ điều hành hiện đại theo style của Data-Driven Documents (d3.js).

7. Plotly (Commits: 2486, Contributors: 33)

Plotly là toolbox cho web để xây dựng các visualizations, APIs được xây dựng bằng vài ngôn ngữ lập trình (như Python chẳng hạn). Có rất nhiều graphics mạnh mẽ, sáng tạo trên trang plot.ly. Để sử dụng Plotly, bạn sẽ cần set up API key riêng. Các graphics sẽ được xử lý phía server và được post lên internet, tuy nhiên vẫn có cách để ngăn việc này.

Lịch sử Google Trends

trends.google.com

Lịch sử pull requests của Github

datascience.com/trends

8. SciKit-Learn (Commits: 21793, Contributors: 842)

Scikits là các packages bổ sung của SciPy Stack được thiết kế cho các chức năng chuyên biêt như xử lý ảnh và hỗ trợ Machine Learning. Riêng với mảng Machine Learning, một trong những ưu điểm nổi bật của các packages này là scikit-learn. Package được xây dựng trên nền tảng của SciPy và tận dụng các operations về toán.

Scikit-learn có giao diện đơn giản, nhất quán, exposes a concise and consistent interface to the common machine learning algorithms, hỗ trợ việc mang Machine Learning vào các hệ thống production trở nên đơn giản hơn. Thư viện này bao gồm các code chất lượng và documentation hay, dễ sử dụng, hiệu suất cao, là chuẩn mực thực tế cho xây dựng Machine Learning bằng Python.

Deep Learning — Keras / TensorFlow / Theano

Liên quan đến Deep Learning, 1 trong những thư viện nổi bật và tiện ích dành cho Python là Keras, có thể hoạt động trên nền tảng của TensorFlow hoặc Theano.

Xem chi tiết bên dưới.

9. Theano. (Commits: 25870, Contributors: 300)

Theano là package Python định dạng các arrays đa chiều tương tự như NumPy, đi kèm với các operation về toán và expressions. Thư viện này được compiled, chạy hiệu quả trên tất cả các architectures. Do đội ngũ Machine Learning của Université de Montréal, Theano được sử dụng chính cho các hoạt động liên quan đến Machine Learning.

Lưu ý là Theano tích hợp với NumPy ở mức độ operation cấp thấp. Thư viện này cũng tối ưu hóa khả năng sử dụng GPU & CPU, giúp cho hiệu năng của computation thiên về data nhanh chóng hơn.

Hiệu quả và sự ổn định cũng mang đến những kết quả chính xác hơn, dù đó là những giá trị rất nhỏ như computation của log(1+x) sẽ cho ra kết quả chính xác đối với các giá trị nhỏ nhất của x.

10. TensorFlow. (Commits: 16785, Contributors: 795)

Do các developer của Google phát triển, TensorFlow là thư viện nguồn mở của graphs computations thuộc luồng dữ liệu, thích hợp với Machine Learning. TensorFlow đáp ứng các requirement cao cấp trong môi trường Google để train Neural Networks và thư viện kế nhiệm của DistBelief – 1 hệ thống Machine Learning dựa trên Neural Networks. Tuy nhiên, TensorFlow không chỉ sử dụng cho mục đích khoa học trong Google mà có thể áp dụng trong các dự án thực tế.

Tính năng quan trọng của TensorFlow is hệ thống nút đa layer, cho phép huấn luyện các neural networks trên datasets lớn 1 cách nhanh chóng, hỗ trợ khả năng nhận diện giọng nói và định vị vật thể trong ảnh của Google.

Tóm lại, 

Trên đây là những thư viện được rất nhiều data scientist và engineers đánh giá cao. Bên dưới là biểu đồ chi tiết về hoạt động trên Github của mỗi thư viện:

Dĩ nhiên, danh sách này vẫn chưa hoàn thiện và còn rất nhiều thư viện, framewoks đáng lưu ý khác. Chẳng hạn như các packages khác nhau của SciKit tập trung vào các domains riêng biệt như SciKit-Image làm việc với hình ảnh.

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

Nguồn: Sưu tầm

Vì sao onsite nước ngoài được xem là điểm sáng trong sự nghiệp?

Onsite là gì? Lập trình viên đi onsite cần biết những gì?

Bạn nghĩ sao nếu một ngày đẹp trời mở mail lên, nhận được thông báo xuất ngoại đi onsite? Cảm giác lúc này của bạn là bất ngờ, sung sướng và xen lẫn cả sự hồi hộp? Vậy là bạn chuẩn bị ra nước ngoài, ăn đồ Tây, lương cũng nhảy lên mấy con số tính theo “vi-en-đi” (VNĐ).

Thế nhưng, bạn đã hiểu rõ ý nghĩa của việc đi onsite chưa? Và làm thế nào để được chọn đi onsite nước ngoài như mình mong muốn?

Onsite nghe hay hay, nhưng đó là gì vậy?

Đi onsite tương tự như việc bạn đại diện cho hình ảnh của công ty để làm việc cho công ty khách hàng ở trong hoặc ngoài nước (hiểu nôm na là “làm cho khách hàng ngay chính trụ sở khách hàng”). Bằng việc tham gia vào đội ngũ IT chuyên nghiệp đến từ nhiều công ty lớn, bạn sẽ có cơ hội thể hiện khả năng của mình trong các dự án tầm cỡ. Một lợi thế trong khi onsite là bạn được làm việc trực tiếp, trao đổi thông tin giữa mọi thành viên trong dự án để đưa ra giải pháp nhanh nhất. Từ đó giúp đảm bảo tiến độ, tiết kiệm thời gian, tiết kiệm chi phí lẫn nguồn lực. Và một trong những chuyến đi onsite được nhiều người trông đợi nhất chính là được cử sang nước ngoài.

  TOP 7 Yêu Cầu Tuyển Dụng Của Các Công Ty Nước Ngoài

Đếm ngược thời gian bay, vậy đi onsite nước ngoài sẽ được gì?

Môi trường mới, ngoại ngữ mới, dấu ấn mới

Khi xuất ngoại, điều gì trong mắt bạn cũng trở nên mới mẻ. Nếu bạn muốn trò chuyện làm quen với mọi người xung quanh thì phải biết dùng tiếng Anh. Bên cạnh đó còn tuỳ thuộc vào ngôn ngữ mà nơi đó sử dụng phổ biến nhất. Đi onsite nước ngoài chính là dịp để bạn rèn luyện kỹ năng ngoại ngữ của mình, giúp bạn tự tin hơn trong giao tiếp dù ở bất cứ đâu. Một mặt khác việc đi onsite cũng góp phần nâng cao hình ảnh cá nhân, xây dựng thương hiệu riêng. Một profile với kinh nghiệm đã từng đi onsite luôn tạo ấn tượng nổi bật trong mắt các nhà tuyển dụng. Đó là lý do tại sao nhiều lập trình viên vẫn mong muốn có được điểm cộng hoành tráng đó.

Kiến thức bồi đắp, kinh nghiệm vững vàng

Việc bạn mới tham gia vào những dự án tại nước ngoài có thể gặp vài thách thức. Áp lực là điều dễ nhận thấy vì yêu cầu đối với các dự án quy mô thường cao. Nhưng đó cũng là bước đệm để bạn phát triển, tôi luyện bản thân với những bài học và kinh nghiệm. Sẽ có lúc bạn vướng phải một vấn đề căng thẳng buộc phải nhanh chóng họp lại với team để đưa ra phương án giải quyết. Và điều này giúp bạn học được cách phòng tránh lỗi tương tự về sau, hiểu cách phân tích và fix lỗi để có thể tạo ra những sản phẩm hoàn thiện hơn. Đồng thời kỹ năng mềm của bạn trong quá trình đó cũng tăng lên, từ cách làm việc nhóm trong một đội ngũ lớn cho đến việc giám sát, đôn đốc, báo cáo – mọi thứ đều để lại cho bạn những kinh nghiệm nhất định.

Lương tăng vút, đãi ngộ vi vu

Đi onsite nước ngoài chính là cánh cửa dẫn đến mức thu nhập mơ ước. Nếu như mức lương ban đầu của bạn là 1,000 USD thì con số offer tại nước ngoài có thể tăng lên gấp vài lần. Các công ty nước ngoài thường có nhiều chính sách hấp dẫn nên đây cũng là dịp để bạn được trải nghiệm một môi trường làm việc với những đãi ngộ tốt nhất.

Làm sao để được chọn đi onsite nước ngoài?

Bất cứ ai cũng đều có thể chạm lấy điểm sáng onsite trong sự nghiệp. Điều này tuỳ thuộc vào quá trình vươn lên của mỗi người dựa trên các yếu tố:

  • Kỹ thuật chuyên môn
  • Số năm kinh nghiệm
  • Trình độ ngoại ngữ
  • Đam mê và nỗ lực

Để được chọn đi onsite, bạn cần phải chuẩn bị cho mình một nền tảng thật vững chắc. Trau dồi kiến thức mới, tích luỹ kinh nghiệm thực tế, đăng kí khoá học ngoại ngữ, tìm danh sách vị trí và công ty có cơ hội đi onsite nước ngoài…  đó là những gì bạn có thể chuẩn bị ngay lúc này để chạm lấy giấc mơ mà mình muốn. Bạn có thể tham khảo qua 9 cơ hội onsite nước ngoài hấp dẫn dưới đây để lấy làm động lực thực hiện:

FUTURE CTO (PHP, Java, Ruby on Rails, Python, .NET) | Study now
>> Cơ hội trải nghiệm môi trường làm việc tại Thái Lan, Indonesia…

Software QA Engineer (Tester) | CYBOZU Vietnam
>> Cơ hội công tác tại Mỹ, Nhật Bản, Trung Quốc

NodeJS Developer | PROVIEW tuyển dụng
>> Cơ hội làm việc tại Mỹ, các nước Châu Âu

Front-end Developer | W&S
>> Làm việc onsite tại Nhật theo mong muốn, nguyện vọng

Full-stack .NET/C# Developer | Futurify
>> Cơ hội onsite tại Canada, Singapore, Malaysia

Front-end Developer | Tripath
>> Cơ hội onsite tại Hàn Quốc

Fresher Software Engineer (Java, NodeJS, .NET, Front-End) | KMS Technology
>> Cơ hội onsite ngắn hạn, dài hạn tại Mỹ

Full-stack Developer (PHP, JavaScript, Laravel, SVN, Git) | Worknetics Singapore
>> Cơ hội làm việc tại Singapore

Onsite như cánh diều giúp bạn được bay lượn. Nhưng để diều bay cao thì cần phải ngược gió. Một khi biến thách thức thành cơ hội, bạn sẽ nhìn thấy con đường thành công của chính mình không còn xa nữa.

6 thư viện JavaScript xác thực người dùng

JavaScript-library

Tác giả: Jonathan Saring

“Xây dựng cho tôi một hệ thống xác thực người dùng trong hai tuần” là một cụm từ phổ biến trong các nhóm R & D những ngày này. Vì nhiều lý do, nhiệm vụ này luôn là một trong những nhiệm vụ để một nhà phát triển duy nhất trong nhóm sắp xếp.

Một mặt, bạn thực sự không muốn lãng phí nhiều thời gian để làm điều đó. Mặt khác, bạn lo ngại rằng hệ thống này có thể được xử lý tốt hơn bởi giải pháp của bạn, để nhân rộng tốt hơn sau này.

Khi các hướng dẫn mới xuất hiện trên web ( một nơi tốt để bắt đầu ) và nhiều nhóm đang cố gắng hiểu phương trình chi phí-lợi ích để thực hiện giải pháp của riêng họ so với sử dụng thư viện hoặc dịch vụ, tôi đã tập hợp một đánh giá ngắn về những gì ở đó. Hy vọng điều này có thể giúp tiết kiệm thời gian và đưa ra quyết định sáng suốt hơn. Hãy bình luận và chia sẻ những hiểu biết của riêng bạn.

Tham khảo các vị trí Javascript tuyển dụng từ các công ty HOT

1. Passport JS

Passport không chỉ là thư viện xác thực người dùng với 15 nghìn sao, đây có lẽ là cách phổ biến nhất để các nhà phát triển JS sử dụng thư viện bên ngoài để xác thực người dùng.

https://github.com/jaredhanson/passport

Với express: https://github.com/expressjs/session

2. Auth0

Mặc dù đây không phải là một thư viện mà là một dịch vụ, đó là một cách mạnh mẽ và nhanh chóng để hoàn thành công việc. Auth0 là một công ty khởi nghiệp (khá lớn) cung cấp nền tảng xác thực & ủy quyền phổ biến rộng rãi cho các ứng dụng web, di động và các ứng dụng kế thừa. Một số cho rằng, đó là giải pháp gần nhất với sự kiện Devise for Ruby on Rails, ngoại trừ bạn có thể kết nối bất kỳ ứng dụng hoặc API bằng bất kỳ ngôn ngữ nào. Có hơn 100 tích hợp được xây dựng sẵn và tại đây là một sự khởi đầu nhanh chóng với Node.js.

https://auth0.com/

3. Permit

Permit là một dự án 1k sao, nhằm mục đích cung cấp một thư viện xác thực không giới hạn của người dùng để xây dựng API Node.js. Permit cho phép bạn thêm lớp xác thực vào bất kỳ API Node.js nào và có thể được sử dụng với các frameworks như Express, Koa, Hapi và Fastify. Nó có thể được sử dụng với nhiều loại API từ REST đến GraphQL, do đó, thiết kế không được đề cập đến. Permit nhằm tập trung vào các API (yêu cầu không trạng thái) và các frameworks. Nó cũng đang được phát triển tích cực, điều này khiến Permit trở thành một lựa chọn thú vị để xem xét. chắc chắn đáng để mắt đến.

https://github.com/ianstormtaylor/permit

Xem ví dụ. Ở đây, một ví dụ với Express:

import { Bearer } from 'permit'
import express from 'express'

const permit = new Bearer({
  basic: 'username', // Also allow a Basic Auth username as a token.
  query: 'access_token', // Also allow an `?access_token=` query parameter.
})

function authenticate(req, res, next) {
  // Try to find the bearer token in the request.
  const token = permit.check(req)

  // No token found, so ask for authentication.
  if (!token) {
    permit.fail(res)
    return next(new Error(`Authentication required!`))
  }

  // Perform your authentication logic however you'd like...
  db.users.findByToken(token, (err, user) => {
    if (err) return next(err)

    // No user found, so their token was invalid.
    if (!user) {
      permit.fail(res)
      return next(new Error(`Authentication invalid!`))
    }

    // Authentication succeeded, save the context and proceed...
    req.user = user
    next()
  })
}

const app = express()

app.get('/', (req, res) => {
  res.send('Some unrestricted content.')
})

app.get('/restricted', authenticate, (req, res) => {
  res.send('Restricted content!')
})

app.listen(3000)

4. Grant

Một thư viện khá mới và đầy hứa hẹn cung cấp OAuth Middleware cho Express, Koa và Hapi – với hơn 180 nhà cung cấp được hỗ trợ và một live playground. Trong trường hợp bạn muốn sử dụng nó với nhà cung cấp OAuth riêng của mình, bạn có thể tự chỉ định khóa được yêu cầu. Mặc dù thư viện này đã được hơn 1K sao, nhưng tài nguyên tương đối khan hiếm, vì vậy hãy cẩn thận thử.

https://github.com/simov/grant

5. Feathers authentication management

Feathers là một open source (11K stars) real-time, một micro-service web framework cho NodeJS cho phép bạn kiểm soát dữ liệu của mình thông qua các tài nguyên RESTful, sockets và plug-ins linh hoạt.

Feathers cũng cung cấp các mô-đun quản lý xác thực cho phép bạn thêm xác minh đăng ký, thiết lập lại khi quên mật khẩu và các khả năng khác cho feathers-authentication cục bộ. Ý tưởng là kết hợp các phương thức xác thực khác nhau dưới một mái nhà, trong một cơ sở hạ tầng linh hoạt. Đây là một hướng dẫn từng bước để giúp bạn bắt đầu.

https://github.com/feathersjs/authentication

https://github.com/feathers-plus/feathers-authentication-management

6. Chỉ dùng Firebase Authentication (cho các app nhỏ)

Đây có thể không nhất thiết là giải pháp lâu dài để quản lý xác thực người dùng trong nền tảng mở rộng của bạn. Tuy nhiên, đây là một cách rất hữu ích để hoàn thành công việc, nhanh chóng và đơn giản, cho các ứng dụng của bạn được triển khai với Firebase.

Firebase Authentication cung cấp dịch vụ phụ trợ, SDK dễ sử dụng và thư viện UI được tạo sẵn để xác thực người dùng với ứng dụng của bạn. Nó hỗ trợ xác thực bằng mật khẩu, số điện thoại, nhà cung cấp nhận dạng liên kết phổ biến như Google, Facebook và Twitter. Tìm hiểu thêm tại đây.

Dưới đây, một hướng dẫn rất hay để xây dựng ứng dụng React tận dụng Firebase cho Người dùng Auth với Facebook, Twitter và GitHub:

https://blog.bitsrc.io/react-oauth-authentication-with-firebase-dfe0e8c5d0d4

Và ở đây, một hướng dẫn tương tự để xây dựng ứng dụng Vue.js với xác thực Firebase:

https://blog.bitsrc.io/build-a-vue-app-with-firebase-authentication-and-database-e7d6816f79af

Và với MERN stack:

https://blog.bitsrc.io/build-a-login-auth-app-with-mern-stack-part-1-c405048e3669

Bài viết gốc được đăng tải tại blog.bitsrc.io

Có gì mới trong Angular 7.0 và làm sao để nâng cấp?

Tác giả: Ankit Sharma

Giới thiệu

Angular đã phát hành phiên bản mới nhất của nó, Angular 7.0. Trong bài viết này, chúng ta sẽ khám phá các điểm sau:

  • Có gì mới trong Angular 7.0?
  • Tạo ứng dụng Angular 7.0 đầu tiên của bạn bằng Angular CLI
  • Cách cập nhật ứng dụng Angular hiện tại của bạn lên Angular 7.0

Có gì mới trong Angular 7.0?

  1. Khi tạo một ứng dụng Angular mới, Angular CLI sẽ nhắc người dùng chọn nếu họ muốn thêm các tính năng như định tuyến Angular hoặc kiểu định dạng mà họ muốn sử dụng trong ứng dụng của họ
  2. Các ứng dụng Angular 7.0 sẽ sử dụng tính năng Bundle Budget của Angular CLI.Điều này sẽ cảnh báo các nhà phát triển nếu kích thước gói ứng dụng vượt quá giới hạn được xác định trước. Giá trị mặc định cho cảnh báo được đặt thành 2MB và đối với lỗi là 5MB.Giá trị này có thể định cấu hình và có thể được thay đổi từ tệp angular.json.Tính năng này nâng cao hiệu suất của ứng dụng một cách đáng kể.
  3. Bộ phần mềm Dev Dev (CDK) của Angular Material cũng nhận được một số tính năng mới như là một phần của bản cập nhật này.Hai tính năng mới được thêm vào của CDK là:
  • Virtual Scrolling
    Nếu bạn đang cố tải một danh sách lớn các phần tử, thì nó có thể ảnh hưởng đến hiệu suất của ứng dụng. Thẻ <cdk-virtual-scroll-viewport> có thể được sử dụng để chỉ tải phần hiển thị của danh sách trên màn hình. Nó sẽ chỉ hiển thị các mục có thể vừa trên màn hình. Khi người dùng cuộn qua danh sách thì DOM sẽ tải và dỡ bỏ các phần tử một cách linh hoạt dựa trên kích thước hiển thị.
    Tính năng này không bị nhầm lẫn với cuộn vô hạn hoàn toàn là một chiến lược khác nhau để tải các yếu tố. Bạn có thể đọc thêm về Virtual Scrolling tại đây .
  • Drag and Drop
    Chúng ta có thể dễ dàng thêm tính năng kéo và thả vào một mục. Nó hỗ trợ các tính năng như kéo miễn phí một phần tử, sắp xếp lại các mục trong danh sách, di chuyển các mục giữa danh sách, animation, thêm tay cầm kéo tùy chỉnh và kéo hạn chế dọc theo trục X hoặc Y. Bạn có thể đọc thêm về Kéo và Thả ở đây .
  1. Trường mat-form-field bây giờ sẽ hỗ trợ việc sử dụng phần tử chọn gốc. Điều này sẽ cung cấp hiệu suất nâng cao và khả năng sử dụng cho ứng dụng. Tìm hiểu thêm về tính năng này ở đây .
  2. Angular 7.0 đã cập nhật các phụ thuộc của nó để hỗ trợ Bản in 3.1, RxJS 6.3 và Node 10.

Bây giờ chúng ta sẽ tiến hành tạo ứng dụng Angular 7 đầu tiên của chúng ta.

Điều kiện tiên quyết

  • Cài đặt phiên bản mới nhất của Node.js từ đây
  • Cài đặt Visual Studio Code từ đây

Cài đặt Node.js cũng sẽ cài đặt npm trên máy của bạn. Sau khi cài đặt Node.js, hãy mở dấu nhắc lệnh. Chạy bộ lệnh sau để kiểm tra phiên bản của nút và npm được cài đặt trên máy của bạn.

  • node -v
  • npm -v

Tham khảo hình ảnh dưới đây:

Cài đặt CLI gốc

Angular CLI là giao diện Command Line cho Angular. Nó giúp chúng ta khởi tạo, phát triển và duy trì các ứng dụng Angular một cách dễ dàng.

Để cài đặt Angular CLI, hãy chạy lệnh sau trong cửa sổ lệnh:

npm i -g @angular/cli

Điều này sẽ cài đặt Angular CLI 7.0 trên toàn cầu trong máy của bạn. Tham khảo hình ảnh dưới đây:

Để kiểm tra phiên bản CLI góc được cài đặt trong máy của bạn, hãy chạy lệnh sau:

Tham khảo hình ảnh dưới đây:

Tạo ứng dụng Angular 7

Mở Visual Studio Code và điều hướng đến View >> Terminal. Điều này sẽ mở cửa sổ thiết bị đầu cuối mã VS. Ngoài ra, bạn cũng có thể sử dụng phím tắt ctrl+` để mở cửa sổ đầu cuối.

Nhập chuỗi lệnh sau trong cửa sổ terminal. Các lệnh này sẽ tạo một thư mục có tên là “ng7Demo”. Sau đó tạo một ứng dụng Angular với tên “ng7App” bên trong thư mục đó.

  • mkdir ng7Demo
  • cd ng7Demo
  • ng new ng7App

Khi bạn chạy lệnh ng mới, Angular CLI sẽ yêu cầu bạn thực hiện các lựa chọn trong hai tùy chọn sau:

  1. Bạn có muốn thêm định tuyến Angular?(y / N)
  2. Kiểu định dạng nào bạn muốn sử dụng?

Khi bạn chọn các tùy chọn và nhấn enter, ứng dụng Angular 7.0 sẽ được tạo.

Tham khảo Gif dưới đây để hiểu rõ hơn.

Khi ứng dụng được tạo thành công, hãy chạy lệnh sau để mở dự án:

code .

Tham khảo hình ảnh dưới đây:

Điều này sẽ mở tệp mã của ứng dụng của chúng ta trong cửa sổ VS Code. Bạn có thể thấy cấu trúc tệp sau trong Solution Explorer.

Mở tệp pack.json và bạn có thể thấy rằng chúng ta đã cài đặt các gói Angular 7.0.0 mới nhất trong dự án của chúng ta.

{
  "name": "ng7-app",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~7.0.0",
    "@angular/common": "~7.0.0",
    "@angular/compiler": "~7.0.0",
    "@angular/core": "~7.0.0",
    "@angular/forms": "~7.0.0",
    "@angular/http": "~7.0.0",
    "@angular/platform-browser": "~7.0.0",
    "@angular/platform-browser-dynamic": "~7.0.0",
    "@angular/router": "~7.0.0",
    "core-js": "^2.5.4",
    "rxjs": "~6.3.3",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.10.0",
    "@angular/cli": "~7.0.1",
    "@angular/compiler-cli": "~7.0.0",
    "@angular/language-service": "~7.0.0",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.1"
  }
}

Demo thực hiện

Tên của ứng dụng Angular của chúng ta là “ng7App” nằm trong thư mục “ng7Demo” .

Vì vậy, trước tiên chúng ta sẽ điều hướng đến ứng dụng của chúng ta bằng các lệnh dưới đây.

  • cd ng7Demo
  • cd ng7App

Bây giờ, chúng ta sử dụng lệnh sau để khởi động máy chủ web.

  • ng serve

Tham khảo hình ảnh dưới đây:

Sau khi chạy lệnh này, bạn có thể thấy rằng nó đang yêu cầu mở http://localhost:4200 trong trình duyệt của bạn. Vì vậy, hãy mở bất kỳ trình duyệt nào trên máy của bạn và điều hướng đến URL này. Bây giờ, bạn có thể xem trang sau.

Cách nâng cấp lên Angular 7

Nhóm góc đã cung cấp Hướng dẫn Angular Update Guide để đảm bảo nâng cấp mượt mà các phiên bản Angular. Điều hướng đến https://update.angular.io/ để truy cập nó. Nó là một ứng dụng tự giải thích và dễ sử dụng. Nó sẽ chỉ cho bạn các bước mà bạn cần phải làm theo trước khi cập nhật, trong khi cập nhật và sau khi cập nhật. Tham khảo hình ảnh dưới đây:

Nếu bạn muốn cập nhật ứng dụng của mình từ Angular 6 lên Angular 7 thì hãy chạy lệnh sau trong thư mục dự án:

ng update @angular/cli @angular/core

Phần kết luận

Chúng ta đã tìm hiểu về các tính năng mới của Angular 7.0. Chúng ta cũng đã cài đặt Angular CLI 7.0. Để tạo và thực thi một ứng dụng Angular 7.0, chúng ta đã sử dụng Angular CLI và VS Code. Chúng ta cũng đã khám phá phương pháp nâng cấp ứng dụng hiện có lên Angular 7.0.

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

10 điều mọi nhà phát triển ứng dụng Android nên biết về kiến trúc Architecture

10 điều mọi nhà phát triển ứng dụng Android nên biết về kiến trúc Architecture

Người dịch: Dương Đình Tuấn

Architecture trong hướng đối tượng cho ứng dụng có thể được mô tả đơn giản là cách sắp xếp các lớp trong hệ thống và cách thức chúng giao tiếp với nhau. Chúng ta tìm thấy cái nhìn tổng quan về vai trò và nhiệm vụ của các lớp này trong khi tạo ra chúng.

Tuyển lập trình viên android lương up to 30M

Dưới đây là một số điều có thể giúp chúng ta hiểu về kiến trúc này:

1 . Architecture là ngôn ngữ và là nền tảng bất khả tri

Architecture dựa trên các nguyên tắc lập trình. Những nguyên tắc hướng dẫn này có thể là nguyên tắc SOLID hoặc các mẫu thiết kế / architecture ổn định và architecture có thể được áp dụng trên các ngôn ngữ và nền tảng. Nên đầu tư thời gian vào architecture. Nó không chỉ giúp chúng ta thiết kế architecture tốt hơn mà còn cải thiện kỹ năng coding.

2. Sự mơ hồ về MVP / MVVM:

Nhiệm vụ của MVP (Model-View-Presenter) / MVVM (Model-View-ViewModel) là tách UI khỏi code. Chúng ta sử dụng Presenter / ViewModel để loại bỏ hết code logic ra khỏi View (Activity/Fragment). Việc phân tách này liên quan đến VP / VVM nhằm tách ra Model (M), M có nhiệm vụ cung cấp dữ liệu tới Presenter / ViewModel.

Những gì tôi thường thấy là PresenterViewModel được implement một cách chuẩn với các interfaceobserver nhưng ngoài ra nó còn khá rối. Tôi nghĩ rằng điều này có thể đổ lỗi cho việc sử dụng VP / VVM cho toàn bộ architecture của một ứng dụng và không thể định hình được Model (M). MVP / MVVM đóng một vai trò quan trọng như một mẫu kiến trúc nhưng kiến trúc của một ứng dụng vượt xa sự phân tách UI.

  1. Architecture rất quan trọng nhưng không cần thiết:

Việc học Architecture đến ở giai đoạn sau trong quá trình phát triển của một dev Android. Một trong những lý do là các ứng dụng của chúng ta có thể hoạt động tốt hơn ngay cả khi không có architecture nào, vậy tại sao phải mất thêm thời gian? Làm thế nào chúng ta sẽ thuyết phục sếp / khách hàng của mình rằng cần thêm thời gian để chúng ta dành cho việc này và có thể không có bất kỳ lợi ích nào ngay lập tức?

Chỉ sau một vài phiên bản, chúng tôi nhận ra sự lộn xộn nhưng sau đó đã quá muộn. Khi chúng ta tiếp tục gặp rắc rối hết lần này đến lần khác, chúng ta mới bắt đầu hiểu được sự cần thiết của architecture.

  1. Architecture cải thiện khả năng thay đổi:

Architecture sẽ rất quan trọng nếu chỉ có một phiên bản được phát hành cho  ứng dụng. Trong thực tế, đây là cách tiếp cận mà nhiều người trong chúng ta thực hiện, đó là  điều thiển cận khi phát triển ứng dụng.

Nếu tôi phải chỉ ra lợi ích lớn nhất của việc có một Architecture phù hợp thì đó sẽ là sự dễ dàng sửa đổi và hiệu quả của nó mang lại.

Sự thật là chúng ta không thể thấy trước mọi thứ mà ứng dụng có thể phát triển trong tương lai nhưng một Architecture tốt có đủ sự linh hoạt để điều chỉnh theo những thay đổi chưa biết này đấy.

  1. Architecture không đòi hỏi kiến thức đặc biệt:

Đối với một dev giỏi, thiết kế Architecture xuất hiện một cách tự nhiên. Điều này hơi liên quan ở luận điểm #1 nhưng nó rất quan trọng vì vậy tôi nghĩ nên sửa nó một chút và trình bày lại 😃

Dagger / RxJava hoặc bất kỳ công cụ nào khác yêu cầu chúng ta tìm hiểu những công cụ của nó. Trong trường hợp architecture, nó chỉ là các nguyên tắc và hướng lập trình. Chúng ta càng trở nên giỏi về code thì càng dễ hình dung được kiến trúc của một ứng dụng.

  1. Architecture đòi hỏi kỷ luật và sự kiên nhẫn

Architecture giống như một cái cây. Chúng ta không thể nhận được quả vào ngày chúng ta trồng nó. Phải mất thời gian và công sức để thiết kế một architecture và nó là một quá trình vẫn đang tiếp diễn. Mỗi thay đổi trong ứng dụng sẽ yêu cầu một quyết định cẩn thận trước khi thực hiện.

Thiệt hại lớn đến architecture của ứng dụng là khi chúng ta bắt đầu dùng phím tắt. Những cam kết trên (để làm sạch code sau này) cuối cùng bị phá vỡ hết lần này đến lần khác.

Chúng ta cần phải hiểu những gì chúng ta đang nhận được nếu không nó sẽ là một khởi đầu tuyệt vời và cuối cùng để mất sau này. Architecture  phải liên kết với vòng đời của một ứng dụng.


  1. Google Architecture components:

Năm 2017 Google đã giới thiệu Architecture Components. Architecture component chỉ để chuyển từ Activity / Fragment sang ViewModel. Các “Architecture” components có sẵn để tạo điều kiện cho chúng ta thiết kế kiến trúc của ứng dụng. Các thành phần này giúp dễ dàng thực hiện kiến trúc  này mà nếu không có thì sẽ là một công việc khó khăn.

Ví dụ như LiveData giúp dễ dàng quan sát các thay đổi trong dữ liệu vốn là thứ liên quan tới vòng đời của Activity/Fragment. Người ta có thể thấy ViewModel như một cách để lưu lại thay đổi nhưng ý nghĩa thực sự của nó là giúp chúng ta tách UI khỏi logic.

  1. Chúng ta không cần phải  trở thành một kiến trúc sư phần mềm Software Architect:

Mọi kiến trúc sư phần mềm là một dev nhưng không phải mọi dev đều là một kiến trúc sư. Trong một tổ chức lớn sẽ có chỉ định rõ ràng các kiến trúc sư phần mềm. Đối với họ, điều cần thiết là phải có kiến thức sâu rộng về các mẫu kiến trúc khác nhau và cách chúng vận hành.

Trong vai trò một dev, điều này giúp  có một cái nhìn về architecture để chúng ta có thể hiểu được các khái niệm trừu tượng được triển khai. Điều này trở nên quan trọng hơn nếu chúng ta đang làm việc tự do hoặc trong một công ty startup với nguồn lực hạn chế.  Trong trường hợp như vậy, sẽ có đủ kiến thức cơ bản về architecture.

Có nhiều mẫu và nguyên tắc đơn giản mà chúng ta có thể áp dụng để tạo ra một architecture tốt cho ứng dụng của mình mà không đi quá sâu vào thế giới architecture.

  1. Lợi ích của architecture:

Như đã đề cập trước đó, một trong những lợi thế là tính dễ thay đổi. Thêm các tính năng và sửa  mới trở nên dễ dàng và nhanh chóng nếu các thành phần được phân tách hợp lý và giao tiếp một cách có tổ chức. Sự tách biệt này dẫn đến nhiều lợi thế khác như khả năng kiểm tra, trong đó chúng ta có thể dễ dàng kiểm tra các thành phần độc lập.

  1. Bắt đầu từ đâu?

Architecture có ở khắp mọi nơi, hệ thống nhúng, ứng dụng web, phần mềm doanh nghiệp, ứng dụng điện thoại di động, v.v … Mỗi loại yêu cầu một kiểu kiến trúc khác nhau. Nếu chúng ta không muốn trở thành kiến trúc sư phần mềm, chúng ta phải cần chọn lọc thứ chúng ta muốn triển khai.

Để hiểu nhu cầu về architecture và việc triển khai nó thì cách tốt nhất là nên nghiên cứu Clean Architecture của Robert C. Martin (còn gọi là Uncle Bob) và một chút chuyên sâu là Domain-Driven Design: Tackling Complexity in the Heart of Software của Eric Evans.

Google cung cấp hướng dẫn về architecture của ứng dụng với sự liên kết theo một hướng nhưng đó là mức vừa đủ. Khi bạn đã nắm bắt được thứ bạn có thể triển khai một mẫu architecture  phân lớp thông qua hướng dẫn của Clean Architecture. Cách tiếp cận này dễ dàng và sẽ phù hợp với hầu hết các ứng dụng. Tôi đã tạo ra một ứng dụng mẫu theo các nguyên tắc này. Đây là repo Github của ứng dụng mẫu này.

Nếu bạn chưa quen với lập trình, tôi khuyên bạn nên bắt đầu với các nguyên tắc SOLID vì chúng sẽ giúp bạn sẵn sàng cho architecture 😉

TopDev via Medium

Tham khảo thêm các công việc ngành it khác tại Topdev

Tuyệt kỹ: Sử dụng cache để tăng tốc hệ thống

Bài viết của tác giả: Thanh Tú Phạm

Bạn đã bao giờ sử dụng cache để tăng tốc hệ thống?

Nếu dùng redis nó đã cung cấp cho bạn những cấu trúc cơ bản như hash, string, list, set, zset. Tuy nhiên bạn sẽ gặp 2 vấn đề, 1 là invalidate cache ko đơn giản, nhất là phải tính đến việc snapshot rồi replicas, 2 là khi object quá lớn, performance giảm đi nhanh chóng do vấn đề về ram và lạm dụng embeded objects.

Nếu tự tin về cấu trúc dữ liệu và giải thuật + lập trình mạng, bạn có thể build được hệ thống cache phục vụ cho mục đích riêng tối ưu hơn redis nhiều, lưu cả triệu tỉ dữ liệu, strong consistency, và tốc độ cao.

Bài dưới đây giúp bạn build được 1 database lưu 1 cấu trúc dữ liệu json bất kỳ, nhưng cho phép cập nhật được 1 value bất kỳ và truy vấn nó trực tiếp mà không cần phải serialize lẫn deserialize.

Từ đó giúp bạn build được các model dựa trên 1 object khổng lồ mà ko phải bận tâm đến các lệnh join where đau đầu của cơ sở dữ liệu truyền thống. Bởi vì bạn biết rằng, 1 object bất kỳ nó chỉ có 2 kiểu, list và hash, cuối cùng value là primative type mà thôi.

Sử dụng cache để tăng tốc hệ thống

Vấn đề là flattern nó ra, nhờ sự hỗ trợ của cấu trúc tree, tức cơ bản chúng ta cần list, tree và hash là đủ để mô phỏng lại datastructure lưu trong ram, từ đó giải quyết trực tiếp bài toán mà ko cần phải nghĩ đến lưu trữ database, ở dạng tự nhiên nhất.

– Xét về lưu trữ trong database, về cơ bản là gồm meta lưu chỉ mục và phần dữ liệu, meta thường là dạng các đoạn bytes chứa chuỗi key và phần còn lại chứa offset value đọc vào file value, nếu key lớn thường padding để chia hết cho 1 chunk size cố định.

Xét cơ bản nhất chúng ta cần lưu key-value, key đã được sắp xếp với btree, còn value thuần bytes, với cơ sở dữ liệu quan hệ value có thể gồm các đoạn byte liền nhau theo schema. Lý do ram đọc nhanh vì nó random access theo key từ hash được (bản chất là dùng mảng rồi hash(key) ra index là number), còn trên file phải tìm tuần tự, với btree nó giúp ích rất nhiều rồi.

– Bây giờ chúng ta sẽ ứng dụng 1 db key/value cơ bản như leveldb, về mặt xử lý nó sẽ giống kiểu sắp xếp merge file lớn bằng cách phân tán trên nhiều nodes, rồi chia tiếp trên mỗi node để fit vào ram, ở đây chúng ta sẽ tận dụng cấu trúc key/value trên 1 db duy nhất để build 1 tầng cache rồi sau đó flush cache này vào batch để update database.

Tham khảo thêm các vị trí tuyển dụng web developer lương cao tại Topdev.

2 cách commit để flush cache khi cache đầy

Có 2 cách 1 là chủ động gọi commit để flush cache khi cache đầy, 2 là dùng 1 lru-less recent used để quản lý cache hit, truy cập nhiều thanh ghi nhanh và đưa item ít truy cập ra thanh ghi chậm hơn và xoá hẳn, khi đó cần pre-images hay có thể coi là transaction logs để đẩy vào database, 1 dạng batch có thể get value nếu cache miss và chưa update db.

– Như trên thì việc quản lý cache và lưu trữ khá ổn, nhưng chúng ta ko chỉ lưu mỗi key-value, chúng ta cần lưu thêm các cấu trúc mở rộng khác, hầu hết sẽ là linked list – mô phỏng list trong ram, và tree – mô phỏng 1 json object trong ram.

Lúc này sẽ nẩy sinh vấn đề là conflict key giữa các cấu trúc, và ta sẽ giải quyết đơn giản bằng tính hash của tên object cần lưu + key của nó, sử dụng big.Int. Ví dụ lưu list tên là a, chèn thêm 1 object tên là b, thì key lưu vào sẽ là hash(a) + b. Để lưu được các cấu trúc như list và tree, cơ bản chúng ta cần meta ví dụ list là next key và back key, với tree là left key và right key, parent key, nếu lấy hash 32 bytes làm chuẩn, key length > 32 thì tính hash, chúng ta có thể dùng 64 và 96 byte đầu tiên lưu meta, còn lại là value.

Như vậy không phải serialize gì cả, đọc trực tiếp luôn giống như cơ sở dữ liệu quan hệ vậy, các key/value db hầu hết hỗ trợ đọc offset:limit của value luôn, mặc định nó đọc hết từ meta value của key lấy ra offset limit.

– Phần cuối cùng, đó là phân tán, lẫn strong consistency, về phân tán thì chúng ta sử dụng kademlia routing giống bittorrent, khi lưu batch thì chúng ta broad cast toàn mạng và các node cùng bucket sẽ đồng bộ dữ liệu, cơ bản cài đặt kiểu p2p protocol.

Còn để strong consistency chúng ta có 2 cách, 1 là theo checkpoint giống blockchain, tức block number, đóng gói lại thông tin root key lần gần nhất, và ko được thay đổi, cái này hợp giao dịch vì đã chuyển tiền là ko có sai lệch tài khoản được.

Cách thứ 2 là theo epoch, tức là 1 thời điểm nào đó với 1 duration nào đó sẽ strong consistency, lúc ấy trước khi truy vấn phải lấy về epoch và timeout sẽ ko có dữ liệu, còn pending sẽ đợi, từ đó có thể dựa vào tần suất update để loại những node ít update khi truy vấn latest item.

– Tổng hợp các ý trên bạn có thể build hệ thống cache cực lớn, ăn ít ram nhờ chung 1 db key-value duy nhất, tốc độ cao, và vẫn invalidate cache dễ dàng, nếu dựa vào hash làm reference của object tương tự reference trong bộ nhớ.

Cài đặt Ở đây