Home Blog Page 120

Hệ thống quản lý chất lượng dữ liệu: Tại sao và như thế nào?

data quality
Hệ thống quản lý chất lượng dữ liệu: Tại sao và như thế nào?

Một ngày của Data team ở Amanotes bắt đầu bằng việc xử lý rất nhiều tin nhắn được gửi cho data team, ví dụ như sự chênh lệch của chỉ số, tại sao trendline có vẻ thay đổi,… Những câu hỏi về các vấn đề liên quan đến data nhân lên rất nhiều lần cho các metrics trên rất nhiều dashboard của công ty.

Tìm việc làm QC làm online tại nhà

Điều này khiến data team suy nghĩ đến việc nên làm sao để mọi người không phàn nàn về những vấn đề liên quan đến data nữa. Và nhờ vậy chúng tôi quyết định build một hệ thống quản lý chất lượng data. Đó cũng là lý giải cho việc tại Amanotes quyết định build hệ thống này và team đã build nó như thế nào?

Nhiều quyết định quan trọng được đưa ra dựa vào data

Tại sao việc build hệ thống này lại quan trọng với data  quality cũng như data team của một công ty?

Mỗi ngày, business stakeholders sẽ có những quyết định quan trọng và tất cả những quyết định đó đều dựa trên data. Và điều quan trọng nhất là mọi người phải tin vào data mà họ nhìn thấy, chỉ có như vậy mới tối ưu hóa được lợi ích mà data mang lại cho user cũng như giúp cho business stakeholders tốn ít thời gian hơn trong việc double check data, complain data và tự tin hơn trong quyết định của họ.

Về sự phân cấp giá trị mà data đem lại, bắt đầu từ data bằng việc processing và khai thác những thông tin quan trọng từ nó chúng ta mới bắt đầu có information. Dựa vào information, stakeholders sẽ có knowledge, từ đó build up thành wisdom – sự thông thái và hiểu biết về những gì đang diễn ra trong business của mình. Vậy nên data chính là nền tảng của tất cả những hiểu biết, những thế mạnh của một doanh nghiệp. Và data quality chính là bước đầu tiên để kiểm soát nguồn thông tin, dữ liệu và sự hiểu biết trong doanh nghiệp.

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết
  Dữ liệu lớn (Big Data) là gì? Đặc điểm và ứng dụng của Big Data

Vậy data team đã copy lại cách user complain về data như thế nào?

User complain flow

User complain flow – những gì thực chất diễn ra bằng con người và Data Quality Control System.

Cũng giống như data team hằng ngày bắt đầu làm việc bằng việc check dashboard, sẽ có 2 cách để check xem data ngày hôm nay có bất thường hay không hoặc có bug gì xảy ra với data hay không.

Có thể check bằng mắt, xem trendline của ngày hôm đó so với các ngày trước có thay đổi hay không, có quá cao hay quá thấp hay không. Nếu như nhìn ở góc độ data quality control system thì đó chính là thuật toán Anomaly Detection. Sau khi đã xem qua các metrics rồi thì bản thân các business stakeholders sẽ có những kiến thức về mặt business để xét xem những con số này có chính xác hay không. Nếu có 2 metrics liên quan đến nhau trên cùng một dashboard thì liệu 2 metrics này có đi cùng một trend hay không… Điều này tương tự với những Rule-based Auto-Tests được đưa vào trong Data Quality Control System.

Và dĩ nhiên là cả Anomaly Detection Algorithm và Rule-based Auto-Tests đều apply trên cùng một data source mà chính những data source đó được sử dụng để visualize lên những dashboard đang có. Dựa vào thông tin của Eye-check và Business Intuition thì bản thân các business stakeholders sẽ quyết định xem những bất thường này có nghiêm trọng hay không. Nếu nó thật sự nghiêm trọng và ảnh hưởng đến quá trình ra quyết định thì họ sẽ liên lạc với data team.

Xem thêm Khái niệm transaction trong database

Data team dựa vào các câu hỏi của stakeholders sẽ đào ngược lại vào trong data source, test, investigate, explore lại xem lỗi này xảy ra như thế nào. Để mimic (mô phỏng/bắt chước) lại quá trình đó thì trong Data Quality Control System sẽ có thêm Data Quality Scoring. Data Quality Scoring là hệ thống check tất cả những input từ Run-based Auto-Tests và các thuật toán để detect anomal, scoring nó để đánh giá data quality của ngày hôm nay có tốt hơn ngày hôm qua hay không. Đưa ra một con số để tất cả user nhìn vào con số của ngày hôm nay biết được tình trạng data quality của toàn bộ pipeline đó như thế nào.

Song song với Data Quality Scoring thì có thêm Severity Rating là tất cả các text và out layer sẽ trả về một list kết quả test là fail hay pass. Mình sẽ có những logic khác nhau dựa trên các chuẩn mực riêng biệt để đánh giá xem lỗi fail test có nghiêm trọng hay không. Nếu nghiêm trọng mình sẽ đưa vào Alerting System và data team sẽ giải quyết vấn đề này trước khi một stakeholders nào check nó trên dashboard.

Tại sao lại cần có Severity Rating để đánh giá data quality?

Có thể hiểu là ở bước Rule-based Auto-Tests và Anomaly Detection nó sẽ trả về rất nhiều loại fail hay pass test. Thậm chí lượng fail test có thể chiếm 10 – 15% của tất cả những test mà mình từng viết nếu như ngày hôm đó không được may mắn cho lắm. Nếu coi tất cả những test đó như nhau và cho nó vào Alerting System thì một ngày data team sẽ nhận được rất nhiều alert!

Và đương nhiên là, nếu liên tục nhận được những signal, những alert không thật sự nghiêm trọng thì dần dần đối tượng của Alerting System sẽ không tin vào lỗi được báo nữa nên  mục đích của Severity Rating ở đây là source lists và filter data. Chỉ những tests nào fail thật sự nghiêm trọng và trigger khiến data team phải can thiệp lại việc fail test đó thì mới đưa vào alerting system. Đó là một bước để tối ưu hóa hiệu quả của hệ thống và giúp data team hoạt động hiệu quả hơn trong việc build các bugs và kiểm soát được chất lượng của hệ thống dữ liệu.

Framework bên dưới để quá trình này diễn ra hoạt động như thế nào?

Analytics Engineering Flow mà hiện tại Amanotes sử dụng có 3 loại technology. Đầu tiên là Google BigQuery như Data Warehouse, đây cũng là technology rất phổ biến dạo gần đây. Thứ hai là Airflow được sử dụng Airflow như công cụ để điều phối các tasks liên quan đến data cũng là một công cụ rất nổi tiếng. Công cụ tiếp theo mới được sử dụng gần đây là dbt. Đây là một công cụ mới cho phép các data engineers và các bạn analytic engineers có thể apply một template cho auto develop và auto test framework với các best practices trong software engineering trên Sql để apply cho BigQuery.

data quality
Framework hỗ trợ đắc lực cho quá trình làm xử lý data

Framework sẽ hoạt động từ Data loader đưa vào trong Raw data. Từ Raw data sẽ đi qua các bước Snapshot, Transform, Test, Deploy và Document. Ngôn ngữ chính đang sử dụng ở đây là BigQuery Sql và dbt. Bình thường khi nhắc đến Sql mọi người sẽ không đánh giá cao nó như một ngôn ngữ mang các best practices của Software Engineering và thiếu đi rất nhiều công cụ để test code đã được viết hoặc để deploy hay document nó.

Nhưng dbt xuất hiện trong framework cho phép thực hiện tất cả những điều này với Sql bao gồm cả version control và test. Đồng thời trong dbt nó cũng automate toàn bộ documentation liên quan đến pipeline gồm các components và các metrics được tạo ra như thế nào. Cùng với version control, Amanotes cũng đang build Alerting và Logging. Alerting và Logging là sự kết hợp của rất nhiều công cụ đang sử dụng trong stack này bao gồm logging từ Airflow và dbt. Amanotes cũng có 1 product inhouse để combine nó lại và đưa vào trong Alerting System. Sau khi raw data đã đi qua tất cả các bước transforming này thì sẽ được show lên BI tool cùng với Metabase.

3 components chính trong hệ thống quản lý chất lượng data

3 components này gồm Rule-based Auto-Tests, Anomaly Detection và Data Quality Scoring. Alerting là output cuối cùng nhận tất cả các kết quả ở 3 hệ thống vừa được đề cập.

1. Rule-based Automated Tests

Mục đích của testing là để validate lại những assumptions của data team nên test được thiết kế tốt là test có thể bắt được những assumption sai về data mà mình đang có. Assumption cụ thể ở đây là khi viết Query, ta assume là kết quả trả ra sẽ như vậy và nếu bộ data đủ phức tạp thì một developer sẽ không thể bao quát hết tất cả những corner case liên quan đến nó. Do đó việc apply test là để check lại kết quả của các query dựa trên một số assumption mà dev biết.

Nếu là fail assumption thì đây sẽ là trigger để cho biết data đang có vấn đề gì và assumption cho thấy data đang không chính xác. Ở đây mình chia tất cả các test thành rất nhiều components khác nhau: comment issues mà data users hay đưa lên cho data team, team biến nó trở thành những automatic tests. Tất cả những issues này sẽ thuộc về những nhóm khác nhau. Ví dụ như revenue đưa xuống ở country level quá lớn thì nó thuộc group Source of Truth vì bên cạnh những dashboard internal mình cũng có những dashboard partners external.

  Làm thế nào để tạo một bảng BI Dashboard bằng cách sử dụng một bảng Pivot và một thư viện biểu đồ?

Một trong những cách đơn giản nhất để viết automatic test này là compare cùng một thông tin từ 2 nguồn data khác nhau để đối chứng với nhau. Có những thông tin liên quan đến data không fresh ví dụ như việc đếm số new users data trong một ngày, như hôm nay là ngày 10 nhưng trong data không có ngày 10 thì lúc này team sẽ biết là data đang không đúng và có vấn đề trong data pipeline của mình.

Tiếp theo là có thể theo dõi inconsistent data hoặc historical trend bằng việc xem LTV trendline của nó qua mỗi ngày có consistent hay không, hay đột nhiên có vấn đề lệch ra khỏi quỹ đạo thông thường. Tất cả các tasks này sẽ được viết bằng Sql để kết quả trả ra là yes hay no và dbt chính là sản phẩm cho phép chúng ta làm được chuyện đó bằng Sql trong BigQuery trong framework. Khi team sử dụng version control để kiểm soát toàn bộ những code mà bọn mình từng viết trong data pipeline này, nếu đã full request thì dbt sẽ tự động chạy. Hoạt động này cũng giống như dbt tự động chạy mỗi ngày trong pipeline để check lại tất cả các bảng data cũng như các metrics quan trọng. Để xem đi qua hết list object này, trải rộng suốt một pipeline thì tất cả các task của mình có pass hay không. Nếu tất cả các test đều pass hết thì sẽ có một report được gửi về cho data team và đảm bảo ngày hôm nay không có vấn đề gì xảy ra.

Xem thêm Bài toán đồng thuận trong Distributed Systems

2. Data Profiling & Anomaly Detection Algorithm

Data Profiling cũng mô phỏng lại một hành vi của user. Cách thức để tìm ra một vấn đề xảy ra trong chart đó là nhìn vào những điểm data bất thường dựa vào những điểm data xung quanh nó. Đây cũng là điểm cốt lõi của Data Profiling và Outlier Detection. Có những quan sát sẽ đi chệch ra nhiều hơn so với những quan sát khác đứng phía trước và sau nó, thường sẽ là đằng sau vì phía trước là dữ liệu trong tương lai mình không thể quan sát được. Và những thứ đi chệch ra này sẽ khiến users hoặc người làm data đưa ra những nghi vấn rằng mọi thứ có đang diễn ra bình thường hay không hay đang có vấn đề bất thường.

Với Anomaly Detection, cần phân biệt được data discrepancy, sự khác biệt của metrics so với một điểm data nào đó. Ở đây mình so với 3 tiêu chí khác nhau:

Một là một điểm data với Business Normal Range, tức là khoảng bình thường theo rule của business. Tiêu chí thứ 2 là so với giá trị trung bình của 7 ngày trước đó. Thứ 3 là so với giá trị trung bình của 4 ngày cùng thứ của 4 tuần trước đó. Tiêu chí thứ 3 này là tiêu chí cần phải có vì ví dụ như với Amanotes là một công ty về mobile app thì vào cuối tuần, behaviours và lượng thông tin sẽ rất khác so với các ngày trong tuần nên thông tin sẽ không công bằng và không capture được outlier thực tế của nó. Trong đó Outliers có 2 dạng: thứ nhất là có lỗi xảy ra và thứ hai là không có lỗi nào cả, chỉ đơn giản là bản chất của data mà thôi.

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

Ngoài ra, còn có các solution khác nhau để identify một outlier dựa vào 3 tiêu chí của data discrepancy. Đầu tiên là dựa vào statistics distribution based ví dụ như so sánh stability index của distribution. Thứ 2 là distance based, thứ 3 là density based và thứ 4 là deviation based. Đây là 4 phương pháp kết hợp và tạo ra outlier. Hiện tại data team mình sử dụng là high bridge của nhiều solution khác nhau và combine output từ những thứ khác nhau như vậy để đi đến quyết định cuối cùng là một data bond có phải là outlier hay không.

3. Data Quality Scoring

2 components trên sau khi hoạt động sẽ trả ra kết quả là pass or fail, bản thân Abnormal Detection cũng sẽ output ra kết quả pass or fail. Ví dụ như một data bond được nhận diện là outlier thì sẽ trả về kết quả là fail và mình coi outlier detection đó cũng là test như Rule based Tests nhưng Abnormal Detection là một database, machine learning base test được apply lên data. Một chuỗi kết quả fail and pass này sẽ được đưa vào Data Quality Scoring. Mục đích của nó là tạo được một metrics, score về data quality của pipeline trên tất cả những metrics trong dashboard ngày hôm đó.

data quality
Scoring giúp đánh giá chính xác chất lượng dữ liệu

3.1. Data Quality

Data Quality là một metrics để measure rất nhiều criteria khác nhau.

Đầu tiên là tính chính xác của data. Tính chính xác này đến từ rule based, automatic tests hoặc so sánh nó với source of truth hoặc outlier thì sẽ compare với historical data.

Thứ 2 là tính toàn vẹn của data. Data có thể hiện hết những value mà mình đang quan tâm hay không. Có những metrics rất quan trọng nhưng 70 – 80% của nó là missing value.

Thứ 3 là relevance. Ở đây sẽ có những điểm data, vậy liệu những điểm data liên quan tới nhau có đang thể hiện một mối tương quan giống trong quá khứ hay không.

Thứ 4 là timeliness. Nó thể hiện được data có fresh hay không, có đến vào đúng thời điểm mà mình cần hay không. Vì thật ra tất cả các data source không đến cùng một thời điểm, có rất nhiều nguồn data được control internally thì timeliness và độ trẻ của nó sẽ ít hơn nhưng cũng có nhiều data mình kéo bằng API, từ nhiều nguồn ở ngoài sẽ có độ trẻ lâu hơn. Thường timeliness sẽ compare data availability với hiểu biết mà mình đã có về độ trẻ của data.

Thứ 5 là clarity, nghĩa là tất cả những data, những metrics có thỏa mãn về mặt syntax và grammar rules hay không. Thật ra mảng này hiện không được cover trong Data Quality Scoring hiện tại của mình.

Thuộc tính cuối cùng là Accessibility – data có thân thiện, hiệu quả và access được với tất cả mọi người hay không.

Ở đây sẽ có những metrics quan trọng hơn các metrics khác như completeness, relevant và timeliness là những tiêu chí rất dễ hình dung để đưa ngay vào trong data quality control system của mình. Accuracy ngược lại hơi mang tính chủ quan hơn vì thực chất có rất nhiều bộ data đang có chỉ mang tính tương đối và cũng không biết được đâu là source of truth để compare data mình đang có với nó. Clarity và Accessibility cũng mang tính chất khách quan nhiều hơn và hiện nay với version hiện tại của Data Quality Control System ở Amanotes không cover 2 metrics này.

3.2. Cách để measure data quality

Đầu tiên là Accuracy – tất cả những rule based auto tests bị fail. Thứ 2 là abnormal detection. Thứ 3 là tính toàn vẹn của data, tức NULL rate trong dữ liệu của mình. Cuối cùng là usability mà cụ thể là Zero rate của một metrics nào đó.

Vậy sự khác nhau giữa NULL rate và Zero rate là gì?

Zero rate không mixing, data này thật sự có giá trị là 0 nhưng nó ảnh hưởng đến usability vì nếu một metrics có đến 70 – 80% nhận cùng giá trị 0 thì đó không phải là một metrics có ý nghĩa và không add được nhiều value cho business của mình. 4 criteria này sẽ được đưa vào một Ranking/Weighting Algorithm.

Weighting Algorithm đến từ việc mình đang có nhiều criteria khác nhau và mỗi criteria này có references khác nhau mà mình collect input này từ phía stakeholders. Ví dụ như trong số những criteria này thì Accuracy là criteria quan trọng nhất và Usability là criteria ít quan trọng nhất. Nó được chấm dựa trên thang điểm từ 1 đến 5. Weighting Algorithm sẽ kết hợp tất cả những criteria đã được weighting và cho ra một kết quả có ý nghĩa, làm sao để tiêu chí được đánh giá, được cho điểm cao nhất và nó không dominate score cuối cùng của mình cũng như làm sao để tiêu chí được cho điểm thấp nhất vẫn có tầm quan trọng nhất định.

Framework chính để Anomates thiết kế Algorithm là dựa trên decision making framework trong management science và sử dụng ranking trên một decision. Sau khi đưa input từ accuracy, abnormal detection, completeness và usability vào Ranking/Weighting Algorithm thì kết quả trả về là score có giá trị từ 0 đến 1. Đề xuất cho data user là nếu bạn đang cân nhắc sử dụng một nguồn data nào đó mà đang có nhiều lựa chọn, nhiều data sources thì hãy lựa chọn data sources có data quality scoring cao hơn.

  Popup alert trong javascript | tạo popup alert bằng html css js

Data Alerting System

Data quality control system sẽ trả ra hàng loạt test và những test này sẽ được đánh giá về mức độ usability dựa trên nhiều yếu tố. Đầu tiên là metrics này có quan trọng hay không và độ lệch của nó có nghiêm trọng hay không. Nhìn vào dashboard, data team sẽ biết nên ưu tiên sửa vấn đề nào trước và nên làm gì với những vấn đề đó.

Cuối cùng là phải tối ưu hóa data quality alerting system. Mục đích của việc này là để giảm đi lượng false positive và có thể tăng productivity của data team lên rất cao, giảm các công việc liên quan đến việc tìm bug, thông báo và communicate với end-user.

Vậy việc tối ưu sẽ diễn ra như thế nào?

Hiện nay interface để entrust với data alerting system mà data team đang sử dụng là thông qua notification của Slack và những thông số trên Metabase giống như rất nhiều dashboard trước đó. Có rất nhiều states khác nhau có thể apply để tối ưu, thứ nhất là smart grouping, kết hợp những alert có liên quan tới nhau và những alert lặp đi lặp lại. Thứ 2 là exception list, có những test lặp đi lặp lại và đây là lỗi mà team không thể sửa được hoặc lỗi này nằm bên ngoài system nhưng không ảnh hưởng quá lớn đến data pipeline và quyết định của mình thì cũng có thể đưa vào exception list.

data quality
Theo dõi các vấn đề có thể xảy ra với data giúp kiểm soát chất lượng data tốt hơn

Thứ 3 là automatic synchronization giữa các platforms để đảm bảo tất cả mọi thứ hoạt động trơn tru và không bị spam quá nhiều cho các thành viên của datateam. Bên cạnh đó thì việc optimize anomaly detection, data quality scoring và severity levels cũng giúp optimize data alerting system.

Nhưng sự thật thì sẽ không thể nào dự đoán được chuyện gì sẽ xảy ra với data, luôn có rất nhiều corner cases trong khi data là những gì đã xảy ra trong quá khứ. Chúng ta sẽ không bao giờ đoán trước được việc data ngày mai sẽ diễn ra như thế nào, nó có thay đổi hay không và bug nào sẽ xảy ra tiếp theo. Do đó quá trình build data quality control system sẽ là một nỗ lực liên tục, teamwork cùng nhau, làm việc cùng các stakeholders để nâng cao chất lượng của data và có thể đưa data vào ứng dụng hơn nữa nhằm tạo ra benefit cho business của mình.

Bài viết được trích dẫn từ phần trình bày của chị Đặng Huỳnh Mai Anh tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức

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

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

Checked và Unchecked Exception trong Java

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

CHECKED VÀ UNCHECKED EXCEPTION TRONG JAVA

CƠ BẢN

Trong Java có 2 loại exception: checked và unchecked. Tất cả các checked exception được kế thừa từ lớp Exception ngoại trừ lớp RuntimeException. RuntimeException là lớp cơ sở của tất cả các lớp unchecked exception. Đó cũng là dấu hiệu để nhận biết đâu là checked exception và đâu là unchecked exception. Cùng xem qua hierarchy của tất cả các lớp exception:

KHÁC NHAU GIỮA CHECKED VÀ UNCHECKED EXCEPTION

Điểm khác biệt giữa các lớp checked và unchecked expcetion chính là thời điểm xác định được expcetion có thể xảy ra. Đối với checked exception, việc kiểm tra được thực hiện ngay thời điểm compile time, một số IDE sẽ giúp chúng ta bằng cách hiển thị lỗi cú pháp nếu ta gọi một method throw ra bất kỳ checked exception nào mà không được catch. Một số checked exception tiêu biểu như: IOException, InterruptedException, XMLParseException.. Còn đối với unchecked exception, việc xác định có exception xảy ra hay không chỉ có thể thực hiện ở thời điểm runtime, và các IDE sẽ không giúp chúng ta xác định được chuyện đó. Một số unchecked exception tiêu biểu là: NullPointerException, IndexOutOfBoundsException, ClassCastException… Hãy xem các ví dụ để hiểu rõ hơn.

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

CHECKED EXCEPTION

Hãy xét qua ví dụ với IOException:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class MainCheckedAndUncheckedException {

    public static void main(String[] args) {

        BufferedReader br = null;

        try {

            String sCurrentLine;

            br = new BufferedReader(new FileReader("C:\\testing.txt"));

            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println(sCurrentLine);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }
}

Ở đoạn trên, nếu ta remove phần try-catch thì IDE sẽ báo lỗi:

Unhandled exception type FileNotFoundException đối với method: FileReader(…)
Unhandled exception type IOException đối với method: readLine()

Bây giờ hãy viết riêng một method để test

public class MainCheckedAndUncheckedException {

    public static void main(String[] args) {
        try {
            doParseXML();
        } catch (XMLParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void doParseXML() throws XMLParseException, IOException {
        doOpenXML();
        // Do parse XML. This method may be thrown a checked exception
    }

    private static void doOpenXML() throws IOException {
        // Do open XML. This method may be thrown a checked exception
    }
}

Method doOpenXML được dánh dấu là sẽ throw ra IOException, do vậy, bất cứ method nào gọi doOpenXML đều phải catch nó hoặc đánh dấu là sẽ throw ra exception của method nó gọi. Trong trường hợp này doParseXML gọi doOpenXML và quyết định throw ra IOException của doOpenXML. Đồng thời nó cũng throw thêm 1 exception là XMLParseException. Và method main gọi doParseXML chọn cách catch các exception của doParseXML có thể throw.

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

UNCHECKED EXCEPTION:

public class MainCheckedAndUncheckedException {

    public static void main(String[] args) {
        printArray();
    }

    private static void printArray() {
        int[] array = new int[1];
        System.out.println(array[1]);
    }
}

Với đoạn code trên sẽ có 1 exception được throw ra mà không hề báo trước:

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1
at com.edward.tutorial.corejava.exception.MainCheckedAndUncheckedException.printArray(MainCheckedAndUncheckedException.java:12)
at com.edward.tutorial.corejava.exception.MainCheckedAndUncheckedException.main(MainCheckedAndUncheckedException.java:7)

Dù cho ta có đánh dấu method printArray sẽ throw ra ArrayIndexOutOfBoundsException thì IDE vẫn không báo lỗi khi hàm main gọi đến hàm printArray bởi vì ArrayIndexOutOfBoundsException là 1 unchecked exception

public class MainCheckedAndUncheckedException {

    public static void main(String[] args) {
        printArray();
    }

    private static void printArray() throws ArrayIndexOutOfBoundsException {
        int[] array = new int[1];
        System.out.println(array[1]);
    }
}

CHECKED VÀ UNCHECKED EXCEPTION USE CASES

Vậy một câu hỏi đặt ra khi design API là khi nào một method sẽ throw checked exception, và khi nào sẽ throw unchecked exception.

Throw unchecked exception trong trường hợp chương trình bị sai về logic, không thể làm gì tiếp theo nếu gặp những lỗi đó, ví dụ như có 1 biến null hoặc không hợp lệ khiến toàn bộ đoạn chương trình phía sau không thể làm tiếp, ta sẽ throw NullPointerException hoặc IllegalArgumentException. Còn trong trường hợp những lỗi vẫn còn có thể handle được thì throw checked exception. Ví dụ như method open file có thể throw FileNotFoundException nhằm mục đích cảnh báo khi client gọi đến method này, cần phải handle trường hợp không tìm thấy file lúc đọc file. Đó không phải là lỗi logic chương trình mà là 1 ngoại lệ khác với kết quả mong muốn từ việc đọc file.

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

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

Xem thêm Tuyển dụng Java hấp dẫn trên TopDev

Interface và Abstract class

Interface và Abstract class

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

Nói về chủ đề này thì đã có quá nhiều bài viết trên mạng, thế nhưng mục đích mình bài này là để cho những đứa em của mình cũng đang theo con đường lập trình có một nơi để tham khảo. Rất hy vọng được các bạn góp ý để kiến thức mình chia sẽ được tốt hơn.

Interface và Abstract class

Thật ra thì với các bạn sinh viên mới ra trường đi làm (con đang là Internship hay Fresher) thì câu hỏi này là top những câu hỏi gặp phải khi phỏng vấn đó nha.

  Cơ bản về Class trong C++
  Factory Function vs. Class

Bên cạnh đó, hiểu rõ sự khác nhau giữa Interface và Abstract Class sẽ giúp chúng ta có thể thiết kế được các ứng dụng mà nó có các kết nối lỏng lẽo (loosely coupled) và dễ dàng mở rộng. Vấn đề này bạn sẽ hiểu rõ hơn trong bài viết nói về Dependency Injection Principle. Một điều quan trọng là bạn không thể chọn dùng Interface hay Abstract Class nếu chỉ biết chúng khác nhau thế nào.

Interface trong C#

Có thể hiểu đơn giản Interface là một bản thiết kế cho bất kì class muốn thực hiện nó. Nghĩa là nó chỉ có phần khai báo các phương thức/sự kiện và thuộc tính. Các class muốn thực hiện Interface này sẽ viết code implement cho tất cả các khai báo của Interface này.

Các tính chất của Interface

  • Interface không cung cấp việc kế thừa như Class hay Abstract Class mà nó chỉ khai báo phương thức/sự kiện để các lớp khác thực hiện nó.
  • Nó không được khởi tạo nhưng nó có thể được tham chiếu bởi đối tượng của lớp thực hiện nó. ví dụ:
IUserRepository user = new UserRepository();
  • Không có interface lồng nhau (nested interface)
  • Không có constructor, destructor, constants, static và variable.
  • Một interface có thể kế thừa từ một hoặc nhiều interface khác.
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
  • Một interface có thể mở rộng một interface khác.
  • Một class có thể implement một hoặc nhiều interfaces.
  • Mọi phương thức, property đều mặc định là public.

Abstract Class trong C#

Lớp trừu tượng (Abstract Class) là một loại lớp đặc biệt không thể khởi tạo được và nó hoạt động như một lớp cơ sở cho các lớp khác.

Mục đích của Abstract Class là cung cấp các chức năng cơ bản mặc định hoặc các chức năng chung chung mà các lớp dẫn suất có thể thực hiện và ghi đè. Nghĩa là, bạn có thể viết định nghĩa cho phương thức trong Abstract Class, các phương thức trong Abstract Class có thể vừa trừu tượng vừa cụ thể.

Các tính chất của Abstract Class

  • Một Abstract Class không thể được khởi tạo.
  • Abstract Class có thể chứa các phương thức trừu tượng và cụ thể (abstract method – virtual method).
  • Một Abstract Class không thể là một Sealed Class. Vì Sealed Class không cho phép kế thừa.
  • Không thể kế thừa từ một Class hay Interface.
  • Lớp dẫn xuất từ Abstract Class phải implement tất cả các abstract methods của Abstract Class đó.
  • Trong Abstract Class thì các abstract method chỉ có khai báo. Còn virtual method thì có thể được định nghĩa.
  • Abstract Class có thể dùng các access modifiers như: private, protected, internal. Nhưng các abstract/virtual methods thì không thể dùng private.
  • Abstract Class có thể có contructor, destructor, constants, fields
  • Không hỗ trợ đa kế thừa.
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SampleClass sc = new SampleClass();
            //AbsSimpleClass absSimpleClass = new AbsSimpleClass(); // Error here
           
            sc.Paint();
            Console.ReadKey();

            //Output:
            //--> AbsSimpleClass constructor here
            //--> Paint method here
        }

        public abstract class AbsSimpleClass
        {
            public AbsSimpleClass()
            {
                Console.WriteLine("AbsSimpleClass constructor here");
            }

            public abstract void DoSomething();

            public virtual void Paint()
            {
                Console.WriteLine("Paint method here");
            }
        }

        public class SampleClass : AbsSimpleClass
        {
            public override void DoSomething()
            {
                Console.WriteLine("Do something here");
            }            
        }
    }    
}

Những điểm khác nhau giữa Interface và Abstract Class

Interface Abstract Class
Constructors, Fields and Constants Không
Multiple inheritance Một class có thể hiện thực nhiều interface.(tạm coi là thừa kế) Không hỗ trợ đa thừa kế
Default implementation Không thể định nghĩa code xử lý, chỉ có thể khai báo. Có thể định nghĩa thân phương thức, property.
Access Modifiers Mọi phương thức, property đều mặc định là public. Có thể xác định modifier.
Adding functionality Mọi phương thức, property của interface cần được hiện thực trong class. Không cần thiết.

Khi nào nên dùng Interface

  • Cần cung cấp các chức năng chung cho các lớp không liên quan.
  • Cần nhóm các đối tượng dựa trên các hành vi phổ biến.
  • Cần sử dụng đa hình vì một lớp có thể thực hiện nhiều interfaces.
  • Cần tạo các thành phần (components) được ghép lỏng lẻo, dễ bảo trì và dùng như 1 plugin vì việc implement cho interface được tách biệt với nó.

Khi nào nên dùng Abstract Class

  • Cần sử dụng kế thừa.
  • Cần cung cấp các phương thức mặc định cũng như các phương thức phổ biến mà nhiều lớp dẫn xuất có thể thực thi và ghi đè.
  • Cần tạo nhiều phiên bản cho các thành phần (components). Bạn có thể thêm các thuộc tính và phương thức vào Abstract Class mà không vi phạm mã và tất cả các lớp kế thừa được tự động cập nhật với thay đổi.

Một vấn đề khác là các Interfaces có thể được implement ngầm hoặc rõ ràng (implemented implicitly or explicitly).

À, còn một vấn đề nữa. Như các bạn thấy một Class có thể implement một hoặc nhiều interfaces. Vậy nếu một class implement 2 interfaces mà trong đó có cùng 1 phương thức (method) thì sẽ thế nào?

Thử mở Visual Studio và chạy console app sau xem như thế nào nhé:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SampleClass sc = new SampleClass();
            IControl ctrl = new SampleClass();
            ISurface srfc = new SampleClass();

            sc.Paint();
            ctrl.Paint();
            srfc.Paint();
        }

        interface IControl
        {
            void Paint();
        }
        interface ISurface
        {
            void Paint();
        }
        class SampleClass : IControl, ISurface
        {
            public void Paint()
            {
                Console.WriteLine("Paint method in SampleClass");
                Console.ReadKey();
            }
            void IControl.Paint()
            {
                Console.WriteLine("Paint method in IControl");
                Console.ReadKey();
            }

            void ISurface.Paint()
            {
                Console.WriteLine("Paint method in ISurface");
                Console.ReadKey();
            }
        }
    }
}

Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về Interface và Abstract Class. Từ đó giúp bạn xây dựng ứng dụng tốt hơn.

Mình cũng rất mong được các bạn góp ý để bổ sung và hoàn chỉnh kiến thức này.

Tham khảo thêm:

  1. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation
  2. https://www.infoworld.com/article/2928719/c-sharp/when-to-use-an-abstract-class-vs-interface-in-c.html
  3. https://www.dotnettricks.com/learn/csharp/a-deep-dive-into-csharp-interface
  4. https://www.dotnettricks.com/learn/csharp/a-deep-dive-into-csharp-abstract-class

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

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

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

Composer – Công cụ tuyệt vời dành cho PHP

Composer - Công cụ tuyệt vời dành cho PHP

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

Trước khi Composer ra đời, chúng ta thường khó chịu với hàng tá các thư viện của bên thứ ba cần phải quản lý, rất khó khăn để cập nhật và còn lại các khâu cài đặt lằng quằng. Đó là quá khứ thôi, sự ra đời của Composer đã làm thay đổi hoàn toàn mọi thứ rồi. Trong bài viết này chúng ta sẽ tìm hiểu về Composer thực chất nó là gì.

Composer là gì ?

Composer là một công cụ quản lý sự phụ thuộc trong PHP. Nó cho phép bạn khai báo các thư viện mà dự án của bạn phụ thuộc vào và nó sẽ quản lý (cài đặt / cập nhật) các thư viện cho bạn.

Composer là một mã nguồn mở (OpenSource) nên được cộng đồng hỗ trợ rất nhiều, bạn có thể tham gia phát triển, phát triển lại từ trang Github chính thức của Composer.

  Composer là gì? Quản lý các thư viện bằng composer

Tại sao lại cần Composer?

Như mình đã nói ở trên Composer ra đời để giải quyết các vấn đề khó khăn như dung lượng project sẽ lơn hơn, việc cập nhật cũng như chèn vào project rất phức tạp và phiền phức. Với composer, bạn sẽ cần khai báo tên và version của các thư viện mà bạn có sử dụng mà không cần phải tự tay chép code của nó vào project, composer sẽ tự động tìm và tải thư viện mà bạn cần trên Server, nếu trong thư viện đó có dùng các thư viện khác thì nó cũng sẽ tải các thư viện khác về, nó đệ quy cho đến khi tải đủ các thư viện, thật tuyệt vời phải không nào.

Khi bạn sử dụng VCS, bạn sẽ chỉ cần commit tên version, tên thư viện ở file cấu hình composer.json mà không cần phải commit những thay đổi trong code của các thư viện như trước. Mặt khác, khi trong project của bạn có các thư viện mà các thư viện ấy lại dùng thư viện khác và khi đó chỉ cần một trong những cái đó có update thì composer sẽ tự động update giùm bạn luôn.

Các framework PHP hiện giờ đều sử dụng composer để quản lý thư viện cần thiết.

  Composer là gì? Quản lý các thư viện bằng composer

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

Yêu cầu để cài Composer

Để cài được composer vào máy bạn cần phải cài đặt sẵn PHP 5.3.2+, và nên cài sẵn Git để hỗ trợ tốt hơn với các gói thư viện. Composer hỗ trợ tốt trên ba nền tảng OS X, Windows và cả Linux.

Composer Trên Linux / Unix / OSX

bạn mở Terminal lên và nhập lần lượt từng dòng lệnh sau:

sudo php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
sudo php composer-setup.php --install-dir=bin
sudo php -r "unlink('composer-setup.php');"

Hoặc bạn có thể download composer.phar từ https://getcomposer.org/ (ở cuối trang) sau đó duy chuyển nó vào trong thư mục bin bằng lệnh

sudo mv composer.phar /usr/local/bin/composer

Composer Trên Windows

Dùng bộ cài tự động

Đây là cách cài dễ dàng nhất, bạn chỉ việc tải về Composer-Setup.exe sau đó cài như một phần mềm bình thường (nhớ trỏ đến php.exe đã cài sẵn trên máy tính đúng chỗ). Composer Installer sẽ tự động cài và thêm vào PATH sẵn cho bạn để bạn có thể dùng lệnh composer trên CMD.

Cài Thủ Công

Như ở trên, bạn tải về composer.phar từ https://getcomposer.org/ (ở cuối trang) sau đó duy chuyển nó vào trong thư mục bất kỳ bạn muốn, ở đây tớ ví dụ là C:\bin nhé.

Bạn tạo tập tin có tên là composer.bat với nội dung như sau:

echo @php "%~dp0composer.phar" %*>composer.bat

Để dùng được lệnh composer trên CMD bạn cần phải thêm thư mục Composer vào PATH environment variable. Bạn có thể xem cách thực hiện dưới đây hoặc bằng Google

Vào File Exploder, chọn chuột phải vào This PC ⇒ Properties  ⇒ Advanced System Settings, ở cửa sổ Pop-up chọn Envaironment Variables…

Sau đó ở mục System Variables chọn vào mục Path và bấm vào nút Edit

Bấm vào New sau đó thêm vào C:\bin (thư mục cài composer như trên) sau đó bấm OK thế là hoàn tất và bây giờ bạn có thể mở CMD và đánh vào câu lệnh sau để kiểm tra: composer -v

  Câu chuyện trước khi PHP có composer

Hướng dẫn sử dụng Composer

Cách dùng cơ bản

Có hai phần riêng biệt để quản lý dependencies bằng Composer. Đầu tiên là command line tool của Composer cho việc nắm giữ và quản lý các dependencies. Thứ hai là Packagist – Đây là nơi lưu trữ các package mà bạn muốn sử dụng.

Khi sử dụng Composer trong thư mục gốc chúng ta có một tập tin JSON là composer.json có nội dung:

{
    "name": "dinhquochan/my_project",
    "description": "My New Project",
    "authors": [
    {
        "name": "Dinh Quoc Han",
        "email": "admin@dinhquochan.com"
    }],
    "require": {
        "monolog/monolog": "1.12.0"
    }
}

Trong tập tên trên có các phần như sau:

  • name tên dự án có dạng vendor_name/package_name.
  • description mô tả gói của bạn.
  • authors tác giả của dự án.
  • require đây chính là danh sách các package thư viện cần thiết, nó sẽ lấy từ server về. sẽ có 2 phần là tên vendor/ tên gói cùng với chỉ định version hay không.

Trong trường hợp trên mình đã yêu cầu Monolog, một framework phổ biến dùng để logging. Chỉ vì tôi có một file JSON với thông tin này không có nghĩa là chúng ta sử dụng được có thể sử dụng Monolog. Chúng ta phải vào Terminal tại thư mục hiện tại với câu lệnh:

composer install

Nó sẽ đưa tất cả dependencies của dự án vào thư mục mang tên vendor và thực hiện các công việc cần thiết khác. Cùng lúc đó nó sẽ tạo ra file composer.lock để biết là composer đã được thiết lặp tại thư mục mình sẽ nói cái này ở dưới. và các bạn hãy kiểm tra thử thư mục vendor xem ắt hẳn các thư viện đã được tải về và một file autoload.php.

Ngay lúc này, để sử dụng được các thư viện đó bạn chỉ viện chèn autoload.php vào file cần thiết:

require "vendor/autoload.php";

Sau đó làm theo hướng dẫn sử dụng của Package đó là xong, ở đây tớ ví dụ monolog nhé:

<?php
require "vendor/autoload.php";
 
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
 
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
 
// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');

Chỉ định version cho các Package trong Composer

Trong composer.json trên chúng ta thấy ta đang sử dụng version 1.12.0 nhưng nếu muốn dùng phiên bản khác thì sao? Có 6 cách để xác định version mà bạn muốn, hãy tìm hiểu xem:

Version Range

Bằng cách sử dụng các toán tử so sánh bạn có thể lấy version cao hơn, thấp hơn hoặc tuân theo một số các nguyên tắc thậm chí phức tạp hơn như sử dụng AND và OR. Các toán tử có thể là >, <,> =, <= và !=. AND được biểu diễn bằng một dấu cách hoặc dấu phẩy, OR được biểu diễn bằng hai dấu gạch dọc: ||.

Ví dụ >2.7 nghĩa là bất kỳ version nào trên 2.7. >2.7 <=3.5 bao gồm các version từ 2.7 trở lên tới 3.5 (bao gồm cả 3.5).

Xem thêm việc làm php hà nội hấp dẫn trên TopDev

Wildcard Versions

Bằng cách sử dụng một ký tự đại diện, bạn có thể xác định một pattern. x.x.* sẽ bao gồm tất cả các version x.x.0 trở lên và trở xuống (tất nhiên cả x.x, nhưng không bao gồm x.y.0.

Ví dụ 2.3.* sẽ bao gồm từ 2.3.0 trở lên và trừ 2.4 Nó tương đương với >=2.3.0 <2.4

Hyphen Ranges

Hyphen Ranges cho phép bạn xác định range dễ dàng hơn, mặc dù bạn sẽ cảm thấy bối rối hơn một chút vì cách nó xử lý các partial version. Full version gồm ba số trong trường hợp hyphen ranges thực hiện đầy đủ ý nghĩa của nó

2.0.0 – 3.0.0 nghĩa là tất cả các version bao gồm 2.0.0 trở lên và bao gồm 3.0.0 trở xuống.

2.0 – 3.0 bao gồm bất kỳ version nào kể cả 2.0 trở lên nhưng không bao gồm version 3.1

Lý do cho hành động tưởng chừng như kỳ lạ này là phần bên trái dấu gạch ngang nghĩa là bao gồm, còn phần bên phải hoàn toàn chỉ là một ký tự đại diện. Biểu thức trên sẽ tương đương với >=2.1 <3.1.0

Tiddle Range

Tiddle Range rất tuyệt vời để đáp ứng các yêu cầu nhỏ nhất cho việc xác định version và chấp nhận bất kỳ version nào trở lên, nhưng không bao gồm chính nó. Nếu chỉ rõ là ~3.6 thì bạn chấp nhận các version từ 3.6 trở lên nhưng không bao gồm 4.0.

Method này tương đương với >-3.6 <4.0

Caret Range

Caret Range có nghĩa là chấp nhận tất cả các phiên bản hiện tại tính từ nó nhưng không bao gồm phiên bản lớn hơn. Ví dụ ^3.3.5 bạn chấp nhận bất kỳ version nào trở lên, nhưng không bao gồm4.0

Dev-Master

Với dev-master bạn đang giữ version mới nhất được phát triển nhưng không được tag với một version number cụ thể. Điều này có thể tốt trong khi phát triển nhưng bạn cần nhận thức được sự tiềm tàng về bugs là cao hơn so với các version kia.

Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

Locking trong Composer

Locking là một trong những tính năng hữu ích nhất của Composer. Trước tiên ta sẽ nói đến composer.lock. Công việc của nó là khóa lại các versions của các components đã sử dụng. Lock file có thể chắc chắn rằng mọi người làm việc với các versions giống nhau của các files.

Khi lần đầu tiên sử dụng Composer để lấy một dependency nó sẽ ghi chính xác version vào file Composer.lock. Ví dụ như nếu bạn chỉ rõ 2.3.* và 2.3.5 là version mới nhất thì version được cài đặt sẽ là 2.3.5 và nó sẽ được đưa vào trong lock file.

Giả sử sau 1 tuần có một developer gia nhập team của bạn. Trong thời gian này dependency đã được update lên 2.3.6. Nếu anh ta sử dụng câu lệnh (composer install) thì sẽ nhận được2.3.5 vì nó đã được ghi trong file lock.

Tất nhiên bạn có thể quyết định việc update các dependencies của mình. Trong trường hợp đó, bạn sẽ thực hiện lệnh :

composer update

Nó sẽ lấy các version mới nhất và ghi chúng vào file lock.

Chú ý: Không bao giờ chạy lệnh composer update trong môi trường thực tế (production) mà hãy kiểm tra trên máy để tránh tình trạng không tương thích.

Require-dev

Composer cho phép bạn xác định các dependency cho môi trường dev. Điều này được thực hiện bằng cách xác định các dependency của bạn trong mảng require-dev thay vì mảng require.

{
    "name": "dinhquochan/my_project",
    "description": "My New Project",
    "authors": [
    {
        "name": "Dinh Quoc Han",
        "email": "admin@dinhquochan.com"
    }],
    "require": {
        "monolog/monolog": "1.12.0"
    },
    "require-dev" : {
        "fzaninotto/faker", "dev-master"
    }
}

Faker là một thư viện tạo ra các dữ liệu mẫu. Điều này là rất tốt trong khi bạn đang dev để test thử nhưng khi đã public sản phẩm thì nó lại không thực sự cần thiết. Nếu muốn loại trừ các yêu cầu phát triển, bạn cần thực hiện lệnh install hoặc update với tùy chọn –no-dev

composer install --no-dev

Lời Kết

Composer giúp lập trình viên giảm bớt suy nghĩ về các thư viện và chỉ tập trung vào ứng dụng chính của mình. Tiết kiệm khá nhiều thời gian để làm những việc khác. Hiện tại, hầu hết các Framework đều hỗ trợ Composer, như: CodeIgniterSymfony2LaravelFuelPHP

Composer đúng là một công cụ tuyệt vời dành cho PHP.

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

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

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

Với CSS, chuyện gì xảy ra khi có 2 giá trị margin nằm liền kề nhau?

Với CSS, chuyện gì xảy ra khi có 2 giá trị margin nằm liền kề nhau?

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

Ví dụ với 2 thẻ <p /> nằm liền kề nhau như thế này:

<style>
  p {
    margin-top: 24px;
    margin-bottom: 24px;
  }
</style>

<p>Paragraph One</p>
<p>Paragraph Two</p>

Thay vì 48px, thực tế giữa hai thẻ <p /> chỉ có khoảng cách là 24px

  3 điều bạn có thể không biết về biến trong CSS
  11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS

Không rõ vì lý do cá nhân gì, mà CSS chỉ áp dụng cái luật margin collapse này cho giá trị top và bottom, nếu giá trị margin là left hoặc right, thì nó lại bình thường

<style>
  p {
    display: inline-block;
    margin-left: 24px;
    margin-right: 24px;
  }
</style>

<p>P1</p>
<p>P2</p>

Khoảng cách giữa (trái phải) là 48px

Chưa đủ dị, CSS lại còn có quy định chỉ khi 2 element nằm liền kề với nhau mới hiệu nghiệm, nếu có 1 element chèn ở giữa thì lại bình thường 48px

<style>
  p {
    margin-top: 24px;
    margin-bottom: 24px;
  }
</style>

<p>Paragraph One</p>
<br />
<p>Paragraph Two</p>

Và sẽ ra sao nếu 2 element có giá trị margin không bằng nhauwinner take all sẽ được áp dụng, giá trị nào lớn hơn thì chỉ lấy giá trị đó.

<style>
    p {
        margin-bottom: 48px;
    }
    div {
        margin-top: 90px;
    }
</style>

<p>Paragraph One</p>
<div>Paragraph Two</div>

khoảng cách trên dưới sẽ là 90px

margin collapse không chỉ xuất hiện khi có giá trị top và bottom, nó còn xảy ra khi có 2 giá trị top hoặc bottom

<style>
  .parent {
    margin-top: 72px;
  }
  .child {
    margin-top: 24px;
  }
</style>

<div class="parent">
  <p class="child">Paragraph One</p>
</div>

Giá trị margin sẽ chỉ lấy top = 72px

Lời khuyên cuối cùng, nếu thực sự hiểu và nhớ mình đang viết gì thì dùng margin, còn không thì dùng padding cho an toàn.

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

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

Xem thêm tuyển dụng it hấp dẫn trên TopDev

Scratch là gì? Giới thiệu chung về ngôn ngữ lập trình Scratch

Giới thiệu chung về ngôn ngữ lập trình Scratch

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

Lập trình Scratch từ lâu đã là ngôn ngữ lập trình phổ biến cho học sinh, sinh viên và các em nhỏ. Với Scratch, việc lập trình từ ban đầu được gán cho cái mác khó nhằn, khó hiểu, đơn điệu và tẻ nhạt bỗng trở thành ngôn ngữ lập trình được các em nhỏ không cần cha mẹ nói cũng vào học.

Vậy điều gì làm nên sức hút của Scratch. Giải đáp Scratch là gì? Tạo scproject với scratch như thế nào? trong bài viết này.

Scratch là gì?

Scratch là gì?
Ngôn ngữ lập trình Scratch là gì?

Scratch là một ngôn ngữ lập trình trực quan và môi trường phát triển tích hợp được thiết kế đặc biệt cho trẻ em và người mới bắt đầu. Được phát triển bởi Lifelong Kindergarten Group tại MIT Media Lab, Scratch cho phép người dùng tạo ra các câu chuyện tương tác, trò chơi, và hoạt hình thông qua việc kéo và thả các khối mã màu sắc. Mục tiêu chính của Scratch là giúp người học tiếp cận dễ dàng với lập trình và phát triển các kỹ năng tư duy sáng tạo, giải quyết vấn đề và làm việc nhóm.

Mục đích của phần mềm Scratch

Trẻ em cũng có thể học lập trình là một ý tưởng rất có ý nghĩa thực tiễn, tuy nhiên để sáng tạo ra một phương pháp lập trình phù hợp với trình độ và tâm lý lứa tuổi trẻ em thì lại vô cùng khó khăn. Không phải nhà khoa học máy tính nào cũng có thể làm được. Những khái niệm khoa học kỹ thuật khó hiểu, những quy tắc luật lệ chằng chịt, những suy nghĩ liên miên mệt mỏi trong những ngôn ngữ lập trình kiểu dòng lệnh phổ biến như Pascal, C, C++, Java, PHP, …chính là rào cản đối với sự tiếp cận lập trình cho trẻ em.

Tuy nhiên, đối với Scratch thì khác! Ngôn ngữ lập trình Scratch phát triển theo hướng tương tác trực quan, đồ họa sống động, sản phẩm liền tay mà vẫn đảm bảo tính khoa học, tính liên thông tri thức sau này.

Mục đích của phần mềm Scratch
Mục đích của phần mềm Scratch

Khi sử dụng Scratch, thay vì phải viết những dòng lệnh logic dễ gặp lỗi thì ở đây bạn chỉ cần nắm và kéo các khối lệnh đầy màu sắc có sẵn để lắp ghép thành một kịch bản điều khiển các đối tượng trên sân khấu biểu diễn.

Đối với những người mới bắt đầu học các ngôn ngữ lập trình như Pascal, C, PHP,…sẽ rất khó hiểu với việc sử dụng Biến, Hàm, Thủ tục, Danh sách và các Điều kiện, Vòng lặp,…nhưng khi sử dụng Scratch thì những khái niệm đó trở nên trực quan, dễ hiểu và dễ vận dụng trong các tình huống cụ thể.

Với đặc điểm dễ học, dễ sử dụng và hiệu quả như vậy, Scratch được xem như là một ngôn ngữ nền tảng trước khi học các ngôn ngữ khác. Và vì thế, đến nay đã có hàng triệu dự án được chia sẻ trên trang chủ của nhà thiết kế. Rất nhiều trường học trên khắp thế giới, từ trường Tiểu học đến Đại học đã sử dụng Scratch như một môn học chính thức.

Đặc điểm của ngôn ngữ lập trình Scratch

Scratch là một ngôn ngữ lập trình trực quan được thiết kế để giúp trẻ em và người mới bắt đầu học lập trình một cách dễ dàng và thú vị. Dưới đây là những đặc điểm chính của ngôn ngữ lập trình Scratch:

Giao diện trực quan và thân thiện

Scratch sử dụng giao diện kéo và thả, giúp người dùng dễ dàng thao tác mà không cần phải viết mã phức tạp. Các khối lệnh được tổ chức theo màu sắc và hình dạng khác nhau, giúp người dùng nhận biết chức năng của từng khối và sắp xếp chúng một cách dễ dàng. Điều này làm cho quá trình lập trình trở nên trực quan và thân thiện với người dùng, đặc biệt là trẻ em.

Khối lệnh màu sắc

Các khối lệnh trong Scratch được phân loại theo màu sắc dựa trên chức năng của chúng. Ví dụ, các khối điều khiển (control) có màu vàng, các khối chuyển động (motion) có màu xanh lam, và các khối âm thanh (sound) có màu tím. Sự phân loại này giúp người dùng dễ dàng tìm kiếm và sử dụng các khối lệnh phù hợp cho dự án của mình.

Tính năng kéo và thả

Scratch cho phép người dùng tạo ra các chương trình bằng cách kéo và thả các khối lệnh vào khu vực làm việc. Điều này giúp loại bỏ sự phức tạp của việc viết mã bằng văn bản và giúp người dùng tập trung vào việc xây dựng logic và ý tưởng cho chương trình. Tính năng kéo và thả làm cho quá trình lập trình trở nên thú vị và ít căng thẳng hơn.

Component-Based Architecture

Scratch sử dụng kiến trúc dựa trên component, nơi mà mỗi thành phần (sprite) có thể được lập trình độc lập. Mỗi sprite có thể có các kịch bản (scripts), trang phục (costumes) và âm thanh riêng, giúp người dùng dễ dàng quản lý và phát triển các thành phần của dự án một cách linh hoạt. Điều này giúp tạo ra các dự án phức tạp một cách dễ dàng và hiệu quả.

Khả năng tương tác

Scratch cho phép người dùng tạo ra các chương trình tương tác thông qua việc sử dụng các sự kiện (events) và cảm biến (sensors). Người dùng có thể lập trình các sprite để phản hồi lại các sự kiện như nhấn chuột, nhấn phím hoặc chạm vào màn hình. Khả năng tương tác này giúp tạo ra các trò chơi và hoạt hình hấp dẫn và sinh động.

Hỗ trợ đa nền tảng

Scratch có thể chạy trên nhiều nền tảng khác nhau bao gồm máy tính để bàn, laptop và máy tính bảng thông qua trình duyệt web hoặc ứng dụng Scratch dành cho thiết bị di động. Điều này giúp người dùng dễ dàng tiếp cận và sử dụng Scratch ở bất kỳ đâu và bất kỳ lúc nào, tạo điều kiện thuận lợi cho việc học và sáng tạo.

Tính năng tích hợp với phần cứng

Scratch có thể tích hợp với nhiều loại phần cứng như robot, bộ điều khiển và các thiết bị IoT. Điều này mở rộng khả năng sáng tạo của người dùng, cho phép họ xây dựng các dự án phức tạp và thực tế hơn, đồng thời áp dụng kiến thức lập trình vào các lĩnh vực khác nhau. Khả năng tích hợp này giúp Scratch trở thành một công cụ mạnh mẽ cho các dự án STEM (khoa học, công nghệ, kỹ thuật và toán học).

Theo chính tác giả Scratch, ông giáo sư Mitchel Resnick đã chia sẻ như sau:

“Khi học lập trình Scratch, trẻ em học được những nguyên lý cơ bản của việc thiết kế, học được cách thử nghiệm ý tưởng mới, học được cách phân chia ý tưởng phức tạp thành những phần việc đơn giản, học được cách hợp tác với người khác để thực hiện dự án, học được cách tìm và sửa lỗi khi kết quả không được như ý, tập được tính kiên trì khi đối mặt với khó khăn. Ngày nay, đó không chỉ là những kỹ năng cần thiết cho việc lập trình, mà còn cần thiết cho nhiều hoạt động khác.”

Từng bước với lập trình Scratch

Cài đặt và đăng kí sử dụng Scratch

Để bắt đầu với lập trình scratch, truy cập trang chủ và ấn vào start creating. Các bạn cũng có thể signup (tạo tài khoản để lưu trữ các project của cá nhân mình).

lập trình scratch
Truy cập trang chủ và ấn vào Start Creating

Scratch sẽ chuyển hướng ta tới trang bắt đầu để lập trình với Scratch.

Lập trình scratch
Giao diện sau khi đã khởi tạo project tại Scratch

Trước khi bắt đầu, các bạn nên xem qua video hướng dẫn một số thao tác cơ bản và thành phần của scratch.

Lập trình scratch
Video hướng dẫn cụ thể và rõ ràng
Lập trình scratch chú trọng tới các đối tượng và lập trình animations cho các đối tượng. Đối tượng ban đầu và mặc định là chú mèo scratch. Để thêm các đối tượng khác. Ấn vào góc bên dưới bên phải màn hình.

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

Lập trình scratch
Góc dưới bên phải cho phép thêm nhiều hơn các đối tượng.

Sau khi đã có các đối tượng, bước tiếp theo là các thao tác, âm thanh được tuỳ chọn để lập trình. Việc lựa chọn đúng các thao tác giúp đối tượng trở nên sinh động hơn.

  50 keywords mà mọi lập trình viên java nên biết

Scratch hiện tại hỗ trợ code (trực quan không code), costumes (tuỳ chỉnh cao hơn) và Sounds (phần âm thanh cho các đối tượng)

Lập trình scratch

Các đối tượng trong Scratch

Về mặt code, hiện tại scratch hỗ trợ danh sách sau:

  • Motion (di chuyển 10 bước, xoay ngang dọc, di chuyển tới vị trí có toạ độ x và y)
  • Looks (xin chào, thay đổi kích thước, ẩn (hide), hiện (show), …
  • Sounds (âm thanh bắt đầu tới lúc kết thúc, thay đổi volume tăng hoặc giảm, …)
  • Events (khi ấn vào thì sao?, khi nhận được tin nhắn, …)
  • Control (kiểm soát, các câu lệnh cơ bản của lập trình, nếu a thì b, nếu như thế này thì thế kia, …)
  • Sensing (các sự kiện của chuột, các sự kiện chờ cho câu hỏi, câu trả lời, …)
  • Operators (các phép cộng trừ, so sánh, tính toán độ dài, …)
  • Variables (các biến tuỳ chỉnh, thiết lập dữ liệu, thay đổi các biến, …)

lập trình scratch
Các đối tượng được hỗ trợ trong khối Variables

Tuỳ biến, tuỳ chỉnh cao hơn với lập trình Scratch

Sau khi đã hiểu rõ và thực hành một số thành phần code được hỗ trợ bởi Scratch. Nếu các animations và lập trình cần tới tuỳ chỉnh các đối tượng. Việc tuỳ chỉnh đối tượng cho phép làm ra các đoạn code sinh động hơn, phù hợp hơn với yêu cầu.

lập trình scratchMục consumes dành cho các đối tượng tuỳ chỉnh. Cho phép chỉnh sửa màu sắc, hình dạng, kích thước các đối tượng.

Lập trình scratchThay đổi màu sắc quần của đối tượng sang màu tím.

Một thành phần khác giúp cho các video animations được lập trình trở nên tuyệt vời hơn là âm thanh. Âm thanh cũng có thể tuỳ chỉnh ở mục Sounds.

lập trình scratch

Nếu hình ảnh trong bộ sưu tập có sẵn của Scratch không phù hợp hoặc chưa đáp ứng được nhu cầu của bạn. Các bạn có thể tự tải lên các hình ảnh riêng của mình bằng nút nhấn phía bên dưới phải màn hình.

lập trình scratch
Tải lên các hình ảnh cá nhân hoặc tự xây dựng là hoàn toàn khả thi với scratch

Khả năng lập trình máy tính là một phần quan trọng trong học vấn của xã hội ngày nay. Khi mọi người học cách lập trình bằng Scratch, bản thân họ sẽ học được những chiến thuật quan trọng để giải quyết vấn đề, thiết kế các chương trình và truyền đạt những ý tưởng.

Chính vì vậy, không chỉ riêng tập lớp trẻ em, học sinh là nên tiếp thu với lập trình scratch. Người già, các đối tượng khác trong xã hội nếu có điều kiện cũng có thể thử sức, sáng tạo với lập trình scratch. Có thể bạn quan tâm:

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

 

BA làm gì?

Bài trước mình đã giới thiệu tổng quan về nghề IT BA hiện nay ở nước ta. Bài này mình sẽ giới thiệu chi tiết BA là làm những công việc gì?

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Bài trước mình đã giới thiệu tổng quan về nghề IT BA hiện nay ở nước ta. Bài này mình sẽ giới thiệu chi tiết BA là làm những công việc gì?

BA là viết tắt của từ Business Analyst. Về cơ bản BA là người làm việc với khách hàng để lấy yêu cầu, sau đó chuyển thông tin và thảo luận đưa ra giải pháp với team nội bộ (development, tester,…) và quản lý các loại tài liệu.

Theo BABOK define:

“A business analyst works  as a liaison among  stakeholders in order to  elicit, analyze,  communicate, and validate  requirements for changes  to business processes,  policies, and information  systems.”

Tuyển business analyst các ngành hấp dẫn nhất

Vai trò của BA trong dự án:

  1. Là người kết nối giữa các stakeholder, giữa stakeholder và nhóm phát triển.
  2. Là người hiểu về cấu trúc, chính sách, cách vận hành của tổ chức.
  3. Đề xuất các giải pháp giúp tổ chức đạt được các mục tiêu.

BA role

Các công việc của một BA

  • Tài liệu Architecture: Tài liệu mô tả luồng thao tác người dùng, luồng hoạt động của hệ thống, cấu trúc cơ bản của hệ thống, các thành phần trong hệ thống, tương tác giữa các thành phần trong hệ thống.
  • Tài liệu SRS or basic design: Tài liệu mô tả chi tiết các chức năng, giao diện của từng chức năng
  • Tài liệu test point: Các testcase cơ bản, đặc thù liên quan đến giao diện từ phía người dùng.
  • Thiết kế mô tả database: Database hệ thống, mô tả chức năng của các bảng các trường đặc biệt.

Các bước tiếp cận với yêu cầu mới từ khách hàng

Requirement là gì? Yêu cầu được định nghĩa là: Một điều kiện hoặc khả năng cần thiết của một bên liên quan để giải quyết một vấn đề hoặc đạt được một mục tiêu. Một điều kiện hoặc khả năng mà hệ thống phải đáp ứng hoặc sở hữu để đáp ứng hợp đồng, tiêu chuẩn, đặc điểm kỹ thuật hoặc tài liệu chính thức khác. Một bản trình bày bằng văn bản của một điều kiện hoặc khả năng như trên.

Các bước để tiếp cận một yêu cầu:

  1. Phân tích tổng quan (Enterprise Analysis)

Sau khi nhận được yêu cầu từ khách hàng thì BA sẽ bắt đầu tìm hiểu, nghiên cứu tính khả thi, đánh giá rủi ro, các tình huống có thể xảy ra. Đôi khi yêu cầu đưa ra ở trạng thái sơ sài, khái quát và là nghiệp vụ mới với BA, nếu gặp phải tình huống này thì tìm hiểu thông tin từ internet hoặc tìm người có hiểu biết để tham khảo thông tin.

  1. Khơi gợi, khám phá (Elicitation)

Sau khi kết thúc bước trên thì BA sẽ có hiểu biết cơ bản về yêu cầu của khách hàng, bước thứ 2 này sẽ trao đổi lại với khách hàng để làm rõ yêu cầu.

Cách khơi gợi yêu cầu từ khách hàng

  • Phỏng vấn các stakeholder liên quan đến dự án. Tập trung các câu hỏi what, why, when, how (Interviews)
  • Khảo sát yêu cầu (Survey)
  • Tổ chức các cuộc họp (Meeting)
  • Quan sát (Observation)
  • Tạo các bản mẫu (Prototyping)
  1. Phân tích yêu cầu và làm tài liệu (Requirements Analysis &  Documentation)
  • Mô hình hóa yêu cầu bằng các biểu đồ (Workflow, Use Case, Activity diagram, Sequence diagram…)
  • Tài liệu mô tả database (ERD)
  • Documentation: Có 2 loại tài liệu thường được sử dụng: SRS (System Requirements Specifications), BD (Basic design).
  1. Đánh giá và xác thực giải pháp (Solution Assessment  & Validation)
  • Đánh giá và chọn giải pháp
  • Hỗ trợ với các nhà phát triển, thử nghiệm và QA
  • Hỗ trợ thực hiện
  • Đánh giá sau khi triển khai

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

Xem thêm IT job hấp dẫn trên TopDev

Share data giữa Docker Container bằng Docker Volume

Share data giữa Docker Container bằng Docker Volume

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

Như chúng ta đều biết, đặc điểm của Docker container là chúng chạy độc lập, và không ảnh hưởng đến nhau, thế nhưng vì một lí do nào đó, chúng ta lại muốn chia sẻ data giữa các container ví dụ, bạn có một 2,3 web server nginx và mong muốn khi chúng share chung các file config, hay html tĩnh. May mắn docker cung cấp volume để thực hiện việc đó.

  Docker to Serverless (Google Cloud Platform)

  Kubernetes sẽ không còn hỗ trợ Docker?

Docker volume là một volume được tạo ra cho phép các container mount volume vào trong các container hay dễ hiểu hơn là đocker sử dụng Volume đó thay thế cho 1 folder của container.

Để tiến hành chia sẻ file html tĩnh cho các 2 web server nginx, đầu tiên mình tạo một volume và đặt tên nó là nginx-static-html-share-volume

docker volume create nginx-static-html-share-volume
Image for post

Mỗi volume được lưu trữ trong host file system (/var/lib/docker/volumes/), và được docker quản lí.

Để xem thông tin chi tiết hơn về volume đã được tạo mình dùng lệnh.

docker volume inspect nginx-static-html-share-volume
Image for post

docker volume inspect

Như các bạn thấy thì volume chúng ta nằm ở “/var/lib/docker/volumes/nginx-static-html-share-volume/_data”

Trước khi chui vào đây thì mình sẽ tạo ra hai web server nginx share folder “/usr/share/html” cho cả hai bằng cách mount volume đó vào 2 container.

docker run -d --name nginx1 --mount source=nginx-static-html-share-volume,destination=/usr/share/nginx/html -p 2222:80 nginx
docker run -d --name nginx2 --mount source=nginx-static-html-share-volume,destination=/usr/share/nginx/html -p 2223:80 nginx

Khi bạn chạy docker run một container, có chỉ định — mount, đầu tiên docker sẽ xem volume đã tồn tại hay chưa, nếu chưa thì docker sẽ tạo volume đó. Sau đó docker sẽ tiến hành copy tất cả các file trong destination vào volume và sau khi copy xong docker container sẽ sử dụng volume đó thay cho destination. Mọi thao tác của container với destination thực chất là thao tác với docker volume.

Image for post

Hai Web server của mình đã chạy, để tiến hành kiểm tra mình gửi 2 get request tới 2 server và thực sự chúng đã chạy và share chung forder “/usr/share/html”.

Image for post

curl localhost:2222

Và giờ mình sẽ chui vào docker VM để xem các volume của chúng ta có gì. Để login vào docker VM mình dùng lệnh.

screen $HOME/Library/Containers/com.docker.docker/Data/vms/0/tty

Nói sơ qua một chút về screen, screen cũng tương tự như việc bạn ssh đến một server, nhưng điểm khác với ssh là ví dụ như vì một lí do nào đó mà bị mất kết nối ( ví dụ mạng mất ) thì phiên làm việc (session) của ssh đó sẽ mất, nhưng với screen thì chúng ta có thể kiểm tra các session và resume lại các session đó để làm việc tiếp.

Sau Khi dùng lệnh trên thì mình đã ở trong docker VM, mình sẽ chui vào “/var/lib/docker/volumes/nginx-static-html-share-volume/_data”

để xem có gì không.

Image for post
Image for post

docker vm

Đây rồi, thư mục /usr/share/nginx/html

đã được share chung giữa 2 nginx container. Có hai file index.html, 50x.html, mình sẽ tiến hành edit index.html xem nó có tác động gì đến hai nginx server không.

echo "Nginx web Server" > index.html
Image for post

Nổi dung file đã thay đổi mình sẽ tiến hành gửi hai get request tới 2 server và kì vọng nội dung trả về của hai server trả về sẽ giống nhau.

curl localhost:2222
curl localhost:2223

Và đúng như kì vọng, 2 Docker container đã share chung được data bằng cách mount volume “nginx-static-html-share-volume” vào “usr/share/nginx/html” của 2 container.

Image for post

Và nếu sau này bạn không có nhu cầu sử dụng volume nữa thì hay remove

nó nhưng trước khi remove nó bạn phải stop và remove docker container.

Để stop và remove container dùng lệnh

docker stop <tên container>
docker rm <tên container>

Để remove volume dùng lệnh

docker volume remove <tên volume>
Image for post

Và sau khi remove mình lại chui vào docker VM để coi nó đã xoá hay chưa. Lúc nãy mình có tắt ngang “screen” và để coi còn nhưng screen session nào và để resume lại vào session đó mình dùng các lệnh sau.

screen -ls      // lệnh này sẽ list ra những session đang tồn tại
screen -r <screen-session-id>       // resume một session.
Image for post
Image for post

Vậy là volume của mình đã bị xoá.

Tổng kết : Ở bài viết trên mình giới thiêụ với các bạn một số điều cơ bản về docker volume và share data giữa các container bằng docker volume. Mình sẽ tìm hiểu thêm và sẽ chia sẻ với các bạn trong những bài viết sau. Cảm ơn các bạn đã đọc bài viết. Bye bye các bạn. ^_^

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

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

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

Endpoint là gì? Lợi ích trong việc phát triển APIs

Endpoint là gì? Lợi ích trong việc phát triển APIs

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Endpoint là gì?

Để dễ hiểu mình sẽ làm ví dụ về Endpoint.

Khi App gọi đến API URL: https://abc.com/foo/bar và lúc này ta gọi /foo/bar là Endpoint.

Endpoint là một phần quan trọng trong quá trình phát triển API

Định nghĩa Hàm (Tạo Action Plan)

Công việc đầu tiên của bạn là nghĩ về những thứ mà API của bạn sẽ cung cấp. Đó có thể là 1 danh sách các hàm CRUD (Create, Read, Update, Delete) thao tác với resourece của bạn. Để giải thích rõ hơn thì đây chính là 1 danh sách các “Action” cần phải làm với mỗi resource:
Ví dụ:

Bạn có một Resouce là Người dùng và bạn cần 1 danh sách hàm như sau:
Users:

  • Create
  • Read
  • Update
  • Delete
  • List

Công việc này gần giống với TDD tức là bạn hình dung ra các hàm cần viết và viết các đoạn mã giả giả sử rằng hàm này và class này đã tồn tại rồi đó, sau đó bạn mới định nghĩa chúng.

Nếu API của bạn có chức năng tìm kiếm theo tên hay mã số người dùng thì công việc đó ta liệt vào List nhé:
Users:

  • Create
  • Read
  • Update
  • Delete
  • List(Name,ID)

Thêm các Params vào có thể tốt và dễ hình dung tuy nhiên không nên thêm quá nhiều và dư như thêm tất cả các thuộc tính vào Create(name,id,age,…) là không nên.

Lý thuyết Restful

Chuyển một Action Plan thành một Danh sách Endpoint thì cần những hiểu biết căn bản về RestFul API và các “Best Practice” trong việc đặt tên. Tất nhiên thì mỗi công ty, mỗi nhóm có chuẩn đặt tên khác nhau và cũng chả thể so sánh được cái nào là tốt nhất. Tuy nhiên mình sẽ nói về cái phổ biến mà mình nghĩ là OKie nhất cho các bạn.
RestFul thì gồm nhiều tuy nhiên có 4 cái căn bản sau:
GET – POST- PUT -DELETE

1. GET

  • GET /resources – Tìm một danh sách records từ resource có thể có phân trang thì tốt nhất hoặc lấy toàn bộ records
  • GET /resources/X – Chỉ cần lấy Record X, ví dụ /users/thanhtriphap -> Lấy Info mình ra nè
  • GET /resources/X,Y,Z – Người dùng muốn tìm kiếm trên nhiều điều kiện hay 1 điều kiện mà nhiều giá trị
  • GET /places/X/users – Lấy tất cả người dùng đang sinh sống trong vùng X
  • GET /users/X/places – Lấy tất cả các nơi mà người dùng này đang hay đã ở
  • GET /users/X/places/Y – Tìm kiếm user theo điều kiện X và Places theo điều kiện Y

[Danger Zone] Auto Increment

Trong quá trình học trong trường các bạn thường xài ID dạng Auto-Increment. Tuy nhiên trong thực tế nếu API của ta để như vậy thì người ta có thể biết được số lượng Resource mà ta đang có điều này rất có ích với đối thủ đó chứ.
Biện pháp là ta sử dụng UUID – Các bạn có thể tìm UUID cho PHP, Ruby hay Python và các Package hỗ trợ Gen UUID trên GOOGLE.

2. DELETE

  • DELETE /users/X – Xóa một người dùng
  • DELETE /users/X,Y,Z – Xóa một vài dòng dữ liệu
  • DELETE /users – Xóa tất cả các dòng dữ liệu (Không nên)
  • DELETE /users/X/image – Xóa image của người dùng X
  • DELETE /users/X/images – Xóa một loạt các hình ảnh của người dùng X
  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  3 công cụ ngon bổ rẻ cho Front-End developer

3. POST và PUT

Về mặt lý thuyết POST dùng tạo 1 dòng dữ liệu mới còn PUT thì dùng cập nhật một dòng dữ liệu đã có. Khác nhau là vậy tuy nhiên trên nguyên tắc thiết kế thì 2 hành động này như nhau mà thôi có nghĩa là những gì POST làm được thì PUT làm được và ngược lại.
Tuy nhiên, tất nhiên phải có sự khác nhau căn bản để dùng chứ. Chúng ta xem khái niệm về
idempotent : Có nghĩa là khi mình gọi đến resource dùng PUT n lần thì behavior vẫn là như nhau, dữ liệu thay đổi của lần thứ n vẫn giống như lần gọi đầu tiên

Nghe có vẻ hơi khó hiểu đúng không, thôi ví dụ cho dễ nhé:

  • Giả sử mỗi sản phẩm chúng ta có 1 hình ảnh đại diện thôi (Chỉ 1 thôi nhé) và mỗi lần ta thay đổi nó tức là thay hình đại diện cho sản phẩm thì dữ liệu vẫn như cũ (Như cũ ở đây có nghĩa là không làm phát sinh thêm dòng nào mới nhé): PUT /products/ao-so-mi-tay-dai-MB2331/image
  • Cũng ví dụ trên tuy nhiên sản phẩm lại có nhiều hình ảnh thì mỗi lần ta thêm thì có 1 dòng dữ liệu mới nên ta xài POST vì dữ liệu thay đỗi mà: POST /products/quan-tay/images

4. Danh từ số nhiều, số ít hay Cả hai

Một vài Developer thì dùng danh từ số ít một số lại xài số nhiều.
Ví dụ:

  • GET /user/1 – Trả về user có ID là 1
  • GET /user – Thắc mắc user nào sẽ được trả về hay về hết

Do đó mình thường xài số nhiều cho các Endpoints:

  • GET /users/1 – Trả về user có ID là 1
  • GET /users?limit=5 – Trả về 5 user cho một lượt

5. Danh từ hay động từ

Trước đây khi POST cái gì đó một vài Dev thường dùng động từ:

  • POST /SendMeAMessage
  • POST /users/5/send-message

Tuy nhiên hình như hơi có vấn đế, chúng ta chỉ cần 1 động từ duy nhất trong đây là POST PUT hay GET … và URL là danh từ chứ không phải động từ. Một vài ví dụ sau:

  • POST /users/5/message – Gửi một Message tới User 5

Một cách tuyệt vời hơn chúng ta có thể:

  • POST /users/thanhtriphap/message
  • PUT /users/thanhtriphap/message/wsis0n

Xây dựng EndPoints

Sau khi hoàn thành công việc định hình GET, PUT, POST … cho mỗi Action trong Action Plan việc tiếp theo chính là Đặt mỗi Resource trong 1 controller trong đó có các hàm trong Action Plan:

  • UsersController
  • CategoriesController
  • PlacesController

Và hoàn thành việc định tuyến Routing.
Ví dụ trên Laravel Framewok

alt text

Kết luận

Làm bất cứ điều gì nếu chúng ta định hình rõ những công việc sẽ phải làm giúp chúng ta dễ dàng hơn rất nhiều trong công việc sau này. Việc tạo ra các Endpoints là cách để Back End và Develper Mobile hay Front End làm việc với nhau và nâng cao hiệu quả công việc.

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

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

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

Chạy Postgresql trong Docker container

Chạy Postgresql trong Docker container

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

Hi các bạn, sau một tuần không chạm vào laptop thì hôm nay mình quay lại và gửi đến các bạn bài hướng dẫn cài Postgres trên Docker. Trong khi viết những dòng chữ này thì mình đã không còn là developer nữa rồi, nhưng niềm đam mê và sở thích thì vẫn còn đó, và biết đâu sau này mình lại có cơ hội quay trở lại với nghề.

Trước tiên, lý do mà mình cài Postgres trên Docker là vì nó khá đơn giản, dễ cài dễ dùng, muốn xóa đi thì cx dễ remove cái container đi là xong.

Để chạy được postgres thì bạn phải pull image của Postpres về và sử run một container trên image đó.

Để pull dùng lệnh

Image for post

  20 trường hợp sử dụng lệnh Docker cho developer

  Docker là gì? Kiến thức cơ bản về Docker

Để run một container mình dùng lệnh dưới

Lệnh trên có nghĩa là

-e POSTGRES_PASSWORD=ai_khoc_noi_dau_nay   
       : lệnh này set biết môi trường để postgres set password cho tài khoản postgres, nếu không set thì mặc định sẽ là không có.postgres: cái này là tên image.
Image for post

Ok, giờ mình sẽ chui vào cái container để tạo database cũng như tạo user cho nó, các bạn có thể làm ngoài docker container nhưng nó sẽ yêu cầu bạn nhập pass khi đăng nhập, còn nếu chạy vào docker container luôn thì họ sẽ không yêu cầu nhập pass, điêu này nói rõ ở trong docs nằm ở đây.

Để chui vô bash của container mình dùng lệnh

Image for post

Sau đó dùng psql để kết nối với psql user là postgres, và ko cần nhập mật khẩu vì container cho phép điều đó. Tiếp theo tạo database “gaugau”, rồi user có username là “cay_to” và password là “thit cho xao lan” rồi gán tất cả quyền trên database cho user.

Image for post

Mình dùng lệnh “\l” để list ra tất cả database hiện tại, xem hình thì thấy okie rồi.

Sau đó mình out ra container và dùng psql của máy mình xem có kết nối được không.

Image for post

Vì mình thao tác ngoài container nên nó yêu cầu nhập pass, nhập “thit_cho_xao_lan” thì mình đã connect thành công.

Image for post

Mình xin được phép dừng bài viết tại đây, trở lại với vai trò “ chạy chợ “ là dân chợ búa nhưng mình sẽ vẫn tiếp tục hỏi hỏi và hi vọng được chia sẻ nhiều kiến thức hơn với các bạn trong tương lai, bye bye các bạn mình đi dọn hàng tiếp đây, mẹ chửi quá trời. Hihi

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

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

Xem thêm Việc làm it tại TPHCM hấp dẫn trên TopDev

Hướng dẫn cài đặt và cấu hình để dùng nhiều version PHP (Multiple versions PHP)

Hướng dẫn cài đặt và cấu hình để dùng nhiều version PHP

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Để cài đặt nhiều version php cho nhiều project website, dùng yum-config-manager để cài đặt multiple versions of PHP. Và lưu ý bài viết này dành cho những người có kiến thức cơ bản về Nginx và PHP.

1. Cài đặt và cấu hình các version PHP

1.1 Cài đặt PHP 7.1 Version

# yum-config-manager --enable remi-php71 [Default]
# yum install php php-common php-fpm
# yum install php-mysql php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml php-pecl-apc php-cli php-pear php-pdo

1.2 Cài đặt PHP 5.6 Version

# yum install php56 php56-php-common php56-php-fpm
# yum install php56-php-mysql php56-php-pecl-memcache php56-php-pecl-memcached php56-php-gd php56-php-mbstring php56-php-mcrypt php56-php-xml php56-php-pecl-apc php56-php-cli php56-php-pear php56-php-pdo

Kiểm tra version PHP mặc định.

# php -v

1.3 Cấu hình PHP-FPM và PHP56-PHP-FPM

Đây là phần cấu hình php-fpm sẽ hoạt động tương thích với Nginx. Cần thiết lập user/group của FastCGI khi hoạt động trên Nginx sẽ listen đúng port.

php-fpm (default 7.1): /etc/php-fpm.d/www.conf

php56-php-fpm: /opt/remi/php56/root/etc/php-fpm.d/www.conf

Mở file config đề thiết lập user/group của FastCGI.

# vi /etc/php-fpm.d/www.conf [PHP 7.1]
# vi /opt/remi/php56/root/etc/php-fpm.d/www.conf [PHP 5.6]

Cập nhật thông tin user/group

user = nginx
group = nginx

Kế tiếp, cập nhật thiết lập address:port cho FastCGI listen các request sẽ nhận.

listen = 127.0.0.1:9000 [php-fpm]
listen = 127.0.0.1:9001 [php56-php-fpm]
Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

2. Thiết lập Nginx dùng PHP-FPM tương ứng

2.1 Khởi chạy services

----------------  NGINX  ---------------- 
# systemctl enable nginx 
# systemctl start nginx 
---------------- PHP 7.1 ---------------- 
# systemctl enable php-fpm 
# systemctl start php-fpm 
---------------- PHP 5.6 ----------------
# systemctl enable php56-fpm 
# systemctl start php56-php-fpm 

Nếu trường hợp bị lỗi xãy ra thì gõ lệnh sau:

# getenforce
# setenforce 0 

2.2 Thiết lập đường dẫn cho website

Tạo các folder web để chạy các version PHP khác nhau trong /var/www/html/.

---------------- Website 1 ----------------
# mkdir -p /var/www/html/example1.com/
# mkdir -p /var/www/html/example2.com/
---------------- Website 2 ----------------
# mkdir -p /var/log/nginx/example1.com/
# mkdir -p /var/log/nginx/example2.com/

2.3 Thiết lập permission

---------------- Website 1 ----------------
# chown -R root:nginx /var/www/html/example1.com/
# chmod -R 755 /var/www/html/example1.com/
# chown -R root:nginx /var/log/nginx/example1.com/
# chmod -R 660 /var/log/nginx/example1.com/
---------------- Website 2 ----------------
# chown -R root:nginx /var/www/html/example2.com/
# chmod -R 755 /var/www/html/example2.com/
# chown -R root:nginx /var/log/nginx/example2.com/
# chmod -R 660 /var/log/nginx/example2.com/
  10 điều bạn cần biết về PHP7
  10 Frameworks tốt nhất hiện nay cho PHP

2.4 Config Nginx Server cho  các Website

Tạo các config Nginx cho các website tại /etc/nginx/conf.d/.

# vi /etc/nginx/conf.d/example1.com.conf
# vi /etc/nginx/conf.d/example2.com.conf

Website 1 cấu hình cho example1.com

server {
	listen 80;
	server_name example1.com www.example1.com;
	root   /var/www/html/example1.com/;
	index index.php index.html index.htm;
	#charset koi8-r;
	access_log /var/log/nginx/example1.com/example1_access_log;
	error_log   /var/log/nginx/example1.com/example1_error_log   error;
	
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	location ~ \.php$ {
		root    /var/www/html/example1.com/;
		fastcgi_pass   127.0.0.1:9000;	#set port for php-fpm to listen on
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include         fastcgi_params;
		include /etc/nginx/fastcgi_params;
	}
}

Website 2 cấu hình cho example2.com

server {
	listen 80;
	server_name example2.com www.example2.com;
	root /var/www/html/example2.com/;
	index index.php index.html index.htm;
	
	#charset koi8-r;
	access_log /var/log/nginx/example2.com/example2_access_log;
	error_log /var/log/nginx/example2.com/example2_error_log error;
	
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}
	
	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	location ~ \.php$ {
		root /var/www/html/example2.com/;
		fastcgi_pass 127.0.0.1:9001; #set port for php56-php-fpm to listen on
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
		include /etc/nginx/fastcgi_params;
	}
}

Kế tiếp tạo các nội dung chứa phpinfo() để xem các version PHP của các website.

# echo "" > /var/www/html/example1.com/info.php
# echo "" > /var/www/html/example2.com/info.php

Để apply các cấu hình thì phải restart lại các services.

# nginx -t
# systemctl restart nginx php-fpm php56-php-fpm
Verify Nginx Configuration
Verify Nginx Configuration

Nếu chạy dưới local thì nhớ cấu hình /etc/hosts.

Cuối cùng truy cập vào domain các trang đã setup trong config nginx để xem thành quả.

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

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

Xem thêm Việc làm php đà nẵng, hcm, hà nội hấp dẫn trên TopDev

Đôi điều về “nghề nghiệp” trong ngành Công nghệ Thông tin

Đôi điều về

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

Ngành CNTT (IT- Informatic Technology) trong khoảng chục năm trở lại đây luôn là một trong những ngành “hot” nhất trong thị trường lao động Việt Nam và thế giới. Trong bối cảnh cuộc cách mạng công nghiệp lần thứ 4 đang bắt đầu bùng nổ, ngành IT càng trở nên nóng hơn bao giờ hết.

  10 bí kíp để startup và FinTech startup thành công đột phá
  6 giải pháp công nghệ hữu ích cho phòng nhân sự của bạn

Bài viết nhằm chia sẻ một số nhận định cá nhân về nghề nghiệp trong CNTT, cũng như dự đoán xu hướng các ngành nghề trong tương lai không xa và các kỹ năng, kiến thức cần thiết cho một vị trí tốt trong một số ngành “hot”. Nội dung bài viết chủ yếu chia sẻ nhận định chủ quan, trải nghiệm cá nhân của mình sau hơn mười năm làm trong ngành công nghệ thông tin. Trong quá trình làm việc, mình đã tham gia và làm đối tác của khá nhiều công ty lớn nhỏ trong và ngoài nước, chứng kiến nhiều sự thay đổi trong công nghệ, thị trường nhân sự, việc làm, cũng như cách thức tổ chức, vận hành, văn hoá doanh nghiệp của nhiều công ty, tổ chức trong ngành.

Điều đầu tiên cần nhấn mạnh là CNTT là một ngành rất rộng, công việc rất đa dạng và phù hợp với nhiều đối tượng khác nhau. Có những việc lặp lại, ổn định, có thể học rất nhanh và không cần đào tạo bài bản (cài đặt máy móc, sửa chữa máy tính cơ bản, lắp đặt phòng máy, mạng, tư vấn sản phẩm, hỗ trợ kỹ thuật sản phẩm, hotline chăm sóc khách hàng…), và có những công việc cần đào tạo bài bản và/hoặc dài hạn hơn, và yêu cầu nhiều chất xám hơn nhiều hơn như lập trình viên, kiến trúc sư hệ thống, chuyên viên phân tích nghiệp vụ, kiểm thử viên, quản trị mạng, phân tích, xử lý dữ liệu… Bài viết này tập trung nói về nhóm ngành thứ hai.

Thách thức trong ngành CNTT

it challenges

Là ngành “hot” trong thị trường lao động, ngành CNTT thu hút số lượng lớn các sinh viên tham gia học, nhiều trường đại học vốn không liên quan đến IT cũng đã mở ra các khoa mới, liên quan đến IT trong lĩnh vực chuyên ngàng chính của trường, hoặc thậm chí cả các khoa chuyên biệt về CNTT vốn chưa bao giờ là thế mạnh của trường như mạng máy tính hay công nghệ phần mềm… Điều này có thể là đúng, để đáp ứng nhu cầu thị trường và đảm bảo duy trì số lượng / thu hút sinh viên. Tuy nhiên, cũng phải nói là chất lượng đầu ra sinh viên CNTT trong nước nhìn chung đang ở mức độ dưới trung bình, phần đông là chưa đáp ứng được nhu cầu công công việc. Sinh viên ra trường rất đông, không tìm được việc làm hoặc làm trái ngành rất nhiều, nhưng các công ty CNTT đều luôn thiếu nhân sự. Cá nhân mình đã từng phỏng vấn đầu vào không dưới 200 bạn sinh viên ra trường và những người đã đi làm (sau khi đã lọc kỹ hồ sơ), thì tỷ lệ trúng tuyển là tương đối thấp. Và trong số trúng tuyển thì phần đông vẫn là từ các trường Bách Khoa, Công Nghệ, Bưu Chính Viễn Thông, FPT và các trường nước ngoài. Rất nhiều bạn trong số đó đã có thành tích học tập các cấp rất tốt, học chuyên ban từ phổ thông, hay là top ở các trường phổ thông, đại học, rất nhiều bạn đạt giải cao trong các kỳ thi học sinh, sinh viên giỏi và nghiên cứu khoa học các cấp.

Có thể thấy ngành CNTT là ngành có yêu cầu khá cao về cả thái độ, kiến thức, kỹ năng. Điều này bởi nhiều lý do:

  • Bản thân ngành CNTT là mới (so với rất nhiều ngành khác), lại rất rộng, yêu cầu nhiều kiến thức nền tảng nhưng lại được trang bị khá muộn trong các trường phổ thông.
  • Công nghệ phát triển chóng mặt, thay đổi liên tục, khiến người làm CNTT nếu không liên tục nghiên cứu, học hỏi, thích ứng thay đổi thì sẽ sớm bị đào thải nhanh chóng.
  • Mức độ cạnh tranh cao và không phân biệt tuổi tác. Do sự thay đổi hàng ngày của công nghệ, yếu tố kinh nghiệm trong CNTT thường mờ nhạt hơn rất nhiều so với các ngành khác. Một sinh viên giỏi mới ra trường làm 1–2 năm với công nghệ hiện đại có thể dễ dàng vượt qua cả về năng suất lẫn chất lượng công việc so với một người với hàng chục năm kinh nghiệm nếu không chịu cập nhật công nghệ thường xuyên. Phải nói thêm, việc “cập nhật công nghệ” ở đây là để làm việc, tức là học nghề để áp dụng vào công việc, chứ không phải đơn thuần là cập nhật tin tức về công nghệ qua báo chí, truyền hình một cách giải trí.

Nghề nào phù hợp?

Do tính cạnh tranh cao và không phân biệt tuổi tác như đề cập phía trên, ở Việt Nam, mình thường thấy hầu hết mọi người làm “kỹ thuật” trong ngàng CNTT thông thường chỉ làm khoảng chục năm hoặc ít hơn, sau đó chuyển hướng qua “quản lý” hay “kinh doanh“, một là vì không theo kịp thế hệ trẻ đi sau, cảm thấy mệt mỏi, hao mòn, hai là nếu không “thăng chức” sẽ bị coi là kém cỏi vì mãi chỉ làm kỹ thuật. Nhưng theo mình, dù làm kỹ thuật, quản lý, kinh doanh… đều là các “nghề” khác nhau, yêu cầu các kỹ năng khác nhau và phù hợp với từng cá nhân khác nhau. Tiếp xúc với các công ty nước ngoài sẽ thấy điều này rất rõ, làm lập trình viên, hay làm quản lý dự án đều là các nghề, và người ta sẽ làm mãi nghề đó nếu thấy còn phù hợp với bản thân, cả về sở thích, năng lực lẫn thu nhập. Làm quản lý không có nghĩa là thu nhập tốt hơn, hay có địa vị cao hơn, nó chỉ là công việc với tính chất khác. Đồng nghiệp và là quản lý trực tiếp làm việc hàng ngày với mình là một anh người Ý, nhiều năm làm việc ở khắp các nước trên thế giới: Hà Lan, Mỹ, Canada, Singapore, gần 50 tuổi, và vẫn đang làm kỹ thuật thuần tuý. Mình cũng có hỏi về vấn đề này, anh ý trả lời: “Anh không giỏi làm quản lý, giám sát các thành viên trong nhóm, anh chỉ thích nghiên cứu và làm kỹ thuật, được cập nhật công nghệ hàng ngày. Và trí nhớ và suy nghĩ của tôi vẫn hoạt động tốt, chừng nào vẫn còn nhớ tốt thì vẫn sẽ làm kỹ thuật”, và anh này là một đội trưởng kỹ thuật rất tốt, đạo tạo, huấn luyện và truyển cảm hứng học hỏi cho đội. Hay hồi qua Mỹ công tác nửa năm, mình có làm việc cùng những đồng nghiệp hơn 60 tuổi, vẫn hàng ngày thiết kế mạch, lập trình vi điều khiển, và rất uyên bác về mọi công nghệ, xu hướng hiện đại.

Mình muốn nhấn mạnh ở đây là chọn nghề không nên quá theo đuổi xu hướng, mà quan trọng hơn là: trong những xu hướng đó, lựa chọn công việc phù hợp với mình. Vậy những ai phù hợp với CNTT? Theo mình, những người phù hợp với CNTT là những người:

  • Thích công nghệ. Dấu hiệu: thích đồ mua, đọc đánh giá, ngắm nghía các đồ công nghệ, thích chơi game, hay tìm tòi, thử nghiệm các tính năng phần mềm, trang web…
  • Tư duy logic tốt và thích logic chặt chẽ. Dấu hiệu: thích học toán, thích lập trình (thích hơn học toán), thích các trò chơi logic, các bài test IQ…
  • Thích thử thách. Dấu hiệu: tự vào các trang mạng giải toán, giải bài các bài lập trình, thích chế độ thi đấu trực tuyến, chơi các trò chơi trí tuệ….
  • Cầu toàn. Dấu hiệu: Luôn không ưng ý với những gì đang có, luôn muốn nâng cấp, sửa đổi từ những thứ nhỏ nhất.

Một số việc làm có nhu cầu cao trong ngành công nghệ

Công việc cụ thể của các vị trí này nằm ngoài phạm vi của bài viết này, mình sẽ viết cụ thể hơn ở một bài khác, mọi người có thể tham khảo link cuối bài để biết thêm thông tin.

Trong số đó một số nghề mới trở nên phổ biến gần đây, cùng với sự bùng nổ của cuộc cách mạng công nghiệp lần thứ 4, và chắc chắn sẽ vẫn là các nghề hot trong một thời gian tới như Data Scientist, AI/ML Engineer, Business Intelligence Analyst…

Một số việc khác có thể sẽ thành “hot trend” trong tương lại không xa có thể kể đến như: kỹ sư vạn vật kết nối (IoT Engineer); kỹ sư nhà thông minh (Smart Home Engineer); kỹ sư xe tự lái, xe bay, robot; kỹ sư công nghệ xử lý rác thải, nước thải; kỹ sư thực tế ảo…

Thế hệ trẻ cần chuẩn bị gì để bước vào ngành CNTT trong tương lai

  • Làm quen, sử dụng các phần mềm máy tính (không phải game) càng nhiều càng tốt: Paint, Word, Powerpoint, Excel, Windows, Photoshop, Illustrator, Algodoo… (từ Tiểu học)
  • Tiếp xúc, học càng nhiều càng tốt các khoá học STEM (online hoặc offline): lập trình, thuật toán robotics, sáng tạo công nghệ… (từ Tiểu học)
  • Học chắc chắn các môn toán, và tiếp xúc, học nhiều về các môn toán đặc biệt cần thiết cho ngành khoa học máy tính. Ở Tiểu học và THCS: các môn toán trong trường phổ thông, logic, đồ thị (graph), tập hợp, toán tổ hợp, xác suất… Ở các cấp cao hơn: toán rời rạc, xác suất, thống kê, đại số tuyến tính, giải thích hàm nhiều biến…
  • Tiếp xúc với lập trình thuật toánlập trình ứng dụng càng nhiều càng tốt.
  • Tham gia làm sản phẩm công nghệ thông tin (phần mềm, website, sản phẩm công nghệ…) trong các cuộc thi sáng tạo, tin học trẻ…, và tự làm các sản phẩm công nghệ, phần mềm phục vụ chính nhu cầu của mình và những người xung quanh.
  • Tham gia, tương tác trên các cộng đồng công nghệ, lập trình trực tuyến

Nội dung, lộ trình, tài liệu học lập trình cụ thể cho các bạn nhỏ từ cấp 2 trở lên mình đã post trước đó. Nội dung và tài liệu cho các bạn nhỏ hơn (tiểu học, tiền tiểu học) mình sẽ chia sẻ ở một bài post khác.

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

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

Xem thêm Việc làm ngành công nghệ thông tin hấp dẫn trên TopDev

Lộ trình công việc của bạn như thế nào?

Lộ trình công việc của bạn như thế nào?

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Xác định mục tiêu công việc

Bạn phải xác định được mục tiêu công việc của bạn. Nó là mục tiêu SMART, chứ không giống như mục tiêu công việc các bạn hay đề ra trong cv: cống hiến & tìm công việc ổn định & gắn bó & thăng chức… Mấy dòng này viết vào cho vui thôi.

  Một vài “trick” khi sử dụng Xpath và CSS selector trong Selenium
  Đam mê game? Hãy đến với Gameloft Career Day – Level Up Your Career!

Lựa chọn cho khởi đầu

Có 2 con đường chủ yếu để bắt đầu:
Một là, bạn nhắm vào công ty nhỏ trước, để phát triển kỹ năng bề rộng trước, khiến bạn trở nên đazi năng. Sau đó, bạn tiến vào công ty lớn để trau dồi chuyên môn sâu hơn và tiếp cận hệ thống, quy trình bài bản, chuyên nghiệp. Lúc này, các kỹ năng “thập cẩm”, linh hoạt, nhạy bén, mà bạn tích lũy ở công ty nhỏ, nơi bạn thường phải ôm đồm, kiêm nhiệm nhiều việc sẽ giúp đỡ bạn rất nhiều ở công việc mới.

  • Có thể việc trúng tuyển vào công ty nhỏ sẽ dễ hơn công ty lớn, vì:
  • Công ty nhỏ không quá nổi tiếng, không phải ai cũng có thể tiếp cận thông tin tuyển dụng, việc cạnh tranh không quá gay gắt.
  • Quy trình tuyển chọn đơn giản, trực quan hơn.
  • Bạn dễ tương tác với sếp hơn.
  • Yêu cầu với ứng viên không quá cao siêu…

Hai là, bạn tiếp cận các công ty lớn, tập đoàn trước. Việc có thể trúng tuyển hoặc vào các vòng phỏng vấn sau trong quy trình phỏng vấn cũng là một thành công đối với bạn. Bạn sẽ được tiếp cận với quy trình tuyển chọn bài bản, bạn sẽ phải cạnh tranh với nhiều người, trong quá trình phỏng vấn bạn cũng đã tích lũy thêm nhiều kiến thức, kỹ năng rồi, đó là một ưu điểm để bạn nên apply job tới cùng (Vd: Management Trainee).

Lộ trình nghề nghiệp cần lựa chọn thật tỉnh táo

Đánh giá

Ở các công ty lớn, bạn sẽ được đào tạo bài bản hơn, công việc sẽ chuyên biệt hơn, mang lại cho bạn sự chuyên nghiệp, năng lực được đào sâu, tập trung vào một mảng.Nếu có thể thăng tiến lên cấp quản lý ở đây luôn thì rất tốt. Nhưng có lẽ cơ hội không đủ nhiều cho tất cả.
Do đó, bạn có thể cân nhắc tình huống nhảy sang công ty nhỏ làm quản lý. Dựa vào năng lực chuyên môn của bạn, dựa vào brand name của công ty… đó sẽ là điểm cộng cho bạn ở các vị trí trong công ty nhỏ.
Sau khi trải nghiệm cả hai môi trường công ty lớn và nhỏ, thì bạn cũng sẽ có kha khá tích lũy rồi, lúc ấy, bạn hoàn toàn có thể xác định cho mình con đường hoặc đích đến tiếp theo.

Bonus: Mức lương khởi điểm ở công ty lớn thường sẽ cao hơn, chức vụ ở công ty nhỏ thì lại cao hơn.

Vân D.

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

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

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

Mail xin nghỉ việc? Tips viết mail xin nghỉ việc chuyên nghiệp 

mail xin nghỉ việc
mail xin nghỉ việc

Nhu cầu xin nghỉ việc là nhu cầu tất yếu phải xảy ra khi một cá nhân cảm thấy không còn điểm chung đối với doanh nghiệp. Đây là lúc bạn cần quan tâm đến việc làm thế nào để có một lá đơn xin nghỉ việc phù hợp. Đồng thời, có rất nhiều hình thức xin nghỉ việc. Viết mail xin nghỉ việc là một trong số đó. Cùng đọc bài viết sau đây để nắm bắt những thông tin bổ ích về vấn đề này nhé.

Thế nào là viết mail xin nghỉ việc?

Đơn giản, mail xin nghỉ việc nó cũng giống như một lá đơn xin nghỉ việc thông thường. Nó có hiệu lực trong một khoảng thời gian nhất định; có ý nghĩa thông báo cho tổ chức/doanh nghiệp về việc dừng hoạt động công tác của một cá nhân nào đó.

mail xin nghỉ việc
mail xin nghỉ việc

Đây được xem là một hình thức viết đơn xin nghỉ việc gián tiếp. Dù nói như vậy, nhưng bạn vẫn phải trực tiếp đến tổ chức để hoàn tất các giấy tờ nếu có các phát sinh về pháp lý. Thực tế, viết mail xin nghỉ việc hoàn toàn giống với cách tổ chức viết đơn xin nghỉ việc bình thường. Điểm khác duy nhất chính là cách thức viết được truyền tải trên một phương tiện chuyển giao gián tiếp qua hòm thư mail; thay vì văn bản giấy như hình thức thông thường.

  Bí quyết phát triển hoạt động nhân sự qua email (Email Marketing) hiệu quả - Bạn đã biết?

Khi đưa ra một quyết định nghỉ việc thường sẽ không dễ dàng. Nó đòi hỏi sự cân nhắc kỹ lưỡng đến từ nhiều phía. Và khi đã thật sự có quyết định, bạn nên có một mail xin nghỉ việc hợp lý, đúng chuẩn.

Điều này sẽ giúp bạn để lại ấn tượng đẹp trong lòng các đồng nghiệp; doanh nghiệp của mình. Đồng thời cũng thể hiện mình là người có ý thức làm việc. Dưới đây sẽ là những tips giúp bạn viết mail xin nghỉ việc sao cho thật hiệu quả.

1. Đảm bảo một lý do xin nghỉ việc thật thuyết phục

Lý do xin nghỉ việc thật sự rất quan trọng không chỉ với đơn xin nghỉ việc thông thường; mà còn đối với mail xin nghỉ việc. Mail xin nghỉ việc của bạn có được chấp thuận hay không; tất cả đều phụ thuộc lớn vào lý do xin nghỉ việc. Hãy thật tỉnh táo để cho đưa ra các lý do hợp tình nhất; tránh những lý do bất khả thi. Điều này sẽ tạo sự thuận lợi giúp mail xin nghỉ việc của bạn dễ được phê duyệt hơn.

Tìm ra một lý do xin nghỉ việc không khó khi bạn thật sự rời đi với các mong muốn chính đáng. Nếu thiếu chuyên nghiệp trong cách làm việc thì có lẽ, bạn đã bị loại khỏi cuộc chơi nghề nghiệp từ lâu rồi.

Một lý do xin nghỉ việc thuyết phục còn giúp bạn nhận được sự đồng cảm từ cấp trên; công ty và các cộng sự. Từ đó, bạn cũng cảm thấy thật thoải mái khi rời đi; chuyển sang một môi trường khác phù hợp hơn.

2. Lưu ý về việc chi tiết thời gian nghỉ việc

Bạn cần phải rõ ràng trong từng nội dung được đề cập trong mail xin nghỉ việc. Cụ thể, đó chính là thời gian nghỉ việc. Việc chia sẻ cụ thể thời gian nghỉ việc giúp nhà quản lý nắm bắt chính xác được quãng thời gian bạn nghỉ. Đồng thời, họ cũng có những cơ sở về thời gian để tìm kiếm; chọn lọc các nhân sự mới cho vị trí mà bạn rời đi.  

  Cách tạo hồ sơ xin việc online qua email ấn tượng
  Văn hóa giao tiếp qua Email - Thế nào là chuyên nghiệp?

mail xin nghỉ việc
mail xin nghỉ việc

Theo quy định của Bộ luật Lao động năm 2019, từ năm 2021, người lao động nghỉ việc phải báo trước ít nhất 45 ngày với hợp đồng không xác định thời hạn.

Nếu còn thời hạn hợp đồng từ 12 – 36 tháng phải báo trước ít nhất 30 ngày; hợp đồng dưới 12 tháng chỉ cần báo trước ít nhất 03 ngày; trừ một số trường hợp được đơn phương chấm dứt hợp không cần báo trước. 

Trong trường hợp, bạn là người chịu trách nhiệm quản lý các đầu công việc chính, là Team Lead,.. thì bạn cần nhiều thời gian hơn để bàn giao công việc. Bên cạnh đó, nếu công việc của bạn tương đối phức tạp cần nhiều thời gian để bàn giao công việc. Thậm chí, bạn có thể cân nhắc kỹ hơn về việc kéo dài thêm thời gian làm việc ra đôi chút để bàn giao; làm việc với nhân sự mới để họ có cái nhìn đủ tốt với vị trí họ sắp đảm nhận.

3. Tận tình chia sẻ về những thứ còn đang thực hiện

Nếu là một nhân viên có tâm và có tầm, bạn hoàn toàn có thể chia sẻ về những dự án còn dang dở về tiến độ thực hiện trong mail xin nghỉ việc của mình.

Cụ thể, khi đã trình bày lý do xin nghỉ việc, hãy khéo léo nhắc đến chúng. Nói chi tiết về những vấn đề đang còn tồn đọng; tính hiệu quả và gợi ý về những cách thức  – giải pháp tiếp theo nào có tính khả thi để thực hiện. Dù là những thông tin phân tích từ một người sắp trở thành cựu nhân viên, nhưng những gì bạn truyền tải qua mail xin nghỉ việc chắc chắn sẽ để lại ấn tượng đẹp trong lòng những bạn bè, đồng nghiệp,…

Việc chia sẻ này cho thấy bạn là người có trách nhiệm với công việc cao; luôn quan tâm đến sự phát triển chung của tổ chức dù không còn hoạt động nữa. Một thái độ chuyên nghiệp qua cách viết mail xin nghỉ việc cũng là điều quan trọng bạn nên lưu tâm, thực hiện.

4. Một điều cực quan trọng – Hãy nói lời cảm ơn

Thời gian gắn bó với tổ chức của bạn dù ngắn hay dài thì khi ra đi, bạn cũng nên nói lời cảm ơn. Chí ít bạn đã có sự trưởng thành hơn nhờ những cọ xát thực tế; có cho mình những trải nghiệm mới. Lời cảm ơn thể hiện bạn là người biết lý lẽ; chuyên nghiệp trong cách hành xử, cách sống và là một nhân viên có phẩm chất tốt.

mail xin nghỉ việc
mail xin nghỉ việc

Đứng bao giờ quên nói lời cảm ơn hoặc quên thể hiện thái độ trân trọng, biết ơn đối với doanh nghiệp của mình.

5. Không bao giờ đưa ra những lời phê phán

Đây được xem là điều tối kỵ bạn không nên thể hiện trong mail xin nghỉ việc.

Đặc biệt, trong phần lý do xin nghỉ việc, đừng bao giờ chia sẻ rằng công ty có môi trường không tốt, có đãi ngộ không phù hợp,…

Dù bạn biết thực tế là vậy, nhưng nếu là người chuyên nghiệp không ai lại quá thẳng thắn như thế. Hãy bình tĩnh để đưa ra một lý do xin nghỉ việc qua mail phù hợp nhất. Hãy thể hiện tính chuyên nghiệp, sự hòa đồng thân thiện. Vì đó là những dấu ấn về thái độ cuối cùng đối với tổ chức, doanh nghiệp của bạn. 

Cấu trúc viết một mail xin nghỉ việc cực chuẩn

Hãy đảm bảo rằng mail xin nghỉ việc của bạn phải có những phần nội dung sau:

1. Phần thông tin mở đầu

Đây là phần thông tin quan trọng bao gồm tên người nhận hoặc nơi nhận đơn xin nghỉ việc của bạn. Như phân tích trước đó, bạn nên ghi rõ về thời gian sẽ rời khỏi công ty. Lưu ý là viết mail xin nghỉ việc cần đúng trọng tâm, không lan man, mơ hồ.

Ví dụ:

Kính gửi [Tên chức danh cấp trên/tổ chức],

Tôi/Em là…., tôi/em viết mail xin thống báo chính thức về việc tôi/em sẽ nghỉ việc tại công ty với vị trí [chức danh hiện tại]. Ngày làm việc cuối cùng của tôi/em là [ngày chính thức bạn rời công ty].

2. Phần lời chia sẻ cảm ơn

Đơn giản, không hoa mỹ – cầu kỳ. Bạn chỉ cần có những chia sẻ chân thành nhất đối với công ty. Thể hiện sự tri ân là điều bạn nên làm. Hãy biết ơn vì các cơ hội học tập, làm việc và truyền tải thông điệp đó thông qua mail xin nghỉ việc của bạn. 

Ví dụ:

Em xin cảm ơn quý công ty vì đã cho em cơ hội làm việc trong khoảng thời gian dài qua. Tại đây, em làm việc rất vui và học được nhiều thứ từ các anh chị dày dặn kinh nghiệm.  [Kể tên một trải nghiệm công việc thú vị mà bạn đã thử sức]. Em cảm ơn vì sự tín nhiệm của công ty đã dành cho em thông qua các dự án dài hạn. Thật sự em rất trân trọng vì cơ hội này. 

Tạo mẫu CV IT đẹp

3. Nội dung về sự bàn giao nhiệm vụ

Đây là phần khá trọng tâm. Vi thông qua phần này, nó sẽ phản ánh tính trách nhiệm của bạn đối với công việc của tổ chức. Hãy chủ động thống kê; và tập hợp các nguồn dự liệu để bàn giao công việc cho nhân sự mới một cách tốt nhất.

Đồng thời, thể hiện sự sẵn lòng giúp đỡ nhân sự mới khi họ cần thông tin về các nhiệm vụ trước đây. Tất nhiên là chỉ duy trì trong một giới hạn thời gian cho phép.

Ví dụ: 

Trong thời gian…. tới, tôi/em sẽ sớm sắp xếp lại các nhiệm vụ, hoàn thành tốt các công việc còn dàng dở cũng như bàn giao cho nhân sự mới. Tôi/em mong quý công ty sẽ thông tin đến tôi/em biết nếu tôi/em có thể giúp gì được cho công ty vào khoảng thời gian còn lại này.\

Gửi lời chúc tốt đẹp nhất đến với công ty, tôi/em xin cảm ơn. 

Trân trọng,

[Ký tên ghi tên của bạn]

Mẫu đơn xin nghỉ việc qua email dành cho bạn

Tiêu đề mail: THƯ XIN NGHỈ VIỆC_[TÊN CỦA BẠN]_ [VỊ TRÍ/CHỨC DANH]

Kính gửi:  Anh/chị [tên người nhận]

Em xin gửi email này để thông báo chính thức về vấn đề thôi việc/dừng công việc tại công ty với vị trí [tên vị trí/chức danh][lý do nghỉ việc]. Ngày làm việc cuối cùng của em sẽ là [ngày chính thức nghỉ]. Em rất lấy làm làm tiếc vì sẽ không còn làm việc tại [tên công ty] trong thời gian sắp tới.

Thực sự đây là quyết định rất khó khăn đối với em. Hiện tại sau khoảng thời gian dài làm việc, em nhận thấy mình đã có được những trải nghiệm thú vị, các kỹ năng chuyên sâu hơn từ công việc và môi trường nơi đây.  [Liệt kê một số điều mà bạn tâm đắc]. Em cảm thấy cảm thấy may mắn khi được làm việc cùng những đồng nghiệp thân thiện, đồng thời cũng rất biết ơn sự hỗ trợ và tạo điều kiện của cấp trên và đồng nghiệm để em có thể hoàn thành tốt công việc này. 

Trong thời gian tới, cụ thể là…., em sẽ cố gắng hoán tất sớm các công việc còn dang dở. Đồng thời em sẽ tập hợp các hồ sơ, phân loại để bàn giao; hướng dẫn lại cho nhân sự mới đảm nhận vị trí của mình. Ngoài ra, anh/ chị vui lòng báo cho em biết nếu em có thể giúp gì cho công ty trong thời gian chuyển giao công việc.

Em hi vọng quyết định này sẽ nhận được sự chấp thuận từ chị và cấp trên. Và một lần nữa em xin cảm ơn vì sự tín nhiệm của cấp trên và tố chức. Chúc mọi người có thật nhiều sức khỏe và công ty sẽ ngày càng phát triển.

Trân trọng,

Ký tên

[Tên của bạn]

Lời kết

Với những chia sẻ trên, TopDev hi vọng bạn sẽ có những thông tin bổ ích về cách viết mail xin nghỉ việc thế nào là hiệu quả. Chúc cho bạn sẽ có một email thật chuyên nghiệp và để lại những dấu ấn đẹp trong tổ chức của bạn.

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

Xem thêm việc làm ngành IT hàng đầu tại TopDev

Âm nhạc đã giúp tôi rèn luyện kỹ năng coding như thế nào?

luyện kỹ năng coding

Tác giả: Jessica Wilkins

Giới thiệu

Có thể bạn đang nghĩ, âm nhạc thì liên quan gì đến lập trình? Là một Professional Developer, tôi lại ý thức rất rõ về sự kết nối giữa việc học lập trình với âm nhạc trong việc luyện kỹ năng coding của mình. Cả hai đều đòi hỏi rất nhiều sự tập trung, kỷ luật và kiên trì để trở nên tuyệt vời hơn trong chuyên môn của mình. Dưới đây tôi sẽ chia sẻ với các bạn những đặc điểm mà âm nhạc và lập trình đều giống nhau trong quá trình luyện tập.

coding-vs-am-nhac
Coding với âm nhạc thì liên kết với nhau như thế nào?

Âm nhạc gắn kết với coding như thế nào?

Hãy cố gắng hết mình

Dù là với khi luyện tập cùng âm nhạc hay hay khi luyện kỹ năng coding, bạn đều cần phải nỗ lực hết mình nếu muốn đạt được kết quả tốt nhất. Hầu hết mọi người trong cuộc sống đều không có 24 giờ rảnh rỗi liên tục để làm bất cứ điều gì chúng ta muốn. Sẽ luôn có một cái gì đó xuất hiện và chúng ta phải giải quyết nó.

Thực tế phũ phàng là chúng ta phải giữ kỷ luật hoàn thành công việc để có thể trở thành những lập trình viên giỏi hơn. Vì vậy, khi bạn chuẩn bị kiếm cớ khác để trì hoãn, hãy nhớ hoàn thành nó bằng mọi cách!

Xem thêm các việc làm tuyển dụng Tester chưa có kinh nghiệp hấp dẫn tại TopDev

Không chỉ đơn giản là luyện tập mỗi ngày

Bất cứ khi nào tôi cố gắng học một phần mới, tôi sẽ thất vọng vì nó không tốt hơn chút nào. Dù tôi có luyện bao nhiêu lần đi chăng nữa thì vẫn là một mớ hỗn độn. Nhưng tôi đã sớm nhận ra rằng chỉ xuất hiện và luyện tập là không đủ. Bạn phải thực hành thông minh.

Vì vậy, tôi đã học cách chia mọi thứ thành nhiều phần nhỏ, làm chậm máy đếm nhịp và làm việc trên đoạn văn đó cho đến khi nó đúng. Một khi tôi thay đổi thói quen luyện tập của mình, tôi bắt đầu trở thành một nhạc sĩ giỏi hơn nhiều.

  "Code dễ đọc" là như thế nào?
  10 mẹo nhỏ cho bạn để coding hiệu quả hơn!

Trong việc học coding, việc học vội vã qua một khóa học sẽ không khiến bạn trở thành một lập trình viên giỏi hơn. Trong một số trường hợp, bạn có thể hình thành một số thói quen xấu mà sau này khó bỏ. Tốt hơn là bạn nên giải quyết từng vấn đề một và giải quyết nó một cách từ từ hơn là vội vàng vượt qua tất cả chúng. Nếu bạn thực hành một cách thông minh, thì các khái niệm sẽ bắt đầu có ý nghĩa hơn.

Nhất quán là chìa khóa của thành công

Tôi là một đứa trẻ bắt đầu chơi piano từ năm 7 tuổi và thực sự đam mê nó trong vài năm đầu. Nhưng một khi tôi bắt đầu làm việc với những bài khó hơn, tôi lại mất dần động lực tập luyện. Tôi đã không luyện tập thường xuyên và kết quả là tôi không khá hơn chút nào. Các bài học của tôi kết thúc là một sự lãng phí hoàn toàn bởi vì chúng tôi chỉ học qua những thứ giống nhau tuần này qua tuần khác.

Xem thêm các việc làm tuyển dụng Tester HCM hấp dẫn tại TopDev

Với tất cả những lời quảng cáo về việc học cách coding tại nhà, rất nhiều người bắt đầu tham gia với sự hào hứng ban đầu. Họ sẽ trải qua các hướng dẫn và xây dựng các dự án nhỏ từ lớp học. Nhưng khi nhiều tháng trôi qua, mọi người bắt đầu mất động lực. Họ bắt đầu viết code ít thường xuyên hơn và cuối cùng mất hứng thú và bỏ cuộc.

Khi học cách viết code, bạn phải đưa ra một lịch trình nhất quán, nếu không bạn sẽ không bao giờ trở thành một lập trình viên thực thụ. Bạn sẽ luôn gặp khó khăn trong việc đấu tranh với các nguyên tắc cơ bản và không bao giờ có thể xây dựng các dự án phức tạp hơn. Bạn không cần phải dành 12 giờ mỗi ngày để thành công. Xây dựng một lịch trình phù hợp với bạn. Nếu bạn chỉ có 2 giờ mỗi ngày để dành cho việc học, thì hãy gắn bó với điều đó. Nhưng lặp lại chu kỳ làm 8 giờ một ngày và sau đó nghỉ hai tuần sẽ chỉ dẫn đến sự thiếu tiến bộ.

Nhất quán là chìa khóa để thành công dù là với bất cứ lĩnh vực nào.

kỹ năng coding
Hãy nỗ lực để trở thành môn chuyên gia trong lĩnh vực của mình

Hãy học những gì bạn chưa biết

Trong năm cuối đại học của tôi, người chỉ huy dàn nhạc gió của chúng tôi đã nói rằng “Hãy can đảm để làm những gì mà bạn không biết.” Hầu hết chúng tôi muốn học nhạc bằng cách mà chúng tôi đã quen thuộc là nghe hay trong phòng tập. Đó có lẽ là một cách để chúng ta cảm thấy dễ chịu và đánh đổi cái tôi của mình một chút.

Xem thêm các việc làm tại Gear Inc tuyển dụng hấp dẫn với TopDev

Nhưng, nhạc trưởng của tôi đã đúng.

Nếu bạn không thử thách bản thân và khắc phục những điểm yếu của mình thì bạn sẽ không bao giờ phát triển như một nhạc sĩ.

Có quá nhiều thứ để học khi bạn mới bắt đầu với tư cách là một lập trình viên. Chỉ tập trung vào những thứ bạn thích thú thực sự rất hấp dẫn. Điều hợp lý là bạn muốn cảm thấy hài lòng về bản thân và thể hiện những gì bạn biết. Nhưng điều đó không cho bạn lý do để bỏ qua những gì bạn đang yếu kém. Nếu bạn biết mình kém về thuật toán, đừng bỏ qua chúng. Dành thêm thời gian để nghiên cứu và luyện tập thật nhiều để chúng trở nên dễ giải quyết hơn. Hoặc có thể bạn đang gặp khó khăn với đệ quy. Nó sẽ không biến mất chỉ vì bạn không thích nó.

Dù khó khăn trong lúc này nhưng bạn phải có kỷ luật ngồi xuống và rút ra những điều cần học.

Xem thêm các việc làm tại Gear Inc tuyển dụng hấp dẫn với TopDev

Kết luận

Dường như có một sự kết nối rất rõ ràng giữa việc học lập trình với học âm nhạc. Hãy biết cách tận dụng những gì tốt nhất để luyện tập mỗi ngày và trở nên thông thái hơn với chuyên môn của mình.

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

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

Xem thêm việc làm tuyển dụng Tester hấp dẫn tại TopDev

Mã hóa mật khẩu trong Selenium Webdriver

Mã hóa mật khẩu trong Selenium Webdriver

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

Khi sử dụng automation để thực hiện tự động một việc nào đó, mà ở đó có sự xuất hiện của một số những thông tin nhạy cảm mà ta không muốn nó bị lộ thiên cho bàn dân thiên hạ thấy, vậy thì chúng ta phải làm như thế nào? Thông tin nhạy cảm ở đây có thể là thông tin password chẳng hạn :)) Tuy nhiên, nếu như bạn chỉ là thực hiện công việc test thông thường và không quan tâm lắm, hoặc không có các dữ liệu nhạy cảm thì có thể bỏ qua bài này nhé :))) Nhưng mình nghĩ là đã đọc đến đây rồi thì đọc nốt đi, biết đâu sau này lại cần dùng thì sao? :v

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  JavaScript Executor trong Selenium Webdriver

Bởi vì Selenium thông thường thì sẽ không có khả năng che dấu mật khẩu và thậm chí kể cả IDE của Elipse cũng vậy. Cho nên người ta mới nghĩ ra một cách để có thể giúp kiểm soát việc hiển thị của các dữ liệu nhạy cảm bên ngoài môi trường kiểm thử (hoặc môi trường thực tế nào đó), đó là tạo một lớp để có thể thực hiện mã hóa (hoặc giải mã) dữ liệu khi thực thi.

Có hai cách để bạn có thể thực hiện mã hóa, ở đây mình ví dụ là mã hóa mật khẩu nhé.

Cách 1

Cách thứ nhất sử dụng thư viện java.util.Base64, bạn thực hiện mã hóa bằng cách sử dụng hàm mã hóa mặc định của BASE64 với cú pháp như sau:

static String password= "yourPassword";
public static String getDecodedpassword() {
   return new String(Base64.getDecoder().decode(decodepassword.getBytes()));
}

Cách này khá là đơn giản, nhưng đối với những password dài quá 12 ký tự và có những ký tự đặc biệt khi mã hóa sẽ bị quá độ dài có thể xử lý hiển thị được của BASE64, không hợp lệ đối với lý tự đặc biệt và theo mình thì đây cũng chính là điểm yếu của cách này. Chắc là không khuyến khích sử dụng cách này rồi.

Cách 2

Cách thứ 2 là sử dụng thư viện sun.misc.BASE64Encoder với thư viện này thì ta có thể thoải mái với bất kỳ loại password nào (bất kỳ password này là do mình nghĩ ra và nhập vào =)) ) Tương tự cách 1 chỉ khác import thư viện và hàm sử dụng một chút thôi.

static String decodepassword = "yourPassword@874";
public static String getDecodedpassword() {
   return new String(new BASE64Encoder().encodeBuffer(decodepassword.getBytes()));
}

Với cách thứ 2, ta không phải nghĩ về vấn đề độ dài của password hay các ký tự đặc biệt xuất hiện trong password nhập vào. Bên cạnh đó, ta cũng có thể tự tùy biến một hàm mã hóa, và hàm giải mã của nó kết hợp với 1 key (chìa khóa) để giải mã. Key này có thể là một chuỗi ký tự bất kỳ, bằng một vài kỹ năng cơ bản ta kết hợp chuỗi key này vào trong chuỗi password ban đầu rồi sau đó mới thực hiện mã hóa. Tất nhiên để giải mã ngược lại thì ta cũng cần phải có key chính xác đã được sử dụng ở phần mã hóa. Tùy nhu cầu mà bạn có thể lựa chọn cách phù hợp nhé :)) Chỉ có điều cách nào ngon thì sẽ phải ngồi code í, :))) – Không code thì chịu khó Google chắc là sẽ ra, à chắc chắn sẽ ra :v

Đấy, tóm lại là muốn bảo mật hơn thì tất nhiên phải dành thời gian :))) Các bạn có thể tham khảo link này để xem thêm việc biến tấu mật khẩu kết hợp với key để mã hóa, rồi sau đó thực hiện giải mã với key đã có nhé.

Mình nghĩ là đưa ra gợi ý đến đây cũng khá là chi tiết và đầy đủ thông tin rồi nhỉ. Các bạn đã sử dụng những cách nào rồi, hay có còn những cách nào khác không? Nếu có vui lòng chia sẻ cho mình và các bạn đọc khác cùng biết nữa nha. Hoặc có ý kiến đóng góp, trao đổi gì thì cũng đừng ngần ngại để lại bình luận phía dưới nhé!

Tham khảo:

Password Encryptor for Selenium Webdriver

https://developers.perfectomobile.com/pages/viewpage.action?pageId=21430626

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

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

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

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

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

Trên bàn phím máy tính, đặc biệt là các bàn phím dạng Full Size hay là bàn phím của Laptop thường được trang bị một cụm phím Media riêng. Nó thường được tích hợp luôn vào một trong các phím từ F1 đến F12 trên các mẫu bàn phím phổ thông.

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

Khi sử dụng máy tính thì hầu hết mọi người đều có nhu cầu giải trí bằng cách nghe nhạc, chơi game hoặc là xem phim, lúc đó những phím media này sẽ phát huy tác dụng tuyệt vời của nó.

Tuy nhiên, trong một vài trường hợp, khi bạn sử dụng các trình duyệt web mà đơn cử như là Google Chrome thì mặc định, Chrome sẽ chiếm quyết sử dụng các phím Media và chúng không thể sử dụng được chúng cho những phần mềm khác.

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

Chính vì sự bất tiện này mà trong bài vài viết ngày hôm nay, mình sẽ chia sẻ với các bạn cách để ngăn Google Chrome chiếm trọn quyền sử dụng các phím Media trên bàn phím nha !

#1. Phím Media trên bàn phím là gì?

Ngăn Google Chrome sử dụng các phím Media trên bàn phím
Cụm phím media trên bàn phím gaming Corsair Vengeance K70

Phím Media, hay còn gọi là phím đa phương tiện bao gồm các phím như PausePlayNextPreviousMute và phím Tăng giảm âm lượng.

Những phím này thường được nằm tách riêng ra một góc đối với những bàn phím Gaming dạng Full size như chiếc Corsair Vengeance K70 bên trên, hoặc là tích hợp thẳng vào các phím F1 - F12 trên các bàn phím phổ thông.

Còn về chức năng thì quá rõ rồi, cái tên đã nói lên tất cả, nó giúp bạn có thể DừngĐổi nhanh bài hát đang nghe mà không cần phải mở phần mềm lên rồi dùng chuột để lựa chọn nữa và có thể dùng với mọi phần mềm trên tất cả các hệ điều hành.

Còn việc Google Chrome chiếm quyền sử dụng phím Media trên bàn phím là sao? Nếu bạn là người có thói quen vừa nghe nhạc bằng Spotify, SoundCloud hay là iTunes,… vừa xem phim hay xem video trên Youtube thì sẽ hiểu.

Lúc này các phím Pause, Play, Next… sẽ chỉ có tác dụng với bộ phim, video bạn đang xem trên Google Chrome mà thôi, còn các ứng dụng/ chương trình khác trên máy tính thì không sử dụng được.

Và lúc này, nếu bạn muốn chuyển nhạc thì bạn sẽ phải vào trực tiếp ứng dụng nghe nhạc đó để chuyển bài hát, tạm dừng bài hát… điều này khá là bất tiện.

Mà coi phim hay xem video trên Youtube thì ta thường ưu tiên dùng chuột chứ ai rảnh mà ngồi bấm mấy phím này phải không nào.

=> Đấy, chính vì lý do đó mà mình mới chia sẻ thủ thuật này với các bạn.

#2. Ngăn Google Chrome chiếm quyền sử dụng toàn bộ các phím Media trên bàn phím

Cách khắc phục thì vô cùng đơn giản, đầu tiên bạn hãy truy cập vào địa chỉ chrome://flags hoặc chrome:flag để mở trang quản lý những tính năng đang được thử nghiệm trên Google Chrome, cái này chắc nhiều bạn không lạ gì nữa rồi.

Google Chrome sử dụng được những phím media trên bàn phím là nhờ một flag có tên Hardware Media Key Handling, để khắc phục thì rất dễ thôi, bạn chỉ việc vô hiệu hóa flag này là được.

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

Thực hiện:

+ Bước 1: Trước hết bạn hãy dán từ khóa Hardware Media Key Handling để tìm kiếm và bạn sẽ chỉ thấy kết quả duy nhất như hình bên dưới.

Hoặc bạn có thể truy cập nhanh theo địa chỉ này:

chrome://flags/#hardware-media-key-handling

+ Bước 2: Mặc định thì flag này đang ở trạng thái Default tương đương với Enabled, bây giờ bạn hãy click vào Default và chọn lại thành Disabled để vô hiệu hóa flag này.

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

+ Bước 3: Cuối cùng, cũng giống như khi chỉnh sửa Registry của Windows 10, bạn vẫn sẽ phải khởi động lại trình duyệt web bằng cách bấm vào nút Relaunch xuất hiện sau khi bạn thay đổi thiết lập, để những thay đổi này có hiệu lực.

Nhớ là lưu lại các trang web, nội dung quan trọng mà bạn đang làm việc trên trình duyệt web trước khi khởi động lại để tránh bị mất dữ liệu đáng tiếc nhé !

#3. Lời kết

Như vậy là mình đã vừa chia sẻ cho các bạn cách để khắc phục, ngăn Google Chrome chiếm trọn quyền sử dụng các phím Media trên bàn phím rồi đấy.

Đây là những phím rất hữu ích và bạn sẽ thường dùng đến nếu là một người hay nghe nhạc, xem phim… Hy vọng là bài viết này sẽ có thể giúp ích được cho các bạn. Đừng quên chia sẻ nếu thấy nó hay nhé.

Bài viết gốc được đăng tải tại blogchiasekienthuc.com
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Kiểm thử tự động – Tưởng không dễ mà dễ không tưởng

Kiểm thử tự động – Tưởng không dễ mà dễ không tưởng

Bài viết được sự cho phép của vntesters.com

Kiểm thử tự động – Automation Test

Kiểm thử tự động không phải là kiểm thử, nó chỉ là kiểm tra” Một ai đó đã nói như thế. Với mình, sau khoảng hơn 10 năm làm kiểm thử – cả thủ công và tự động, câu nói này không hề sai chút nào.

Hãy cùng thử nhìn qua các lợi ích mà nó mang lại:

  • Hỗ trợ kiểm thử qui hồi – Regression Test → Giảm thiểu thời gian và chi phí.
  • Hỗ trợ kiểm thử độ chịu tải của hệ thống → Làm cho việc kiểm thử mở rộng và đầy đủ.
  • Kịch bản chạy nhiều lần với nhiều bộ dữ liệu, điều kiện và môi trường khác nhau. → Tăng độ bao phủ của việc kiểm thử.
  • Kịch bản kiểm thử tốn quá nhiều thời gian và dễ bị lỗi của người kỹ sư → Tăng cường độ chính xác của việc kiểm thử.
  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  7 lãng phí trong kiểm thử phần mềm

Trong mọi tình huống, Automation Test chỉ tác dụng hỗ trợ cho kỹ sư kiểm thử tiến hành kiểm thử theo những kịch bản có sẵn, do kỹ sư kiểm thử đưa ra. (Ở đây, mình không bàn đến kiểm thử bằng AI nhé, chuyên ngành này vẫn đang được phát triển trong phòng thí nghiệm và – theo mình biết thì – chưa thực sự ứng dụng thực tế).

Kiểm thử tự động với kiểm thử thủ công

Về kỹ năng

Đối với kiểm thử thủ công, kỹ sư kiểm thử cần một số kỹ năng đặc biệt như: biết cân bằng, có mức độ tò mò cao, biết cách tìm/xác định lỗi/bug, có cái nhìn tổng thể, khả năng quan sát, sắp xếp mức độ ưu tiên, suy nghĩ độc lập, sáng tạo, vân vân và mây mây.

Ngược lại, đối với Automation Test chỉ yêu cầu một thứ: khả năng lập trình. Mà, trong một số trường hợp, khả năng lập trình cũng không cần thiết – nếu dự án của bạn dùng một công cụ không cần lập trình – codeless tool.

Về công việc

Công việc của kỹ sư kiểm thử thủ công sẽ bao gồm: đọc tài liệu mô tả các yêu cầu chức năng, lên kế hoạch kiểm thử, viết kịch bản kiểm thử, tiến hành kiểm thử (ghi nhận kết quả) và ghi nhận/báo cáo lỗi/bug (nếu có), làm báo cáo kiểm thử sau khi hoàn thành.

Công việc của kỹ sư kiểm thử tự động chỉ là: chuyển các kịch bản kiểm thử do kỹ sư kiểm thử thủ công đưa ra thành các đoạn mã kiểm thử tương ứng, đồng thời đảm bảo tính chính xác và ổn định của đoạn mã kiểm thử đó.


Với những yêu cầu kỹ năng và công việc hằng ngày như thế, so ra, việc kiểm thử tự động thực sự không khó như kiểm thử thủ công.

Bạn có cảm thấy như vậy không? Kiểm thử tự động thực ra không khó chút nào, kiểm thử thủ công mới thực sự là thử thách.

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

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

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

Hướng dẫn sử dụng Nock để mock request APIs cho việc run Integration test

Hướng dẫn sử dụng Nock để mock request APIs cho việc run Integration test

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Trước khi tham khảo thông tin bài viết này, bạn cần biết về Integration test là gì? Và Nock là một giải pháp tốt trong việc mocking các request đến các APIs khi làm với NodeJS để trả ra expected bạn mong muốn.

  10+ tools và extensions tuyệt vời cho GraphQL APIs
  3 bước tối ưu hiệu năng React App bằng các API mới của React

I. Tại sao phải dùng Nock?

Khi chạy Integration test chúng ta khó có thể Injection vào function để mock như Unit test được. Vì thế việc gọi các APIs và trả ra dữ liệu mong muốn với phương thức Injection vào function thì khá khó khăn.

Việc mock vào HTTP request để các APIs trả ra dữ liệu thì khả quan hơn!

Ví dụ: Itegration có function gọi tới API của Amazon mà mock nó trả ra dữ liệu mình muốn.

Có rất nhiều package tương tự Nock như Pact, Chai, Sinon nhưng việc sử dụng thì mình thấy Nock hoạt động dễ dàng và cách dùng rất dễ hiểu!

Repo: https://github.com/nock/nock

NPM: https://www.npmjs.com/package/nock

II. Nock hoạt động như thế nào?

Nock hoạt động bằng cách ghi đè hàm http.request của Node. Ngoài ra, nó cũng ghi đè lên http.ClientRequest để đề cập đến các module sử dụng trực tiếp.

III. Cách sử dụng Nock để mock HTTP request hiệu quả.

Mình tham khảo hoàn toàn từ tài liệu của Nock cung cấp và kết hợp với Chai để tiến code Integration test.

Nock document: https://github.com/nock/nock#usage

Cách mà mình sử dụng Nock cho việc Integration test.

https://github.com/lechidung/test-source-sample-for-nodejs

'use strict';

const request = require('request');
const chai = require('chai');
const chaiHttp = require('chai-http');
const nock = require('nock');

const server = require('../../../src/app');
const {api} = require('../../../src/configs');
const dataProvider = require('./dataProvider/books');
const testCase = require('./testCase/books');
const RealDate = Date;

function mockDate (isoDate) {
    global.Date = class extends RealDate {
        constructor () {
            return new RealDate(isoDate)
        }
    }
}

describe('books Detail API Success', () => {
    before(() => {
        chai.use(chaiHttp);
    });

    beforeEach(() => {
        global.Date = RealDate;
        mockDate('2018-07-12T12:00:00z');

        // Mock CMS API get books Detail
        nock(api['BOOK_DETAIL'].host)
        .get(api['BOOK_DETAIL'].path)
        .query({
            url_key: 'book_code'
        })
        .reply(200, dataProvider.book_info);

        // Mock get IAM Data API
        nock(api['IAM'].host, {
            reqheaders: {
                'App-Auth': 'PemToken'
            }
        })
        .get(api['IAM'].path)
        .query({
            fields: 'login, reg, prem, iden'
        })
        .reply(200, dataProvider.IAMResult);

        // Mock Target User API
        let iamDataStr = JSON.stringify(dataProvider.IAMData);
        let iamDataBase64 = Buffer.from(iamDataStr).toString("base64");

        nock(api['TARGET_USER'].host)
        .get(api['TARGET_USER'].path)
        .query({
            cp_id: dataProvider.book_info.book_id,
            date: 20180712190000,
            iam_data: iamDataBase64
        })
        .reply(200, dataProvider.targetUser);
    });

    afterEach(() => {
        global.Date = RealDate;
    });

    testCase.forEach(v => {
        it(v.caseName, done => {
            // When
            chai.request(server)
            .get(v.path)
            .set(v.headers)
            .query(v.queryParameters)
            .end((err, res) => {
                // Then
                expect(res).to.have.status(v.expected.status);
                expect(res.body).to.deep.equal(v.expected.body);
                done();
            });
        });
    });
});
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Những lưu ý khi làm CV Online? Tổng hợp mẫu CV free cho Dev mới nhất 2024

làm cv online
làm cv online

Làm CV online không phải là điều đơn giản vì nó đòi hỏi ứng viên nắm được những bước căn bản. Hiểu thế nào là CV? Tìm những nguồn nào để làm cv online tốt nhất? CV có những điểm gì khác so với Cover Letter? Cùng TopDev tìm hiểu bài viết sau đây để biết cách lựa chọn và làm cv online hiệu quả. Đồng thời, cung cấp cho bạn những phân tích sâu về CV, Cover Letter.

Khi làm CV – Đâu là những điều đáng lưu ý

Hiểu rõ về CV và cách phân biệt CV vơi Cover Leter? 

Trước khi làm cv online, bạn cần hiểu CV là gì? CV là loại văn bản ngắn được cấu tứ theo một chuẩn format nhất định. Nó được trình bày trên một trang A4. Tính ngắn gọn, dễ hiểu và nhấn mạnh trọng tâm nội dung là điều người viết cần đặc biệt lưu ý khi viết CV.

Tùy theo từng loại CV IT gắn với các vị trí ứng tuyển cụ thể, các thông tin về cá nhận, học vấn – trình độ năng lực, kinh nghiệm, mục tiêu phát triển nghề nghiệp,.. của một ứng viên sẽ linh hoạt được thay đổi, bổ sung và tinh gọn sao cho phù hợp nhất với nhu cầu từng ứng viên, cũng như đòi hỏi từ phía nhà tuyển dụng.

Vậy thế nào là Cover Letter cho Dev?

Phân biệt Cover Letter là bước tiếp theo để bạn không bị nhầm lẫn định hướng khi làm cv online Cover Letter (hay còn gọi là Thư xin việc), là một loại văn bản được xây dựng dưới hình thức một trang. Cover Letter cho Dev được đánh dấu chuyên biệt cho lĩnh vực IT. Cụ thể là từng vị trí cụ thể hơn như Senior Developer, Freelancer IT,… Tùy thuộc vào từng vị trí mà cách truyền tải các thông tin về cá nhân, năng lực, trình độ, mục tiêu phát triển sẽ khác nhau. Đó là các thông tin ban đầu giúp ứng viên tạo ấn tượng quan trọng đến nhà tuyển dụng. 

Chất lượng của một Cover Letter cho Developer 

Làm cv online cần nắm bắt tốt các đặc tính về CV lẫn Cover Letter. Và chất lượng của một Cover Letter sẽ quyết định thành công kết quả ứng tuyển, chiếm từ 30 đến 50%. Điều đó đồng nghĩa, việc bạn đầu tư cho bản thân một Cover Letter hoàn hảo, chuyên nghiệp là điều đúng đắn.

Hãy cố gắng hoàn thiện Cover Letter của mình thật chỉn chu để đủ sức gây ấn tượng với nhà tuyển dụng. Đặc biệt, do tính cạnh tranh của thị trường tuyển dụng ngày một gia tăng, bạn không nên ỷ lại, quá tự tin. Cũng đừng xem thường các đối thủ vì trong tích tắt bạn có thể bị vượt qua. Đừng để bản thân mình “out” khỏi hành trình nghề nghiệp với sự thờ ơ đối với chính Cover Letter của mình.

Cover Letter có thể phản ánh cả hai mặt. CV cũng tương tự, đó cũng là một điểm bạn cần lưu ý khi làm cv online Một là bạn hoàn toàn là ứng viên phù hợp với vị trí. Hai là bạn không thuộc về vị trí đó, Chính đây cũng là bải học để bạn tự nhìn nhận về Cover Letter, những gì bản thân chia sẻ lẫn định hướng tương lai của mình. Việc xem xét, điều chỉnh sẽ giúp bạn hoạn thiện và phát triển bản thân mình nhiều hơn.

Những lưu ý cần lưu ý cần nắm bắt khi làm CV Online và Cover Letter cho Dev

Bám sát trọng tâm cấu trúc format và cách thức tổ chức nội dung

Ứng viên IT cần lưu ý về việc lựa chọn các định dạng phù hợp cho CV IT và Cover Letter cho Dev. Tùy thuộc vào từng vị trí Freelancer IT, tuyển dụng Data Analyst, Senior Developer. Các bạn cần hiểu rõ một CV và Cover Letter:

+ Gồm những nội dung cơ bản nào

+ Đâu là phần quan trọng cần triển trai chi tiết

Từ đó, bạn biết kiểm soát và chọn lọc nội dung phù hợp. Điều này giúp hồ sơ xin việc dễ dàng ghi điểm với nhà tuyển dụng hơn.

Bạn có thể linh động chuyển đổi các các phần nội dung cho hợp lý. Để tạo điểm nhấn trong CV của mình mình, hãy cân nhắc sắp xếp hợp lý. Quan trọng hơn nữa, đừng để cập đến các nội dung không liên quan đến vị trí bạn ứng tuyển.

Tính ngắn gọn – dễ hiểu của mẫu làm CV online

Cả CV và Cover Letter cần phải đảm bảo tính ngắn gọn, dễ hiểu. Lưu ý không nên viết quá dàn trải, thậm chí lan man. Văn phong dài dòng khiến thông điệp của ứng viên trở nên lủng củng, mất đi các giá trị. Vì thế, hãy sử dụng câu từ dễ hiểu, cách viết đơn giản để hồ sơ xin việc của bạn đạt hiệu quả hơn. 

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

Nhà tuyển dụng cần nắm bắt nhanh những mô tả về ứng viên. Đó cũng chính là cơ sở họ xem xét tính quyết định đến việc chi tiết hóa nội dung tài liệu của bạn. Do vậy, hãy thật sự chăm chút cho bộ hồ sơ ứng tuyển của mình.

Tạo CV online miễn phí, nhanh chóng trên TopDev

Kỹ năng – Phần nội dung quan trọng đối với việc làm CV online

Chỉ cần 3-5s, nhà tuyển dụng có thể dễ dàng phân loại chất lượng CV IT của bạn. Nó ngắn hơn các loại văn bản dài như sơ yếu lý lịch cho IT,…Điều đó đồng nghĩa cơ hội để bạn tạo ấn tượng là hết sức cạnh tranh.

Nếu không biết tạo điểm nhấn, đặc biệt đối với các vị trí cao hơn như Senior Developer, CV của bạn sẽ bị quên lãng.

Phần kỹ năng là phần rất quan trọng. Nó chiếm phần trăm lớn sự kỳ vọng mà mọi nhà tuyển dụng tìm kiếm ở ứng viên. Do vậy, việc trình bày, chọn lọc các kỹ năng cũng cần phải thông minh và có chiến lược. Đừng để CV IT của bạn trở nên không có giá trị. Và tất nhiên, bạn sẽ bị out khỏi vòng phỏng vấn đấy!

Các lưu ý khi trình bày mục kỹ năng – Skills trong CV của bạn

Có thể bạn có rất nhiều kỹ năng. Thế nhưng, điều này không có nghĩa bạn có thể phô trương hết chúng vào trong làm CV online của mình. Với trường hợp là CV cho sinh viên IT mới ra trường, có thể bạn còn thiếu sót.

Tuy nhiên, khi apply các vị trí khác thì CV Junior Developer, Senior Developer, Mobile App Developer thì CV IT của bạn cần phải tập trung vào các kỹ năng chuyên sâu hơn. Vì vậy, hãy lưu tâm những tips sau đây:

Chi tiết hóa và thể hiện các kỹ năng tương ứng với vị trí công việc 

Mục đích quan trọng của phần kỹ năng là thuyết phục nhà tuyển dụng bạn phù hợp với vị trí ứng tuyển. 

Vì vậy, chỉ những kỹ năng quan trọng đến vị trí ứng tuyển thì mới nên hiện diện trong list kỹ năng CV. Ví dụ như đối với làm CV Developer, Senior Developer, bạn nên lựa chọn các kỹ năng chuyên sâu về công nghệ như các ngôn ngữ lập trình, viết code, và các kiến thức có liên quan.

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

Có tính toán trong việc phân chia kỹ năng

Việc linh hoạt trong việc phân chia các kỹ năng có ý nghĩa rất quan trọng.

Hãy chia các kỹ năng của bạn thành từng các mục nhỏ ứng với các đặc trưng chuyên môn khác nhau. Senior Developer, bạn có thể liệt kê và phân chia các kỹ năng về ngôn ngữ lập trình; các nhóm kỹ năng về phần mềm. Chính việc phân loại giúp bạn hiểu rõ hơn về vị trí. Đồng thời, nhà tuyển dụng sẽ đánh giá cao hơn về năng lực phân tích của bạn.

Chọn lọc và nhấn mạnh kỹ năng quan trọng

Đây là cách ứng viên nhấn mạnh các kỹ năng quan trọng bằng cách lặp lại các kỹ năng. Tất nhiên, việc “rải” từ khóa về kỹ năng cần ứng viên phải khéo léo và tinh tế. Bạn có thể phân theo từng mục và giới hạn xuất hiện để đảm bảo các kỹ năng không bị trùng lặp quá nhiều lần.

Cụ thể bạn có thể liệt kê kỹ năng trong phần đầu – phần giới thiệu và phần kinh nghiệm làm việc. Từ khóa về kỹ năng rất quan trọng để nhà tuyển dụng kết luận đâu là điểm mạnh của bạn. Tuy vậy, tần suất hoàn hảo nhất của một kỹ năng chỉ nên từ 2-3 lần.

Ứng viên không nên quá lạm dụng. Đặc biệt, kỹ năng được lặp lại phải thật sự phản ánh chính xác năng lực của bạn. 

Độ dài khi làm CV online cho Dev – Liệu có quan trọng hay không?

CV có độ dài lý tưởng sẽ thể hiện mức độ phụ ứng giữa những trải nghiệm chuyên 

CV cho Dev dài 1 trang

Đối với CV cho sinh viên IT mới ra trường (CV IT student) thì CV một trang là sự lựa chọn hoàn hảo và an toàn nhất. Đơn giản vì họ chưa có nhiều kinh nghiệm. Họ còn “non” trong một môi trường IT khá cạnh trạnh. Đây cũng là thời điểm tốt để họ bắt đầu những trải nghiệm, tích lũy để nâng cấp cho CV của mình.

Liệu rằng làm CV online 2 trang sẽ khiến nhà tuyển dụng lắc đầu?

Nếu xét trong một phạm vi lý tưởng, mẫu CV IT tiếng việt sẽ có độ dài tiêu chuẩn 2 trang CV. Một khảo sát thực tế cho thấy đó là sự yêu thích của 91% nhà tuyển dụng. Đặc biệt, nhiều công ty ở Anh đã từ chối CV ít hơn 2 trang của các ứng viên với lý do CV họ chưa nhiều ấn tượng. Nguyên nhân được cho là chưa biết cách chọn lọc, hiểu rõ về các kỹ năng thế mạnh của bản thân.

Hãy thật sự quan tâm đến mẫu CV IT tiếng việt của bạn. Vì nhiều trường hợp đòi hỏi bạn viết CV IT tiếng Anh (CV English IT); hay khi bạn apply các vị trí đa dạng như App Mobile Developer, Senior Developer thì CV IT Developer cũng cần được đảm độ về độ dài song song với việc kết hợp lựa chọn các kỹ năng phù hợp.

CV Dev có thể 3 trang hoặc dài hơn 

Nói một cách thực tế, không một nhà tuyển dụng thích các ứng viên có CV quá dài. Tuy nhiên, nên nhìn nhận sâu hơn vì phạm vi sử dụng CV 3 trang vẫn được biết đến. 

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

CV 3 trang sẽ phù hợp với các nhà quản lý, giám đốc cấp cao, các học giả, nhà khao học khi muốn truyền tải các nội dung; thông điệp đính kèm với các ấn phẩm tài liệu, nghiên cứu của mình.

Giải pháp giúp tối ưu số lượng chữ trên CV cho Dev

Sau đây là một số tips có thể giúp bạn cải thiện mẫu CV IT tiếng việt của mình trở nên ngắn gọn hơn.

Ưu tiên các kỹ năng – kinh nghiệm có liên quan đến vị trí ứng tuyển 

Đây là mẹo nhưng cũng chính là một kỹ năng quan trọng khi viết CV. Thông minh trong việc chọn lọc thông tin về các kinh nghiệm. Ứng viên chỉ nên liệt kê các kỹ năng – trải nghiệm có liên quan đến vị trí ứng tuyển. Điều này giúp CV đạt chuẩn hơn, chuyên nghiệp hơn. Vì vừa đảm bảo tính khoa học, vừa truyền tải đúng các thông điệp.

Yếu tố dễ đọc – nắm bắt nhanh nội dung CV

Đừng quá dài dòng, thê lê nhiều con chữ! Điều đó chỉ khiến CV trở nên không điểm nhấn. Bạn nên rút gọn câu từ, sử dụng những từ ngữ đơn giản. Hoặc tương tư như CV Template IT, sơ yếu lý lịch cho dân IT, cover letter cho dev thì mẫu CV IT tiếng việt của bạn nên lượt bỏ đi những phần không thật sự quan trọng, cần thiết.

Quan tâm đến mặt hình thức cấu trúc CV

Kích thước cỡ chữ, font chữ trong mẫu CV IT tiếng Việt cũng là một yếu tố quan trọng. Đừng để font chữ quả to hoặc quá nhỏ. Cần lưu ý đến khoảng cách lề trang sao cho nhất quán. Điều này có ý nghĩa quan trọng vì chi phối trực tiếp đến định dạng bố cục thông tin được trình bày trên mẫu CV IT tiếng việt.

Tips giúp tối ưu việc làm CV Developer hiệu quả nhất

– Điểm lại những yếu tố cốt lõi tạo nên giá trị chính của CV: mục tiêu nghề nghiệp, kỹ năng, trình độ và kinh nghiệm chuyên môn của bạn.

– Phải nhớ: Tính ngắn gọn, súc tích, mạch lạc – dễ hiểu trong mẫu CV IT tiếng việt rất quan trọng. Vì đó tạo nên sức hút cho nhà tuyển dụng từ những ánh nhìn đầu tiên.

– Đừng để CV xin việc dài quá 2 trang .

– Kiểm soát thông tin, không nén quá nhiều thông tin trong CV của bạn. 

Xem thêm các việc làm BrickMate Group tuyển dụng

Nhà tuyển dụng cần nắm bắt nhanh những mô tả về ứng viên. Đó cũng chính là cơ sở họ xem xét tính quyết định đến việc chi tiết hóa nội dung tài liệu của bạn. Do vậy, hãy thật sự chăm chút cho bộ hồ sơ ứng tuyển của mình.

Cách viết mẫu CV free cho Dev với một số vị trí cụ thể

CV IT Administrator cực chuẩn

Thông tin liên hệ

Hãy cung cấp các thông tin về: 

  • Số điện thoại 
  • Email
  • Kênh liên hệ cá nhân (nếu có)

Mục tiêu nghề nghiệp

Mục tiêu này, bạn nên đưa ra các mục tiêu rõ ràng, tránh mơ hồ.

Ví dụ: Tôi nộp đơn vì mục đích: Có cơ hội trải nghiệm và phát triển nghề nghiệp tốt hơn. Tôi muốn làm việc tại … với vị trí IT Administrator và định hướng sắp tới, tôi hy vọng mình sẽ gặp gỡ các đối tác tiềm năng. Đồng thời, mục tiêu lâu dài tôi mong muốn trở thành một Administrator Manager. 

Nếu có thể, bạn hãy khéo kéo đưa vào một số thế mạnh: Một vài điểm nổi trội về bản thân

+ Kinh nghiệm làm việc (đề cập đến số năm kinh nghiệm)

+ Chứng chỉ chuyên ngành/kỹ năng mềm (nên có thông tin xác nhận) 

+ Các kỹ năng liên qua trực tiếp đến vị trí IT Administrator, các nền tảng kiến thức quan trọng từ các chương trình nghiên cứu

Trình độ học vấn

Liệt kê trường đại học hoặc các khoa học gần đây của bạn. Lưu ý, hãy đề cập đến các khóa học liên quan vị trí ứng tuyển. Điều này sẽ giúp CV IT của bạn thu hút hơn. Dù là CV IT tiếng anh hay tiếng việt, bạn cũng đang tạo ra lợi thế cho mình. Các khóa học liên quan về:

  • Quản trị mạng
  • Quản lý bảo mật
  • Thiết kế web
  • Hỗ trợ ứng dụng và hệ thống email

Kinh nghiệm làm việc

Trình bày những kinh nghiệm làm việc tại các công ty trước đó (ghi cụ thể thời gian). Vị trí/chức vụ đảm nhận và các task – nhiệm vụ) cụ thể bạn thực hiện. 

Một số vị trí liên quan nền tảng: System Engineer, IT Excutive, IT Helpdesk,…

Bạn ghi rõ nhiệm vụ nhưng cần đảm bảo không quá dài dòng. Thông qua từng trải nghiệm công việc, nhà tuyển dụng sẽ hiểu rõ hơn về sự định hướng sự nghiệp sắp tới của bạn. Freelancer IT cũng đánh giá kinh nghiệm quan trọng cuộc đua nghề nghiệp của bạn.

Kỹ năng

Liệt kê các kỹ năng bạn có và đánh dấu mức độ thể hiện ở từng kỹ năng. Đây là một số kỹ năng cần có trong CV IT Administrator. Tuy nhiên, bạn vẫn phải đảm đảm độ chân thật với năng lực thực tế.

  • Giao tiếp
  • Kỹ năng tư duy hệ thống/quản lý
  • Teamwork
  • Tin học văn phòng
  • Ngoại ngữ
  • Kỹ năng hỗ trợ dịch vụ

Chứng chỉ, hoạt động, giải thưởng và các sở thích

Đây là phần nội dung bạn sẽ tự linh động về chúng có xuất hiện trong CV IT Administrator của mình hay không? Nếu có các chứng chỉ hoặc các thành tích cá nhân, bạn có thể bổ sung vào CV. Bạn nên cân nhắc và lựa chọn các thông tin có liên quan trước khi đưa chúng vào “tấm vé” tuyển dụng của mình.

IT Programmer –  Mẫu CV free cho Dev đẹp nhất

Tên của bạn (và các thông tin cá nhân)

Ví dụ: Raina Angela Barbie

raina.anbie@gmail.com | 111-xxx-xxx| Texas, NY

Mục tiêu nghề nghiệp

Đây là mục khá quan trọng đối với CV ngành IT của bạn. Nhà tuyển dụng sẽ đánh giá mức độ hoạch định mục tiêu phát triển của bạn. 

Ví dụ: Học hỏi và nâng cao trình độ chuyên môn về lập trình JavaScript, C++. Mong muốn trở thành chuyên gia nghiên cứu các giải pháp phát triển; hỗ trợ và đào tạo các lập trình viên trẻ tuổi.

Kỹ năng

Một số kỹ năng bạn mà IT Programmer CV của bạn có thể cân nhắc lựa chọn là:

  • Tư duy định hướng, làm việc nhóm
  • Đa nhiệm, sáng tạo
  • Phân tích và giải quyết vấn đề
  • Kỹ năng giao tiếp nâng cao (đồng nghiệp, đối tác,…) 
  • Khả năng thích ứng và chịu áp lực

Kỹ năng chuyên sâu

Vị trí này đòi hỏi bạn cần có nhiều kinh nghiệm hơn. Vì thế, quá trình tạo CV IT tiếng anh hoặc tiếng việt cũng chính là cơ hội bạn đánh giá lại các kỹ năng của mình.

Dưới đây là các kỹ năng chuyên sâu mà cần có cho vị trí IT Programmer:

– Hệ thống máy tính: Mac OS X, DOS, Window,…

– Các ngôn ngữ lập trình: React JS, C++, HTML, Python, SharePoint,…

– Cơ sở dữ liệu: MS Access, Oracle 9.x, FileMaker Pro, FoxPro, MySQL

Trình độ học vấn

Do là vị trí đòi hỏi nhiều kinh nghiệm, ngoài việc trình bày nơi học tập (tốt nghiệp Cử nhân…., điểm GPA (nếu muốn đề cập), bạn thể chia ra các phần như:

Các khóa học có liên quan

+ Phát triển phần mềm (Software Development)

+ Coding cơ bản và nâng cao (Coding Basics, Advanced)

+ Quản lý dự án (IT Project Management)

+ An ninh Mạng (Cyber Security)

+ Quản lý bảo trì thiết bị (CMMS)

+ Xử lý sự cố (Troubleshooting)

Và các khóa học khác…

Dự án cộng đồng

Bạn nên trình bày các dự án có gắn liền với việc sử dụng chuyên một hay nhiều cơ sở dữ liệu hoặc các chuyên môn có liên quan. 

Ví dụ sử dụng FileMaker Pro để thiết kế các đơn nộp trực tuyến,…

Giải thưởng danh dự

Nói về các giải thưởng bạn/Team bạn đạt được nếu có.

Kinh nghiệm

Phần này tùy thuộc vào “tuổi nghề” mà bạn sở hữu. Hãy thông minh trong việc trình bày các kinh nghiệm có trong CV IT của mình. Nếu bạn là một freelancer IT, đừng ngần ngại chia sẻ trải nghiệm của mình vào việc làm CV online IT nhé! đơn xin nghỉ việc, kỹ năng giao tiếp

Gợi ý cho bạn là có thể chia sẻ các trải nghiệm theo từng giai đoạn:

– Thực tập sinh – Programmer Intern

– Giai đoạn trình độ được nâng cao và phát triển (có thể chạm đến mức độ là IT Specialist – Chuyên viên)

– Giai đoạn hợp tác và đại diện cho các khách hàng/đối tác lớn (nếu có)

Mỗi giai đoạn, bạn có thể trình bày:

+ Những nhiệm vụ bạn đã thực hiện một cách cụ thể

+ Các thay đổi tích cực qua số liệu

+ Những bài học đúc kết

Chứng chỉ

Liệt kệ ngắn gọn các chứng chỉ khoa học chuyên ngành cùa bạn nếu có.

Ví dụ: C++ Certified Associate Programmer, Java SE 8 Programmer,…

Tham khảo các mẫu CV free cho Dev hấp dẫn nhất 

cv online
M1 – CV đa nhiệm

 

làm cv online
M2 – CV đa nhiệm

làm cv online
M3 – CV đa nhiệm

làm cv online
Mẫu CV cổ điển

làm cv online
Mẫu CV cổ điển

làm cv online
M1 – CV Pro

làm cv online
M2 – CV Pro

làm cv online
M3 – CV Pro


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

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

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