Home Blog Page 149

Tips viết CV trái ngành chinh phục nhà tuyển dụng

CV

“Nghề chọn bạn, bạn không chọn nghề” – Câu nói phản ánh những trải nghiệm thực tế về câu chuyện trái ngành. Ứng tuyển trái ngành dần trở nên phổ biến hơn trên thị tường tuyển dụng. Chính việc này mà nhiều ứng viên trở trở nên thiếu tự tin. Do họ chưa biết cách viết một CV chỉn chu nhất. Đừng vội lo lắng! Trong bài viết sau đây, TopDev sẽ bật mí với bạn những tip giúp CV của mình trở nên nổi bật khi ứng tuyển trái ngành.

Biến “kỹ năng” thành sức mạnh 

Có thể trong một “sân chơi nghề nghiệp” mới, bạn gặp những thiếu sót về kinh nghiệm. Thế nhưng, những kỹ năng mà bạn có lại chính là thứ vũ khí bí mật của bạn. Hãy biến các kỹ năng mà bạn sở hữu, hoàn thiện và phát triển nó để tạo nên sức mạnh.

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

Chẳng hạn, bạn là một sinh khối ngành Xã hội. Công việc bạn sắp apply lại là HR – nghề Nhân sự. Tất nhiên, bạn lo ngại vì lợi thế sẽ dành cho các bạn có chuyên môn tương ứng với lĩnh vực tuyển dụng. Tuy vậy, bạn hãy tự tin vì những điều sau đây:

– Sinh viên các khối ngành Xã hội là nguồn lực quan trọng và tiềm năng mà mọi tổ chức/doanh nghiệp đang muốn khai thác, đồng hành.

– Là một sinh viên khối ngành Xã hội hay Tự nhiên, năng lực tư duy của bạn về các vấn đề rất phát triển.

– Hãy kể ra các kỹ năng bạn rèn luyện thông qua các CLB như: kỹ năng teamwork, giao tiếp, networking, kỹ năng lãnh đạo (leadership), tư duy độc lập, phân tích – phản biện,… 

  Cách thiết lập và duy trì mối quan hệ (networking) hiệu quả
  Kỹ năng giao tiếp? Làm thế nào để cải thiện giao tiếp hiệu quả?

CV

Cơ hội đôi lúc sẽ đến với bạn. Nhưng để thành công, bạn phải tự tạo ra cơ hội cho chính mình. Hãy tập trung làm nổi bật các kỹ năng có liên quan đến vị trí bạn ứng tuyển. Thêm chúng vào CV để gây ấn tượng với nhà tuyển dụng. Một lưu ý nhỏ, không nên quá ôm đồm và cũng đừng bày những gì sai sự thật.

Đừng bỏ quên “Hoạt động ngoại khóa” khi viết CV

Có nhiều ứng viên chưa từng trải nghiệm các công việc cùng vị trí, dẫn đến việc họ buông xuôi. Hoặc thâm chí là tự ti về bản thân mình. Tuy nhiên, bạn cần nhớ rằng những hoạt động ngoại khóa cũng là một phần quan trọng trong việc đánh giá năng lực ứng viên.

CV

Hãy dành cho CV của mình một không gian để mô tã về các hoạt động ngoại khóa của bạn. Một điều bạn cần lưu tâm chính là mọi thứ cần phải có sự chọn lọc. Một ứng viên thông minh sẽ biết mình cần phải làm gì.

Ví dụ: Bạn muốn apply vào vị trí Program Associate nhưng lại chưa có nhiều kinh nghiệm. Tuy nhiên, những trải nghiệm cá nhân của bạn có thể là sự lựa chọn phù hợp cho tình huống này. Bạn là thành viên của ban nào: Ban Chương trình, Ban Tổ chức sự kiện, Ban Đối ngoại,… Dù bạn có thể không thuộc nhóm những ứng viên ưu tiên dựa trên cơ sở củng ngành nghề, nhưng bạn sẽ là nhân tố thú vị. Những mô tả và phân tích ngắn gọn trong CV phần nào đã thể hiện được bạn là ai. Đồng thời, đó là cách bạn bộc lộ dấu ấn về tiềm năng của bạn đối với nhà tuyển dụng

3 bước hoàn hảo cho cuộc cải tiến CV trái ngành

Nếu bạn được chia cho một quân cờ xấu, hãy là một người chơi giỏi!

  Top 5 website giúp thiết kế CV chuẩn format, đủ nội dung

Vậy làm thế nào để trở thành một người chơi giỏi? Bạn hoàn toàn có thể biến những kinh nghiệm không liên quan thành liên quan. Đây được xem là phương pháp hữu ích có thể giúp ghi dấu ấn với các nhà tuyển dụng.

Để thực hiện hiệu quả, bạn hãy theo dõi quá trình gồm 3 bước sau đây:

1. Đọc kỹ bản mô tả công việc (Job Description) 

Hãy quan tâm 2 phần sau: Công việc bạn cần làm và các kỹ năng mà nhà tuyển dụng yêu cầu. Bạn cần nắm kỹ 2 phần này vì trước khi quyết định ứng tuyển. Bắt đầu triển khai những gì mình có tương ứng với các tiêu chí mà nhà tuyển dụng đòi hỏi. Sự phân tích và khả năng chọn lọc rất quan trong ở bước này.

2. Đánh giá lại các công việc một cách có khoa học

Đây là bước cụ thể hóa thông tin và đưa ra sự phân tích của bạn. Thay vì chỉ liệt kê ra những gạch đầu dòng, bạn cần thể hiện sự chi tiết hơn.

Hãy tập trung vào các công việc hằng ngày. Bạn làm gì, làm yêu thích cái gì, bạn làm nó hiệu quả ra sao? Mỗi câu hỏi dù là cách bạn nhận ra những thứ có liên quan mật thiết đến công việc bạn đang ứng tuyển.

CV

Ví dụ, bạn đừng chỉ đơn giản kể ra việc bản thân quản lý các kênh social như Facebook, Instagram, Linkedin,… Cái bạn cần thể hiện là bạn đã lập kế hoạch như thế nào? Như việc bạn seeding vào các group trên nhiều nền tảng, dẫn link về Website công ty,…Đừng ngần ngại mà thể hiện ra những gì bạn từng thực hiện.

3.Viết CV dựa trên mối liên hệ giữa Job Descripstion và Experience.

Lấy một ví dụ cụ thể. Bạn ứng tuyển cho ban Social – Marketing cho vị trí Copywriter.

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

CV

Một trong những task của bạn là tạo và quản lý nội dung cho về một chuyên mục nào đó trên webiste công ty. Kinh nghiệm viết và quản lý có thể bạn còn thiếu sót. Tuy vậy, bạn là ứng viên biết cách phán đoán và đề ra các kế hoạch phát triển nội dung. Điều này lại là một tiêu chí rất quan trọng mà một Copywriter cần có nếu muốn tiến xa hơn trên con đường nghề nghiệp. Hãy mạnh dạn trình bày nó vào chiếc CV của mình để không bỏ lỡ bất cứ cơ hội nào.

Lời kết

Tuyển dụng trái ngành suy cho cùng vẫn là tuyển dụng. Điều quan trọng là bạn ứng biến nó như thế nào để hoàn thiện nội dung chiếc CV một cách tốt nhất. TopDev mong rằng qua bài viết này, bạn sẽ tự tin hơn về những gỉ mình đang sở hữu. Đồng thời, bạn nhận biết được đâu là những thứ phù hợp nhất cần thể hiện trên CV trên hành trình chinh phục các công việc trái chuyên môn của mình. Chúc các bạn thành công! 

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

Xem thêm Top tìm việc ngành it trên TopDev

Hướng dẫn sử dụng Intent trong Android

intent-trong-android

Intent trong Android là những object tin nhắn không đồng bộ mà bạn có thể sử dụng để yêu cầu hành động từ các thành phần Android khác. Bên cạnh đó nó cho phép bạn tương tác với các thành phần từ các ứng dụng tương tự cũng như với các thành phần do các ứng dụng khác đóng góp. Ví dụ: một Activity có thể bắt đầu một Activity bên ngoài để chụp ảnh

intent-trong-android

Intent trong Android là object của class android.content.Intent. Code của bạn có thể gửi Intent đến hệ thống Android với chỉ định thành phần mục tiêu gửi đến. Ví dụ, thông qua startActivity() bạn có thể xác định một Intent sử dụng để gọi chạy một Activity khác. Tại Activity mục tiêu, với  startActivity() bạn có thể xác định được Intent của người gửi đến để khởi động Activity này.

Một Intent trong Android có thể chứa dữ liệu thông qua Bundle. Dữ liệu này có thể được sử dụng bởi các receiving component (thành phần tiếp nhận).

Trong Android, việc tái sử dụng các application component khác được coi là một task. Một ứng dụng có thể truy cập các component Android khác để đạt được một task. Ví dụ: từ một component của ứng dụng, bạn có thể kích hoạt một component khác trong hệ thống Android, component đó sẽ quản lý ảnh, ngay cả khi nó không phải là một phần của ứng dụng đó. Trong component đó, bạn chọn một ảnh và quay lại ứng dụng của bạn để sử dụng ảnh đã chọn.

Một dòng sự kiện đó sẽ được mô tả như sau:

intent-trong-android
Intent được sử dụng để:
  1. Bắt đầu một Activity: startActivity(intent)
  2. Bắt đầu một Activity con
  3. Bắt đầu một dịch vụ (Service): startService(Intent)

Cách bắt đầu một Activity hoặc Service

Để bắt đầu một Activity chúng ta sẽ sử dụng method startActivity(intent). Method này được định nghĩa trên đối tượng ContextActivity mở rộng.

intent-trong-android

Đoạn mã sau minh họa cách bạn có thể bắt đầu một Activity khác thông qua một Intent:

# Start the activity connect to the
# specifiedclass

Intent i = new Intent(this, ActivityTwo.class); startActivity(i);

Các Activity được khởi động bằng các Activity Android khác gọi là sub-Activity.

Còn để khởi động một Service thông qua Intent trong Android ta dùng method startService(Intent)

Tham khảo thêm: Tuyển dụng lập trình Android lương cao tại Topdev

Các loại Intent

Intent trong Android hiện có 2 loại là Intent tường minh (explicit) và Intent không tường minh (implicit).

Một ứng dụng có thể xác định thành phần mục tiêu một cách trực tiếp vào Intent (explicit) mục tiêu được yêu cầu là rõ ràng hoặc yêu cầu hệ thống Android đánh giá các thành phần đã đăng ký trên dữ liệu đích để chọn ra một cái để gửi yêu cầu đến (Intent implicit).

  • Intent tường minh (explicit)

Intent tường minh (Explicit intents): Là những intent chỉ định rõ ràng tên của các thành phần mục tiêu để xử lý; trong đó, trường mục tiêu (tùy chọn) được sét một giá trị cụ thể thông qua các phương thức setComponent() hoặc setClass().

intent-trong-android

Ví dụ khởi tạo Intent:

Intent intent = new Intent(this,GreetingActivity.class);

intent.putExtra("firstName",firstName);
intent.putExtra("lastName", lastName);

this.startActivity(intent);

this.startActivityForResult(intent, MY_REQUEST_CODE);

Hoặc sử dụng Bundle:

// Cách 1.
Intent mIntent = new Intent(this, GreetingActivity.class);
Bundle extras = mIntent.getExtras();
extras.putString("firstName", "<firstName>");
extras.putString("látName", "<lastName>");

// Cách 2.
Intent mIntent2 = new Intent(this, GreetingActivity.class);
Bundle mBundle = new Bundle();
mBundle.putString("firstName", "<firstName>");
mBundle.putString("látName", "<lastName>");
mIntent2.putExtras(mBundle);

// Cách 3:
Intent mIntent3 = new Intent(this, GreetingActivity.class);
mIntent3.putExtra("firstName", "<firstName>");
mIntent3.putExtra("látName", "<lastName>");

Tại Activity:

Intent intent = this.getIntent();

String firstName= intent.getStringExtra("firstName");
String lastName = intent.getStringExtra("lastName");

// Hoặc
Bundle extras = this.getIntent().getExtras();

String firstName1 = extras.getString("firstName");
String lastName2  = extras.getString("lastName");
  • Intent không tường minh (Implicit)

Intent không tường minh (Implicit Intents): Là những intent không chỉ định rõ một mục tiêu thành phần, nhưng bao gồm đầy đủ thông tin cho hệ thống để xác định các thành phần có sẵn là tốt nhất để chạy cho mục đích đó. Hãy xem xét một ứng dụng liệt kê các nhà hàng có sẵn ở gần bạn. Khi bạn bấm vào một tùy chọn nhà hàng cụ thể, ứng dụng sẽ hỏi một ứng dụng khác để hiển thị các tuyến đường đến nhà hàng đó. Để đạt được điều này, nó có thể gửi một ý định rõ ràng trực tiếp đến các ứng dụng Google Maps, hoặc gửi intent implicit, ý định sẽ được chuyển giao cho bất kỳ ứng dụng nào cung cấp các tính năng bản đồ (map)  (chẳng hạn, Yahoo Maps).

intent-trong-android

Ví dụ:

Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.tutlane.com"));
startActivity(intent);

Truyền dữ liệu cho intent explicit và implicit intent

Android hỗ trợ cho intent explicit và intent implicit. Một ứng dụng có thể xác định thành phần đích (target component) trực tiếp trong intent (intent explicit) hoặc yêu cầu hệ thống Android đánh giá các component đã đăng ký dựa trên dữ liệu intent (intent implicit).

Intent explicit sẽ xác định chính xác thành phần sẽ được gọi bởi hệ thống Android, bằng cách sử dụng lớp Java để định danh. Intent explicit thường được sử dụng để kiểm soát ứng dụng. Sau đây là cách tạo một intent explicit và gửi nó đến hệ thống Android để bắt đầu một Activity.

Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo");

Intent implicit chỉ định hành động cần được thực hiện và dữ liệu tùy chọn, cung cấp nội dung cho hành động. Nếu một intent implicit được gửi đến hệ thống Android, nó sẽ tìm kiếm tất cả các component được đăng ký cho hành động cụ thể và kiểu dữ liệu phù hợp. Nếu chỉ tìm thấy một component, Android sẽ khởi động trực tiếp component này. Nếu một số component được hệ thống Android xác định, người dùng sẽ nhận được hộp thoại lựa chọn và có thể quyết định component nào sẽ được sử dụng cho mục đích.

Ví dụ:

Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.vogella.com/"));
startActivity(i);

Xác định bộ nhận intent hợp lệ

Đôi khi bạn muốn xác định xem một component đã đăng ký một intent hay chưa. Ví dụ: bạn muốn kiểm tra xem có sẵn một bộ nhận intent nhất định hay không và trong trường hợp có sẵn một component, bạn bật một chức năng trong ứng dụng của mình.

Việc kiểm tra này có thể được thực hiện thông qua lớp PackageManager.

Đoạn code sau sẽ kiểm tra xem một component có đăng ký một intent nhất định hay không. Xây dựng intent của bạn như bạn mong muốn để kích hoạt nó và chuyển nó đến method sau.

public static boolean isIntentAvailable(Context ctx, Intent intent) {
    final PackageManager mgr = ctx.getPackageManager();
    List<ResolveInfo> list =
        mgr.queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

Dựa trên kết quả, bạn có thể điều chỉnh ứng dụng của mình. Ví dụ: bạn có thể tắt hoặc ẩn các mục menu nhất định.

Các kiểu dữ liệu trong Intent

Qua những kiến thức ở trên bạn đã biết rằng, Intent trong Android có khả năng chuyển dữ liệu qua các Activity. Vậy cách thức hoạt động của quá trình đó như thế nào?

Dữ liệu được truyền vào Intent và lấy ra theo các cặp dữ liệu dạng key/value. Key ở đây là một chuỗi, giúp định danh cho kiểu dữ liệu value. Nếu bạn truyền vào trong Intent cặp dữ liệu key/value nào, thì bạn phải lấy ra bởi đúng cặp key/value đó, chắc chắn khai báo đúng key và lấy ra đúng kiểu của value khi được truyền vào.

Tuy vậy, bạn có thể sử dụng một trong hai hình thức sau. Sử dụng Extra hoặc là Bundle. Thật sự thì khác nhau giữa hai hình thức cũng không quan trọng lắm, chỉ là bạn nên biết cả hai cách và mình sẽ đưa ra chút lời khuyên phân tích trường hợp nào nên sử dụng cách nào ở bên dưới.

Trường hợp dùng Extra

Theo mình truyền nhận dữ liệu bằng Extra là cách đơn giản nhất.

Gửi Dữ Liệu

Bước đầu tiên, để truyền dữ liệu bằng Extra. Sau khi khai báo Intent và trước khi bạn dùng nó để kích hoạt một activity nào đó, bạn có thể sử dụng các phương thức được nạp chồng của nó để gửi dữ liệu. Các phương thức đó có chung một tên là putExtra().

intent-trong-android

Có một điều bạn cần lưu ý là các phương thức putExtra() này không có chữ s ở đằng sau Extra nhé. Extra mà có s thì sẽ dành cho Bundle ở bên dưới.

Với mỗi putExtra() như vậy, tham số đầu tiên sẽ chính là key mà mình nói trên kia. Tham số thứ hai chính là value. Phương thức này được nạp chồng làm nhiều bản để bạn dễ dàng sử dụng từng loại value mà bạn muốn. Tuy nhiên có 2 kiểu value bạn đừng để ý đến là Parcelable và Serializable, hai kiểu này hơi phức tạp một chút, có lẽ lần sau mình sẽ có một bài viết riêng về hai kiểu này khi thích hợp.

Đoạn code sau ví dụ cách để truyền dữ liệu vào Intent bằng Extra.

Intent intent = new Intent(this, ContactActivity.class);
intent.putExtra("Key_1", "Truyền một String");
intent.putExtra("Key_2", 5);
intent.putExtra("Key_3", true);
startActivity(intent);

Nhận Dữ Liệu

Đến bước này, theo như ví dụ trên thì ContactActivity sẽ được kích hoạt với dữ liệu là ba cặp key/value được truyền vào. Ở phương thức onCreate() hoặc bất cứ chỗ nào của ContactActivity, bạn đều có thể lấy bất cứ cặp key/value nào ra dùng. Bằng cách gọi đến getxxxExtra().

intent-trong-android
Các phương thức giúp lấy dữ liệu khỏi Extra

xxx ở đây thì bạn thay thế bằng kiểu dữ liệu phù hợp với key bên “đóng gói”, ví dụ như getBooleanExtra()getStringExtra()getIntExtra(),… Dĩ nhiên tham số name được truyền vào phương thức này phải đúng là key bên “đóng gói” luôn.

Có một số phương thức cần phải có tham số thứ hai, tham số đó chính là dữ liệu mặc định nếu như hệ thống không tìm thấy dữ liệu với key mà bạn đã cung cấp. Việc cung cấp tham số thứ hai này để tránh một số lỗi có thể xảy ra đối với chương trình của chúng ta.

Đoạn code sau sẽ mô phỏng cách lấy dữ liệu ra khỏi Intent bằng Extra ở onCreate() của Activity. Bạn có thể thấy từng cặp key/value khớp với khi bạn đặt dữ liệu vào trên kia.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact);

    Intent intent = getIntent();
    String value1 = intent.getStringExtra("Key_1");
    int value2 = intent.getIntExtra("Key_2", 0);
    boolean value3 = intent.getBooleanExtra("Key_3", false);
}

Trường hợp dùng Bundle

Như mình nói từ đầu, Bundle và Extra không khác gì nhau hết. Nếu như Extra trên kia sẽ “xé lẻ” dữ liệu ra và gửi theo từng dòng. Thì Bundle sẽ giúp bạn “đóng gói” dữ liệu lại và gửi nguyên kiện. Tất nhiên Bundle sẽ tiện hơn trong trường hợp bạn muốn gửi cùng một bộ dữ liệu đến nhiều Activity khác nhau.

Ngoài nhiệm vụ “đóng gói” dữ liệu để truyền qua lại giữa các Activity, thì Bundle còn được dùng trong một số trường hợp khác, ví dụ như truyền dữ liệu qua Fragment mà bạn sẽ được biết ở một bài nào đó trong tương lai 😂. Nên tốt hơn hết là bạn hãy học cách sử dụng Bundle ngay từ bài này nhé.

Gửi Dữ Liệu

Chỉ có phát sinh vài dòng code so với Extra trên kia thôi, đầu tiên là dòng tạo ra Bundle. Sau đó vẫn là các dòng đặt dữ liệu vào Bundle, các dòng này có hơi khác với các dòng đặt dữ liệu vào Extra một chút, nếu với Extra bạn dùng các phương thức nạp chồng với cùng một tên putExtra() thì với Bundle bạn phải dùng đúng phương thức putxxx() với xxx là kiểu dữ liệu bạn cần dùng.

intent-trong-android

Khi Bundle đã chứa đủ dữ liệu, bạn cần phải đặt Bundle này vào trong Intent bằng một dòng code putExtras() (và nhớ là có s nha).

Bạn xem code như sau:

Intent intent = new Intent(this, ContactActivity.class);
Bundle bundle = new Bundle();
bundle.putString("Key_1", "Truyền một String");
bundle.putInt("Key_2", 5);
bundle.putBoolean("Key_3", true);
intent.putExtras(bundle);
startActivity(intent);

Nhận Dữ Liệu

Cũng tương tự như bước gửi thôi, nếu đã gửi theo kiểu Bundle, thì bên nhận cũng sẽ nên nhận theo Bundle trước rồi mới lấy từng dữ liệu ra dùng. Để lấy Bundle ra khỏi Intent thì chúng ta có phương thức getExtras().

Sau khi lấy Bundle ra khỏi Intent, việc tiếp theo sẽ gọi đến các phương thức getxxx() của nó. Các phương thức này của Bundle cũng giống như các phương thức getxxxExtra() của Extra ở trên. Chỉ khác một chỗ getxxx() của Bundle thường có hai phương thức nạp chồng, giúp bạn linh hoạt hơn. Thường thì bạn nên dùng getxxx() với hai tham số, như vậy bạn có thể định nghĩa được giá trị mặc định cho từng phương thức khi mà nó không tìm được dữ liệu từ key mà bạn cung cấp, giúp tránh một số lỗi không cần thiết.

intent-trong-android
Các phương thức giúp lấy dữ liệu khỏi Bundle

Để chắc chắn thì khi nhận dữ liệu với Bundle, bạn nên kiểm tra xem Bundle đó có tồn tại hay không (kiểm tra khác null) trước nhé.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact);  
  
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        String value1 = bundle.getString("Key_1", "");
        int value2 = bundle.getInt("Key_2", 0);
        boolean value3 = bundle.getBoolean("Key_3", false);
    }
}

Bạn vừa xem qua cách thức chuyển dữ liệu qua lại giữa các Activity. Giờ là lúc chúng ta thực hành xây dựng một chút cho TourNote rồi.

Thực Hành Gửi Dữ Liệu Từ MainActivity Qua ContactActivity

Thực ra ContactActivity mà mình muốn hướng đến sẽ chứa hai loại nội dung. Một là thông tin về ứng dụng, hai là thông tin giúp đỡ. Việc phân biệt nội dung nào được hiển thị sẽ dựa vào lựa chọn của người dùng trên menu item của MainActivity. Chính vì vậy chúng ta sẽ xây dựng ContactActivity sao cho có thể nhận được dữ liệu từ MainActivity chuyển qua, dữ liệu này chỉ đơn giản báo cho ContactActivity biết người dùng vừa nhấn chọn About App hay Help.

Bạn đã hiểu yêu cầu của bài thực hành hôm nay rồi đúng không nào. Nên nhớ là chúng ta chỉ nói đến cách thức gửi nhận dữ liệu để ContactActivity hiểu được chuyện gì đang xảy ra thôi nhé, do đó bài này chúng ta chỉ sử dụng Toast để kiểm chứng dữ liệu nhận. Còn việc hiển thị cái gì khi đã nhận dữ liệu thì ở bài sau chúng ta sẽ xây dựng tiếp.

Xây Dựng Các Giá Trị Hằng Số

Bạn đã biết việc sử dụng Extra hay Bundle là việc lưu trữ các dữ liệu dạng key/value rồi chuyển đi và nhận chúng ở nơi khác đúng không nào. Vậy để đảm bảo các key luôn luôn được dùng đúng, chúng ta nên định nghĩa nó là một giá trị tĩnh (static) và hằng (final). Giá trị này nên định nghĩa bên lớp nhận dữ liệu thì tốt hơn về mặt quản lý code (theo ý mình thôi nhé, bạn có thể định nghĩa một lớp chuyên chứa các giá trị key này). Do đó mình thêm các thuộc tính được tô sáng sau vào ContactActivity.

public class ContactActivity extends AppCompatActivity {
 
    public static final String KEY_SHOW_WHAT = "show_what";
    public static final String VALUE_SHOW_ABOUT = "show_about";
    public static final String VALUE_SHOW_HELP = "show_help";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
 
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
}

Gửi Dữ Liệu Từ MainActivity

Dĩ nhiên bên MainActivity, chúng ta chỉnh sửa một tí nơi kích hoạt ContactActivity, sao cho Intent có thể chứa Bundle mà chúng ta muốn như sau.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
 
    switch (item.getItemId()) {
        case R.id.search:
            Toast.makeText(this, "Search button selected", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.about:
            Intent intent = new Intent(this, ContactActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString(ContactActivity.KEY_SHOW_WHAT, ContactActivity.VALUE_SHOW_ABOUT);
            intent.putExtras(bundle);
            startActivity(intent);
            return true;
        case R.id.help:
            intent = new Intent(this, ContactActivity.class);
            bundle = new Bundle();
            bundle.putString(ContactActivity.KEY_SHOW_WHAT, ContactActivity.VALUE_SHOW_HELP);
            intent.putExtras(bundle);
            startActivity(intent);
            return true;
    }
 
    return super.onOptionsItemSelected(item);
}

Nhận Dữ Liệu Ở ContactActivity

Như mình có nói, ContactActivity chỉ nhận dữ liệu rồi dùng Toast để show ra làm bằng chứng là nó đã nhận đúng dữ liệu. Còn việc hiển thị cái gì thì bài học sau chúng ta sẽ nói tiếp nhé. Như vậy code của ContactActivity như sau.

public class ContactActivity extends AppCompatActivity {
 
    public static final String KEY_SHOW_WHAT = "show_what";
    public static final String VALUE_SHOW_ABOUT = "show_about";
    public static final String VALUE_SHOW_HELP = "show_help";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
 
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
 
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            String valueShow = bundle.getString(KEY_SHOW_WHAT, "");
            Toast.makeText(this, "Show value: " + valueShow, Toast.LENGTH_SHORT).show();
        }
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
}

Kết quả là, tùy vào cách người dùng chọn vào menu item mà ContactActivity sẽ hiển thị Toast như sau.

intent-trong-android
Hình ảnh TourNote sau khi thực hành

Kết bài

Như vậy mình đã chia sẻ những kiến thức rất căn bản để có thể hiểu bản chất Intent trong Android cũng như cách chúng truyền dữ liệu cho nhau. Các bạn hãy nhớ rằng Intent là một phần cực kỳ quan trọng. Và nếu như chưa hiểu phần nào thì các bạn hãy comment bên dưới để mình và mọi người cùng hỗ trợ nhé. Chúc anh em sẽ thành công hơn

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

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

Khi nào nút “Cancel” không nên đặt là “Cancel”

Khi nào nút

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

Trong design, nút cancel ngoài cái tên gọi là cancel ra, nó còn 1 vài cái tên gọi khác nữa.「Not Now – Không làm bây giờ」 hay「Maybe Later – Làm lúc khác」 là 1 trong những ví dụ đó.

Nhưng đôi khi có 1 số trường hợp mà nút Cancel không thể đặt là Cancel hay những tên gọi tương tự khác. Vì có thể làm người dùng khó hiểu, hay nói cách khác sẽ khó thể thực hiện được hành động CTA (Call to Action).

  Cách đặt nút "Cancel" trong thiết kế UX tối ưu nhất
  "Muốn đi nhanh phải dựa vào dev, muốn đi nhanh hơn nữa phải dựa vào khách hàng"

Call to Action (CTA): là thuật ngữ viết tắt của call to action trong quảng cáo Google. Chúng được thể hiện thông qua văn bản hoặc hình ảnh nhằm mục đích kêu gọi người xem phải hành động bằng những cú click chuột. Như vậy, hiểu một cách đơn giản, CTA có nhiệm vụ tạo ra tỉ lệ chuyển đổi từ người dùng thành khách hàng tiềm năng.

Vậy chúng ta hãy cùng đi xem những trường hợp nào không nên đặt tên nút là ”Cancel” nhé.

Phòng chống ấn cancel “nhầm”

Ví dụ như có 1 màn hình ”cancel subscription” như bên dưới.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Sự nhầm lẫn của nút cancelNếu như chúng ta đặt 1 cái nút Cancel ở ngay bên trên nút Cancel Subscription thì theo các bạn điều gì sẽ xảy ra?

Như ở cái màn hình bên trái. Có thể dịch đơn giản như sau: Bạn có muốn huỷ subscription không?

  • Nút bên trên là “Huỷ”
  • Nút bên dưới là “Huỷ subscription”

Nếu để 2 nút như này đúng quả thật gây khó hiểu thật. Cả 2 nút đều là “Huỷ”. wtf @@

Vậy nếu đặt 2 nút như này thì có thể gây ra vấn đề gì?

Đó chính là người dùng có thể ấn nhầm vào nút Cancel Subscription ở bên dưới.

Với những ai đang muốn huỷ Subscription thì không sao, nhưng ai không muốn huỷ mà ấn nhầm vào nút **Cancel Subscription **thì quả thực gây thiệt hại cho công ty đúng không nào.

Nếu chúng ta thay nút Cancel bằng nút Not Now hay là Maybe Later thì cũng vẫn gây hiểu nhầm. Bởi vì những nút này có ngụ ý là sẽ không huỷ subscription lúc này mà sẽ huỷ vào lúc khác.

Để giải quyết vấn đề đó thì chúng ta nên thay cái nút Cancel bằng nút Keep Plan – Vẫn giữ nguyên subscription sẽ thân thiện và an toàn với người dùng hơn rất nhiều.

Tên nút không được gây xung đột nhau

Khi nghĩ về 1 tên mà đối lập với ”Cancel” có thể ai trong chúng ta cũng đều nghĩ là ”Do not Cancel”. Nhưng cái tên này không phải là lựa chọn tốt bởi vì nó đang cùng sử dụng từ giống nhau đó là ”Cancel“.

Đây cũng là lí do mà ”Keep Subscription” sẽ không phải sự lựa chọn tốt, mà chúng ta nên đặt là ”Keep Plan“.

Khi mà chúng ta cùng sử dụng 1 từ giống nhau cho 2 button thì có thể làm người dùng nhầm lẫn nút này với nút kia, hay nói cách khác để không bị nhầm lẫn người dùng sẽ bỏ ra khoảng thời gian nào đó để đọc thật kĩ 2 nút đó.

Với UX thì điều đó là không tốt 1 chút nào.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Hơn nữa, ”Do Not Cancel” không phải là từ trái lập với ”Cancel” bởi vì cả 2 từ này đều mang ý nghĩa là phủ định.

Nếu cả 2 nút đều mang nghĩa là phủ định thì khi đó người dùng sẽ xem 2 từ này như là ”Huỷ”, và đây cũng chính là nguyên nhân gây nhầm lẫn.

Từ ”Cancel – Huỷ” nó mang nghĩa phủ định. Nếu mà 1 lúc nhìn vào 2 từ ”Do Not Cancel” và ”Cancel Subscription” thì người dùng có cảm giác khi ấn vào 1 trong 2 nút này thì có thể làm mất đi “1 thứ nào đó”.

Để đặt tên nút an toàn hơn trong trường hợp này, thì từ ”Keep Plan” có lẽ sẽ là giải pháp tốt nhất.

Cancel Subscription Vs. Unsubscribe

Đôi khi chúng ta nghĩ, sử dụng ”Unsubscribe” có thể thay thế cho từ ”Cancel Subscription”. Nhưng các bạn đã nhầm.

2 từ ”Subscription” với ”Subscribe” là 2 từ không thể thay thế cho nhau được. Bởi vì ngữ cảnh sử dụng nó là hoàn toàn khác nhau.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Chắc xem nhiều Youtube chúng ta cũng đều nghe thấy từ ”Subscribe” đúng không nào?

Ý nghĩa của từ ”Subscribe” là muốn nói đến việc người dùng đăng kí theo dõi kênh đó, và sẽ nhận thông báo khi có bài viết mới.

Còn từ ”Subscription” thì sao? Nó lại có ý nghĩa hoàn toàn khác.

Với những ai đăng kí dùng Netflix hay là **Spotify **để nghe nhạc thì cũng biết. Cả 2 dịch vụ này đều tính tiền theo tháng, và chúng ta phải mua thì mới dùng được. Nó có những plan khác nhau.

Nếu chúng ta đăng kí plan và trả tiền theo tháng, cứ đến đầu tháng sẽ bị rút tiền từ thẻ VISA. Cái hành động đó được gọi là ”Subscription“.

Do đó tuỳ vào ngữ cảnh, nếu chúng ta không phân biệt cách sử dụng của 2 từ này 1 cách rõ ràng thì có thể gây nhầm lẫn cho người dùng.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Như ảnh ở bên trên, nếu chúng ta muốn hỏi người dùng là “Có muốn huỷ subscribe kênh hay không?” thì có lẽ câu trả lời tốt nhất vẫn là ”Stay Subscribed” đúng không nào?

Qua đó ta thấy được, để làm rõ hành động của người dùng thì việc đặt tên nút phù hợp với từng ngữ cảnh là điều khá quan trọng.

Nếu sử dụng tên nút không thích hợp sẽ không chỉ làm người dùng nhầm lẫn, mà còn khiến người dùng ”phải bỏ chút thời gian” để hiểu rõ xem nút này có ý nghĩa là gì.

Và còn rất nhiều ví dụ khác nữa cũng khá thú vị. Đặc biệt là Nitendo họ đã làm rất tốt điều này.

Nếu bạn nào biết tiếng nhật có thể tham khảo bài này về Design Nitendo (mình tìm mãi không thấy có bài viết về tiếng anh): Nintendo SwitchのUIはなぜ使い勝手がいいのか!? 全員で体験し、“あたりまえ”を磨く任天堂のもの作り【CEDEC 2018】

Kết luận

Các bạn thấy UX nó quan trọng thế nào với người dùng chưa ak?

Việc đặt tên nút dường như là 1 việc rất nhỏ trong design, thế nhưng nó lại mang lại 1 hiệu quả vô cùng to lớn.

Nếu tên nút đặt thích hợp, người dùng phán đoán nhanh, sẽ là nhân tố kết nối đến CTA (Call to Action) được cao hơn.

Chúc các bạn thành công.

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

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

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

Hiểu về hook useRef của React như thế nào cho đúng

Hiểu về hook useRef của React như thế nào cho đúng

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

Câu nói chào hàng của useState vẫn thường được nghe: thêm state vào trong function component.

  Làm animate siêu đơn giản với hook khi react component mount và unmount
  React hook là gì và lợi ích mà React hook đem lại
const [value, setValue] = React.useState("init value");

Giả dụ tình huống là thế này, bạn làm gì đó mà nó ko liên quan đến UI, không cần re-render, nhưng vẫn muốn giá trị này cố định giữa các lần render? useState có thể cố định giá trị, nhưng ngặt nỗi nó sẽ trigger re-render nếu bị thay đổi

function usePersistentValue(initValue) {
  return React.useState({
    current: initialValue,
  })[0];
}

Vì chúng ta không muốn trigger re-render, nên chỉ trả về giá trị của state (phần tử đầu tiên trong mảng), không trả về hàm để cập nhập nó.

Vẫn còn chưa rõ ràng lắm nhỉ, thí dụ trong trong ứng dụng chúng ta muốn có một giá trị counter tăng lên 1 từng giây, một button đế stop việc đó.

function Counter() {
  const [count, setCount] = React.useState(0);

  let id;

  const clear = () => {
    window.clearInterval(id);
  };

  React.useEffect(() => {
    id = window.setInterval(() => {
      setCount((c) => c + 1);
    }, 1000);

    return clear;
  }, []);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clear}>Stop</button>
    </div>
  );
}

Code này chạy không? Không, lý do? bạn có để ý biến id giữa các lần chạy (render) là khác nhau, nói cách khác bạn không clear được cái interval đã setup.

Việc làm lập trình React lương cao 2 năm KN

Bạn sẽ phải viết lại sử dụng cách usePersistentValue ở trên

function usePersistentValue(initialValue) {
  return React.useState({
    current: initialValue,
  })[0];
}

function Counter() {
  const [count, setCount] = React.useState(0);
  const id = usePersistentValue(null);

  const clearInterval = () => {
    window.clearInterval(id.current);
  };

  React.useEffect(() => {
    id.current = window.setInterval(() => {
      setCount((c) => c + 1);
    }, 1000);

    return clearInterval;
  }, []);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clearInterval}>Stop</button>
    </div>
  );
}

Nói có cảm giác hơi sai trái khi hack như vậy, nhưng nó chạy được.

Tuy nhiên không khuyến khích bạn tự viết như vậy, vì việc cố định giá trị giữa các lần render là nhu cầu khá bình thường nên bạn sẽ được team React làm sẵn cho một API mà xài: useRef

Vẫn là đoạn ứng dụng trên nhưng giờ chúng ta viết lại nó bằng useRef

function Counter() {
  const [count, setCount] = React.useState(0);
  const id = React.useRef(null);

  const clearInterval = () => {
    window.clearInterval(id.current);
  };

  React.useEffect(() => {
    id.current = window.setInterval(() => {
      setCount((c) => c + 1);
    }, 1000);

    return clearInterval;
  }, []);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clearInterval}>Stop</button>
    </div>
  );
}

Công dụng của useRef như đã đề cập, cố định dữ liệu giữa các lần re-render, truy xuất giá trị đó qua thuộc tính current

Một ứng dụng rất phổ biến của useRef là truy xuất đến DOM node. Thí dụ để set focus của input

function Form() {
  const nameRef = React.useRef();
  const emailRef = React.useRef();
  const passwordRef = React.useRef();

  const handleSubmit = (e) => {
    e.preventDefault();

    const name = nameRef.current.value;
    const email = emailRef.current.value;
    const password = passwordRef.current.value;

    console.log(name, email, password);
  };

  return (
    <React.Fragment>
      <label>
        Name:
        <input placeholder="name" type="text" ref={nameRef} />
      </label>
      <label>
        Email:
        <input placeholder="email" type="text" ref={emailRef} />
      </label>
      <label>
        Password:
        <input placeholder="password" type="text" ref={passwordRef} />
      </label>

      <hr />

      <button onClick={() => nameRef.current.focus()}>Focus Name Input</button>
      <button onClick={() => emailRef.current.focus()}>
        Focus Email Input
      </button>
      <button onClick={() => passwordRef.current.focus()}>
        Focus Password Input
      </button>

      <hr />

      <button onClick={handleSubmit}>Submit</button>
    </React.Fragment>
  );
}

Bài viết gốc được đăng tải tại Vui Lập Trình

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

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

Vừa học vừa chơi! Top 15+ game lập trình miễn phí

15 game miễn phí giúp bạn luyện code mỗi ngày

Game không thể dạy bạn mọi thứ cần thiết trong lập trình nhưng lại có thể giúp bạn luyện tập một cách hứng khởi hơn.

Học trực tuyến đã có những bước phát triển đáng kinh ngạc trong vài năm qua, đặc biệt là trong mảng lập trình với những nền tảng có tính tương tác cao như Udacity hay Codecademy. Thế nhưng nếu bạn cần thêm chút động lực “cày” code, hãy thử sức với những trò game lập trình thú vị dưới đây.

Tất nhiên, game không thể dạy bạn mọi thứ cần thiết trong lập trình nhưng lại có thể giúp bạn luyện tập một cách hứng khởi hơn.

Dưới đây là danh sách các game miễn phí và hữu ích như vậy:

1. CodeMonkey

15 game miễn phí giúp bạn luyện code mỗi ngày

CodeMonkey dạy code qua CoffeeScript, một ngôn ngữ lập trình chính thức. Chương trình này sẽ dạy người chơi cách tạo ra một game hoàn chỉnh cho chính mình bằng HTML5. CodeMonkey hướng tới trẻ em nhưng cũng rất thú vị với những người lớn muốn thử sức với lập trình.

2. CodinGame

15 game miễn phí giúp bạn luyện code mỗi ngày

GenK từng có bài giới thiệu chi tiết về trò game giúp người chơi luyện tập tới 25 ngôn ngữ này. Cụ thể, CodinGame cho phép bạn “đấu” JavaScript, Ruby, PHP,… với bạn bè và các game thủ khác. Chính tính tương tác cao đã tạo nên sức hút không nhỏ cho trò game này.

3. CSS Diner

15 game miễn phí giúp bạn luyện code mỗi ngày

CSS Diner giúp bạn học CSS một cách đơn giản qua 32 level chơi. Không chỉ nâng dần độ khó, mỗi level còn giúp bạn đào luyện lại những gì đã học ở level trước.

4. Flexbox Froggy

15 game miễn phí giúp bạn luyện code mỗi ngày

Nếu muốn hiểu hơn về CSS flexbox, hãy thử sức ngay với Flexbox Froggy. Trong quá trình “giải cứu” Froggy và những người bạn trong game, bạn sẽ được hướng dẫn chi tiết về cấu trúc sắp xếp trong flexbox.

Ứng tuyển ngay các vị trí tuyển dụng lập trình Game lương cao trên TopDev

5. Flexbox Defense

15 game miễn phí giúp bạn luyện code mỗi ngày

Flexbox Defense là một phiên bản game khác để luyện tập kỹ năng flexbox. Lần này, bạn sẽ di chuyển các tháp súng vào những vị trí chiến lược có thể đánh bại kẻ thù bằng các kỹ thuật tương tự như trong Flexbox Froggy.

6. CodeCombat

15 game miễn phí giúp bạn luyện code mỗi ngày

CodeCombat hướng tới giáo viên và sinh viên nhưng thực tế bất cứ ai cũng có thể chơi. Tựa game này sẽ giúp bạn học Python, JavaScript, CoffeeScript,… Ở level đầu tiên, bạn sẽ di chuyển nhân vật của mình bằng các lệnh cơ bản theo hướng dẫn.

7. Ruby Warrior

15 game miễn phí giúp bạn luyện code mỗi ngày

Nếu muốn luyện tập Ruby, game Ruby Warrior chính là món ăn dành cho bạn. Các level từ dễ đến khó sẽ giúp bạn hoàn thiện và theo dõi tiến độ phát triển kỹ năng Ruby của mình.

8. Untrusted

15 game miễn phí giúp bạn luyện code mỗi ngày

Untrusted là một cuộc hành trình JavaScript đồ sộ giúp bạn kiểm tra kỹ năng sử dụng JavaScript vào giải quyết vấn đề. Trong game, bạn sẽ dùng các kỹ thuật JavaScript từ cơ bản đến nâng cao để hướng dẫn Dr. Eval đi qua ma trận máy.

9. Code Hunt

15 game miễn phí giúp bạn luyện code mỗi ngày

Code Hunt dạy code Java và C# một cách độc đáo qua việc phân tích các đoạn code và sửa đổi chúng sao cho khớp với nhau.

10. Robocode

15 game miễn phí giúp bạn luyện code mỗi ngày

Với Robocode, bạn sẽ luyện lập trình qua việc xây dựng một robot xe tăng chiến đấu ảo bằng Java và .NET.

11. CheckIO và Empire of Code

15 game miễn phí giúp bạn luyện code mỗi ngày

CheckIO và Empire of Code là hai game chiến lược dạy bạn lập trình Python và JavaScript. Bối cảnh trong Empire of Code sẽ là các màn giao chiến trong không gian, và bạn sẽ phải dùng code để bảo vệ căn cứ của mình, đồng thời chống lại các kẻ thù xung quanh.

  Amanotes - Kẻ viết tiếp giấc mơ game Việt

12. VIM Adventures

15 game miễn phí giúp bạn luyện code mỗi ngày

VIM là công cụ chỉnh sửa văn bản được nhiều lập trình viên sử dụng. Nếu muốn học cách sử dụng VIM thì VIM Adventures chính là bước khởi đầu thú vị. Bạn cũng có thể sử dụng các phím tắt của VIM để điều chuyển hướng đi trong trò chơi thám hiểm này.

13. Cyber Dojo

15 game miễn phí giúp bạn luyện code mỗi ngày

Cyber Dojo đưa ra các bài luyện tập cho hàng chục ngôn ngữ lập trình khác nhau, bao gồm cả Ruby, JavaScript, PHP và Python. Mỗi bài tập sẽ đưa ra một thách thức có kèm theo ví dụ để người chơi biết kết quả khi hoàn thành sẽ ra sao.

14. Evevator Saga

15 game miễn phí giúp bạn luyện code mỗi ngày

Elevator Saga sẽ kiểm tra kỹ năng JavaScript của bạn bằng các thách thức như di chuyển thang máy hay vận chuyển người sao cho hiệu quả nhất. Trò game khởi động bằng nhiệm vụ vận chuyển 15 người trong khoảng thời gian dưới 1 phút.

15. Code Wars

15 game miễn phí giúp bạn luyện code mỗi ngày

Code Wars giúp bạn nâng cao kỹ năng lập trình JavaScript, Swift, PHP, Python, Ruby và Haskell. Bạn sẽ bắt đầu với một bài kiểm tra cơ bản độ hiểu về ngôn ngữ đang muốn luyện tập.

Tham khảo Business Insider

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

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

3 điều lầm tưởng về nghề Nhân sự (HR) 

nhân sự

Người làm nhân sự chỉ để kỷ luật, chỉ để tuyển dụng? Làm nhân sự có thể tự ý lựa chọn, sa thải các nhân viên của mình? Đó là suy nghĩ chung của nhiều người về ngành nhân sự. Tuy nhiên, nó chưa xác đáng. Và thật sự, họ là những người chưa thật sự hiểu về ngành nhân sự. Cùng TopDev tìm hiểu những lầm tưởng mà phần đông người đều áp đặt cho nghề nhân sự nhé! 

Nghề nào cũng có đắng – có ngọt! Người làm Nhân sự cũng có những “nỗi lòng” riêng

Công tác nhân sự tất nhiên sẽ bao gồm nhiệm vụ tuyển dụng. Tuy nhiên, đó chưa phải là tất cả. Nhiều công tác khác cần được thực hiện. Đồng thời, họ phải đảm bảo các ứng viên được chọn đáp ứng đủ các nhu cầu chi tiết trong bản mô tả.

  Nhân sự là gì? Vai trò và các vị trí công việc của HR

nhân sự

Chưa kể, người làm nhân sự sẽ phải đối mặt với nhiều khó khăn:

– Ứng viên “bỏ bom”, viện nhiều lý do để không đến phỏng vấn hoặc đến nhưng rất muộn.

– Chưa có kinh nghiệm làm việc, kỹ năng chuyên mô còn thiếu sót.

– CV sơ sài, thiếu chuyên nghiệp.

– Email gửi thì dùng ngôn từ, văn không phù hợp,…    

  Văn hóa giao tiếp qua Email - Thế nào là chuyên nghiệp?
  Top 5 website giúp thiết kế CV chuẩn format, đủ nội dung

Tùy thuộc vào tính tương ứng về quyền quản lý hoặc được phân công, họ sẽ đảm nhận nhiều nhiệm vụ hơn. Các công việc khác có thể là: nhóm về chế độ lương và phúc lợi (C&B); nhóm công việc hành chính, nhóm đào tạo và phát triển. Rất nhiều nhiệm vụ quan trọng được gói trọn trong 3 từ “nghề tuyển dụng”.

Khi thế giới nhân sự phát triển gắn liền với công nghệ số, ngoài câu chuyện về quản trị con người; sự đồng hành và thăng tiến, việc kết hợp IT và HR được xem là một thách thức lớn. HR cần có những chiến lược phù hợp để đủ sức cạnh tranh trong cuộc tìm kiếm các ứng viên tiềm năng.

Kỷ luật, trừ lương hay sa thải đều do nhân sự (HR)?

Sự quy chụp rất đáng sợ dù trong bất kỳ hoàn cảnh nào.

Thực tế cho thấy rằng nhiều nhân viên sau khi bị “đánh bay” khỏi doanh nghiệp, họ đã lên tiếng rằng chính HR đã ra quyết định sa thải họ. Điều này hoàn toàn sai bởi việc đưa ra quyết định loại ai ra khỏi cuộc chơi nghề nghiệp phải dựa trên các tổng hợp về đánh giá, thảo luận từ nhiều phía.

Xem thêm: 5 “quả bom nổ chậm” có thể đánh bay sự nghiệp bất cứ lúc nào

nhân sự

HR luôn tự nhận thức được mình luôn được gán cho một vai phản diện trong “vở kịch” mang tên “tái cơ cấu hay cắt giảm biên chế”. 

Tùy thuộc vào quy mô, văn hóa từng doanh nghiệp mà sự sàng lọc định kỳ thông qua các giá sẽ có độ khắc nghiệt khác nhau. Chính điều đó tạo nên sự sàng lọc định kỳ. Và tất nhiên, những cá nhân không còn đủ sự phù hợp phải “được” rời đi. 

Chẳng một nhà lãnh đạo nào đuổi nhân viên của mình vì cảm tính, vì sự thúc giục cả. Và dù nếu có, doanh nghiệp đó chẳng thể nào tồn tại được lâu. Hơn hết, khi bị sa thải, bạn cần nhìn nhận về bản thân để rồi thay đổi, nỗ lực để hoàn thiện mình hơn thay vì cứ ngồi ngẫm và suy diễn những chuyện không đâu.

Kỷ luật, trừ lương hay sa thải đều là hình phạt cho những biểu hiện thiếu tích cực của bạn. HR chịu trách nhiệm quản lý và cũng chỉ đưa ra những nhận xét cơ bản. Nhà lãnh đạo sẽ là  người có cái nhìn sâu sắc hơn để đưa ra một quyết định đúng đắn nhất.

Nhân sự chỉ đứng về phía sếp?

Có thể thấy rằng, HR phải chịu những ánh mắt dè bỉu khi bi đánh giá là chỉ đứng về phía sếp. Tuy vậy, ít ai biết rằng HR đã phải tranh luận với sếp để bảo vệ quyền lợi cho các nhân viên nếu nhận thấy điều gì chưa thỏa đáng.

Xem thêm: 3 điều quan trọng cần nắm về tương lai của ngành Nhân sự

nhân sự

HR họ luôn cho rằng khi đồng hành trong công tác phát triển nguồn nhân lực, điều họ cần làm là cố gắng đảm bảo những quyền lợi cơ bản cho nhân viên một cách tốt nhất.

Người ta từng ví von rằng người làm nhân sự như là “làm dâu trăm họ”. Chính vì thế, họ cần phải khéo léo và tinh tế trong việc lắng nghe; tiếp thu những kiến thức. Có thể họ chưa nhận được sự thấu hiểu của các nhân viên. Thậm chí còn bị nhân viên đặt điều phê phán. Thế nhưng, họ không cần nhận nhân được sự ủng hộ từ nhân viên. Mong muốn họ đon giản chỉ là hoàn thành tốt nhiệm vụ của mình. 

Lời kết

Nghề nhân sự có nhiều góc khuất chưa được bật mí. Nơi đó có những câu chuyện thú vị và cũng lắm nỗi niềm riêng. Do vậy, HR đều là những người thật sự bản lĩnh trong cuộc sống. TopDev mong rằng đó sẽ là động lực lớn để họ tiếp tục theo đuổi, phát triển bản thân nhiều hơn trên con đường sự nghiệp.


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

Markdown là gì? Cách sử dụng Markdown

markdown

Trong bài viết này TopDev xin gửi đến các bạn một số cách sử dụng Markdown thông dụng, nhưng trước tiên chúng ta cần nắm rõ định nghĩa Markdown là gì để có thể có một cái nhìn khách quan hơn cho loại ngôn ngữ lâu đời này.

Markdown là gì?

markdown

Markdown là ngôn ngữ đánh dấu văn bản đã có mặt từ rất lâu, với cú pháp đơn giản, dễ hiểu nên đã được nhiều người biết đến và được sử dụng khá phổ biến. Đây là loại ngôn ngữ đánh dấu văn bản được tạo ra vào năm 2004 bởi John Gruber.

Ngôn ngữ đánh dấu là gì? Ngôn ngữ đánh dấu được hiểu đơn giản là phương pháp làm cho một câu, đoạn văn bản hoặc một ý nào đó trở nên nên khác biệt đối với các đoạn còn lại (có thể là in nghiêng, in đậm…) giúp cho người đọc có thể dễ dàng tìm kiếm và chú ý đến ngay phần được đánh dấu.

Trả lời câu hỏi ‘tại sao nên sử dụng Markdown?’

Lý do thuyết phục nhất để sử dụng Markdown có lẽ là vì nó rất phổ biến, cách sử dụng của nó cũng cực kỳ đơn giảntiện dụng. Nếu có thể sử dụng một phương pháp đỡ rắc rối hơn HTML và thuận tiện hơn các các trình soạn thảo WYSIWYG (What You See Is What You Get) như MS Word, CKEditor… thì tại sao lại không chọn Markdown?

Như các bạn đã biết, ngôn ngữ đánh dấu HTML cũng là một trong những ngôn ngữ phổ biến và được sử dụng rất nhiều, tuy nhiên, có nhiều ý kiến cho rằng cú pháp của HTML không mấy thân thiện với người dùng và kể cả khi bạn là người có kiến thức, hiểu biết về nó thì cú pháp của nó vẫn mang đến sự “rối mắt” cho bạn.

Ngoài ra, bạn vẫn có thể sử dụng Markdown thuần thục ngay cả khi bạn không có tí kiến thức nào về HTML

Cách sử dụng Markdown

markdown

Dùng cho Heading

Sử dụng # trước tiêu đề để đánh dấu Heading, số kí tự # sẽ tương ứng với các cấp Heading khác nhau từ 1 đến 6.

# Heading 1
# Heading1 #

Hiển thị: Heading 1

## Heading 2
## Heading ##

Hiển thị: Heading 2

### Heading 3
### Heading 3 ###

Hiển thị: Heading 3

#### Heading 4
#### Heading 4 ####

Hiển thị: Heading 4

##### Heading 5
##### Heading 5#####
Hiển thị: Heading 5
###### Heading 6
###### Heading 6 ######
Hiển thị: Heading 6

Dùng cho Bold và Italic

Sử dụng ** ở đầu (hoặc đầu và cuối câu) nếu muốn bôi đậm câu đó.

Tạo chữ Bold

**TopDev việc làm IT hàng đầu**

Hiển thị: TopDev việc làm IT hàng đầu

Tạo chữ Italic

Sử dụng _ ở đầu hoặc * (hoặc đầu và cuối câu) nếu muốn in nghiêng câu đó.

_TopDev việc làm IT hàng đầu_

Hiển thị: TopDev việc làm IT hàng đầu

Tạo chữ Blod & Italic:

Sử dụng **_ ở đầu (**_ đầu và _**cuối câu) hoặc *** nếu muốn bôi đậm và in nghiêng câu đó.

**_TopDev việc làm IT hàng đầu_**

Hiển thị: TopDev việc làm IT hàng đầu

Dùng cho Strikethrough

Sử dụng ~~ ở đầu (hoặc đầu và cuối câu) nếu muốn gạch ngang giữa chữ của câu đó.

~~TopDev việc làm IT hàng đầu~~

Hiển thị: TopDev việc làm IT hàng đầu

Dùng cho chèn Link

Sử dụng cú pháp []() để chèn link trong bài viết, ở đó nội dung trong [] sẽ là thẻ alt text, và nội dung trong () sẽ là đường link mà bạn muốn điều hướng đến.

[TopDev](https://topdev.vn)

Hiển thị: TopDev

  Kiến thức về "Lazy-loading images" mà bạn cần biết

Dùng cho chèn Image

Sử dụng cú pháp ![]() để chèn link trong bài viết, ở đó nội dung trong [] sẽ là thẻ alt text, và nội dung trong () sẽ là địa chỉ ảnh mà bạn muốn người đọc nhìn thấy.

![topdev](https://topdev.vn)

Dùng cho chèn Code

Code theo từ hoặc cụm từ

Sử dụng ` hoặc ``` ở đầu và cuối câu nếu muốn định dạng câu đó ở dạng code.

`TopDev việc làm IT hàng đầu`

Hiển thị: TopDev việc làm IT hàng đầu

Code theo đoạn/khối

Sử dụng 4 khoảng trắng ở đầu câu      nếu muốn định dạng cả đoạn đó ở dạng code.

    </style>
    <body>
        <div>TopDev tuyen dung IT hang dau.</div>
        <div class="relative">TopDev tuyen dung IT hang dau.</div>
        <div>TopDev tuyen dung IT hang dau.</div>
    </body>

Hiển thị:

</style>
<body>
    <div>TopDev tuyen dung IT hang dau.</div>
    <div class="relative">TopDev tuyen dung IT hang dau.</div>
    <div>TopDev tuyen dung IT hang dau.</div>
</body>

Dùng cho List

Sử dụng - hoặc * hoặc + nếu muốn định dạng câu đó ở dạng list.Trong trường hợp muốn tạo thêm lớp level thấp hơn thì thêm 2 khoảng trắng vào nữa.

- TopDev việc làm IT hàng đầu
  - Cộng sự đắc lực hỗ trợ doanh nghiệp tuyển dụng
  - Người bạn đồng hành giúp các Developer tìm được công việc mơ ước

Hiển thị:

  • TopDev tuyển dụng IT hàng đầu
  • Cộng sự đắc lực hỗ trợ doanh nghiệp tuyển dụng
  • Người bạn đồng hành giúp các Developer tìm được công việc mơ ước

Dùng cho Blockquote

Sử dụng > nếu muốn định dạng câu đó ở dạng quote.

> TopDev việc làm IT hàng đầu

Hiển thị:

markdown

Tạo bảng

Sử dụng theo mẫu dưới đây để tạo bảng

| Letter | Next Letter | Previous Letter | 
| :----- | :---------- | :-------------- | 
| B      | C           | A               | 
| E      | F           | D               | 
| H      | I           | G               | 
| T      | U           | S               |

Hiển thị:

Letter Next letter Previous letter
B C A
E F D
H I G
T U S

Lời kết

Có vô vàn lý do để người dùng sử dụng Markdown, nhưng chắc hẳn rằng lý do ‘vì nó tiện dụng’ sẽ là lý do được nhắc đến nhiều nhất. Việc ngôn ngữ Markdown được thiết kế với cú pháp tiện lợi, tiết kiệm thời gian như thế này không những làm hài lòng các Coder mà còn có cả những người dùng ngoài ngành khác, miễn là họ có để nhớ đến các cú pháp đơn giản được TopDev giới thiệu ở trên!

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

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

Lập trình hướng đối tượng (OOPs) trong Java

Lập trình hướng đối tượng (OOPs) trong java

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

Khái niệm về lập trình hướng đối tượng trong java

Lập trình hướng đối tượng (Object Oriented Programing – OOP) là một phương pháp để thiết kế một chương trình bởi sử dụng các lớp và các đối tượng.

Java là một ngôn ngữ lập trình hướng đối tượng vì vậy nó cũng hỗ trợ các đặc tính của lập trình hướng đối tượng:

  • Đa hình (Polymorphism)
  • Thừa kế (Inheritance)
  • Đóng gói (Encapsulation)
  • Trừu tượng (Abstraction)

Tuyển dụng lập trình viên Java

Đối tượng (object)

Đối tượng là một thực thể có trạng thái và hành vi. Nó có thể mang tính vật lý hoặc logic.

Nếu chúng ta xem xét thực tế chúng ta có thể tìm thấy nhiều đồ vật xung quanh chúng ta: cái bàn, con chó, con người, v.v… Tất cả các đối tượng này đều có thuộc tính và hành vi.

Nếu chúng ta xem xét một con chó, thuộc tính của nó sẽ là – tên, giống, màu sắc, và các hành vi là: sủa, chạy, ăn, … Nếu bạn so sánh các đối tượng trong phần mềm với một đối tượng trong thế giới thực, chúng sẽ có đặc điểm rất giống nhau: thuộc tính đối tượng trong phần mềm được lưu trữ trong trường (field) và hành vi được lưu trữ trong phương thức (method).

Lớp (Class)

Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp.

Khai báo lớp

Cú pháp:

<Phạm vi truy cập> class <Tên lớp> {      // Khai báo thuộc tính (field) hay biến     <Phạm vi truy cập> <kiểu dữ liệu> <field_1>;      <Phạm vi truy cập> <kiểu dữ liệu> <field_2>;      // Hàm khởi tạo không có tham số     <Phạm vi truy cập> <Tên lớp>(){         // Khởi tạo dữ liệu     }     // Hàm khởi tạo có tham số     <Phạm vi truy cập> <Tên lớp>(<Kiểu dữ liệu> <tên biến>[, <Kiểu dữ liệu> <tên biến>]){         // Khởi tạo dữ liệu     }     // Phương thức xử lý (method)     <Kiểu trả về> method_1() {         // Logic xử lý      }     <Phạm vi truy cập> <Kiểu trả về> method_2(<Kiểu dữ liệu> <tên biến>) {         // Logic xử lý      } }

Trong đó:

  • class: là từ khóa để khai báo lớp trong Java.
  • Tên lớp: là tên chúng ta đặt cho lớp (quy tắc đặt tên: viết hoa mỗi chữ cái đầu).
  • field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp (quy tắc đặt tên: chữ cái đầu tiên viết thường, các chữ cái đầu tiên tiếp theo viết hoa).
  • Hàm khởi tạo (constructor): hàm dùng để khởi tạo đối tượng lớp.
  • method_1, method_2: là các phương thức thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.

Ví dụ:

  • Tạo lớp Student.
  • Có 2 thuộc tính id và name.
  • Tạo hàm khởi tạo có tham số là id.
  • Cung cấp 3 phương thức: lấy id, lấy name và gán giá trị name
public class Student {
   // Khai báo thuộc tính
   private int id; 
   private String name;

   // Hàm khởi tạo có 1 tham số là id
   public Student(int id) {
     // Sử dụng từ khóa this để truy cập thuộc tính trong lớp
     // nếu không sử dụng từ khóa this thì đang truy cập vào tham số của hàm khởi tạo
     this.id = id;
   }

   // Cung cấp phương thức lấy giá trị id
   public int getId() {
     return id;
   }

   // Cung cấp phương thức lấy giá trị name
   public String getName() {
     return name;
   }

   // Cung cấp phương thức gán giá trị name
   public void setName(String name) {
     this.name = name;
   }
}

Lưu ý:

  • Trong ví dụ trên từ khóa this nhằm chỉ đến chính lớp đang được tham chiếu đến. this.name sẽ tham chiếu đến thuộc tính name của class Student.
  • Các phương thức (method) dùng để gán giá trị của một thuộc tính (field) nên bắt đầu là set.
  • Các phương thức (method) dùng để lấy giá trị của một thuộc tính (field) nên bắt đầu là get.

Sử dụng lớp

Cú pháp:

<Tên lớp> <tên đối tượng> = new <Tên lớp>(<giá trị tham số nếu có>); <tên đối tượng>.<tên thuộc tính>; <tên đối tượng>.<tên phương thức>(<giá trị tham số nếu có>);

Sử dụng từ khóa new để khởi tạo một đối tượng của một lớp.

Ví dụ:

Student student = new Student(1);
student.setName("gpcoder");
System.out.println("Id=" + student.getId());
System.out.println("Name=" + student.getName());

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

Đối tượng Lớp
Đối tượng là thể hiện của 1 lớp. Lớp là một khuân mẫu hay thiết kế để tạo ra các đối tượng.
Đối tượng là 1 thực thể trong thế giới thực như Con mèo (Cat), con chó (Dog), … Lớp là một nhóm các đối tượng tương tự nhau. Ví dụ: Lớp động vật (Animal).
Đối tượng là 1 thực thể vật lý Lớp là 1 thực thể logic
Đối tượng được tạo ra chủ yếu từ từ khóa new.
Ví dụ: Student s1=new Student();
Lớp được khai báo bằng việc sử dụng từ khóa class.
Ví dụ: class Student{}
Đối tượng có thể được tạo nhiều lần. Lớp được khai báo 1 lần duy nhất.
Đối tượng được cấp bộ nhớ khi nó được tạo ra. Lớp không được cấp bộ nhớ khi nó được tạo ra.
Có rất nhiều cách để tạo ra đối tượng trong java như từ khóa new, phương thức newInstance(), phương thức clone(), phương thức factory và deserialization. Chỉ có một cách để định nghĩa lớp trong java sử dụng từ khoá class.
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  11 mẹo đơn giản để tăng hiệu suất Java cấp tốc

Package

Định nghĩa

Một package (gói) trong java là một nhóm các kiểu tương tự của các lớp, giao diện và các package con .

Package trong java có thể được phân loại theo hai hình thức, package được dựng sẵn và package do người dùng định nghĩa.

Có rất nhiều package được dựng sẵn như java, lang, net, io, util, sql, …

Package do người dùng tự định nghĩa

Cú pháp:

package <tên package cha>[.<tên package con>];

Ví dụ về java package:

package gpcoder; // Package cha
package com.gpcoder; // Package gpcode là con của package com

Lợi thế của việc sử dụng package trong java:

  • Package được sử dụng để phân loại lớp và interface giúp dễ dàng bảo trì.
  • Package cung cấp bảo vể truy cập
  • Package khắc phục được việc đặt trùng tên.

Truy cập package từ package khác

Có 3 cách để truy cập package từ package bên ngoài:

  • Khai báo import package.*; tránh sử dụng cách này, không xác định sẽ sử dụng class nào, có thể gặp vấn đề trùng tên lớp nếu cả 2 package import package.* giống nhau. Ví dụ: sử dụng class Date có thể gặp lỗi biên dịch do không thể xác định chính xác sử dụng class Date của package nào nếu import cả 2 package java.util và java.sql.
package com.gpcoder.oop;

import java.util.Calendar;
import java.util.*;
import java.sql.*;

import com.gpcoder.service.*;

public class PackageDemo {

   public static void main(String[] args) {
     java.util.Date d = Calendar.getInstance().getTime();
   }

}
  • Khai báo import package.ClassName; nên sử dụng cách này để giữ code đơn giản, rõ ràng, tái sử dụng lại nhiều chỗ, hạn chế xung đột về tên.
  • Sử dụng tên đầy đủ: tránh sử dụng cách này, do code trở nên dài dòng nếu package gồm nhiều cấp cha, con.

Ví dụ: một project có package như sau

Lập trình hướng đối tượng (OOPs) trong java

Class CommonService cung cấp 2 phương thức method1 và method2.

Chúng ta có thể sử dụng method1 từ một class khác ngoài package com.gpcoder.service như sau:

  • Khai báo import com.gpcoder.service.*;
package com.gpcoder.oop; import com.gpcoder.service.*; public class PackageDemo {     public static void main(String[] args) {         CommonService service = new CommonService();         service.method1();     }
}
  • Khai báo import com.gpcoder.service.CommonService;
package com.gpcoder.oop; import com.gpcoder.service.CommonService; public class PackageDemo {
     public static void main(String[] args) {         CommonService service = new CommonService();         service.method1();     }
 }
  • Sử dụng tên đầy đủ: import com.gpcoder.service.CommonService;
package com.gpcoder.oop;

public class PackageDemo {

   public static void main(String[] args) {
     com.gpcoder.service.CommonService service = new com.gpcoder.service.CommonService();
     service.method1();
   }

}

Lưu ý

  • Nếu bạn import một package thì package con của package đó không được import.
  • Thứ tự của chương trình phải là khai báo package -> import -> class.
  • Khi sử dụng một class của package này ở package khác nên sử dụng ở dạng import package.ClassName
  • Mỗi package tương ứng với một thư mục được. Như ví dụ trên thì cấu trúc thư mục ứng với package com.gpcoder.service được tạo ra như sau:

Lập trình hướng đối tượng (OOPs) trong java

Constructor

Định nghĩa

Constructor trong java là một dạng đặc biệt của phương thức được sử dụng để khởi tạo các đối tượng.

Java Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.

Khai báo của Constructor giống với khải báo của method (phương thức). Nó phải có cùng tên với class (lớp) và không có giá trị trả về.

Có 2 kiểu của constructor:

  • Constructor mặc định (không có tham số truyền vào – default constructors).
  • Constructor tham số (parameterized constructors).

Constructor mặc định trong java

Một constructor mà không có tham số được gọi là constructor mặc định. Constructor mặc định được sử dụng để cung cấp các giá trị mặc định cho các thuộc tính như 0, null, false … , tùy thuộc vào kiểu dữ liệu được sử dụng.

Nếu một lớp không khai báo contructor thì trình biên dịch sẽ tự động tạo một constructor mặc định trong lớp đó.

Cú pháp:

<Phạm vi truy cập> <Tên lớp>(){
// Khởi tạo dữ liệu
}

Ví dụ:

package com.gpcoder.oop;
 public class JavaDefaultConstructor {
     public JavaDefaultConstructor() {
         System.out.println("This is default constructor.");
     }
     public static void main(String[] args) {
         JavaDefaultConstructor obj = new JavaDefaultConstructor();
     }
}

Kết quả khi chạy chương trình trên:

This is default constructor.

Constructor tham số trong java

Một constructor có tham số truyền vào được gọi là constructor tham số. Constructor tham số được sử dụng để cung cấp các giá trị khác nhau cho các đối tượng khác nhau.

<Phạm vi truy cập> <Tên lớp>(<Kiểu dữ liệu> <tên biến>[, <Kiểu dữ liệu> <tên biến>]){
        // Khởi tạo dữ liệu
}

Ví dụ:

package com.gpcoder.oop;
public class JavaParameterizedConstructor {
     private String website;
     public JavaParameterizedConstructor(String website) {
         this.website = website;
         System.out.println("This is parameterized constructor");         System.out.println("from website = " + website);     }
     public static void main(String[] args) {
         JavaParameterizedConstructor obj = new JavaParameterizedConstructor("gpcoder.com");
     }
}

Kết quả:

This is parameterized constructor from website = gpcoder.com

Overloading Constructor trong java

Constructor Overloading là một kỹ thuật trong Java. Bạn có thể tạo nhiều constructor trong cùng một lớp với danh sách tham số truyền vào khác nhau, điều này được gọi là phép đa năng hóa (Overloading). Trình biên dịch phân biệt các constructor này thông qua số lượng và kiểu của các tham số truyền vào.

Ví dụ:

package com.gpcoder.oop;
 public class JavaOverloadingConstructors {
     private String website;
     private String subject;
     public JavaOverloadingConstructors(){
         System.out.println("This is default constructor.");
     }   
      public JavaOverloadingConstructors(String website) {
         this.website = website;
         System.out.println("This is parameterized constructor");
         System.out.println("from website = " + website);
    } 
     public JavaOverloadingConstructors(String website, String subject) {
         this.website = website;
         this.subject = subject;
         System.out.println("This is parameterized constructor");
         System.out.println("from website = " + website);
         System.out.println("with subject = " + subject);
     }
     public static void main(String[] args){
         JavaOverloadingConstructors obj = new JavaOverloadingConstructors();
         System.out.println("---");    
      obj = new JavaOverloadingConstructors("gpcoder.com");           System.out.println("---");
        obj = new JavaOverloadingConstructors("gpcoder.com", "OOP"); 
     } }

Kết quả:

This is default constructor.
---
This is parameterized constructor
from website = gpcoder.com
---
This is parameterized constructor
from website = gpcoder.com
with subject = OOP

Lưu ý

  • Từ khóa this trong java là một biến tham chiếu được sử dụng để tham chiếu tới đối tượng của lớp hiện tại.
  • Từ khóa super trong java là một biến tham chiếu được sử dụng để tham chiếu trực tiếp đến đối tượng của lớp cha gần nhất.

Sự khác nhau giữa constructor và phương thức trong java

Constructor Phương thức
Constructor được sử dụng để khởi tạo trạng thái của một đối tượng. Phương thức được sử dụng để thể hiện hành động của một đối tượng.
Constructor không có kiểu trả về. Phương thức có kiểu trả về.
Trình biên dịch Java tạo ra constructor mặc định nếu bạn không có constructor nào. Phương thức không được tạo ra bởi trình biên dịch Java.
Tên của constructor phải giống tên lớp. Tên phương thức có thể giống hoặc khác tên lớp.

Phạm vi truy cập (Access modifier)

Có hai loại modifier trong java: access modifiers và non-access modifiers.

Các access modifiers trong java xác định độ truy cập (Phạm vi) vào dữ liệu của của các trường (field), phương thức (method), cấu tử (constructor) hoặc lớp (class).

Có 4 kiểu của java access modifiers:

  • private
  • (Mặc định)
  • protected
  • public

Và có một vài non-access modifiers chẳng hạn static, abstract, synchronized, native, volatile, transient, v.v.. Trong tài liệu này chúng ta sẽ học về access modifier.

Bảng mô tả tổng quan về cách sử dụng các access modifier:

Access Modifier Truy cập bên trong class? Truy cập bên trong package? Truy cập bên ngoài package bởi class con? Truy cập bên ngoài class và không thuộc class con?
private Y
Default Y Y
protected Y Y Y
public Y Y Y Y

Tài liệu tham khảo:

  • https://www.javatpoint.com/java-oops-concepts
  • https://www.tutorialspoint.com/java/java_packages.htm

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

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

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

Tại sao lập trình viên thường ế?

Tại sao lập trình viên thường ế?

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

Môi trường làm việc ngành IT thừa nam thiếu nữ

Đối với ngành IT thì các bạn cũng biết rõ là môi trường làm việc đồng nghiệp nam sẽ nhiều hơn nữ, đối với team mình hiện giờ thì số lượng thành viên trên 30 người nhưng chỉ có 2 3 bạn nữ thôi. Việc tìm được người tình trong mộng thật sự rất khó khăn phải không chưa tính tới việc phải cạnh tranh với các con đực còn lại để giành được bạn tình nữa nhé.

Tại sao lập trình viên thường ế?

Dev không khéo trong việc ăn nói

Dân kỹ thuật thì mọi người cũng đã quá hiểu là rất kiệm lời, không giỏi trong việc ăn nói và giải thích cảm xúc như các bạn ở những ngành đòi hỏi việc giao lưu và kỹ năng ăn nói tốt khác. Nên sẽ fail trong vòng gửi xe khi mở miệng ra cua gái dưới đây là 1 đoạn tin nhắn quen thuộc khi lập trình viên cua gái:

                 “Sáng ấm em nha,

                  Em ăn cơm chưa,

                  Em buồn ngủ chưa,

                  Anh làm việc tí đã,

                  Em ngủ ngon”

Mà đáng tiếc thay là “Con trai yêu bằng mắt, con gái yêu bằng tai” các anh chàng của chúng ta lại không khéo trong việc ăn nói nên chẳng có lời nào ngọt ngào nghe vừa tai phái đẹp thế là lại ế.

Dev Hướng nội, thiên về logic hơn thiên về cảm xúc

Nguyên nhân ế của các lập trình viên cũng từ tính cách quá hướng nội, thích thì nói thích, yêu thì nói yêu không đâu cứ giữ trong lòng đó để rồi bỏ mất cơ hội có được người đẹp.

Lập trình viên hay gọi 1 cách thân mật hơn là các dev (developer) chúng ta hay giấu những tâm sự cho riêng mình chứ ít khi bày tỏ ra được hết nỗi lòng mình.

Các bạn nữ thì đang tìm các anh chàng soái ca như trong phim Hàn còn các dev thì khô cứng thấy mà chán.

Với sức chịu đựng của các dev cực kỳ cao thế nên có buồn chàng dev cũng không nói ra đâu, có câu an ủi này “các dev chúng ta không cô đơn, chúng ta có máy tính bên cạnh rồi phải không”

Tại sao lập trình viên thường ế?

Các dev khá bận rộn

Chúng ta là những người đam mê và ham học hỏi những kiến thức mới, những công nghệ mới, ngoài giờ làm việc các dev thường phải nghiên cứu và mày mò thêm để có thể cập nhật đủ lượng kiến thức phòng thân vì công nghệ cứ thay đổi từng ngày từng ngày nếu chúng ta ngưng học hỏi, chúng ta sẽ dậm chân tại chỗ và bị vùi chôn bởi thứ gọi là công nghệ.

Áp lực từ công việc deadline tới liên tục có khi các dev phải làm việc OT để kịp thời hạn delivery cho khách hàng, khi đã delivery cho khách hàng rồi nếu có lỗi (bug) thì các dev phải fix nó bất chấp là ở công ty, trên xe bus, hay ở nhà, hoặc kể cả trong nhà vệ sinh.

Vì cái gọi là tương lại mà thời gian nắm chuột nhiều hơn là nắm tay em người yêu đi chơi, đi ăn, đi làm mấy trò yêu đương nên là rất thiệt thòi cho các em ấy.

Tại sao lập trình viên thường ế?

  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết
  Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên

Kiến thức xã hội thiếu thốn.

Tuy các dev rất thông minh, giải quyết vấn đề logic rất nhanh nhạy nhưng do chỉ ngồi ở nhà code và học ít khi ra ngoài xã hội trải sự đời nên thường các dev kinh nghiệm thực chiến bên ngoài xã hội sẽ yếu hơn các bạn khác.

Dev có phong cách giản dị và tinh gọn

Các chàng trai khác thì quần áo tóc tai đủ kiểu nhưng các chàng dev thì quá đơn giản không cầu kì trong phong cách ăn mặt, ít chải chuốt. Người đẹp vì lụa mà đúng không các trai dev tuy cũng có nét đẹp riêng của mình nhưng lại không lọt vào mắt của phải đẹp.

Tạm kết:

Khi chúng ta biết chúng ta thiếu gì thì hãy sửa đổi, thiếu muối thì tắm biển để mặn mòi từ da dẻ. Cô đơn thì tìm gấu và nhớ thay đổi và hoàn thiện bản thân mỗi ngày nhé các bạn.

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

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

Đào tạo (Training) – Đâu là thời điểm bạn cần trải nghiệm?

đào tạo
đào tạo

Để thành công, bạn cần quan tâm đến việc tự thúc đẩy, phát triển những kỹ năng. Trong  quá trình đó, Training, Coaching, Mentoring là ba điều các bạn cần quan tâm nhất. Cả 3 đều được phát sinh từ nhu cầu muốn trải nghiệm của mỗi cá nhân. Với bài viết hôm nay, TopDev phân tích về thời điểm lý tưởng nhất để bạn bắt đầu training cũng như những tip để quá trình training đạt hiệu quả nhất.

Training là gì? Đâu là thời điểm thích hợp dành cho bạn?

Training là gì?

training

Traning (sự đào tạo) là một hình thức cung cấp các kiến thức chuyên môn, liên ngành, kỹ năng mềm,… trong một thời hạn nhất định

Training chú trọng đến việc nâng cao mức độ am hiểu về một lĩnh vực hay nhiệm vụ của công việc đặc thù nào đó. Dựa trên các cơ sở về mức độ phức tạp của mỗi khóa học; khả năng tiếp thu của mỗi nhân viên; trình độ của người đào tạo, quá trình training có thể diễn ra trong khoảng thời gian khác nhau.

Hãy bắt đầu từ nhu cầu Training của bạn!

Tuỳ thuộc vào mục tiêu, định hướng và điều kiện của bạn, việc training sẽ hiệu quả hơn. Và nếu bạn đã sẵn sàng, bạn có thể bắt đầu bất cứ lúc nào.

  Bí mật giúp tạo động lực và tăng năng suất cho nhân viên!
  Khám phá phong cách hợp tác của bạn

training

Nhu cầu training sẽ được đáp ứng khi bản thân bạn mong muốn mình được học hỏi, phát triển thêm. Bạn cần được đào tạo hiểu chuyên sâu một vấn đề nào đó. Hoặc đơn giản, bạn cần update lại các kiến thức một cách bài bản hơn. Từ đó, bạn có những nền tảng vững chắc. Điều này giúp bạn đảm bảo các vấn đề được thu nhận và truyền tải một cách khoa học.

Lựa chọn Trainer phù hợp với bạn

Một Trainer phù hợp sẽ thúc đẩy bạn phát triển những định hướng tốt hơn. 

Thông thường, việc lựa chọn Trainer giỏi sẽ phụ thuộc vào 2 tiêu chí:

  • Khả năng sáng tạo các khóa học.
  • Khả năng đứng lớp.

Xem thêm: 4 cách thúc đẩy sự phát triển nhân viên tại công ty

training

Tuy nhiên, nếu cùng một khóa đào tạo, bạn có thể lựa chọn Trainer dựa vào khả năng  “thực chiến” của họ. Tức là các năng lực khác như giá trị đồng hành, tính hiệu quả từ bài giảng và các chia sẻ thực tế; sự hiểu biết, độ dày kinh nghiệm, tính cách, cảm xúc,.. Tất cả đều là những cơ sở giúp bạn tìm ra một Trainer giỏi. 

Trainer càng có thâm niên, những gì họ sở hữu sẽ rất cần thiết cho bạn. Họ dễ dàng nắm bắt giá trị thực tiễn và đưa chúng vận dụng vào các cơ sở lý thuyết chuyên ngành. Họ biết cách tạo cơ hội cho bạn dễ hình dung về các vấn đề.

Quan trọng hơn hết, họ còn dành sự quan tâm nhiều hơn đối với bạn khi luôn chia sẻ; đưa ra các giải pháp dựa trên kinh nghiệm sống của họ. 

Ngược lại cũng có một số Trainer chỉ cần xem bài giảng người khác thiết kế sẵn rồi dạy lại. Điều này sẽ làm giảm đi tính hiệu quả, sự tương tác các kiến thức. Do vậy mà Trainer mãi chậm dân với lối dẫn dắt cũ, lượng kiến thức cũng dần trở vào quên lãng.

Vận dụng kiến thức từ việc Training

Giá trị thật sự của việc đào tạo không đơn thuần chỉ dừng lại ở việc truyển tải – tiếp thu; dẫn dắt, định hướng – thực hành; mà điều quan trọng, bạn phải cảm nhận được sự thay đổi. Đó là những hiệu quả thực tế từ việc vận dụng các bài học vào công việc, lĩnh vực mà bạn theo đuổi. Điều đó không phải ai cũng có thể làm được. Và đó được xem là một thách thức lớn đấy!

Bạn hiểu gì về giá trị của mô hình Đào tạo -Training?

Đối với doanh nghiệp, việc training sẽ giúp công ty sàng lọc nhân sự, làm căn cứ để đánh giá chất lượng nhân viên thử việc. Từ đó đưa ra quyết định tuyển dụng chính thức. 

Ngoài ra, training còn là cơ sở để các chuyên gia nhân sự đánh giá được mức độ phát triển của từng nhân viên thông qua hiệu suất thực tế được chính nhân viên áp dụng vào công việc sau khóa đào tạo.

Xem thêm: 5 lưu ý để viết đánh giá hiệu suất của bạn

training

Đối với nhân viên, quá trình đào tạo được xem như một cơ hội để bạn thể hiện hết những tiềm năng của mình. Training mang lại cho nhân viên sự trải nghiệm thực tế. Do vậy, họ cần hiểu và chứng minh được thực lực của.

Các hệ giá trị được xem xét dựa trên: khả năng tiếp thu, tính sáng tạo chủ động, sự kết nối với đồng nghề nghiệp,… Chúng đều là những tiêu chí để nhà lãnh đạo cân nhắc việc đào tạo và phát triển bạn nhiều hơn. Hơn hết, training sẽ giúp bạn tự thúc đẩy bản thân phấn đấu để chạm đến gần hơn với sự thăng tiến trong sự nghiệp.

Tại sao khó áp dụng chúng vào thực tế?

Việc học các kỹ năng, kiến thức có thể không quá khó khăn. Tuy vậy, việc hoàn thành khóa học và làm thế nào để áp dụng chúng vào công việc thực tiễn mới là điều quan trọng.

training

Những chia sẻ từ các Trainer đa phần do trải nghiệm thực tế của chính họ. Bản thân họ cũng đã cố gắng xây dựng cách truyền tải sao cho đảm bảo tính cân bằng giữa yếu tố khách quan và cái tôi cá nhân. Tuy vậy, không phải chúng đều là những trải nghiệm tồn tại trong một bối cảnh cụ thể đồng thời được đảm bảo trong một điều kiện khá lý tưởng hay sao?

Thực tế lại hoàn toàn khác và mọi thứ chỉ mang tính tương đối. Không có một quy chuẩn chung để áp dụng chúng vào hoàn cảnh của mỗi người.

Thế nhưng, bạn đừng quá lo lắng. Mỗi cuộc training đều mang đến sự thay đổi lớn về nhận thứcmột ít hành vi nếu bản thân bạn cố gắng thực hành nó. Tất nhiên, bạn cần đảm hiểu rõ về những gì mình được tiếp thu. Vấn đề còn lại chỉ là sự trải nghiệm của bạn. Các giá trị bạn rút ra được sau khóa đào tạo mới chính là tài sản riêng của bạn. 

Lời kết

Việc học tập, trải nghiệm và việc thực hành hiệu quả là hai việc cần phải song hành cùng nhau. Tuy nhiên, bạn đừng quá đặt nặng vấn đề đạt hiệu quả để rồi “đốt cháy giai đoạn”. Mọi thứ cần có thời gian. Điều quan trọng là bạn phải thật cố gắng, sẵn sàng thích nghi. TopDev hi vọng, bạn sẽ có những sự lựa chọn tốt nhất cho quá trình training của mình.

Có thể bạn quan tâm

Xem thêm Top Việc làm ngành it trên TopDev

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Một môi trường phát triển tốt là điều cần thiết cho mọi lập trình viên. Cho dù bạn đang phát triển các ứng dụng web mới nhất hoặc học ngôn ngữ lập trình lần đầu tiên, thì môi trường bạn sử dụng phải thuận tiện và dễ sử dụng.

IDE (Integrated Development Environment) được thiết kế để giúp việc lập trình trở nên dễ dàng hơn cho các nhà phát triển. Hầu hết chúng là các chương trình ngoại tuyến được cài đặt trên ổ cứng của máy tính.

  Bài học cho các Developer sau lỗi bug video từ Facebook
  8 video game giúp bạn lập trình web tốt hơn

Nhiều IDE dựa trên trình duyệt phù hợp để lập trình trên đám mây. Hầu hết các công cụ trong số này có những hạn chế khi so sánh với những đối thủ ngoại tuyến, nhưng chúng đang dần cải thiện theo thời gian. Bất kể bạn định làm gì, đều có một IDE phù hợp cho hầu hết mọi mục đích sử dụng.

1. IDE trực tuyến chuyên nghiệp tốt nhất: AWS Cloud9

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Khi Amazon mua IDE Cloud9 vào năm 2016, nó đã được các nhà phát triển yêu thích. Việc tích hợp đầy đủ với Amazon Web Services khiến nó được cho là nền tảng phát triển trực tuyến mạnh mẽ và có thể mở rộng nhất hiện có. IDE trực tuyến kết hợp trình soạn thảo code với terminal và các công cụ gỡ lỗi mạnh mẽ.

Cloud9 cũng có chế độ lập trình theo cặp tương tự như VS Live Share cho phép lập trình cộng tác từ xa theo nhóm. Nếu cần tạo mẫu nhanh, Cloud9 cung cấp cho bạn quyền truy cập trực tiếp vào những AWS service thông qua hỗ trợ terminal tích hợp.

>>> Xem thêm: Codepen là gì ? Hướng dẫn sử dụng Codepen cơ bản

2. IDE trực tuyến miễn phí tốt nhất: CodeTasty

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

CodeTasty là một IDE đầy đủ tính năng trên đám mây, được thiết lập nhanh chóng và đơn giản.

Tất cả các ngôn ngữ chính đều được hỗ trợ, cùng với linting (kiểm tra lỗi mã nguồn) và transpiling (chuyển mã nguồn từ ngôn ngữ này sang một ngôn ngữ khác, với điều kiện 2 ngôn ngữ có cùng cấp độ trừu tượng hóa) cho Typescript, v.v… Bản thân trình soạn thảo này là một môi trường phát triển ảo hoàn chỉnh với các cửa sổ terminal và đầu ra. CodeTasty là công cụ miễn phí và đầy đủ chức năng. Bên cạnh đó, các tùy chọn trả phí cũng có sẵn cho nhiều tùy chọn dự án và hợp tác nhóm.

3. IDE trực tuyến tốt nhất cho người mới bắt đầu: Codeacademy

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Codecademy kết hợp một IDE trực tuyến với những bài học để dạy lập trình cho mọi đối tượng, từ người mới bắt đầu đến các chuyên gia. Danh mục đa dạng của công cụ này bao gồm các ngôn ngữ phổ biến như Python, JavaScript, CSS, HTML và Ruby.

Bên cạnh việc học ngôn ngữ, Codeacademy cung cấp những khóa học trả phí chuyên sâu Pro và Pro Intensive, được thiết kế để bao quát toàn bộ các môn học. Các khóa học cho chuyên gia về machine learning, phát triển theo hướng kiểm thử (Test Driven Development) và phát triển web front end chỉ là một số trong đó.

4. IDE trực tuyến tốt nhất dành cho nghệ sĩ: p5.js

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Thư viện p5.js dựa trên JavaScript và cung cấp các công cụ để tạo những tác phẩm nghệ thuật tương tác thông qua code. Thay vì cài đặt thư viện và chạy máy chủ cục bộ, trình soạn thảo web p5.js cho phép bạn viết code trực tuyến ngay lập tức.

Cùng với việc tạo ra hình ảnh đẹp mắt, thư viện p5.js mang đến cơ hội tương tác.

5. IDE trực tuyến tốt nhất cho Python: Codevny

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Một IDE Python trực tuyến cần phải nhanh chóng, dễ sử dụng và có một terminal để thử nghiệm. Codenvy cung cấp tất cả những điều này và nhiều thứ khác nữa. Mỗi phiên bản của IDE này là một môi trường phát triển độc lập.

Các gói và mô-đun bổ sung có thể được cài đặt bằng cách sử dụng terminal trực tuyến. Codenvy là một công cụ cộng tác và phát triển mạnh mẽ, mang trong mình tiềm năng của hầu hết các hình thức phát triển hiện đại.

6. IDE trực tuyến tốt nhất cho JavaScript: JSFiddle

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Nếu bạn đang loay hoay với JavaScript, hãy dùng thử JSFiddle, với các dự án mẫu để giúp nhanh chóng đưa ra ý tưởng về ứng dụng web của bạn.

JSFiddle hoàn toàn miễn phí (được hỗ trợ quảng cáo) và được sử dụng bởi những “gã khổng lồ” như Google và Facebook cùng với hàng ngàn nhà phát triển.

7. IDE trực tuyến tốt nhất cho người dùng GitHub: Gitpod

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Mặc dù khái niệm về IDE GitHub ban đầu có vẻ lạ, nhưng lại mang rất nhiều ý nghĩa. Gitpod tồn tại như một cách để chỉnh sửa các file trên GitHub trong trình duyệt. Tiện ích mở rộng trình duyệt thêm một nút vào trang GitHub, khi được nhấp sẽ mở ra một không gian làm việc cho dự án hiện tại.

Việc chỉnh sửa diễn ra trong một IDE dựa trên VS Code. Tính năng so sánh code song song cũng được tích hợp cùng với khả năng nhận xét, rất phù hợp cho việc cộng tác trong một nhóm. Gitpod là một ý tưởng độc đáo và hiện đang trong giai đoạn beta miễn phí.

8. IDE trực tuyến tốt nhất cho Ruby và Ruby on Rails: Repl.it

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Ruby giữ một vị trí đặc biệt trong trái tim của nhiều lập trình viên. Nó rất dễ đọc, súc tích và là xương sống cho nền tảng Ruby on Rails thời thượng. Một IDE trực tuyến cho Ruby nên đơn giản và có tính thẩm mỹ cao. Repl.it có môi trường cho cả Ruby và Ruby on Rails. Đây là nơi hoàn hảo để nâng cao kỹ năng của bạn.

9. IDE trực tuyến tốt nhất dành cho nhà thiết kế: Codepen.io

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Nếu muốn làm những thứ đẹp mắt cho web, Codepen.io là nơi dành cho bạn. IDE hoạt động như một sketchbook cho tất cả các loại phát triển web front end. Một cộng đồng lớn gồm tất cả các cấp độ kỹ năng liên tục đẩy cao giới hạn của những gì có thể đạt được trong trình duyệt.

Bản tin Spark hàng tuần là nơi tập hợp những cây bút tốt nhất trong tuần cùng với podcast Codepen Radio. Bên cạnh cộng đồng của mình, Codepen còn có nhiều tính năng tuyệt vời khác dành cho các lập trình viên và nhà phát triển web.

10. IDE lập trình trực tuyến tốt nhất cho trẻ em: Small Basic

Bắt đầu viết code là điều khó khăn với trẻ em. Small Basic bao gồm một trình soạn thảo trực tuyến thân thiện với trẻ em. Ngôn ngữ có thể đọc được nhưng vẫn gần giống với code thực tế để thực sự mang lại lợi ích.

Thư viện đi kèm bao gồm bản vẽ, đầu vào văn bản, âm thanh và thậm chí một số mạng cơ bản. Tham khảo thêm: Top 5 ngôn ngữ lập trình tốt nhất cho trẻ em hiện nay để biết thêm chi tiết.

11. IDE dựa trên block tốt nhất cho trẻ em: Tynker

Phụ huynh và những đứa trẻ có thể cùng học với nền tảng dựa trên block Tynker. Có nhiều khóa học miễn phí có sẵn để dùng thử dịch vụ, nhưng việc trả tiền thuê bao $7,5 (175.000VND) hàng tháng sẽ giúp bạn có được nhiều thứ hơn. Tynker có một thư viện rộng lớn các khóa học lập trình, game, phần cứng và Minecraft cho những bé từ 7 tuổi trở lên.

12. IDE trực tuyến tốt nhất cho Arduino/IoT: Arduino Web Editor

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Có lẽ không có gì đáng ngạc nhiên, nơi tốt nhất để lập trình cho các bo mạch Arduino trực tuyến là Arduino Web Editor. Mặc dù vẫn còn rất mới, nhưng nó hoạt động giống như IDE ngoại tuyến. Bên cạnh trình chỉnh sửa code, trình quản lý thư viện và trình giám sát nối tiếp cũng có sẵn trong trình duyệt.

Hiện tại, chỉ có hỗ trợ cho các bo mạch Arduino chính thức và một số ít tùy chọn khác, tuy nhiên sẽ có nhiều hỗ trợ hơn trong tương lai. Một lưu ý về IDE này là cần phải tải xuống một chương trình bridge nhỏ để truy cập các cổng USB và upload code.

13. IDE trực tuyến tốt nhất để lập trình phần cứng trực quan: XOD.io

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

XOD là một chương trình trực quan dựa trên node, mã nguồn mở cho các bo mạch Arduino. Mỗi block đại diện cho các thiết bị và cảm biến. Bạn có thể tạo liên kết giữa chúng bằng cách kéo các dòng từ mỗi node.

Thư viện đi kèm với nhiều node cho những mục đích sử dụng khác nhau và bộ sưu tập các node thu gọn thành những node mới để block gọn gàng và dễ đọc.

Thật không may, phiên bản trình duyệt của XOD không hỗ trợ upload lên bo mạch trực tiếp. Tuy nhiên, có một chế độ Simulate sẽ kiểm tra chương trình mà không cần bo mạch kết nối.

Nhiều IDE trong danh sách này có khả năng thực hiện gần như mọi thứ mà một lập trình viên yêu cầu. Tuy nhiên, hầu hết đi kèm với một số hạn chế. Nhiều tùy chọn có chi phí đăng ký và tất cả đều yêu cầu kết nối liên tục với Internet để hoạt động đúng cách.

Các IDE ngoại tuyến có sự tiện lợi khi không yêu cầu kết nối Internet, và nhiều tùy chọn, bao gồm Microsoft Visual Studio hay VS Code, rất mạnh mẽ và miễn phí.

Chúc bạn tìm được lựa chọn phù hợp!

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

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

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

Giải thích mô hình MVC thông qua … cốc trà đá

Giải thích mô hình MVC thông qua … cốc trà đá

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

1. Nếu bạn từng đi uống trà đá, thì bạn đã hiểu được MVC rồi

Model – View – Controller (MVC) là một mô hình thiết kế web hiện đại đã trở nên quá đỗi quen thuộc. Cứ thử bước vào một phòng làm việc của các lập trình viên xem, bạn sẽ bị “dội bom” bởi hàng đống thứ khủng khiếp mà bạn có khi còn chưa từng nghe tên như là Ruby on Rails, Angular hay Django.

Nhìn rộng hơn, logic của mô hình MVC được sử dụng để mô tả quá trình làm web của đại đa số các ngôn ngữ như là PHP, Ruby, Python hay JavaScript.

Nhiều ông lập trình web mà cứ theo kiểu nhìn đời qua kẽ lá. Cứ thử để mấy ông lập trình viên khác nhìn vào code của họ xem, họ sẽ cho ngay một bài thuyết trình dài cả tiếng toàn những giáo điều quen thuộc.

Mà rõ ràng là mấy thứ đấy không thực tế. Trong khi mô hình MVC hiện tại hoàn toàn có thể được giải thích dễ dàng bằng hình thức trà đá vỉa hè. Vậy nên, nếu bạn từng đi ngồi trà đá với bạn bè, thì bạn có thể hiểu được cấu trúc của các ứng dụng web hiện đại rồi đấy.

Giải thích mô hình MVC thông qua … cốc trà đá
  Google AMP là gì ? Cài đặt AMP cho website asp.net mvc
  Mô hình MVC trong php là gì? Hướng dẫn chi tiết

2. Mô hình MVC là gì?

MVC gồm 3 thành phần bao gồm:

  • M là Model: một cấu trúc dữ liệu chắc chắn, chuẩn bị dữ liệu để cung cấp cho Controller
  • V là View: nơi hiển thị dữ liệu cho người dùng theo cách mà người dùng có thể dễ dàng hiểu và tương tác được
  • C là Controller: nhận về lệnh từ người dùng, gửi lệnh đến Model để lấy hay cập nhật dữ liệu, rồi truyền lệnh đến View để cập nhật giao diện hiển thị cho đúng với dữ liệu đã cập nhật

Trên sơ đồ thì nó sẽ như thế này

Giải thích mô hình MVC thông qua … cốc trà đá

Ôi giời lằng nhằng phức tạp quá. Làm cốc trà đá cho hạ nhiệt

Bạn bước vào quán trà đá. Giữa mùa hè, quán nào quán nấy nóng nực đông đúc. Bạn luồn lách qua đám đông để gọi cho bằng được bà chủ quán “cho cháu một cốc trà đá cô ơi”.

Lúc này, bạn là “người dùng” và “cốc trà đá” là “yêu cầu từ phía người dùng”. Đối với bạn, cốc trà đá là thứ đồ uống ưa thích, mát lạnh, quá phù hợp để xua tan cái nóng thủ đô 40 độ C.

Bà chủ quán gật đầu “ô kê em nhớ”. Đối với bà chủ quán, cốc trà đá không chỉ ngon lành mát lạnh, mà còn là một mớ quy trình các bước:

  1. Lấy cái cốc
  2. Cho đá vào
  3. Cho trà vào
  4. Cho thêm nước lọc cho trà loãng bớt
  5. Khuấy đều lên
  6. Đưa cốc trà cho bạn
  7. Thanh toán

Bộ não của bà chủ quán lúc này đóng vai trò Controller. Kể từ thời điểm bạn nói “một cốc trà đá” bằng tiếng Việt và bà chủ quán hiểu được, công việc bắt đầu. Trà đá, nước mía hay cocktail thì cũng như nhau, nhưng nguyên liệu thì hoàn toàn khác biệt. Bà chủ quán chỉ có thể sử dụng những công cụ và nguyên liệu của quán, và những công cụ đó sẽ đóng vai trò Model, bao gồm:

  • Đôi tay của bà chủ
  • Các nguyên liệu pha chế (trà, nước …)
  • Đá lạnh
  • Bia, nước ngọt, thuốc lá…
  • Chanh, sấu, gừng…
  • Các ly cốc để đựng đồ uống

Những nguyên liệu và công cụ này, thông qua một loạt các bước, đã trở thành cốc trà đá mát lạnh đến tay bạn. Cốc trà đá lúc này đóng vai trò “View”. “View” được làm nên từ những công cụ, nguyên liệu trong “Model”, được chế biến và bàn giao tới tay bạn thông qua “Controller” (chính là bộ não của bà chủ quán)

Giải thích mô hình MVC thông qua … cốc trà đá

3. Bài học rút ra là gì?

  • 1 cốc không đủ, bạn muốn gọi cốc nữa? Rõ ràng là bạn không thể hét to vào cái cốc đã hết (chính là “View”) được, bạn phải gọi bà chủ quán “Controller”.

– Thời gian từ lúc bà chủ quán nhận được yêu cầu tới khi làm xong phải tối thiểu nhất có thể. Đó chính là “skinny controller”, có thể hiểu là “controller” nên chứa tối thiểu lượng logic cần xử lý và được quản lý lượng model nhiều nhất có thể. Một bà chủ quán “thiện nghệ” không chỉ ghi nhớ chính xác cách làm, mà còn chuẩn bị đầy đủ công cụ và nguyên liệu để không mất nhiều thời gian tìm kiếm và chế biến.

– Vậy nếu bà chủ quán đưa hết nguyên liệu cho bạn rồi bảo bạn tự pha? Chẳng ai làm thế cả. Do vậy, bạn cần phải để việc xử lý logic trên model nhiều nhất có thể, và tối giản hóa view. Nói cách khác, được phục vụ tận miệng thì vẫn thích hơn là phải đi pha.

Giải thích mô hình MVC thông qua … cốc trà đá
  • Nếu bạn gọi 1 lon bia thì sao? Bà chủ chắc chẳng phải làm gì nhiều, bật nắp lon bia rồi đưa bạn là xong. Nhưng mà rõ ràng bạn vẫn phải gọi bà chủ quán, vì lon bia không thể tự nhảy ra trước mặt bạn được.

4. Quay trở lại vấn đề lập trình web

Giờ thử xem một ứng dụng web hiện đại có quy trình thế nào nhé

– Người dùng tạo ra một yêu cầu thông qua đường dẫn, ví dụ /home

– Controller nhận yêu cầu và đưa ra một mệnh lệnh để xử lý yêu cầu đó. Nếu lệnh thực thi với phần View thì cập nhật lại màn hình hiển thị, với Model thì để trình diễn logic. Giả sử yêu cầu của người dùng có yếu tố logic

– Model thực thi phần logic lấy từ một cơ sở dữ liệu nào đó và gửi trả lại phản hồi theo hướng dẫn từ Controller

– Controller truyền dữ liệu này ra phần view và cập nhật lại giao diện cho người dùng.

– Mọi yêu cầu đều phải đi qua Controller trước khi chuyển hóa thành lệnh thực thi cho View hay Model.

5. Tổng kết

Bất cứ khi nào bạn học một framework lập trình web mới, bạn sẽ gặp mô hình MVC. Nói cách khác, một khi bạn đã lập trình dựa trên MVC thì không cần phải ngán bất cứ framework mới nào cả

Bài viết gốc được đăng tải tại Tạp chí Lập trình

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

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

Làm layout masonry bằng flexbox

Làm layout masonry bằng flexbox

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

Một trong những cách đơn giản nhất để tạo masonry layout là dùng flexbox, tất cả những gì cần làm là set flex-flow: column wrap và height: giá-trị-độ-cao-nào-đó, là bạn có kiểu layout nổi tiếng của pinterest.

  Cách vận hành của Flexbox
  Làm chủ CSS Flexbox trong 5 phút
/* hiển thị theo dạng column, rớt dòng khi cần thiết */
.container {
    display: flex;
    flex-flow: column wrap;
    align-content: space-between;
    /* fixed height, cao hơn độ cao của item cao nhất */
    height: 960px;
}

Cách này bị một vấn đề, thứ tự các item chúng ta sẽ là như thế này

Làm layout masonry bằng flexbox

Đây không phải là kết quả chúng ta mong muốn, nó phải xếp các item từ trái qua phải mới hợp gu

Nếu chuyển giá trị flex-direction: row, thứ tự sẽ đúng như mong muốn, tuy nhiên nó lại bị khoảng trống khi các item có độ cao không đồng nhất, như thế này

Làm layout masonry bằng flexbox

Sử dụng kết hợp với 2 thuộc tính :nth-child() và order để giải quyết vấn đề này

Column 1 Column 2 Column 3
Row 1 1 2 3
Row 2 4 5 6
Row 3 7 8 9
Row 4 10 11 12

Chúng ta có 3 cột, chúng ta sẽ xếp các item theo từng cột, nhưng order nó theo hàng

/* sắp xếp lại theo từng dòng */
.item:nth-child(3n+1) { order: 1; }
// set order = 1 cho các item 1, 4, 7, 10,...
.item:nth-child(3n+2) { order: 2; }
// set order = 1 cho các item 2, 5, 8, 11,...
.item:nth-child(3n) { order: 3; }
// set order = 1 cho các item 3, 6, 9, 12,...

Với các item có cùng giá trị order như 1, 4, 7, 10 trình duyệt sẽ render theo thứ tự xuất hiện của html, một cách ngắn gọn với đoạn css trên chúng ta đã xếp các item lại theo thứ tự là 1,4,7,10,2,5,8,11,3,6,9,12

Còn một trường hợp có thể xảy ra là item có độ cao ko fill hết chỗ trống trong cột, khi ấy nó sẽ dồn item đó về cột phía trước

Để xử trí vụ này, đây là một cái trick khá vi diệu, chúng ta sẽ chèn 2 element before và after có giá trị order: 2 để các item sẽ theo thứ tự 1, 4, 7, 10, <break>, 2, 5, 8, 11, <break>, 3, 6, 9, 12

/* bắt buộc chèn vào cột mới */
.container::before,
.container::after {
content: “”;
flex-basis: 100%;
width: 0;
order: 2;
}

Đường màu xám là 2 element before và after

Làm layout masonry bằng flexbox

Toàn bộ source

<div class="container">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  ...
</div>
/* hiển thị theo dạng column, rớt dòng khi cần thiết */
.container {
  display: flex;
  flex-flow: column wrap;
  align-content: space-between;
/* fixed height, cao hơn độ cao của item cao nhất */
  height: 600px; 
}

.item {
  width: 32%;
  margin-bottom: 2%;
}

/* sắp xếp lại theo từng dòng */
.item:nth-child(3n+1) { order: 1; }
// set order = 1 cho các item 1, 4, 7, 10,...
.item:nth-child(3n+2) { order: 2; }
// set order = 1 cho các item 2, 5, 8, 11,...
.item:nth-child(3n) { order: 3; }
// set order = 1 cho các item 3, 6, 9, 12,...

/* bắt buộc chèn vào cột mới */
.container::before,
.container::after {
  content: "";
  flex-basis: 100%;
  width: 0;
  order: 2;
}

Bài viết gốc được đăng tải tại Vui Lập Trình

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

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

Bitbucket là gì? Tính năng ưu, khuyết điểm so với GitHub

bitbucket là gì

Bitbucket là gì? – Bitbucket và GitHub đang là 2 code repository phổ biến nhất trong giới lập trình viên hiện nay. Tại sao lại cần code repository? Nói tóm tắt là quản lý source code. Nếu như bạn đang update code base hoặc đang làm việc với người khác, thì bạn sẽ cần review những thay đổi về code và cấp access cho đồng nghiệp hay đối tác. GitHub thì phổ biến hơn một chút với hơn 100 triệu code repositories.

Giải thích một số thuật ngữ thường dùng

  • Repo: viết tắt của repository – kho chứa code
  • Origin: repository gốc, nếu có clone code thì là clone từ origin. 
  • Pull: kéo code mới từ origin về máy.
  • Commit: cập nhật những sửa đổi của code vào repo trong máy của bạn
  • Push: đẩy những sửa đổi mà bạn đã commit lên origin.

Bitbucket là gì?

Được đặt lên bàn cân với GitHub, Bitbucket cũng là một loại hệ thống để quản lý các phiên bản code, dịch vụ cung cấp kho lưu trữ source code cho các dự án. Bitbucket hỗ trợ cả Git và Mercurial VCS, được viết bởi ngôn ngữ lập trình Python và sử dụng web framework là Django, có thể dùng trên Mac, Windows và Android qua các app.

Bitbucket trình làng vào năm 2008 tại Úc, lúc này chỉ mới là một startup chỉ cung cấp hosting cho các dự án Mercurial. Sau đó vào năm 2010, Atlassian – một công ty của Úc đã mua lại và update thêm tính năng hỗ trợ Git repository khoảng 1 năm sau đó.

Nhiều user đã chuyển từ GitHub qua Bitbucket do lo ngại về mặt private của các source code khi Microsoft mua lại GitHub với 7,5 tỷ USD.

>>> Xem thêm: GitHub là gì?

Tính năng của Bitbucket là gì?

Bitbucket có thể tích hợp rất tốt với Jira (Jira cũng là sản phẩm của Atlassian), lúc đầu được dùng với chức năng bug tracker – tìm bug, sau đó mới tới các chức năng khác như: track bug, track issue, service desk và quản lý dự án.

Những tính năng quan trọng nhất của Bitbucket là:

  • Pull Request và review code
  • So sánh branch và commit history
  • Số lượng private repo miễn phí không giới hạn (lên đến 5 user)
  • Mac và Windows client dùng SourceTree, đối với app Android thì có thể dùng BitBeaker
  • Bitbucket dành cho doanh nghiệp có thể dùng Stash
  • Tích hợp sâu với Trello (qua Bitbucket Cloud có thể tích hợp liền mạch các branch, commit và pull request lên Trello board).
  • Cấp quyền cho branch. Thay vì cấp quyền cho mọi branch trong repo, Bitbucket cấp quyền hạn chế vào từng branch, ngăn các tình huống vô tình push master, cũng là điểm khác biệt của Bitbucket.
  • Bitbucket Snipperts cho phép tạo và quản lý mọi loại snippets multi-file (đa tệp).
  • Bitbucket hỗ trợ Git Large File Storage (LFS) đồng nghĩa với clone nhanh hơn và dành thời gian cho các file nặng.

Ưu điểm của Bitbucket so với GitHub là gì?

Trước khi đi vào chi tiết thì bạn có thể tham khảo bảng so sánh tóm tắt sau:

Bitbucket vs GitHub

Bitbucket linh hoạt hơn GitHub

Trong khi GitHub có khá nhiều tính năng và cho phép bạn tự tạo workflow của riêng mình, Bitbucket có tính năng built-in linh hoạt hơn.

Ví dụ, Bitbucket có nhiều option về hệ thống kiểm soát phiên bản (kết hợp Mercurial cũng như Git). Điều này có nghĩa là bạn có thể làm đúng theo những gì bạn muốn mà không phải cố nhét mình vào chốt hình vuông hay tròn. Bitbucket có thể import từ GIt, CodePlex, Google Code, HG, SourceForge và SVN, còn Git chỉ giới hạn ở Git, SVN, HG và TFS.

Bitbucket cho bạn số lượng private repo vô hạn

Việc quản lý sẽ trở nên đơn giản hơn rất nhiều nếu chỉ có một account trên một nền tảng duy nhất. Về mặt này thì bitbucket cho phép bạn số lượng private repo theo ý muốn và có thể share với 5 người khác. Ngoài ra thì bạn cũng có thể phân chia giữa project cá nhân và project cho công việc, hay phân chia công việc cho các khách hàng khác nhau mà không phải suy nghĩ về vấn đề quản lý.

Ưu điểm về giá

Ừ thì GitHub cũng free nhưng với điều kiện là bạn phải làm ở chế độ public. Còn nếu muốn set private các repo của mình trên GitHub thì cần một khoản chi phí.

Ngược lại, Bitbucket thì hoàn toàn miễn phí với 5 user, bao gồm vô số private repo được nhắc đến bên trên. Điều đáng ngạc nhiên là có vô số project open-source trên nền tảng này. 

CI/CD (Continuous Integration/Delivery)

Ngay từ đầu, source code của bạn đã được gắn với CI/CD trong Bitbucket, đồng nghĩa với việc là không cần bận tâm đến chuyện thiết lập và quản lý đối với người dùng, repositories và máy chủ.

  Triển khai CI/CD với Gitlab

Còn với GitHub thì mọi thứ phải được thiết lập theo từng trường hợp cụ thể và thông tin cuối cùng sẽ được lưu ở những tool khác nhau.

Thuật ngữ tìm kiếm thông minh hơn

Đây là tính năng tuy nhỏ nhưng rất khác biệt, khi Bitbucket sẽ thu thập cú pháp (syntax) để tìm các định nghĩa phù hợp với query, hơn là chỉ dừng ở tên biến.

Bitbucket semantic search

Bitbucket tích hợp Jira mạnh mẽ hơn

Forbes từng đánh giá như sau “Tầm ảnh hưởng của Atlassian tới phần mềm chẳng khác gì tầm ảnh hưởng của Apple tới thiết kế”

Kể từ khi trình làng năm 2017 với giá trị thị trường lên đến 10 tỷ USD, tốc độ tăng trưởng của Atlassian dường như không hề chững lại, và sản phẩm chính của họ chính là Jira. Lúc đầu Jira chỉ dùng để track bug nhưng sau này linh hoạt hơn với các tính năng: Quản lý dự án, kiểm soát và theo dõi lỗi, kiểm soát và theo dõi vấn đề phát sinh trong một tổ chức.

Nếu dùng Jira và Bitbucket cùng lúc thì bạn có thể set code tự động update các lỗi Jira. Và bạn có thể tạo nhánh thẳng từ Jira để workflow nhanh và linh hoạt hơn. Đây cũng là ưu điểm khi tích hợp Bitbucket x Jira – liên kết toàn bộ quá trình develop với một bộ tools được tích hợp và đồng bộ hóa.

better jira integration

Bitbucket tích hợp Trello mạnh mẽ hơn

Trello là một công cụ quản lý công việc hiệu quả khi làm việc theo nhóm, nói một cách dễ hiểu Trello là công cụ quản lý công việc cần làm của một team do ai đảm nhiệm, hoàn thành hay chưa và deadline khi nào, trong mỗi task thì chia nhỏ các to do checklist.

Khuyết điểm của Bitbucket

Đặt lên bàn cân thì Bitbucket vẫn còn kém hơn GitHub ở hai điểm:

Cộng đồng

Không thể phủ nhận GitHub vẫn đang phổ biến hơn Bitbucket, đồng nghĩa với việc cộng đồng lập trình viên rộng lớn hơn, từ đó có việc recommend và tìm tips và chia sẻ code cũng nhanh chóng và dễ dàng hơn.

Plugins

GitHub đang vượt xa Bitbucket về số lượng native plugins để mở rộng platform. Tuy nhiên Bitbucket cũng có vài plugin khá ổn, ví dụ như Bitbucket Connect (đơn giản hóa các tích hợp sâu – deep integration), SourceTree (trực quan hóa giao diện cho project), app Slack (cho phép pull info và comment, merge và prompt review code trong cùng channel), và các sản phẩm khác từ Atlassian.

Lựa chọn khác ngoài Bitbucket và GitHub là gì?

Là hai nền tảng hosting Git phổ biến nhất nhưng không có nghĩa đây là 2 platform duy nhất. Có thể kể đến các low-key player khác như:

Gitlab

Trình làng năm 2011 và là đối thủ nặng ký đối với cả GitHub và Bitbucket, GitLab đã nâng cấp từ nền tảng cung cấp dịch vụ quản lý source code lên full DevOps Lifecycle – từ project planning đến CI/CD và giám sát, là platform DevOps hoàn chỉnh.

  Triển khai CI/CD với Gitlab

LaunchPad

LaunchPad là platform quản lý software collaboration được Canonical, nhà sản xuất của Ubuntu Linux và các software liên quan sử dụng. Canonical là tên tuổi lớn trong phong trào open-source, nên nếu bạn đang làm việc với open-source thì LaunchPad khá thích hợp hỗ trợ cả Git và Bazaar.

SourceForge

Cũng là cái tên nổi bật trong giới open-source, SourceForge cho phép developer host code và distribute software của họ thông qua nền tảng này. Ngoài ra SourceForge còn có tools để import GitHub repo cùng các data liên quan như wiki.

Kết luận

Khác biệt cơ bản nhất giữa Bitbucket và GitHub có thể được tóm tắt như thế này: GitHub thì tập trung xung quanh public code còn Bitbucket thì về private code. GitHub có cộng đồng open-source khổng lồ còn Bitbucket thì phần lớn là người dùng doanh nghiệp.

Tài khoản GitHub nhiều khi là tấm danh thiếp của developer. Nếu có viết blog thì dev có xu hướng sẽ chia sẻ ví dụ code trên GitHub, góp phần xây dựng cộng đồng GitHub lớn mạnh. Tuy nhiên điều đó cũng đồng nghĩa là các doanh nghiệp phải “chăm” kỹ hơn để quản lý user và cài đặt access control, đảm bảo không ảnh hưởng đến an ninh mạng – cyber resilience.

Bitbucket và Github khá tương tương đồng về mặt tính năng và cả hai đều là dịch vụ host code repo. Cho nên tùy vào lựa chọn và nhu cầu mà bạn có thể chọn lựa phù hợp hơn: nếu VCS bạn là Mercurial hay tích hợp với Jira thì nên dùng Bitbucket, còn với những project về web-hosting nhỏ nhỏ thì có thể dùng GitHub.

Với các thông tin trên thì chắc hẳn bạn đã biết Bitbucket là gì? và mối quan hệ với Github. Hy vọng bạn đọc đã những kiến thức hữu ích cho mình nhé!

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

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

Sharepoint là gì? Học SharePoint và cơ hội việc làm IT tốt hơn

sharepoint là gì

Trong thập kỷ qua, SharePoint đã phát triển thành một nguồn lực vô cùng hùng hậu —hơn  250,000 organizations và gần 85% các công ty trong danh sách Forbes Fortune 500 đều đang sử dụng nó. Sự phát triển hùng hậu và ứng dụng của SharePoint trên toàn thế giới hiện đã xuất hiện nhiều hơn tại thị trường Việt Nam. Nhiều công ty và lập trình viên không khỏi tìm hiểu SharePoint là gì và tìm hiểu sâu hơn về lợi ích và cách học cho người mới bắt đầu SharePoint.

SharePoint là gì?

sharepoint la gi

SharePoint là một nền tảng cộng tác làm việc trên web (web-based) tích hợp đồng bộ với Microsoft Office. Ra mắt vào năm 2001, SharePoint chủ yếu được ra mắt dưới dạng hệ thống quản lý và lưu trữ tài liệu, tuy nhiên sản phẩm cũng có cấu hình cao và việc sử dụng có thể khác nhau đáng kể tuỳ vào mô hình tổ chức.

SharePoint là một nền tảng quản lý và phối hợp nội dung dựa trên Cloud có khả năng tùy chỉnh cao, giúp đội ngũ làm việc từ xa, làm việc cùng nhau và thông minh hơn. SharePoint hiện đang được áp dụng tại hơn 250.000 công ty trên toàn cầu với hơn 190 triệu user, là một nền tảng quản lý nội dung khuyến khích teamwork và làm việc nhóm bất kể các thành viên ở đâu trên thế giới.

Nói một cách dễ hiểu, SharePoint là một hệ thống website phối hợp nội dung và công việc trên trang web sử dụng các workflow application, danh sách cơ sở dữ liệu và các thành phần website và tính năng bảo mật khác để trao quyền cho các team làm việc cùng nhau. SharePoint cũng cung cấp cho doanh nghiệp một nền tảng để kiểm soát quyền truy cập vào thông tin và tự động hóa quy trình làm việc giữa các đơn vị kinh doanh.

Những sản phẩm và công nghệ SharePoint phổ biến nhất hiện nay

  • SharePoint trong Microsoft 365     

Một dịch vụ nền điện toán đám mây, được lưu trữ bởi Microsoft, dành cho các doanh nghiệp thuộc mọi quy mô. Thay vì cài đặt và triển khai SharePoint Server tại chỗ, bất kỳ doanh nghiệp nào có thể đăng ký vào một gói Microsoft 365 hoặc đối với dịch vụ SharePoint Online độc lập. Nhân viên của bạn có thể tạo các website để chia sẻ tài liệu và thông tin với các đồng nghiệp, đối tác cùng khách hàng. Để bắt đầu lưu trữ các tệp của bạn trên site nhóm của bạn, hãy xem thiết lập lưu trữ và chia sẻ tệp của Microsoft 365. Cung cấp cho Microsoft 365 một thử.

  • SharePoint Server

Các tổ chức có thể triển khai và quản lý SharePoint Server tại chỗ hoặc với đăng ký Office 365 Enterprise để tận dụng các tính năng mới nhất. Và nó cung cấp các tính năng và chức năng bổ sung, chẳng hạn như các trang site hiện đại, phần web hiện đại và tác giả, danh sách và thư viện hiện đại, tìm kiếm hiện đại, tích hợp với PowerApps, Power BI và MS, và trang chủ SharePoint. Tải xuống SharePoint Server 2019. 

  • SharePoint Designer 2013      

Một chương trình miễn phí được phát hành gần nhất vào năm 2013. Được dùng để xây dựng các giải pháp hỗ trợ dòng công việc hiệu quả. Đồng thời, được dùng để chỉnh sửa các loại nội dung ngoài cho giải pháp dữ liệu bên ngoài dựa trên Business Connectivity Services. Hãy tải xuống SharePoint Designer 2013.

  • Đồng bộ OneDrive

Một chương trình trên máy tính mà bạn có thể dùng để đồng bộ các tài liệu từ một site nhóm hoặc OneDrive cho cơ quan hoặc trường học vào máy tính của bạn để sử dụng ngoại tuyến. Tìm hiểu thêm về OneDrive.

sharepoint la gi

Xem thêm Các công cụ giúp tăng tốc Workflow cho developer tại đây

Tại sao nên dùng SharePoint?

Tại thời điểm hiện tại, đội ngũ của bạn sẽ cần phải giải quyết các vấn đề như sau:

  • Công ty bạn có làm việc từ xa không?
  • Team bạn có cần truy cập vào nhiều thiết bị để làm việc không?
  • Hiện tại team bạn đang sử dụng thiết bị như thế nào? Có dễ dàng không?
  • Bạn có thường nhận các yêu cầu cần sự phối hợp của khách hàng, ví dụ một nơi chia sẻ thông tin, catalogue online, form thông tin để request online để khách hàng có thể nhập vào? 
  • Bạn có hay share tài liệu với Khách hàng không?
  • Nhân viên của bạn có bao giờ phàn nàn / mong muốn có cách truy cập tài tư liệu và công việc dễ dàng hơn không?

Tin vui cho bạn đó là, SharePoint hoàn toàn có thể thực hiện các thao tác và đáp ứng được những yêu cầu trên, và đó cũng sẽ là những lợi ích của SharePoint mà TopDev sẽ phân tích chi tiết hơn bên dưới.

SharePoint có nhiều tính năng lớn bao gồm khả năng co-authoring (đồng chỉnh sửa và quản lý) thời gian thực hiện, các tính năng gắn thẻ và đánh tag nâng cao giúp team dễ dàng tìm kiếm tài liệu, quyền truy cập bất cứ lúc nào – cho bất cứ thiết bị nào bạn sử dụng, và tích hợp hoàn toàn với bộ Office 365, giúp bạn làm việc hiệu quả hơn mỗi ngày. 

Ứng dụng của SharePoint

  • Quản lý tài nguyên và tài liệu Doanh nghiệp

SharePoint cho phép lưu trữ, truy xuất, tìm kiếm, lưu trữ, theo dõi, quản lý và báo cáo về các loại tài liệu và record số. SharePoint còn cung cấp chức năng tìm kiếm và tính năng ‘đồ thị hoá’. Sự tích hợp SharePoint với Microsoft WindowsMicrosoft Office cho phép chỉnh sửa thời gian thực cùng lúc và đồng bộ hóa quyền được mã hóa /thông tin.

  • Mạng nội bộ và social 

Mạng nội bộ SharePoint hoặc cổng mạng nội bộ là một cách để tập trung quyền truy cập thông tin và ứng dụng của doanh nghiệp. Nó là một công cụ giúp một tổ chức quản lý thông tin liên lạc nội bộ, ứng dụng và thông tin của mình dễ dàng hơn.

  • Như một phần mềm Collaborative

SharePoint gồm các chức năng phần mềm cộng tác nhóm (team collaboration), bao gồm: lên lịch dự án (tích hợp với Microsoft Outlook), share hộp thư và lưu trữ và cộng tác tài liệu liên quan đến dự án. 

  • Tuỳ chỉnh web app 

Khả năng developer tùy chỉnh của SharePoint cung cấp thêm một lớp tính năng dịch vụ cho phép các developer sử dụng khả năng quản lý thông tin và bảo mật của SharePoint được trên nhiều nền tảng và kịch bản phát triển khác nhau. SharePoint cũng có sẵn một “app store” nhiều ứng dụng ngoài được quản lý để truy cập vào các tài nguyên khác như dữ liệu người dùng của công ty và dữ liệu tài liệu.

  OpenCV là gì? Học Computer Vision không khó!
  Lập trình Cặp: chúng ta giúp nhau thành công

Lợi ích SharePoint so với các collaboration software khác

1. SharePoint bảo mật RẤT CAO 

Microsoft rất nghiêm túc coi trọng vấn đề bảo mật. Các hoạt động điện toán đám mây của họ phát hiện gần 1,5 triệu lần attempt mỗi ngày để đột nhập vào hệ thống của họ, vì vậy họ đã đầu tư ngân sách 1 tỷ USD hàng năm chỉ dành cho việc bảo mật.

SharePoint là một trong số rất nhiều thành phần của Microsoft, nó đi kèm với một số tính năng bảo mật tích hợp, như tính năng giới hạn người ngoài tổ chức không thể xem nội dung của bạn, đặt quyền đối với những người trong tổ chức của bạn có quyền truy cập vào một số nội dung nhất định, tự tạo cơ chế cho phép hoặc chặn hành vi người dùng nhất định & cho phép hoặc chặn quyền truy nhập vào nội dung dựa trên vị trí nhất định.

sharepoint la gi

2. SharePoint giúp doanh nghiệp phối hợp nghiệp vụ hiệu quả hơn 

SharePoint đã được thiết kế để nâng cao trải nghiệm làm việc cộng tác, đặc biệt là khi nó kết hợp với các ứng dụng và dịch vụ khác của Office 365. Khi được triển khai như một phần của Office 365, SharePoint tạo nên không gian làm việc ảo cho phép các nhóm gặp gỡ, hoàn thành nhiệm vụ và cộng tác với nhau.

Cụ thể dưới đây là một số cách mà SharePoint có thể giúp các tổ chức cộng tác nhiều hơn:

  • Bằng SharePoint, tài liệu của bạn nằm ở một nơi share chung để có thể truy cập được từ bất kỳ thiết bị nào, bất kỳ lúc nào (tất cả những gì bạn cần là kết nối Internet).
  • Tính năng co-authoring (đồng thao tác) theo thời gian thực, nghĩa là nhiều người có thể làm việc và chỉnh sửa trên cùng một document một lúc.
  • SharePoint sẽ luôn hiển thị phiên bản mới nhất của document, với option revert về phiên bản cũ nếu cần.
  • Các thành viên trong team và leaders có thể thiết lập task theo cá nhân hoặc theo nhóm, giao nhiệm vụ cho các thành viên khác trong nhóm và theo dõi nhiệm vụ nào đã được hoàn thành.
  • Bạn có quyền truy cập vào lịch dùng chung, các note và comment được chia sẻ (thông qua OneNote), conversation được chia sẻ (thông qua Yammer) và các công cụ cộng tác khác.

SharePoint đóng vai trò như một “co-working space ảo” vì bạn không cần phải setup hoặc có team Tech để xây nên một nền tảng làm việc nhóm chung – tất cả chỉ cần được phân chia và assign từ team leader. 

3. SharePoint hỗ trợ tự động hoá các công việc “tay chân” 

SharePoint giúp tiết kiệm cho bạn nhiều thời gian và nỗ lực, đồng thời cũng mang lại sự đồng nhất và hiệu quả cho các công việc bạn đang thực hiện hàng ngày. Các công việc / task cấp thấp như thu thập các chữ ký hay xác nhận, theo dõi trạng thái của các tài liệu, thông báo cho bạn khi có gì thay đổi nội dung,… để bạn tập trung vào các tác vụ cao và phức tạp hơn.

Ai nên sử dụng SharePoint?

Với quy mô và những lợi ích quản lý đa năng hiện tại, SharePoint đang dần được hầu hết các công ty công nghệ ứng dụng về cho đội ngũ.

  • Với Cấp Tech leads/ IT Managers/ Lập trình viên: Nhóm team công nghệ sẽ sử dụng SharePoint phiên bản có phần được nâng cao hơn so với các bản thông thường. Phục vụ trực tiếp cho các sản phẩm và project công nghệ của công ty nên sẽ được cấp Lead phân chia lại rồi phân chia assign cho đồng đội.

Với lập trình viên thì họ thường sử dụng các tính năng đã có nhưng có phần mở rộng, phát triển dựa trên các tính năng mới của nền tảng SharePoint.

  • User thông thường: Đa phần đối tượng này sử dụng với những tính năng cơ bản, có sẵn khá là dễ sử dụng và tiện lợi mà SharePoint đã cung cấp đến. Có thể kể đến một số tính năng đáp ứng được nhu cầu thông thường: Lập kế hoạch, tìm kiếm thông tin, bảng biểu…

Tham khảo 10 công cụ Go-To mà Developer phải có năm 2020 tại đây

Biết sử dụng SharePoint để làm gì?

Là mùa tuyển dụng của năm 2020, hệ thống TopDev đã ghi nhận không ít các vị trí tuyển dụng ưu tiên nhiều cho các bạn biết và hiểu về SharePoint, là cơ hội để các bạn tìm được vị trí việc làm IT tốt hơn và cơ hội “trả giá” vị trí lương cao hơn so với các bạn khác. Vì thể quan trọng nhất vẫn là cơ hội nghề nghiệp tốt hơn cho bất kì developer nào hoặc IT-er nào.

Chưa kể đến rằng cả các công ty công nghệ trong nước, trong khu vực như công ty IT Hàn tuyển dụng, hay quốc tế như Mỹ và châu Âu đều ứng dụng và ưu tiên tuyển dụng người có kinh nghiệm sử dụng SharePoint. Đây là điểm cộng rất lớn cho các bạn đang tìm kiếm cơ hội mới, một điểm “Nice to have” nhưng cũng đang dần trở thành điểm “Must have” tại một số doanh nghiệp công nghệ mới.

Ngoài ra, biết sử dụng SharePoint sẽ giúp lập trình viên nhanh chóng tiếp cận các xu hướng công nghệ mới mới thông qua các nhu cầu và sản phẩm của doanh nghiệp. Đây cũng là cơ hội để bạn nâng cao kỹ năng mềm và kiến thức công nghệ liên tục cập nhật trên thị trường – là cơ hội phát triển sự nghiệp IT mà bạn cần nắm bắt. 

Bắt đầu học SharePoint như thế nào?

Không thiếu tài liệu ngon để khởi động đâu, tuy nhiên bước đầu tiên bạn phải làm đó là trực tiếp làm thử trên SharePoint. Sau khi chọn được source tài nguyên phù hợp, hãy thử cài đặt và sử dụng SharePoint luôn để hiểu hơn cấu trúc, cơ chế hoạt động và phối hợp trên platform. 

tuyển dụng it

Nếu cần thêm tutorial hoặc giải đáp trực tiếp về platform bạn có thể tìm đến các nguồn tham khảo sau:

Các cộng đồng Sharepoint

Các site Khóa học (cả miễn phí & có phí)

TopDev tổng hợp

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

Xem thêm IT Jobs for Developer mới nhất trên TopDev

YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java)

YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java)

Bài viết được sự cho phép của tác giả Trần Hữu Cương

YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java)

Cũng giống như KISS, YAGNI và DRY là 2 nguyên tắc quan trọng để lập trình.

1. DRY

DRY: “Don’t Repeat Yourself” – Đừng bao giờ lặp lại code.
Bạn cũng có thể đã nghe về sự so sánh: DRY cod vs WET code (Don’t Repeat Yourself and Write Everything Twice)

Bạn đã bao giờ viết các đoạn code giống nhau nằm ở các phần, module khác nhau của project? bạn đã bao giờ có 2 màn hình giống nhau nhưng lại dùng tới 2 đoạn code để hiển thị 2 màn hình đó?

OK, Nguyên tắc DRY chính là đang nói về vấn đề này.

Đừng lặp lại code ở đây là không lặp lại các đoạn code giống nhau, các method thực hiện chức năng như nhau, cố gắng gom chúng lại 1 cách gọn gàng và có thể dùng lại khi cần.

Ví dụ 1

Ta có 2 method

public void print(User user) {
System.out.println("first name: "+user.getFirstName());
System.out.println("last name: "+user.getLastName());
System.out.println("age: "+user.getAge());
System.out.println("email: "+user.getEmail());
System.out.println("address: "+user.getAddress());
System.out.println("gender: "+user.getGender());
System.out.println("exprience: "+user.getExperience());

 // do something: print user info
}
public void preview(User user) {
System.out.println("first name: "+user.getFirstName());
System.out.println("last name: "+user.getLastName());
System.out.println("age: "+user.getAge());
System.out.println("email: "+user.getEmail());
System.out.println("address: "+user.getAddress());
System.out.println("gender: "+user.getGender());
System.out.println("exprience: "+user.getExperience());

 // do something: review user
}
public void print(User user) {
System.out.println("first name: "+user.getFirstName());
System.out.println("last name: "+user.getLastName());
System.out.println("age: "+user.getAge());
System.out.println("email: "+user.getEmail());
System.out.println("address: "+user.getAddress());
System.out.println("gender: "+user.getGender());
System.out.println("exprience: "+user.getExperience());

 // do something: print user info
}
public void preview(User user) {
System.out.println("first name: "+user.getFirstName());
System.out.println("last name: "+user.getLastName());
System.out.println("age: "+user.getAge());
System.out.println("email: "+user.getEmail());
System.out.println("address: "+user.getAddress());
System.out.println("gender: "+user.getGender());
System.out.println("exprience: "+user.getExperience());

 // do something: review user
}

2 method trên thực hiện 2 chức năng khác nhau nhưng có rất nhiều code bị lặp lại, đây là case bị lặp code cơ bản ít người mắc phải. Ta có thể tránh lặp code trường hợp này bằng cách tách phần in thông tin user ra thành 1 method và gọi tới nó:

public void showUser(User user) {
System.out.println("first name: "+user.getFirstName());
System.out.println("last name: "+user.getLastName());
System.out.println("age: "+user.getAge());
System.out.println("email: "+user.getEmail());
System.out.println("address: "+user.getAddress());
System.out.println("gender: "+user.getGender());
System.out.println("exprience: "+user.getExperience());
}

public void print(User user) {
showUser(user);
 // do something: print user info
}
public void preview(User user) {
showUser(user);
 // do something: review user
}

Sau khi tách ra method showUser thì ta có thể dùng lại nó hoặc nếu cần chỉnh sửa, lỗi trong việc in ra thông tin user thì ta chỉ cần sửa method showUser là được.

Ví dụ 2

Dưới đây là 1 đoạn code thực hiện tìm kiếm đối tượng User theo name, email, theo cả name và email

public List<User> findByName(String name) {
if (name == null) {
return null;
}
String sql = "SELECT u FROM User u WHERE u.name like %"+name+"% ";
 // do something
}

public List<User> findByEmail(String email) {
if (email == null) {
return null;
}
String sql = "SELECT u FROM User u WHERE u.email like %"+email+"% ";
 // do something
}

public List<User> findByNameAndEmail(String name, String email) {
if (name == null || email == null) {
return null;
}
String sql = "SELECT u FROM User u WHERE u.name like %"+name+"% AND u.email like %"+email+"%";
 // do something
}

Cái gì thế này? có vẻ như cả 3 method này đều thực hiện một việc khá giống nhau.

Sao không chuyển thành hàm dưới đây:

public List<User> find(String name, String email) {
if (name == null && email == null) {
return null;
}
String sql = "SELECT u FROM User u WHERE u.name like %"+name+"% AND u.email like %"+email+"%";
if (name != null && email == null) {
 sql = "SELECT u FROM User u WHERE u.name like %"+name+"% ";
}
if (name == null && email != null) {
 sql = "SELECT u FROM User u WHERE u.email like %"+email+"% ";
}
 // do something
}

Ngắn gọn hơn đúng không, lại vừa có thể search theo name, theo  email và theo cả 2.

Vậy là việc suy tính trước method của mình sẽ làm gì sẽ giúp bạn trành việc lặp code, phải viết thêm method mới.

(Chú ý, giả sử bạn có method findByName, bây giờ cần thêm method search theo email thì phải giữ nguyên method findByName và viết mới method find chứ không được xóa method cũ đi nếu không nó sẽ vi phạm nguyên tắc  “open for extension but closed for modification” tức là ưu tiên thêm mới và hạn chế sửa đổi).

  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

2. YAGNI

YAGNI: “You Aren’t Gonna Need It”: Bạn không cần nó.

Đôi khi bạn nghĩ rằng cần phải thêm 1 số chức năng mới, bạn nghĩ nó cần thiết, có thể sẽ dùng trong tương lai và bạn làm nó. Stop, hãy dừng lại, như thế là bạn đang phạm phải sai lầm.

Bạn không nên lãng phí thời gian vì hành động đó, cái chức năng mà bạn thêm mới đó có thể không làm ưng ý khách hàng hoặc cấp trên, thậm chí không bao giờ được dùng tới. Hãy confirm nó trước khi làm, và tập trung vào các task hiện tại thay vì đi làm 1 cái mới mà chưa chắc đã dùng tới rồi lại phải mất thêm công test nó.

YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java) stackjava.com

Okay, Done!

References: https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it

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

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

Xem thêm các tuyển dụng Java hấp dẫn tại TopDev

Hướng dẫn làm giao diện Dark mode cho website từ A-Z

Hướng dẫn làm giao diện Dark mode cho website từ A-Z

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

Gần đây lướt Facebook thấy nhiều bạn hỏi về vấn đề làm sao tạo được giao diện Dark Mode cho website, để khi người ta vào website thì có thể tuỳ chỉnh nền tối hay là sáng. Nên hôm nay tranh thủ viết một bài về cách làm giao diện Dark mode cho website từ a-z cho các bạn luôn.

  Mental model trong React
  Tìm hiểu về thuộc tính Writing Mode trong CSS

Việc đầu tiên chúng ta cần làm đó chính là tạo một giao diện, ở đây mình tạo một giao diện đơn giản với HTML và CSS lần lượt như sau:

@import url("https://fonts.googleapis.com/css?family=Lora:400,400i,700");
.wrapper {
     font-family: "Lora";
     background-color: white;
     width: 800px;
     height: 100vh;
     position: relative;
     margin: 0 auto;
}
.box {
     height: 100%;
     width: 100%;
     display: flex;
}
.image, .content {
     width: 50%;
}
.content {
     padding: 20px;
     display: flex;
     align-items: center;
     justify-content: center;
     flex-direction: column;
     background-color: #fafafa;
}
.title {
     font-weight: bold;
     font-size: 40px;
     margin-bottom: 10px;
}
.title + p {
     font-size: 20px;
}
.image img {
     display: block;
     width: 100%;
     height: 100%;
     object-fit: cover;
}
.theme-switch-wrapper {
    display: flex;
     align-items: center;
     position: absolute;
     top: 10px;
     right: 10px;
     z-index: 1000;
}
.theme-switch {
     display: inline-block;
     height: 34px;
     position: relative;
     width: 60px;
}
.theme-switch input {
     display:none;
}
.slider {
     background-color: #999;
     bottom: 0;
     cursor: pointer;
     left: 0;
     position: absolute;
     right: 0;
     top: 0;
     transition: .4s;
}
.slider:before {
     background-color: white;
     bottom: 4px;
     content: "";
     height: 26px;
     left: 4px;
     position: absolute;
     transition: .4s;
     width: 26px;
}
input:checked + .slider {
     background-color: #eee;
}
input:checked + .slider:before {
     transform: translateX(26px);
}
.slider.round {
     border-radius: 34px;
}
.slider.round:before {
     border-radius: 50%;
}

Ta sẽ có giao diện lúc này như sau. Các bạn để ý nút Toggle nhé để sau này chúng ta dùng Javascript để viết sự kiện khi nhấn vào thay đổi màu sắc cho website đó. Còn các mũi tên xanh dương mình chỉ là để chúng ta CSS cho chúng bằng cách dùng biến trong CSS dưới đây.

Hướng dẫn làm giao diện Dark mode cho website từ A-Z

Mấu chốt để làm được giao diện đổi màu đó chính là sử dụng biến trong CSS, mình có viết về nó rồi. Các bạn có thể xem lại tại đây nha. Khi sử dụng biến chúng ta sẽ tạo ra 2 lựa chọn về màu sắc, mặc định là các mã màu ban đầu từ thằng :root và  thứ 2 là từ thằng [data-theme="dark"] mà chúng ta sẽ chuyển qua. Cũng là các biến từ :root thôi tuy nhiên ở Dark Theme các bạn sẽ đổi các biến đó thành các mã màu khác mà các bạn thích, ở đây mình đổi trắng thành đen và đen thành trắng.

Sau đó ta áp dụng chúng vào các class mà chúng ta đã khai báo ban đầu như thế này

Việc tiếp theo cần làm đó là viết một đoạn Javascript để bắt sự kiện khi nhấn vào nút Toggle để nó chuyển các mã màu sang màu tối ở [data-theme="dark"] mà chúng ta đã tạo ở trên. Mình có Javascript như sau

Mình sẽ giải thích Javascript một chút cho các bạn hiểu nhé. Đầu tiên mình khai báo 1 biến là toggleSwitch truy xuất tới DOM là Toggle, và một biến là currentTheme để truy xuất tới một localStorage có tên là theme.

Sau đó mình kiểm tra xem có localStorage nào tên là theme không, nếu có thì mình thiết lập cho thẻ html (root) có thuộc tính data-theme là currentTheme, đồng thời mình kiểm tra xem theme hiện tại có phải là dark không, nếu phải thì mình sẽ thiết lập cho Toggle đó checked là true, tức là đã nhấn vào.

Tiếp theo mình viết một hàm có tên là switchTheme để khi nhấn vào Toggle thì sẽ gọi hàm này. Hàm này kiểm tra 2 điều kiện, nếu Toggle được nhấn vào thì sẽ thiết lập theme là dark đồng thời tạo localStorage theme là dark luôn, ngược lại thì thiết lập theme là light.

Và cuối cùng là sự kiện change của Toggle, nghĩa là khi các bạn nhấn vào nó sẽ gọi hàm switchTheme viết ở trên để xử lý. Lúc này chúng ta sẽ có kết quả như mong đợi

Hướng dẫn làm giao diện Dark mode cho website từ A-Z

Chúc các bạn một ngày tốt lành, và đừng quên tham khảo Codepen dưới đây nhé

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

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

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

Lấy ngày giờ hiện tại trong Java

Lấy ngày giờ hiện tại trong Java

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

Có nhiều cách để lấy ngày giờ hiện tại trong Java. Trong bài này, tôi sẽ giới thiệu một vài cách thường được sử dụng để lấy ngày giờ hiện tại.

  5 thói quen ngày thứ 2 giúp bạn xây dựng app tốt hơn
  "Luật 5 giây" giúp Steve Jobs thách thức mọi giới hạn sáng tạo

Lấy ngày hiện tại: java.time.LocalDate

System.out.println(java.time.LocalDate.now());

Kết quả:

2017-01-23

Lấy giờ hiện tại: java.time.LocalTime

System.out.println(java.time.LocalTime.now());

Kết quả:

00:01:14.341

Lấy ngày và giờ hiện tại: java.time.LocalDateTime

System.out.println(java.time.LocalDateTime.now()); 

Kết quả:

2017-01-24T00:03:31.593

Lấy ngày và giờ hiện tại: java.time.Clock

System.out.println(java.time.Clock.systemUTC().instant());  

Kết quả:

2017-01-23T18:35:23.669Z

Lấy ngày và giờ hiện tại: java.util.Date

java.util.Date date=new java.util.Date();   System.out.println(date);  

hoặc

long millis=System.currentTimeMillis();   java.util.Date date=new java.util.Date(millis);   System.out.println(date); 

Kết quả:

Thu Oct 26 08:22:02 IST 2017

Lấy ngày hiện tại: java.sql.Date

long millis=System.currentTimeMillis();   java.sql.Date date=new java.sql.Date(millis);   System.out.println(date); 

Kết quả:

2017-10-26

Lấy ngày và giờ hiện tại: java.util.Calendar

Date date=java.util.Calendar.getInstance().getTime();   System.out.println(date); 

Kết quả:

Thu Oct 26 08:22:02 IST 2017

Như bạn thấy có rất nhiều cách để lấy ngày giờ trong Java, nếu có thể hãy sử dụng các phương thức Date Time trong Java 8 : java.time.* sẽ tốt hơn nhé.

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

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

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

Khám phá Quy trình tuyển dụng Data Engineer

Data Engineer

Đọc bài viết dưới đây của TopDev từ kinh nghiệm của anh Calvin Cảnh Trần – Senior Data Engineer tại Grab, để hiểu rõ hơn về Quy trình và kinh nghiệm phỏng vấn Data Engineer cập nhật mới nhất trong năm 2020. 

Data Engineer (Kỹ sư dữ liệu) hiện đang là ngành phát triển và nhận được sự quan tâm lớn. Nhiều cơ hội bắt đầu mở ra cho các ứng viên theo đuổi ngành nghề này. Và để có sự chuẩn bị tốt nhất, bạn cần nắm bắt rõ quy trình tuyển dụng của vị trí này.

Cùng TopDev khám phá ngày những điều thú vị xoay quanh cuộc tuyển chọn cho vị trí Data Engineer nhé!

Những hiểu biết cơ bản về Data Engineer

Kỹ sư dữ liệu (Data Engineer) là người phát triển, xây dựng, kiểm tra và duy trì kiến trúc. Đồng thời, họ cũng là người đề xuất và đôi khi đảm nhậm việc cải thiện chất lượng dữ liệu. Để hoàn thiện và phát triển nguồn dữ liệu, nhóm những Data Engineer cần cải biến các quy trình thiết lập dữ liệu để mô hình hóa, khai thác và sản xuất dữ liệu.

Data Engineer

Nhóm các công cụ mà một Kỹ sư dữ liệu cộng tác bao gồm: SAP, Oracle, Cassandra, MySQL, Redis, Riak, PostgreSQL,…

Xét về tiềm năng phát triển, ngành Kỹ sư dữ liệu dường như phát triển mạnh mẽ hơn tại thị trường quốc tế. Tại Việt Nam, nguồn lực tuyển dụng của ngành này chưa nhiều. Mức lương trung bình dành cho vị trí này cũng lên đến $124.000/năm. Song, với những đặc thù công việc, tính khoa học thực tiễn, ngành Kỹ sư dữ liệu hứa hẹn là một ngành rất có triển vọng trong tương lai.

Tuyển dụng data engineer hấp dẫn lương cao

Quy trình tuyển dụng Data Engineer

Bài viết là những trải nghiệm thực tế của quy trính tuyển dụng vị trí Data Engineer tại thị trường quốc tế. Tại Việt Nam, việc tuyển vị trí này vẫn chưa trở thành xu hướng. Tuy nhiên, mô hình tuyển dụng vẫn đảm bảo những vòng thi cơ bản. Vì thế, bài viết này sẽ khá hữu ích cho bạn dù bạn apply vị trí tại Việt Nam hay thị trường nước ngoài.

Vòng 01 – Thách thức HackerRank

HackerRank là một trong những trang web thực hành – đánh giá coding hàng đầu hiện nay. 

Data Engineer

Nền tảng tích hợp đánh giá ứng viên IT mới TopDev x HackerRank

Bài test HackerRank sẽ được diễn ra trong vòng 90 phút, gồm 3 câu hỏi giải thuật và 1 câu SQL. Đặc biệt, chỉ các ứng viên hoàn thành trên 80% tổng số bài thi mới được nhận cơ hội tham gia vòng tiếp theo.

Các bài tập này là những thách thức được xây dựng trên nền tảng lập trình tích hợp. Thách thức được đặt ra chủ yếu tập trung vào thuật toán và cấu trúc dữ liệu đơn giản, không quá phức tạp. Các lời giải cho thách thức gửi đi sẽ được chấm tự động và kết quả được gửi về nhà tuyển dụng nhân sự IT xem xét, đánh giá.

Vòng 02 – Giải toán lập trình trên bảng trắng (Whiteboard Coding)

Khi vượt qua vòng đầu tiên, bạn sẽ tiếp tục phỏng vấn vòng 2. Ở vòng này, ứng viên sẽ được gặp trực tiếp một Engineer nào đó của công. Đồng thời, thực hiện thử thách qua 2 phần nhỏ như sau: 

Phần 1: Câu hỏi về phân tích chuyên môn

Với phần này, nhà tuyển dụng muốn đánh giá sự am hiểu của bạn về mức độ phức tạp của thuật toán; cách bạn lựa chọn, xử lý giải thuật ra sao.

  Tuyển tập câu hỏi phỏng vấn Data Engineer mới nhất

Data Engineer

Các bạn sẽ phải giải toán lập trình trên bảng trắng thông qua mã giả. Các giàm khảo – nhà tuyển dụng sẽ yêu cầu ứng viên tối ưu hóa câu trả lời của mình.

Ví dụ:

Mức độ phức tạp (Compacity) thay vì O(n)^2, nhà tuyển dụng phỏng vấn sẽ yêu cầu ứng viên tối ưu hóa thành O(nlogn) hoặc O(n).

Phần 2: Câu hỏi về thiết kế hệ thống (System Design)

Một điểm lưu ý: Phần phỏng vấn có thể thay đổi tùy vào mục đích của nhà tuyển dụng. Thông thường, 70 – 90% các thách thức sẽ rơi vào các dạng câu hỏi về kỹ thuật (Technical Questions). Cụ thể bao gồm: Câu hỏi về thuật toán (Algorithms); câu hỏi về cấu trúc dữ liệu (Data Structure);Câu hỏi về khả năng thiết kế hệ thống (System Design)

Trong phần này, giám khảo sẽ đưa ra một số bài toán kinh điển dành cho bạn như: thiết kế thang máy, thiết kế máy bán hàng tự động, tthiế kế ứng dụng uber,… Và tổng thời lượng dành cho bài test này sẽ vào khoảng 2 tiếng.

Đây đều là 2 vòng khá cơ bản mà các bạn cần phải lưu tâm. Vì hầu như nó được áp dụng cho hầu hết các vị trí: Backend, Frondend, Software Engineer,…

Vòng 03 – Phỏng vấn với Data Engineer

Sau khi vượt qua vỏng 2, ứng viên sẽ được phỏng vấn trực tiếp với Data Engineer. 

Hỏi về những trải nghiệm thực tế

Mục đích của vòng 3 chính là thảo luận để tăng sự tương tác. Đồng thời, làm rõ hơn về những mong muốn từ phía nhà tuyển dụng lẫn ứng viên.

>>> Xem thêm: Top những câu hỏi phỏng vấn “ngược” nhà tuyển dụng 

Data Engineer

Người phỏng vấn sẽ xem xét liệu ứng viên có thật sự phù hợp với vị trí này hay không. Trong khi đó, ứng viên cũng cân nhắc về tính  việc những công việc ở công ty có đúng với những yêu cầu mà bản thân mong muốn trải nghiệm.

Người phỏng vấn sẽ hỏi ứng viên về những dự án đã từng tham gia hoặc các công việc nào mà họ tâm đắc nhất. Đây là cách khai thác các kỹ năng chuyên môn thông qua việc kích thích sự gợi nhớ đối với ứng viên.

Càng về sau, các câu hỏi ngày càng cụ thể hơn. Khả năng vận hành, tổ chức, xử lý các dự án, công việc đó ra? Hỏi càng xoáy, ứng viên càng có nhiều “đất” để thể hiện bản lĩnh của mình. Điều này cũng đồng nghĩa, nhiều ứng viên “chém gió” suốt cuộc hội thoại sẽ nhanh chóng bị loại bỏ.

Xem thêm: Kinh nghiệm Phỏng vấn Data Engineer của anh Calvin Cảnh Trần

Thách thức về lĩnh vực chuyên môn

Dường như ít nhà tuyển dụng sẽ hỏi về tool. Điều họ đặc biệt quan tâm hơn là về MapReduce. Mục đích của nhà tuyển dụng là tìm hiểu mức độ chuyên môn cách ứng viên giải quyết một vấn đề thực tế.

Data Engineer

Các thách thức có thể được đặt ra xoay quanh các vấn đề như sau:

1. MapReduce: Ứng viên sẽ thực hiện yêu cầu code một đoạn nhỏ trên giấy, trên máy tính hoặc thậm chí bảng trắng về MapReduce. Thách thức đặt ra: Đọc số lượng chữ xuất hiện trong một câu? 

2.Tối ưu hóa Spark Job: 1 Spark Job với 1 column với format tương đương là year/month/day. Thách thức đặt ra: Hãy chuyển sang 3 column khác nhau ngày/tháng/năm. Điều kiện đi kèm: Spark Job được xử lý trên một nguồn dữ liệu nặng 50 TB. Đồng thời, ứng viên cần đảm bảo Spark Job được chạy với thời gian ít nhất.

3. Schema: Ứng viên được cung cấp 1 schema. Và toàn bộ thông tin của schema đó. Thách thức đặt ra: Thiết kế một Data Mark hoặc Data Warehouse với các yêu cầu tương ứng a,b,c,…

Nếu vượt qua vòng 3, các ứng viên sẽ được gặp Hiring Manager. Ứng viên sẽ được đánh giá về tính cách, khả năng đồng hành và phát triển với team. Sau cùng, nhân sự liên lạc chính thức với ứng viên để thương lương về lương và kế hoạch làm việc chi tiết. 

Lời kết

Quy trình phỏng vấn tuyển dụng Data Engineer có thể thay đổi tùy vào các vị trí tuyển dụng. Nếu vị trí là fresher, kiến thức nền tảng và khả năng học hỏi sẽ được chú trọng nhiều hơn. Nếu vị trí cần tuyển là junior hoặc mid-level, tính trải nghiệm thực tế lại là yếu tố được nhà tuyển dụng ưu tiên khai thác. Do vậy, yêu cầu tuyển dụng sẽ khắc khe hơn.

TopDev hi vọng với những chia sẻ từ bài viết, các ứng viên sẽ có những hình dung cơ bản về quy trình tuyển dụng. Từ đó, các bạn sẽ có sự chuẩn bị kỹ lưỡng nhất cho cuộc phỏng vấn của mình.


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 IT trên TopDev

Công nghệ Cloud: Bối cảnh sử dụng Cloud & kinh nghiệm làm việc với AWS, IaC

Công nghệ Cloud tuy chỉ mới phổ biến ở Việt Nam những năm gần đây, tuy nhiên tại Singapore, cloud đã được triển khai rộng rãi. Hãy cùng tìm hiểu về bối cảnh, kinh nghiệm và lợi ích mà cloud, infrastructure as code mang lại qua buổi trò chuyện cùng anh Tuấn Lê – Cloud SA @Orient Software.

Về khách mời

  • Anh Tuấn Lê, hiện là Cloud Solution Architect của Orient Software – một công ty chuyên về Software Development.
  • Công việc Cloud SA của anh hiểu cơ bản là Solution Architect trên cloud, những thứ mà anh thiết kế hoàn toàn xoay quanh cloud.
  • Anh Tuấn có hơn năm kinh nghiệm 10 năm làm về Solution Consultant và hiện tại vừa chuyển qua in-house ở Orient Software được 1 năm..
  Ginco đã sử dụng và tối ưu Cloud Functions như thế nào
  Business Intelligence (BI) là gì? Trò chuyện cùng chuyên gia Trường Phan để hiểu hơn về vai trò của BI trong hệ thống

Cung & Cầu trong mảng Cloud Consulting Việt Nam ra sao?

Hiện tại, những công ty đang sử dụng cloud ngày càng xuất hiện nhiều, đặc biệt là ở những startup. Còn những công ty chuyên làm về Cloud Consulting thì cũng đã có những cái tên, chẳng hạn như FSoft, tuy nhiên họ làm ở thị trường Nhật là chủ yếu.

Trong quá trình làm Solution Consultant tại Việt Nam và cả ở Singapore, có một điều mình nhận ra khi làm consulting đó là mình không thực sự hiểu về chuyên môn của khách hàng, không hiểu về Software Development Knowledge của khách hàng. Vì vậy khi tư vấn, mình không thực sự sâu sát với những thứ đang diễn ra với khách hàng, cả khách hàng Việt lẫn Sing.

Theo anh, khi xây dựng hệ thống Cloud sẽ có những thách thức nào?

Đầu tiên, Cloud khác hẳn so với on-premise ở chỗ tất cả những dịch vụ sử dụng (theo các best practices) đều đã có sẵn. Tuy nhiên, thách thức lớn nhất là làm sao để biết tất cả những dịch vụ ấy, mỗi cái dùng để làm gì. Riêng như AWS khoảng 200 services và features sử dụng là khoảng 7000 cái. Bạn buộc phải biết tất cả những thứ đó để làm gì, mức độ làm như thế nào, có thể thay thế bằng alternative solutions (giải pháp thay thế) nào khác hay không hay là bản thân nó dùng đủ tốt rồi.

Trong nhiều trường hợp, bạn buộc phải tuân theo best practices để research và test xem hiện tại nó đã adapt theo nhu cầu của mình ra làm sao. Nghĩa là nhu cầu của bạn phải có trước và bạn phải tự định nghĩa nhu cầu ấy thật chi tiết về mặt kỹ thuật. Tóm lại là bạn sẽ không phải tự hỏi là mình đang cần cụ thể một giải pháp gì, mà câu hỏi sẽ là setup như vậy để làm việc gì.

Còn để làm được việc đó trên Cloud sẽ có nhiều phương án:

  • Hoặc là phương án server-based
  • Hoặc là cái phương án trên một service có sẵn
  • Hoặc là một phương án third-party nào đó

Mình sẽ chọn những phương án này sau. Vấn đề trước mắt là làm sao để biết được cái nào đang có sẵn để lựa chọn. Bởi vì một trong những ưu điểm của Cloud là khả năng tích hợp và đưa bất kỳ phương án nào rất là nhanh, và gọn, và biết nó tồn tại để bạn có thể sử dụng.

Ví dụ như với một số dịch vụ về AI/Maching Learning, như Speech to Text chẳng hạn. Thì trong phần lớn trường hợp là bạn sẽ phải tự build platform bằng một số workload bên dưới để training trước, tìm nguồn để mà train và rồi sau đó là chạy. Còn khi đã đưa lên cloud rồi thì top 3 Cloud như AWS, Google Cloud Platform và Azure luôn có sẵn rất nhiều dịch vụ. Bạn chỉ cần đẩy dữ liệu qua API xuống, họ đã train sẵn, mình chỉ việc dùng thôi.

Nói một cách đơn giản, mình chỉ việc đẩy API xuống vào file audio đó và mình sẽ có file text ra. Vấn đề ở chỗ là dùng service đó nó có chất lượng đủ tốt với mình hay chưa, và một số cái liên quan, chẳng hạn như chi phí đã phù hợp với dự án của mình hay chưa.

Xem thêm: “Cơ hội phát triển sự nghiệp AI với các ngành nghề là tương đồng” – Bảo Đại, AI Researcher tại Knorex

Vậy nếu mình muốn extract audio tiếng Việt hoặc ngôn ngữ khác ít resource thì mình làm như thế nào ạ?

Thực ra, đây là một vấn đề liên quan đến PM (Project Management) nhiều hơn là liên quan đến cloud.

Khi mình đã có những dịch vụ có sẵn và biết được mỗi dịch vụ đó nó đáp ứng như thế nào. Ví dụ Transcribe của AWS đang có sẵn tiếng Anh rồi. Trong trường hợp đó thực sự là công việc của PM; có nghĩa là mình phải test xem phương án nào đáp ứng được đúng nhu cầu của mình hơn là cố pushing là một cái cloud nào đang phù hợp với khách hàng, đó không phải là vấn đề.

Anh có thể chia sẻ một vài service của AWS mà anh hay sử dụng được không ạ?

Trước đây, khi làm cho những công ty Cloud Consultant bên Singapore thì gần như khách hàng dùng cái nào, mình sẽ research trước để tư vấn (như về server-based, serverless, Transcribe,…), và mình phải làm rất nhiều về network và security bởi vì hầu như tất cả các doanh nghiệp ở đây họ đều quan tâm đến network và security. Như về việc nó sẽ chuyển đổi kết nối giữa hệ thống mạng của công ty và cloud như thế nào; Còn security thì nó liên quan đến tiền bạc và một số quy tắc phải tuân thủ rồi.

Hiện tại, khi đã chuyển qua công ty software thì mọi thứ lại đi sâu hơn rất nhiều vào các service hỗ trợ dev.

Ví dụ như:

  • Về S3 cách sử dụng, resign URL trên đó, làm sao để lấy file và upload một cách bảo mật, hệ thống CDN CloudFront
  • Một số service thuần riêng của dev thì có một số service về message là SQS, rồi một số service gửi email, notification và có cả Elasticsearch… rất nhiều.

Hầu như đều xoay quanh các service của dev sẽ chạy như thế nào, trên cloud có sẵn sẽ làm những thứ đó.

Những trải nghiệm “nhớ đời” cùng các Service của Cloud?

Trước đây, phần lớn khách hàng có xu hướng sử dụng server-based. Họ xem EC2 instance như là một cloud server bình thường. Họ tự cài đặt trên đó và họ tận dụng cái phần của cloud (môi trường) vì đơn giản nó liên quan và có sẵn để chạy.

Về kinh nghiệm sử dụng, khi anh làm in-house tại Orient Software thì mọi thứ đang dần chuyển dịch rất nhiều từ phía cloud server sẽ bắt đầu chuyển sang container, Docker như thế nào… nên bắt buộc phải sử dụng những dịch vụ Container as Service như là EKS, ECS trên AWS. Hiện nay, với định hướng mà container đang theo là serverless, mọi thứ đều chạy trên service hết. Không có quản lý trên server nào cả. Thế thì, một cái kinh nghiệm là gần như bạn phải có một cái nhìn tổng thể rằng là những thứ mình đang làm, khi chuyển đổi sang serverless thì nó sẽ như thế nào. Có một số thứ sẽ cần lưu ý, ví dụ như không bị attached quá nhiều vô một phiên bản software nhất định nào đó chẳng hạn. Ví dụ cố gắng là dùng những standard protocol hoặc standard configuration thì việc chuyển đổi sẽ tốt hơn rất nhiều.

Cái thứ 2 là phải luôn đảm bảo một số tiêu chuẩn, chẳng hạn như hệ thống của bạn phải sẵn sàng có thể được clone, được scale bằng cách nào đấy. Thì những thứ liên quan đến log hay một số thông tin, một số loại storage khác là bắt buộc bạn phải tách riêng độc lập ra để có thể sẵn sàng cho việc sử dụng những dịch vụ ngoài chứ không chỉ dồn hết vào một node. Một số kinh nghiệm cơ bản mình chia sẻ là như thế.

Có một “bài học” mà anh muốn chia sẻ với mọi người khi làm việc với AWS không?

Khi còn làm bên Singapore, lúc ấy là làm dịch vụ billing – nghĩa là bên công ty anh sẽ trả tiền cho AWS và sẽ charge bill khách hàng như kiểu hóa đơn đỏ. Lúc ấy là anh làm cho một khách hàng thôi, là một MNC ở Singapore, Ấn Độ và Hàn Quốc.

Câu chuyện là vào thời điểm ấy, khi bên mình chưa kịp làm dịch vụ security và optimization hay bất kỳ thứ gì cho họ thì đã xuất hiện một sự cố. Đó là một user của họ để upload lên S3, nhưng trong cấu hình, user này là để full quyền admin. Thông tin đăng nhập của user đó (access key & secret key) bị lộ và đột nhiên cuối tháng cái bill bình thường của họ bị tăng thêm $10.000 và họ không biết làm sao cả.

Thì lúc này, client họ phải request partner gần nhất thôi là công ty billing – công ty anh. Sau khi research một vòng, coi cái log audit lại thì phát hiện ra họ bị lộ vấn đề như vậy. Lúc này có 2 vấn đề cần xử lý, một là phải khắc phục sự cố ngay. Người mà đã lấy access key & secret key đó, họ cũng hiểu về AWS và họ làm một việc là đến cái region ở châu u và tạo một đống EC2 để mining Bitcoin. Họ làm như vậy gần như là một động tác rửa tiền một cách hoàn hảo, bởi vì không thể nào truy vết được ai làm gì, như thế nào, ở đâu hết. Nó sẽ chuyển thẳng vô phần chi phí của phía khách hàng bị hack account và bill thì vẫn do công ty bên này chịu.

Bởi vì cách thiết kế của AWS là khi mình view một cái region này thì không thấy thông tin của region khác cho nên khi khách hàng chỉ coi 3 cái region ở châu Á thôi là sẽ không biết bất kỳ việc gì xảy ra ở region ở châu Âu cả.

Sau đó việc cuối cùng cần làm là xử lý lại, gọi là “xây chuồng lại sau khi đã mất bò”, thì nó đơn giản. Đó là bắt đầu apply một số security alert về tiền bạc, đảm bảo giới hạn quyền thấp nhất cho tất cả các function, các user, đặt cảnh báo về chuyện tiền bạc rồi có mở thêm cái audit log của tất cả các nơi. Nhưng đây vẫn là chuyện đơn giản. Việc phức tạp hơn rất nhiều đó là phải giải trình với AWS là tôi đã bị hack và để AWS trả lại số tiền đó. Nghĩa là mình vẫn phải trả số tiền đó trước và sau khi đã giải trình xong, AWS sẽ claim lại bởi việc này là vẫn có thể đáp ứng được. Nhưng có nhiều trường hợp nó phức tạp ở chỗ là bạn phải giải trình toàn bộ sự việc bằng văn bản kỹ thuật.

Vậy cuối cùng nó có thành công không ạ?

Và cuối cùng, case này đã thành công. Bởi vì AWS, anh đã từng làm việc nhiều với họ, họ không làm việc quá máy móc nguyên tắc mà chỉ đơn giản dựa trên kết quả cuối cùng. Nếu thật sự bạn thể hiện được case đó là khách hàng bị hack và partner hỗ trợ khách hàng show tất cả mọi thứ bằng evidence (chứng cứ) đầy đủ là được. Nó chỉ khó ở chỗ là làm đúng thủ tục và chứng minh qua những chứng cứ đó.

Có những công nghệ thú vị nào mà anh muốn chia sẻ cùng mọi người không?

Đó là Infrastructure as Code & Terraform.

Có một điều thú vị anh nhận thấy khi mới qua Singapore làm việc, đó là ngoại trừ các công ty MNC – họ đem toàn bộ adaptation có sẵn từ phía headquarter về Singapore làm, thì những người bên đó đã biết quá rành về Cloud và mọi thứ bên đó diễn ra như thế nào rồi. Còn đối với những công ty ở Singapore mà họ chỉ mới bắt đầu muốn sử dụng Cloud, thì mức độ adaptation ở những công ty này tại Singapore không hơn Việt Nam là mấy, nếu có hơn thì cũng chỉ hơn về số lượng, như các dự án làm rất nhiều thôi, còn về mức độ hiểu và sẵn sàng adapt Cloud thì giống hệt với VN thôi.

Câu chuyện là như lúc trước, sau khi làm optimization và propose, là một số activity mà công ty có thể làm cho khách hàng như: Professional Service thì sẽ charge thêm manday qua đó trên cái web console click kéo thả, cấu hình gì đấy để tương ứng, và sau đó screenshot lại các bước lại gửi cho khách hàng; Việc này cũng có thể tạm gọi là nhanh hơn so với cách cũ trên on-premise: phải cài đặt server, đưa server đến. Tuy nhiên, từ khi anh sử dụng Infrastructure as Code (IaC) thì các dự án thường từ mất vài ngày để thực hiện, nay nó chỉ mất vài tiếng để code Infrastructure, vài phút để plan và chạy.

IaC đem lại sự hiệu quả khủng khiếp, ít nhất là đối với Cloud Consulting. Ngoài ra còn rất nhiều lợi ích khác như nó sẽ không bị phụ thuộc vào 1 người. Ví dụ: anh có 2 người, làm 2 dự án cùng lúc. Nhưng khi chạy được code như vậy, 10 dự án hay 100 dự án nó vẫn chạy được.

Thứ hai nữa là về thời gian, nó sẽ nhanh hơn, một số ví dụ như về version, versioning như có làm sai thì việc rollback lại là việc cực kỳ dễ dàng.

Tiếp đến là về Document.

Document cũng đơn giản vì không cần screenshot các thao tác. Bởi thực ra, việc screenshot thao tác chỉ là để chứng minh tôi đã thực hiện đầy đủ dự án, chỉ vậy thôi. Còn việc document hóa toàn bộ những cái phần code và giải trình lại nó dễ hơn rất nhiều.

Sau đó khi làm việc tiếp một dự án của chính phủ Singapore, một điều thú vị là do đặc trưng địa lý của Singapore, toàn bộ cloud đã có ở Singapore, chính phủ Singapore khuyến khích sử dụng cloud rất mạnh. Toàn bộ các dự án, ít nhất là từ năm đó đều phải sử dụng cloud hết, không một dự án nào được triển khai ở các center. Vào thời điểm đó, có một điều khá buồn cười là trước những năm khoảng 2010s muốn sử dụng workload trên cloud phải giải trình bằng văn bản, nhưng hiện tại thì ngược lại, nếu còn triển khai trên data center là phải phải trình ngược lại.

Để hỗ trợ cho toàn bộ mọi thứ diễn ra suôn sẻ, Singapore đã hình thành một công ty GovTech. Họ hỗ trợ và audit các dự án để đưa lên cloud. Lúc ấy, Singapore đưa ra 1 framework là Government Commercial Cloud Infrastructure (GCCI), nghĩa toàn bộ tất cả các dự án chính phủ phải tuân theo framework đó. Nó bao gồm 1 bộ tiêu chuẩn gồm: các cách thiết kế bắt buộc phải có, các cách làm việc quy chuẩn phải có, đảm bảo traffic không bị lộ, dữ liệu không bị thất thoát, toàn bộ traffic phải được kiểm soát….

Lúc này, Singapore bắt buộc áp dụng một quy trình làm việc cực kỳ mới đó là toàn bộ các dự án triển khai phải bằng Infrastructure as Code. Tức là việc triển khai (cài đặt, cắm, gõ…) sẽ không còn do con người can thiệp nữa mà gần như là đưa vào khoảng code => bên phía GovTech review => nếu được thì mới triển khai. Nhờ vậy, mọi thứ trở nên nhanh chóng nhờ Infrastructure as Code. Bởi gần như, có những thứ chỉ IaC mới có thể làm được như vậy.

Còn nếu làm theo cách bình thường, tức là thuê một team vào làm, rồi phải cử một người review, xem ai đang làm gì thì nó sẽ tốn thời gian rất nhiều và khó rollback được khi có sự cố xảy ra.

Trước khi làm cùng Cloud cần biết những gì?

Mới đây, anh có phỏng vấn một số bạn cho vị trí DevOps thì thấy có những suy nghĩ của nhiều bạn chưa hợp lí lắm khi sử dụng dịch vụ Cloud là như thế này: Các bạn vẫn còn tìm cách manual quá nhiều.

Đối với cloud thì gần như mọi thứ, nó đã có API sẵn và có thể programming được, thì điều này đồng nghĩa việc chúng ta có thể automation được mọi thứ. Đặc biệt, điều cơ bản nhất là bạn phải biết cách để cài đặt package cho phía server chạy được.

Bạn sẽ phải viết mọi thứ thành bash script, đẩy vào user data của EC2 để sau đó tự cài đặt mọi thứ đó lên và chỉ việc review xem nó chạy có đúng hay không. Điều này sẽ hạn chế tối đa việc phải remote SSH vô từng server để cài đặt. Tất nhiên có những cái tool đã làm điều đó rất tốt rồi, giống như Ansible. Nhưng với cái cách thiết kế của cloud, bạn sẽ không cần phải làm những cái manual đó nữa. Cho dù manual đó đã tự động hóa bằng một configuration management rồi nhưng điều đó cũng không cần thiết.

  Top 20 chứng chỉ IT được săn đón nhất trong ngành CNTT

Tiếp theo cần hiểu một xu hướng compute nó thay đổi và nâng dần. Trong cách thiết kế ngay từ đầu, cần phải gỡ từng workload ra. Ví dụ như storage, service này là phải tách riêng ra như thế nào. Điều này cũng giống như triết lý của monolithic chuyển sang microservice nhưng mà nó ở cơ chế rộng hơn, mở rộng hơn cho toàn bộ system. Ví dụ như là log có thể ghi được rất nhiều và cũng có thể ghi thêm một hệ thống khác, như cloud chẳng hạn.

Bên cạnh đó, có một điều bạn cần biết thêm nữa, đó là security và monitor trên cloud rất là rẻ. Nó rẻ bởi vì với một quy mô nhất định, nếu triển khai on-premise cho performance chừng đó về monitor và lâu chừng đó thì phải đâu đó $x00,000 cho một cái dự án như vậy, cho vài năm. Trong khi ở trên cloud chỉ tốn nhiều nhất vài chục đô đến vài trăm đô/tháng cho toàn bộ với quy mô chừng đó. Thì đó cực kỳ hiệu quả và nên tận dụng càng sớm càng tốt, càng nhiều càng tốt. Bởi vì nó available nhưng không có nghĩa nó turn on by default. Mình phải biết và phải turn on nó trước, để khi mà có sự cố, mình có thể coi lại log, coi lại bất cứ thứ gì để kiểm tra được ngay.


Về công ty Orient Software Development

  • Công ty Orient Software Development đã thành lập được 15 năm và hoạt động chuyên về Software Development trên web và mobile.
  • Thành công nhất là về các mảng AI, Machine Learning, IoT cho khách hàng, đặc biệt ở Châu Âu và Mỹ. Hiện tại anh Tuấn cùng công ty đang thực hiện một dự án cùng chính phủ Singapore.
  • Orient Software đang mở rộng mảng Cloud Consultant tại Việt Nam, cụ thể là AWS. Chuyên hỗ trợ khách hàng về Cloud Transformation Journey: từ hệ thống On-premise đang sử dụng như thế nào, lên cloud sẽ chuyển đổi ra làm sao, tối ưu trên cloud, quan trọng nhất là về Cost Optimization và Cloud Security.

Cảm ơn anh vì những chia sẻ với khán giả của TopDev TV!

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

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