Home Blog Page 139

Cover Letter cho Dev là gì? Tips nâng cấp Cover Letter dành cho Developer

Cover Letter cho Dev
Cover Letter cho Dev

Cover Letter chuẩn Dev sẽ như thế nào? Nhiều ứng viên ngành IT cảm thấy khó khăn trong việc tìm kiếm một Cover Letter cho Dev với một format chuyên nghiệp. Vậy Cover Letter cho Developer là gì và đâu là những điểm cần lưu ý? Cùng TopDev điểm qua bài viết sau để giải đáp các thắc mắc đấy

Thế nào là Cover Letter cho Dev?

Cover Letter (hay còn gọi là Thư xin việc), là một loại văn bản được xây dựng dưới hình thức một trang. Cover Letter cho Dev truyền tải các thông tin về cá nhân, năng lực, trình độ, mục tiêu phát triển ngành lập trình đến với nhà tuyển dụng. 

Cover Letter
thư xin việc – Cover Letter  được hiểu như thế nào?

Chất lượng của một Cover Letter cho Developer sẽ quyết định 30-50% kết quả ứng tuyển. Điều đó cho thấy, cần đầu tư cho chiếc Cover Letter của mình sao cho chỉn chủ nhất. Đừng xem thường vai trò của Cover Letter cho Dev. Vì biết đâu bạn sẽ bị “out” vì sự hời hợt đối với nó đấy!

Cover Letter không chỉ phản ánh bạn là ứng viên Developer phù hợp mà còn cho trong nhiều trường hợp, nó còn thể hiện bạn là người không phù hợp với vị trí đó.

Tips nâng cấp Cover Letter cho Developer

Hãy lưu tâm các tips sau để Cover Letter của bạn không trở nên quá tệ hại trong mắt nhà tuyển dụng.

CV ngành IT
Tips viết CV giúp ứng viên có thêm bí quyết hoàn thiện Cover Letter Developer

Cover Letter bám sát tính trọng tâm về nội dung

Ứng viên IT nên chú trọng đến việc chia sẻ về các thông tin quan trọng. Tránh liệt kê những nội dung thừa thải, không liên quan. Điều đó chứng tỏ bạn là người thiếu sự nhìn nhận, sàng lọc và phân tích thông tin.

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

Nội dung cần được triển khai theo format chuẩn và đúng định hướng. Không dài dòng, dàn trải với nhiều thông tin lan man, thiếu tính kết nối. Sự rời rạc về nội dung khiến giá trị của Cover Letter cho Developer bị giảm đi. 

Trọng tâm còn nằm ở chỗ vấn đề ứng viên chia sẻ các kỹ năng cần thiết cho vị trí ứng tuyển. Đừng nói quá và phô trương quá nhiều kỹ năng. Bạn cần nhớ là nhà tuyển dụng cần chất lượng hơn số lượng.

Số liệu thực minh chứng cho các trải nghiệm trong Cover Letter 

Những minh chứng rất quan trọng. Nhà tuyển dụng sẽ có ấn tượng hơn với nhiều ứng viên trình bày rõ ràng các minh chứng về các trải nghiệm của mình. 

Đó có thể là:

+ Số liệu cho thấy tốc độ tăng trưởng dưới sự phồi hợp giải quyết các công việc giữa bạn và team trong một dự án.

+Lời đánh giá chuyên môn.

+ Các thành tích, giải thưởng từ quá trình phân tích, nghiên cứu chuyên sâu.

Kiểm tra lại nội dung Cover Letter cho Dev

Khó có thể nói có một công thức chung nào để được gọi là sự ấn tượng. Thế nhưng, việc rà soát lại các lỗi trong Cover Letter sẽ giúp cho thư xin việc IT được nâng cấp một cách toàn diện hơn.

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

Định dạng Cover Letter đã đúng hay chưa? Một điều lưu ý là Cover Letter cho Dev không quá nhiều chữ. Khoảng cách lề chuẩn là từ 1’’- 1,5’’.

Dù cho bạn viết CV ngành IT, CV IT tiếng anh (CV English IT), CV cho sinh viên IT mới ra trường (CV IT student), CV IT Developer hay CV dành cho Senior Developer,… bạn vẫn nên quan tâm đến vấn đề văn phong và giọng điệu.  

Không nên dùng những từ ngữ quá phức tạp, có sắc thái biểu đạt quá cao. Điều này làm giảm đi tính hiệu quả của Cover Letter cho Developer . Thay vào đó hãy ưu tiên dùng các từ ngữ đơn giản, dễ hiểu. Ứng viên cần lượt bỏ đi những thông tin không quan trọng. Vì đôi khi, quá nhiều nội dung sẽ khiến nhà tuyển dụng khó nắm bắt được những điều bạn muốn truyền tải trong Cover Letter cho Dev.

Gợi ý các mẫu template Cover letter/mẫu thư xin việc cho Dev

Tải ngay những mẫu CV đẹp dành cho lập trình viên tại đây

CV cho sinh viên IT mới ra trường
M1 – Cover Letter
Cover Letter
M2 – Cover Letter

Khi đã đủ tự tin, bạn hãy chuẩn bị một chiếc CV IT thật chất lượng. Đừng chần chờ mà không nắm bắt cơ hội trải nghiệm việc làm IT tại TopDev.

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

Xem thêm Jobs Developer trên TopDev

“Quyền năng” dữ liệu trong Kỷ nguyên mới?! | VWS2020

Vietnam Web Summit 2020 (VWS2020) với hàng loạt chủ đề hấp dẫn về tính “quyền năng” của dữ liệu đặc biệt trong thời đại Digital Transformation! Sự phát triển mạnh mẽ và ứng dụng công nghệ đa dạng vào trong đời sống tạo ra một lượng lớn dữ liệu khách hàng, tạo nên những câu chuyện và rồi lại tác động trở lại đến quyết định của nhiều tổ chức, doanh nghiệp. Tuy nhiên trong thực tế, liệu những câu chuyện được kể bởi dữ liệu có phản ánh toàn bộ thực tế? Dữ liệu có phải là một ‘đấng toàn năng’ và chi phối mọi quyết định của doanh nghiệp?

Hãy để các diễn giả của Vietnam Web Summit 2020 giúp bạn ‘tỏ tường’ hơn về quyền năng của dữ liệu và lý do dữ liệu không phải là toàn năng. Ai sẽ thực hiện điều này?

  Lộ diện những "nhân vật" đầu tiên góp mặt tại Vietnam Web Summit 2020 | VWS2020
◸Mr. Nguyễn Tấn Triều
CEO @USPA Technology Company◿

Câu trả lời mà bạn đang tìm kiếm có thể sẽ được tìm thấy dưới góc nhìn của “dataism”. Thông qua topic “Thinking with Dataism and LEO Customer Data Platform”, anh Nguyễn Tấn Triều sẽ cho bạn một góc nhìn tổng quan về ‘tôn giáo’ này cùng phương pháp LEO CDP.

◸Ms. Đặng Huỳnh Mai Anh
Data Science Manager @Amanotes◿

Tự thân dữ liệu không thể tạo ra câu chuyện nếu không có bàn tay của con người. Trong topic “Data Quality Control System – what it is and how it is employed in a music-tech company”, chị Đặng Huỳnh Mai Anh sẽ “bật mí” cách tận dụng triệt để loại ‘quyền năng’ này với một Data Quality Control System – một ‘cỗ máy’ quản trị chất lượng dữ liệu của một công ty đã chạm đến con số 1 tỷ lượt tải ứng dụng và với 95 triệu MAU.

◸Mr. Nghiêm Xuân Bách
Vietnam Country Manager @Cinnamon AI◿

“Data never sleep” – dữ liệu luôn được sản sinh liên tục, vì lẽ đó một Data Harvest Loop sẽ là giải pháp cho các doanh nghiệp. Để hiểu rõ hơn Data Harvest Loop là gì, doanh nghiệp sẽ ứng dụng như thế nào trong quá trình chuyển đổi, hãy để anh Nghiêm Xuân Bách tiết lộ cho bạn.

◸Ms. Kelly Tran
Client Partner – Monetization @Unity Technologies◿

Ở giai đoạn cuối cùng của quá trình chuyển hóa dữ liệu, chị Kelly Tran sẽ giải đáp lý do vì sao đôi lúc dữ liệu lại ‘nói dối’ với bạn, đặc biệt trong lĩnh vực gaming, thông qua topic “Why A/B testing by data go wrong in gaming”.

Với lượng topic lên đến con số hàng trăm, xoay quanh 6 nhóm chủ đề liên quan đến công nghệ web, VWS2020 hứa hẹn là điểm hẹn công nghệ hoành tráng nhất cuối năm 2020, nơi các tech-guys gặp gỡ và chia sẻ về những ứng dụng công nghệ mới và đón đầu xu hướng trong giai đoạn 5 năm tiếp theo!

==

Vietnam Web Summit 2020: LEAD THE AGE OF REVOLUTION TECHNOLOGIES

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

► Tìm hiểu thêm: www.vietnamwebsummit.com
► Hồ Chí Minh: 11/12/2020 | Hà Nội: 18/12/2020

Giới thiệu IDE phổ biến trong lập trình Python

Giới thiệu IDE phổ biến trong lập trình Python

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

IDE là gì?

IDE là viết tắt của Integrated Development Environment (môi trường phát triển tích hợp) được định nghĩa là một công cụ mã hóa giúp tự động hóa quá trình chỉnh sửa, biên dịch, kiểm thử mã nguồn và nó giúp nhà phát triển dễ dàng chạy, viết và debug code.

Nó được thiết kế đặc biệt để phát triển phần mềm bao gồm một số công cụ được sử dụng để phát triển và kiểm thử phần mềm.

Giới thiệu IDE phổ biến trong lập trình Python như sau:

  • PyCharm
  • Spyder
  • PyDev
  • Atom
  • Wing
  • Jupyter Notebook
  • Thonny
  • Rodeo
  • Microsoft Visual Studio
  • Eric
  Python là gì? Tổng hợp kiến thức cho người mới bắt đầu

PyCharm

PyCharm được phát triển bởi Jet Brains và đây là môi trường phát triển tích hợp đa nền tảng (IDE) được thiết kế đặc biệt cho Python. Đây là IDE được sử dụng rộng rãi nhất và có sẵn ở cả phiên bản trả phí và nguồn mở miễn phí.

PyCharm là một IDE Python hoàn hảo với một các tính năng phong phú như tự đồng hoàn thiện code, điều hướng project nhanh, test và debug nhanh, hỗ trợ phát triển từ xa, khả năng truy cập cơ sở dữ liệu, v.v.

Tính năng, đặc điểm:

  1. Điều hướng mã thông minh
  2. Đánh dấu lỗi
  3. Trình gỡ lỗi (debug) mạnh mẽ
  4. Hỗ trợ các framework phát triển web Python, ví dụ, Angular JS, Javascript

Tuyển python lương cao không yêu cầu kinh nghiệm

Spyder

Spyder là một công cụ mã nguồn mở có sự công nhận cao trong thị trường IDE và phù hợp nhất với khoa học dữ liệu. Tên đầy đủ của Spyder là môi trường phát triển Python khoa học. Nó hỗ trợ tất cả các nền tảng quan trọng Linux, Windows và MacOS X.

Nó cung cấp một tập hợp các tính năng như trình soạn thảo mã cục bộ, trình xem tài liệu, trình thám hiểm biến, bảng điều khiển tích hợp, v.v. và hỗ trợ các mô-đun khoa học như NumPy, SciPy, v.v.

Tính năng, đặc điểm:

Làm nổi bật cú pháp đúng và hoàn thành mã tự động
Tích hợp mạnh mẽ với Python console
Hoạt động tốt trong chế độ chỉnh sửa đa ngôn ngữ và chế độ hoàn thành mã tự động
PyDev
PyDev được định nghĩa là một trong những IDE Python thường được sử dụng, là một plugin bên ngoài cho Eclipse. Đó là một lựa chọn tự nhiên của các nhà phát triển Python đến từ nền tảng Java và rất phổ biến trên thị trường với tư cách là trình thông dịch Python.

Pydev có một tính năng bao gồm tích hợp Django, hoàn thành mã tự động, thụt lề thông minh, v.v.

Tính năng, đặc điểm:

  1. Các tham số mạnh như tái refactor, debug, phân tích mã và chức năng bao phủ mã.
  2. Nó hỗ trợ các môi trường ảo, Mypy và định dạng màu đen.
  3. Cũng hỗ trợ tích hợp PyLint, trình debug từ xa, tích hợp unit test, v.v.

Atom

Atom được phát triển bởi GitHub, ban đầu được bắt đầu như một nguồn mở, đa nền tảng. Nó dựa trên một framework, nghĩa là nó cho phép ứng dụng máy tính để bàn cross-platform sử dụng Chromium và Node.js và thường được gọi là “Text Editor Hack cho thế kỷ 21 st

Tính năng, đặc điểm:

  1. Trực quan hóa kết quả trên Atom mà không cần mở bất kỳ cửa sổ nào khác.
  2. Một plugin có tên “Markdown Preview Plus” cung cấp hỗ trợ tích hợp để chỉnh sửa và hiển thị các tệp Markdown.
  Một số thủ thuật hay trong Python

Wing

Nó được định nghĩa là một IDE đa nền tảng được tích hợp các tính năng cần thiết và hỗ trợ phát triển tốt. Phiên bản cá nhân của nó là miễn phí. Phiên bản pro đi kèm bản dùng thử 30 ngày.

Nó có một số tính năng bao gồm tự động hoàn thành code, highlight cú pháp, thụt lề và debug.

Tính năng, đặc điểm:

  1. Có phần tùy chình và cũng có thể mở rộng.
  2. Hỗ trợ phát triển từ xa, test-driven development cùng với kiểm thử đơn vị.

Jupyter Notebook

Jupyter là một trong những trình soạn thảo sổ ghi chép IPython được sử dụng nhiều nhất được sử dụng trong ngành Khoa học dữ liệu. Nó là một ứng dụng web dựa trên cấu trúc máy chủ-máy khách và cho phép bạn tạo và thao tác với các tài liệu sổ ghi chép.

Tính năng, đặc điểm:

  1. Hỗ trợ đánh dấu
  2. Dễ dàng tạo và chỉnh sửa mã
  3. Lý tưởng cho người mới bắt đầu trong khoa học dữ liệu

Thonny

Thonny là một IDE khác phù hợp nhất cho việc học và dạy lập trình. Nó là một phần mềm được phát triển tại Đại học Tartu và hỗ trợ hoàn thành mã và đánh dấu các lỗi cú pháp.

Tính năng, đặc điểm:

  1. Trình debug đơn giản
  2. Hỗ trợ đánh dấu lỗi và hoàn thành mã tự động

Rodeo

Rodeo được định nghĩa là một trong những IDE tốt nhất cho python được sử dụng rộng rãi nhất cho các dự án khoa học dữ liệu như lấy dữ liệu và thông tin từ các tài nguyên khác nhau.

Nó hỗ trợ chức năng đa nền tảng và cung cấp tự động hoàn thành mã.

Tính năng, đặc điểm:

  1. Cho phép các chức năng so sánh dữ liệu, tương tác, vẽ đồ thị và kiểm tra dữ liệu.
  2. Hoàn thành mã tự động, highlight cú pháp, trình điều hướng tệp trực quan, v.v.

Microsoft Visual Studio

Microsoft Visual Studio là một trình soạn thảo mã nguồn mở phù hợp nhất để phát triển và gỡ lỗi các dự án web và đám mây mới nhất. Nó có thị trường riêng cho các phần mở rộng.

Tính năng, đặc điểm:

  1. Hỗ trợ mã hóa Python trong Visual studio
  2. Có sẵn ở cả phiên bản trả phí và miễn phí

Eric Python

Eric Python là một trình soạn thảo được phát triển bằng chính Python và có thể được sử dụng cho cả công việc chuyên nghiệp và không chuyên nghiệp.

Tính năng, đặc điểm:

  1. Cung cấp bố trí cửa sổ cấu hình, editor
  2. Khả năng quản lý dự án nâng cao, kiểm soát phiên bản
  3. Trình debug tích hợp và hỗ trợ quản lý tác vụ

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

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

MySQL: case vs. if vs. if function

mysql

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

Bạn đã bao giờ tự hỏi: Trong MySQL, câu lệnh CASE, câu lệnh IF và hàm IF khác nhau thế nào? Bạn có thấy phân vân khi chọn một trong ba thứ trên để viết query? Đây không phải câu hỏi mới nhưng nhiều bạn sẽ bỡ ngỡ khi tiếp xúc với nó. Nhất là khi bạn vừa bắt đầu tìm hiểu về MySQL và cơ sở dữ liệu quan hệ.

  Kinh nghiệm vận hành MySQL - Chú ý khi chọn MySQL làm database
  PHP & MySQL: Novice to Ninja, 5th Edition

Nếu bạn muốn tìm hiểu cơ sở dữ liệu là gì và có những loại nào, hãy tham khảo bài viết này.

Cú pháp

Câu lệnh CASE

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

Câu lệnh IF

IF condition1 THEN
   {...statements to execute when condition1 is TRUE...}

[ ELSEIF condition2 THEN
   {...statements to execute when condition1 is FALSE and condition2 is TRUE...} ]

[ ELSE
   {...statements to execute when both condition1 and condition2 are FALSE...} ]

END IF;

Hàm IF

IF(expr1,expr2,expr3)

Đào sâu hơn

Nhìn vào cú pháp trên đây, ta có thể thấy, dường như hàm IF ít linh hoạt hơn câu lệnh CASE. Nếu bạn viết thế này:

SELECT IF(movie = 'The Matrix', 'high', 'low') AS suggestion

Thì bạn hoàn toàn có thể dùng CASE như thế này:

SELECT CASE WHEN movie = 'The Matrix' THEN 'high' ELSE 'low' END AS suggestion

Khá là giống nhau đúng không? Trừ việc hàm IF trông gọn gàng hơn chút ít. Nhưng nếu có nhiều hơn hai nhánh thì sao? Có lẽ bạn sẽ không muốn viết thế này:

SELECT IF(movie = 'The Matrix', 'high', IF(movie = 'Endgame', 'medium', 'low')) AS suggestion

Mà nên là thế này:

SELECT CASE movie 
    WHEN = 'The Matrix' THEN 'high'
    WHEN = 'Endgame'    THEN 'medium'
    ELSE 'low'
END AS suggestion

Nó cũng tương tự như khi ta dùng switch để rẽ nhánh vậy, tự nhiên vào thoải mái hơn rất nhiều.

Có một điều bạn phải chú ý. Trong khi câu lệnh CASE là câu lệnh chuẩn của SQL thì hàm IF lại hoàn toàn không phải. Điều đó có nghĩa gì? Nếu bạn có ý định chuyển sang dùng SQL Server hay PostgreSQL chẳng hạn, hàm IF sẽ không còn hoạt động nữa.

Ở một diễn biến khác, câu lệnh IF là cái gì đó rất lạ lẫm với hai thứ trên. Nó được dùng khi viết thủ tục (procedure). Ví dụ:

CREATE FUNCTION get_suggestion (movie varchar(50))
RETURNS varchar(20)
BEGIN
   IF movie = 'The Matrix' THEN
      return 'high';
   ELSEIF movie = 'Endgame' THEN
      return 'medium';
   ELSE
     return 'low';
   END IF;
END;

Do đó, chớ nên nhầm lẫn mục đích sử dụng của câu lệnh IF với hàm IF, hay thậm chí câu lệnh CASE. Chúng sinh ra vì những “sứ mệnh” khác nhau.

Generate fake UUID cực kì đơn giản

Generate fake UUID cực kì đơn giản

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

UUID là viết tắt của Universally Unique IDentifier. Mình chỉ hiểu đơn giản đây là một mã định danh duy nhất là một số gồm 128bit. Tổng cộng có 32 kí tự chia thành 5 phần cách nhau bởi 4 dấu gạch nối đơn cử

123e4567-e89b-12d3-a456-426655440000

Để generate ra một UUID thì bạn hoàn toàn có thể dùng 1 package nào đó mà khỏi cần nghĩ nhiều, nhưng mình sẽ tự generate ra 1 fake uuid bằng cách random ra một slice byte gồm 16 phần tử (8 bit) và sau đó để cho đẹp mắt thì mình sẽ convert hệ thập phân về base16.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

  10 câu nói cực hay về lập trình

Vì sao là 16 phần tử và base 16. Thứ nhất mình muốn các kí tự trong uuid là chữ hoặc số A-Z 0–9, cộng thêm cty mình đang làm 1 dự án mang tên là HexSafe, mà hex là hexadecimal thập lục phân là 16 luôn. Và nếu số 8bit phân sang base16 thì chỉ tốn hai char nên mình sẽ random 16 số 8 bit.

b := make([]byte, 16)
_, err := rand.Read(b)	
if err != nil {
   return "", err
}

Sau đó mình sẽ lấy 4 số cho phần đầu, tiếp theo là 2,2,2 và cuối cùng là 6 số,

để chuyển qua hex thì quá easy luôn. Có sẵn fmt.Sprintf(“%X”,n) để convert n về base16 dạng in hoa.

fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]), nil

Mình có kết quả sau 3 lần generate

CB0C7CF2-B9C0-9133-0C6B-0EB0380305D8 <nil>
FA18D239-BF14-4D82-B2E6-1000DA7870AF <nil>
EDB05EC8-8AB1-E994-6E7E-67AB30708872 <nil>

Mặc dù là fake uuid, trên lý thuyết là có thể trùng lẫn nhau xác xuất 1/(256¹⁶)
và nếu nó xảy ra thì thôi ý trời :)) đến UUID còn có thể trùng nhau cơ mà.

Đây là full đoạn code gen uuid của mình.

package main
import (
   "crypto/rand"
   "fmt"
)
func main() {
   f.mt.Println(uuid())
   fmt.Println(uuid())
   fmt.Println(uuid())
}
func uuid() (string, error) {
   b := make([]byte, 16)
   _, err := rand.Read(b)
   if err != nil {
    return "", err
   }
   return fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8],b[8:10], b[10:]), nil
}

Happy coding ^_^

Nguồn : https://twitter.com/pliutau

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

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

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

Các cách khai báo function trong JS

Khai báo function trong javascript

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

Khai báo tường minh

Cách khai báo function “vở lòng” mà ai cũng phải biết, sau từ khóa function là tên function chúng ta muốn khai báo

  5 kinh nghiệm khi viết arrow function
  5 điểm khác nhau giữa function thường và arrow function
function foo() {
	console.log(‘vui lap trinh’)
}

Gán function vào một biến

Chúng ta khai báo một biến, gán giá trị của biến này là một function

const foo = function () {
	console.log(‘vui lap trinh’)
}

Với cách này, lưu ý là không dùng function trước khi khai báo, giống như chúng ta không thể dùng một biến mà chưa được khai báo vậy.

foo(); // Uncaught ReferenceError: foo is not defined

const foo = function() {
   console.log(‘vui lap trinh’)

}

Arrow function

Khai báo function bằng dấu => mũi tên, bên trái là params của function, bên phải là phần ruột function

() => console.log(‘vui lap trinh’)

// hoặc bỏ luôn ngoặc kép
[‘An’, ‘luckyluu’, ‘vui’, ‘laptrinh’]
  .filter(name => name.length > 5)
  .map(name => name.toLowerCase())

Lưu ý cho arrow function, sẽ không có

  • object đặc biệt arguments, các function khác sẽ có cái object tên là arguments chứa các tham số truyền vào cho function đó
  • Ko có gọi new (() => {})
  • Không có thissupernew.target

constructor

Ko được khuyến khích sử dụng, đọc cho vui

const myStrangeFunc = new Function("a", "console.log(a + ' with Functions')");
myStrangeFunc("Fun"); // logs --> "Fun with Functions"

3 thằng còn lại, cũng không phổ biến, chưa thấy giá trị sử dụng

  • generator function expression
  • generator function declaration
  • GeneratorFunction constructor

    Nếu có đam mê bạn có thể tìm hiểu thêm

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

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

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

Tổng hợp 15+ CV Template IT đẹp và chuyên nghiệp

CV Template IT
CV Teamplate IT

CV đóng một vai trò rất quan trọng đối với việc thu hút nhà tuyển dụng. Một CV Template IT đúng chuẩn lại giúp gia tăng nhiều hơn các lợi thế ở ứng viên. Vậy liệu dân lập trình IT đã có những hình dung chính xác về CV online IT hay chưa? Cùng TopDev điểm qua top các mẫu CV Template IT (IT CV Template) đẹp chuẩn.

Những lưu ý ban đầu về CV Template IT

Dù đó là CV cho sinh viên IT mới ra trường hay CV ứng tuyển các vị trí Junior Developer, Senior Developer,… bạn vẫn phải đầu tư cho CV IT Developer của mình. Nó là tài liệu quan trọng ghi dấu ấn trong sự nghiệp phát triển của bạn. Đồng thời, dựa trên các thông tin bạn truyển tải, nhà tuyển dụng có thể đánh giá được các tiêu chí về trình độ, năng lực, tiềm năng phát triển,…

  Cách viết CV giúp lập trình viên ghi điểm với nhà tuyển dụng
  5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!

Hãy lưu tâm vấn đề này để CV Template IT của bạn chuẩn format, Phải nhớ nó không giống sơ yếu lý lịch đơn thuần. CV ngành IT nhấn mạnh các giá trị nổi bật về kỹ năng, trình độ chuyên môn, quan điểm – mục tiêu,… 

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

Lợi thế điểm nhấn có thể đến từ các lưu ý về kỹ năng và các khoa học chuyên sâu dưới đây:

Kỹ năng (Skills)

Kỹ năng duy trì các ứng dụng phần mềm khoa học hiện. Phát triển các ứng dụng mới hơn.

Kết nối và chia sẻ kinh nghiệm áp dụng các nguyên tắc, chiến thuật phát triển dựa trên các nền tảng lý thuyết.

Kỹ năng phân tích, xử lý – giải quyết vấn đề.

Kỹ năng giao tiếp 

Đây là các kỹ năng khá quan trọng mà bạn cần bổ sung vào IT CV Template.

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

Các khóa học chuyên sâu (Specialize Courses)

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

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

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

+ An ninh Mạng (Cyber Security)

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

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

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

15+ IT CV Template chuẩn chuyên nghiệp nhất

Mẫu Template IT chuẩn 

CV cho sinh viên IT mới ra trường
M1 – CV Template đa nhiệm
Senior Developer
M2 – CV Template đa nhiệm
CV ngành IT
M3- CV Template đa nhiệm
CV cho sinh viên IT mới ra trường
CV Pro 1
Senior Developer
CV Pro 2
cv ngành IT
M1 – CV cổ điển
CV cho sinh viên IT mới ra trường
M2 – CV cổ điển

IT Programmer CV 

Senior Developer
IT Programmer CV

Data Scientist

CV ngành IT
Data Scientist

Fullstack Developer

CV cho sinh viên IT mới ra trường
Fullstack Developer

CV IT Manager

Senior Developer
CV IT Manager

IT Project Manager

CV ngành IT
IT Project Manager

Java Developer

CV cho sinh viên IT mới ra trường
Java Developer

Networking Engineer

Senior Developer
Networking Engineer

PHP Developer

CV ngành IT
PHP Developer

Product Manager

CV cho sinh viên IT mới ra trường
Product Manager

Data Analyst

Senior Developer
Data Analyst

UX Designer

CV ngành IT
UX Designer

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

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

Toán tử instanceof trong Java

Toán tử instanceof trong Java

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

Toán tử instanceof trong Java là một toán tử được sử dụng để kiểm tra xem đối tượng này có phải là instance của một class hay interface nào đó hay không? Kết quả trả về của toán tử này sẽ là true nếu đối tượng đó là thể hiện của class mà các bạn đang check, ngược lại thì false.

Tuyển lập trình viên Java nhiều công ty HOT

Ví dụ, mình có một class Application như sau:

package com.huongdanjava.java;

public class Application {

public static void main(String[] args) {
Application application = new Application();
System.out.println(application instanceof Application);
}

}

Trong hàm main() của class này, mình initialize một đối tượng của class Application và sử dụng toán tử instanceof để kiểm tra xem đối tượng này có phải là instance của class Application này hay không? Các bạn sẽ thấy kết quả sẽ như sau:

Toán tử instanceof trong Java

Nếu các bạn viết code như sau:

package com.huongdanjava.java;

public class Application {

public static void main(String[] args) {
Application application = new Application();
System.out.println(application instanceof String);
}

}

thì IDE sẽ báo lỗi ngay:

Toán tử instanceof trong Java

Đây là trong trường hợp quá tường minh, quá rõ ràng, IDE có thể báo lỗi cho các bạn biết ngay.

Nhưng nếu bạn có một interface với hai implementation như sau:

package com.huongdanjava.java;

public interface Shape {

}
package com.huongdanjava.java;

public class Rectangle {

}

thì lúc này nếu các bạn initialize đối tượng của class Triangle nhưng lại đi kiểm tra đối tượng này có phải là thể hiện của class Rectangle,

package com.huongdanjava.java;

public class Application {

public static void main(String[] args) {
Shape shape = new Triangle();

System.out.println(shape instanceof Rectangle);
}

}

IDE sẽ không thể detect lỗi lúc compile time nhưng khi chạy các bạn sẽ thấy kết quả như sau:

Toán tử instanceof trong Java

Chúng ta sẽ thường sử dụng toán tử instanceof trong trường hợp kiểm tra xem tham số truyền vào của một phương thức có phải là instance của một class nào đó hay không? Ví dụ như:

private void check(Shape shape) {
    if (shape instanceof Triangle) {
        Triangle triangle = (Triangle) shape;

        System.out.println("This is triangle: " + triangle.toString());
    }
}

Kết quả:

package com.huongdanjava.java;

public class Application {

private void check(Shape shape) {
if (shape instanceof Triangle) {
Triangle triangle = (Triangle) shape;

System.out.println("This is triangle: " + triangle.toString());
}
}

public static void main(String[] args) {
Application application = new Application();
application.check(new Triangle());
}

}

Toán tử instanceof trong Java

Từ Java 14, các bạn có thể viết lại phương thức check() sử dụng pattern matching instanceof, đơn giản như sau:

private void check(Shape shape) {
    if (shape instanceof Triangle triangle) {
        System.out.println("This is triangle: " + triangle.toString());
    }
}

Với cách viết mới, chúng ta không cần viết thêm một dòng code để cast instance về đối tượng mà chúng ta muốn nữa. Tất cả sẽ được thực hiện trong dòng lệnh if.

Kết quả vẫn như vậy:

Toán tử instanceof trong Java

Bài viết gốc được đăng tải tại huongdanjava.com
Có thể bạn quan tâm:

Hướng dẫn sử dụng Factory trong Design Pattern

Hướng dẫn sử dụng Factory trong Design Pattern

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

Xin chào các bạn, bài viết hôm nay mình sẻ giới thiệu đến các bạn Factory Design Pattern dùng thế nào trong lập trình C#, Winform.

[C#] How to using Factory Design Pattern

Factory Pattern  là một design pattern thuộc nhóm khởi tạo (Creational patterns).

Pattern này được sinh ra nhằm mục đích khởi tạo một đối tượng mới mà không cần thiết phải chỉ ra một cách chính xác class nào sẽ được khởi tạo.

  30 tiện ích Chrome cho designer và dev
  9 công cụ siêu tiện lợi cho cả Developer và Designer

Factory Method Pattern giải quyết vấn đề này bằng cách định nghĩa một factory method cho việc tạo đối tượng, và các lớp con thừa kế có thể override phương thức này để chỉ rõ đối tượng nào sẽ được khởi tạo.

Hướng dẫn sử dụng Factory trong Design Pattern

Bây giờ, mình sẽ có một ví dụ, cho các bạn dễ hiểu về factory design pattern này.

Mình có yêu cầu viết một ứng dụng, nạp tiền điện thoại cho các mạng điện thoại Việt Nam: Mobifone, VinaPhone, Viettel, Vietnamobile, Gmobile.

Request yêu cầu gởi đến ứng dụng của chúng ta gồm 2 tham số: số thoại cần nạp tiền và số tiền.

Thường trong bài viết này, chúng ta sẽ sử dụng một thiết bị modern GMS và sử dụng tập lệnh AT-Command xài lệnh USSD để nạp tiền vào tài khoản cho người dùng.

Nhưng có rắc rối ở đây là mỗi nhà mạng, đều có cấu trúc kiểm tra số dư tài khoản, hay cú pháp nạp tiền đều khác nhau.

Vậy làm sao khi gởi đến chúng ta sẽ điều hướng cho từng class nhà mạng.

Sơ đồ Design Pattern:

Hướng dẫn sử dụng Factory trong Design Pattern

Đầu tiên, mình sẽ tạo một InterFace INetwork.cs C#:

namespace FactoryPatternDemo
{
    public interface INetwork
    {
        string GetNameNetWork();
        string CheckAccountMoney();
        string GetCarrierNumber();

    }
}
C#

Trong này mình khai báo ba phương thức sẵn: lấy tên nhà mạng, kiểm tra số dư tài khoản, và lấy đầu số của mỗi nhà mạng.

Tiếp đến mình sẽ tạo 5 class cho mỗi nhà mạng: viettel.cs, mobifone.cs, vinaphone.cs, vietnamobile.cs, gmobile.cs

Mỗi class này mình đều implement đến interface INetwork

  1. Viettel.cs
class Viettel : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "086, 096, 097, 098, 032, 033, 034, 035, 036, 037, 038, 039";
    }

    public string GetNameNetWork()
    {
        return "VIETTEL";
    }
    
}
C#

2. Mobifone.cs

class Mobifone : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "090, 093, 0120, 0121, 0122, 0126, 0128, 089";
    }

    public string GetNameNetWork()
    {
        return "MOBIFONE";
    }
}
C#

3. Vinaphone.cs

public class Vinaphone : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "091, 094, 083, 084, 085, 081, 082";
    }

        public string GetNameNetWork()
    {
        return "VINAPHONE";
    }
}
C#

4. Vietnamobile.cs

public class Vietnamobile : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "092, 056, 058";
    }

    public string GetNameNetWork()
    {
        return "VIETNAMOBILE";
    }
}
C#

5. Gmobile.cs

public class Gmobile : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "099, 059";
    }

    public string GetNameNetWork()
    {
        return "GMOBILE";
    }
}
C#

Tiếp đến mình sẽ tạo một Enum NetworkType.cs

public enum NetworkType
{
    VIETTEL,
    MOBIFONE,
    VINAPHONE,
    VIETNAMOBILE,
    GMOBILE,
}
C#

Tạo một class abstract NetworkFactory.cs:

public abstract class NetworkFactory
{
    public abstract INetwork Create(NetworkType type);
}
C#

Tiếp đến là một class ConcreteCreator.cs để điều hướng cho từng nhà mạng:

class ConcreteCreator : NetworkFactory
{
    public override INetwork Create(NetworkType type)
    {
        switch (type)
        {
            case NetworkType.VIETTEL:
                return new Viettel();
               
            case NetworkType.MOBIFONE:
                return new Mobifone();

            case NetworkType.VINAPHONE:
                return new Vinaphone();

            case NetworkType.VIETNAMOBILE:
                return new Vietnamobile();

            case NetworkType.GMOBILE:
                return new Gmobile();
            default: 
                throw new ArgumentException("Invalid type", "type");

        }
    }
}
C#

Và bây giờ chúng ta sẽ sử dụng hàm trong form program.cs

namespace FactoryPatternDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var factory = new ConcreteCreator();
            INetwork viettel = factory.Create(NetworkType.VIETTEL);
            Console.WriteLine(viettel.GetNameNetWork());
            Console.WriteLine(viettel.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork vinaphone = factory.Create(NetworkType.VINAPHONE);
            Console.WriteLine(vinaphone.GetNameNetWork());
            Console.WriteLine(vinaphone.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork mobiphone = factory.Create(NetworkType.MOBIFONE);
            Console.WriteLine(mobiphone.GetNameNetWork());
            Console.WriteLine(mobiphone.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork vietnamobile = factory.Create(NetworkType.VIETNAMOBILE);
            Console.WriteLine(vietnamobile.GetNameNetWork());
            Console.WriteLine(vietnamobile.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork gmobile = factory.Create(NetworkType.GMOBILE);
            Console.WriteLine(gmobile.GetNameNetWork());
            Console.WriteLine(gmobile.GetCarrierNumber());

            Console.ReadLine();
        }
    }
}
C#

Và dưới đây là kết quả khi chúng ta chạy ứng dụng:

Hướng dẫn sử dụng Factory trong Design Pattern

Bây giờ, các bạn muốn viết hàm gì chung xử lý cho từng nhà mạng điện thoại, các bạn chỉ cần khai báo tên hàm vào Interface INetwork.cs.

Và sau đó các bạn vào từng class nhà mạng Override lại phương thức để thực hiện theo mong muốn của mình.

Hy vọng bài viết sẽ giúp ích được cho các bạn.

Thanks for watching!

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

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

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

9+ cách để xóa một phần tử ra khỏi JavaScript Array

9+ cách để xóa một phần tử ra khỏi JavaScript Array

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

Mảng JavaScript cho phép bạn nhóm các giá trị và lặp lại chúng. Bạn có thể thêm và loại bỏ các phần tử mảng theo những cách khác nhau. Thật không may, không có một phương thức Array.remove đơn giản để loại bỏ phần tử nào đó ra khỏi mảng.

Vậy, làm thế nào để bạn xóa một phần tử khỏi mảng JavaScript?

Thay vì phương thức xóa, mảng JavaScript có nhiều cách bạn có thể xóa các giá trị mảng.

1. Xóa các phần tử ở cuối mảng Javascript

1.1 Dùng cách set lại độ dài của mảng

Các phần tử mảng JavaScript có thể được loại bỏ khỏi phần cuối của mảng bằng cách đặt thuộc tính độ dài thành giá trị nhỏ hơn giá trị hiện tại. Bất kỳ phần tử nào có chỉ số lớn hơn hoặc bằng độ dài mới sẽ bị xóa.

var ar = [1, 2, 3, 4, 5, 6];
ar.length = 4; // đặt độ dài để xóa bớt phần tử ở cuối
console.log( ar ); //  [1, 2, 3, 4]

1.2 Dùng pop()

Phương thức pop loại bỏ phần tử cuối cùng của mảng, trả về phần tử đó và cập nhật thuộc tính độ dài. Phương thức pop sửa đổi mảng mà nó được gọi, Điều này có nghĩa là nó không giống như cách trên mà phần tử cuối cùng được loại bỏ hoàn toàn và chiều dài mảng giảm đi.

var ar = [1, 2, 3, 4, 5, 6];
ar.pop(); // returns 6
console.log( ar ); // [1, 2, 3, 4, 5]

2. Xóa các phần tử ở đầu mảng Javascript

Làm thế nào để bạn loại bỏ phần tử đầu tiên của một mảng JavaScript?

Phương thức shift hoạt động giống như phương thức pop ngoại trừ việc loại bỏ phần tử đầu tiên của mảng JavaScript thay vì phần tử cuối cùng.

Không có tham số vì phương thức shift chỉ loại bỏ phần tử mảng đầu tiên. Khi phần tử được loại bỏ, các phần tử còn lại được chuyển xuống.

var ar = ['zero', 'one', 'two', 'three'];
ar.shift(); // returns "zero"
console.log( ar ); // ["one", "two", "three"]

Phương thức shift trả về phần tử đã bị xóa, cập nhật các chỉ mục của các phần tử còn lại và cập nhật thuộc tính độ dài. Nó sửa đổi mảng mà nó được gọi.

Nếu không có phần tử hoặc độ dài mảng bằng 0, phương thức trả về undefined.

Xem ngay các tin tuyển dụng Javascript mới nhất tại TopDev

3. Sử dụng Splice

Phương thức Splice có thể được sử dụng để thêm hoặc xóa các phần tử khỏi một mảng.

  1. Đối số đầu tiên chỉ định vị trí bắt đầu thêm hoặc xóa các phần tử.
  2. Đối số thứ hai chỉ định số lượng phần tử cần loại bỏ.
  3. Các đối số thứ ba và tiếp theo là tùy chọn; họ chỉ định các phần tử được thêm vào mảng.

3.1 Xóa một mảng phần tử

Ở đây, mình sử dụng phương thức Splice để loại bỏ hai phần tử, bắt đầu từ vị trí ba (chỉ số dựa trên zero):

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
var removed = array.splice(2,2);

/*
removed === [3, 4]
array === [1, 2, 5, 6, 7, 8, 9, 0]
*/

3.2 Xóa phần tử bằng giá trị của nó

Tham số thứ nhất chỉ định vị trí bắt đầu, trường hợp hay gặp nhất đó là xóa một phần tử bằng giá trị của phần tử đó

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];

for( var i = 0; i < array.length-1; i++){ 
   if ( array[i] === 5) {
     arr.splice(i, 1); 
   }
}

//=> [1, 2, 3, 4, 6, 7, 8, 9, 0]

Đây là một ví dụ đơn giản trong đó các phần tử là số nguyên. Nếu bạn có một mảng các đối tượng, bạn sẽ cần một skill nặng đô hơn.

Một cách khác, sử dụng indexOf

var ar = ['zero', 'one', 'two', 'three'];
ar.splice(ar.indexOf('one'), 1);
console.log( ar ); // ["zero", "two", "three"]
  Crawl dữ liệu bằng JavaScript ngay trên trình duyệt

4. Sử dụng Array.filter xóa phần tử bằng giá trị

Không giống như phương thức splice()filter() tạo ra một mảng mới. filter() không làm thay đổi mảng mà nó được gọi, nhưng trả về một mảng mới.

filter() có một tham số duy nhất, một phương thức gọi lại (callback function). Cuộc gọi lại được kích hoạt khi phương thức lọc lặp qua các phần tử mảng. Nó sẽ chuyển ba giá trị cho hàm gọi lại:

  1. giá trị hiện tại hoặc phần tử
  2. chỉ mục mảng hiện tại
  3. và mảng đầy đủ.

Phương thức gọi lại sẽ trả về đúng hoặc sai. Bạn có trách nhiệm kiểm tra giá trị (phần tử) để xem nó có đáp ứng tiêu chí của bạn không. Nếu nó bạn có thể trả lại true. Các phần tử trả về true được thêm vào mảng mới được lọc.

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];

var filtered = array.filter(function(value, index, arr){
    return value > 5;
});

//kết quả filtered => [6, 7, 8, 9]
//mảng array vẫn giữ nguyên => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

Bạn nên lưu ý một mảng mới chứa các giá trị khớp với filter được trả về. Mảng ban đầu thì không bị ảnh hưởng. Mình thấy điều này hữu ích vì mình thường muốn giữ lại dữ liệu gốc, nhưng truy xuất các tập hợp con để xử lý các nhu cầu logic khác nhau.

  JavaScript là gì? Làm thế nào để trở thành lập trình viên JavaScript?

5. Phương thức remove trong Lodash

Đôi khi các thư viện tiện ích là cách tốt nhất để giải quyết các vấn đề phức tạp hơn. Lodash cung cấp một tập hợp phong phú các phương thức thao tác mảng, trong đó có phương thức remove().

Phương thức remove() hoạt động giống như phương thức filter(), nhưng sắp xếp ngược lại. Nó không lưu các giá trị mảng ban đầu, nhưng loại bỏ các phần tử khớp với điều kiện. Và cuối cùng, nó trả về các phần tử phù hợp như là một mảng mới.

var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
  return n % 2 === 0;
});

console.log(array);
// => [1, 3]

console.log(evens);
// => [2, 4]

6. Tự tạo phương thức xóa

Như đã nói ở đầu bài viết, không có phương thức chuyển để xóa phần tử khỏi mảng kiểu như Array.remove(). Phương pháp Lodash giải quyết được vấn đề này, nhưng không phải lúc nào bạn cũng muốn sử dụng Lodash. Điều này không có nghĩa là bạn không thể tạo ra một phương thức tiện ích cho riêng mình.

function arrayRemove(arr, value) {
   return arr.filter(function(ele){
       return ele != value;
   });
}

var result = arrayRemove(array, 6);
// result = [1, 2, 3, 4, 5, 7, 8, 9, 0]

Ví dụ trên chỉ đơn giản, bạn có thể sửa đổi cho phù hợp với nhu cầu của bạn, nhưng có lẽ filter() vẫn là ổn nhất

  Giới thiệu Fetch API trong Javascript

7. Loại bỏ chính xác phần tử bằng toán tử delete

Bạn có thể xóa các thành phần mảng cụ thể bằng cách sử dụng toán tử delete:

var ar = [1, 2, 3, 4, 5, 6];
delete ar[4]; // xóa phần tử có chỉ số index là 4
console.log( ar ); // [1, 2, 3, 4, undefined, 6]
alert( ar ); // 1,2,3,4,,6

Sử dụng toán tử delete không ảnh hưởng đến thuộc tính độ dài. Nó cũng không ảnh hưởng đến các chỉ số của các element tiếp theo. Mảng trở nên thưa thớt, đó là một cách thú vị để nói rằng mục bị xóa không bị xóa mà trở nên không xác định. So sánh cách sử dụng delete với phương thức splice() được mô tả dưới đây.

Toán tử delete được thiết kế để xóa các thuộc tính khỏi các đối tượng JavaScript, mà các mảng là các đối tượng.

Lý do phần tử không thực sự bị xóa khỏi mảng là toán tử delete liên quan đến giải phóng bộ nhớ hơn là xóa một phần tử. Bộ nhớ được giải phóng khi không còn tham chiếu đến giá trị.

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

Xem thêm các vị trí tuyển dụng IT hấp dẫn tại TopDev

Cơ hội trải nghiệm môi trường làm việc tại Top 6 công ty công nghệ Hàn Quốc cho các lập trình viên Việt

Cơ hội trải nghiệm môi trường làm việc tại top 6 công ty công nghệ Hàn Quốc cho các lập trình viên Việt

Thị trường IT Việt Nam ngày càng phát triển và trở nên năng động hơn. Đó là một phần lý do để thu hút một lượng lớn doanh nghiệp công nghệ nước ngoài đầu tư vào Việt Nam, tiêu biểu trong số đó là các công ty của Hàn Quốc.

Bên cạnh đó, qua “cái bắt tay” chiến lược giữa Korea IT Cooperation Center tại TP. HCM (KICC HCMC) và Nền tảng tuyển dụng chuyên về IT hàng đầu Việt Nam – TopDev, các lập trình viên Việt càng có nhiều lựa chọn hơn khi tìm kiếm nơi làm việc phù hợp, đặc biệt nhất chính là cơ hội trải nghiệm môi trường làm việc “chuẩn” quốc tế cùng nhiều công nghệ tiên tiến đến từ Hàn Quốc.

Hãy cùng khám phá Top 6 công ty công nghệ đến từ Hàn Quốc xuất hiện trong kỳ này để bắt lấy cơ hội cho chính mình bạn nhé!

1. Total Software Bank VietNam

Ra đời vào năm 1998, Total Soft Bank Ltd (TSB) là công ty chuyên cung cấp các giải pháp maritime logistics thông qua việc áp dụng công nghệ tiên tiến hàng đầu cùng đội ngũ phát triển giàu kinh nghiệm chuyên môn. Một số giải pháp tiêu biểu của công ty như: tự động hóa tàu biển, các giải pháp cảng,…

⇒ Bạn vừa ra trường và muốn trải nghiệm làm việc tại công ty thuộc lĩnh vực logistics thì Total Soft Bank Vietnam chính là “đáp án” dành cho bạn!

⇒ Hãy sẵn sàng “bùng nổ” năng lực, cùng chinh phục những thử thách giúp nâng cao tay nghề từ Total Soft Bank Vietnam với vị trí Fresher Software Developer

2. LOTTE Data Communication

Được thành lập từ năm 2009, LOTTE Data Communication Việt Nam đóng vai trò cung cấp hầu hết các giải pháp và Dịch vụ IT cho các công ty con thuộc Tập đoàn LOTTE đang kinh doanh tại Việt Nam. Kế thừa tất cả tinh hoa từ Công ty mẹ, LOTTE Data Communication Việt Nam kết nối và phát triển mạng lưới khách hàng thuộc mọi lĩnh vực từ Bán lẻ, Sản xuất đến Tài chính, Dịch vụ Công… bằng những giải pháp bắt kịp xu hướng Công nghệ của thế giới như Triển khai hệ thống ra vào cho cao ốc, An Ninh nhận diện khuôn mặt, Smart Parking, Thu phí tự động,…

LOTTE Data Communication Việt Nam đem đến nhiều cơ hội phát triển sự nghiệp cho các Lập trình viên tài năng. Cùng khám phá những vị trí hấp dẫn mà bạn không nên bỏ lỡ:

3. Hanbisoft

Hanbisoft là công ty chuyên cung cấp các dịch vụ máy tính tùy chỉnh cho doanh nghiệp, giúp các hoạt động quản lý: nhân sự, kế toán, thuế, vận chuyển hàng hóa, mua bán,…trở nên dễ dàng hơn.

Tự hào với môi trường làm việc chuyên nghiệp, Hanbisoft sẽ là nơi các lập trình viên có thể bùng nổ năng lực qua các dự án phát triển ứng dụng di động và phần mềm chất lượng.

⇒ Bạn muốn tìm kiếm môi trường làm việc ổn định, lâu dài cùng cơ hội học hỏi các công nghệ mới nhất? Hãy thử khám phá vị trí React Native Developer tại Hanbisoft, biết đâu đây chính là “bến đỗ” phù hợp với tài năng của bạn!

4. VNIB Tech

Được thành lập từ năm 2016, VNIB Tech là công ty chuyên cung cấp các phần mềm trên nền tảng di động (iOS, Android) và web. Hoạt động với sứ mệnh mang thế giới đến gần nhau hơn bằng công nghệ, VNIB Tech không ngừng cải tiến chất lượng, đem đến cho khách hàng những sản phẩm và giải pháp tối ưu nhất. Đây cũng chính là cơ hội cho các tài năng công nghệ trải nghiệm môi trường làm việc chuyên nghiệp tại công ty đến từ Hàn Quốc và gặt hái thành công.

Bạn đã sẵn sàng chinh chiến cùng VNIB Tech trong những dự án đầy thách thức? Khám phá ngay loạt vị trí hứa hẹn cho bạn cơ hội bứt phá sự nghiệp:

5. Mintpot

Mintpot Việt Nam là thành viên của Minpot, có trụ sở chính tại Hàn Quốc, và là một trong những công ty sáng tạo thông minh, chuyên cung cấp các dịch vụ video VR có phụ đề Mint VR với ước mơ tạo ra một cuộc sống tốt hơn với VR.

Đến với Mintpot, ngoài mức lương cực hấp dẫn, bạn còn có nhiều cơ hội thăng tiến và phát triển không giới hạn. Nếu bạn đang tìm kiếm “bến đỗ” cho sự nghiệp và đã sẵn sàng tạo cú hích mới cho bản thân? Vậy Mintpot chính là câu trả lời tốt nhất cho bạn..

Đừng bỏ lỡ cơ hội! Gia nhập Mintpot ngay với 1 trong 3 vị trí hấp dẫn đang chờ bạn trực tiếp trải nghiệm:

6. Genuwin Solution

Genuwin là công ty thuộc top đầu trong ngành lập trình phần mềm quản lý nhân sự, kế toán, quản lý sản xuất, nhà hàng khách sạn, sân golf, trường học quốc tế, liên kết thanh toán với hệ thống ngân hàng Hàn Quốc Shinhan Bank với mạng lưới khách hàng trải dài khắp Việt Nam và các nước như Campuchia, Indonesia, Hàn Quốc…

Với đội ngũ nhân viên chuyên nghiệp, tận tâm và có năng lực, trách nhiệm cao, Genuwin ngày càng phát triển và từng bước trở thành một trong những nhà cung cấp và phát triển hệ thống quản lý (ERP) hàng đầu.

Và nếu bạn là ERP Developer đang tìm kiếm cơ hội phát triển sự nghiệp qua các dự án phát triển hệ thống ERP, đừng ngần ngại click apply để gia nhập Genuwin Solution ngay hôm nay. 

Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của Top 6 công ty công nghệ Hàn Quốc, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê lập trình!

⇒ Và đừng quên, KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!

________________________________

Dự án được hỗ trợ bởi Korea IT Cooperation Center tại TP. HCM (KICC HCMC) – thuộc Cơ quan Xúc tiến CNTT Hàn Quốc (NIPA), phối hợp cùng TopDev – Nền tảng tuyển dụng CNTT hàng đầu tại Việt Nam với mục đích thúc đẩy tuyển dụng việc làm CNTT cũng như quảng bá cho các công ty IT Hàn Quốc trong cộng đồng lập trình viên lớn nhất tại Việt Nam.

Liên hệ: Korea IT Cooperation Center tại TP. HCM (KICC HCMC)

☎️ Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)

E-mail: HCMC@nipa.kr

Address:135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

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

Senior Developer là gì? Những điều thú vị về Senior Developer

Senior Developer
Senior Developer

Senior Developer là gì? Có gì khác so với Junior Senior hay Fresher? Tuyển dụng IT đã có những tên gọi riêng nhằm phân loại các vị trí khác nhau. Senior Developer là một trong số đó. Tuy nhiên, bạn đã có cách hiểu chính xác về thuật ngữ này chưa? Cùng TopDev tìm hiểu tất tần tật về Senior Developer qua bài viết sau! 

Senior Developer là gì? 

Nhiều định nghĩa đã được đưa ra về cách hiểu Senior Developer? Vậy Senior Developer thật sự là gì? Trước hết hãy cùng tìm hiểu sơ lược về thế nào là Senior?

Bạn biết gì về thuật ngữ Senior?

Senior là gì? Senior được biết đến là một thuật ngữ mô tả các cá nhân sở hữu nhiều kinh nghiệm (cả về kỹ năng chuyên môn và trải nghiệm thực tế). Theo quá trình, năng lực của họ được nâng cao hơn từ nền tảng cơ sở thông qua các giai đoạn tiền phát triển trước đó như Intern, Fresher, Junior,…

Senior là gì
Senior Developer là gì?

Senior chỉ những người có thâm niên trong nghề lâu hơn. Do vậy, không quá để gọi họ là những tiền bối hoặc cấp cao. Thời gian “thăng tiến” của một Junior lên Senior đòi hỏi sự tập trung vào sự nghiệp phát triển của mỗi cá nhân.

Không có một thước đo cụ thể về thời gian. Vì nó chỉ mang tính tương đối. Đặc biệt, tùy thuộc vào từng quy mô – loại hình doanh nghiệp, việc phân loại và đánh giá một Senior sẽ dựa trên nhiều yếu tố khác nhau. 

Senior Developer là gì?

Senior Developer là thuật ngữ được quy chiều đến đối tượng là các lập trình viên cấp cao. Một thực tế là họ dễ dàng nắm bắt và làm tốt mọi thứ trong bất kỳ một giai đoạn nào của công việc ngành IT. Nắm rõ quy trình thực hiện, các khâu có liên quan; tất tần tật đều được họ điều phối và vận hành một cách trơn tru, chuyên nghiệp nhất. Đặc biệt hơn, họ lại có khả năng kết nối, trao đổi để tìm ra các mong muốn của khách hàng. 

  Con đường trở thành một Senior developer đích thực

Điểm nổi trội của Senior nằm ở nền tảng tư duy, năng lực nhận biết về quá trình thực hiện, giải quyết các nhiệm vụ. Đồng thời, họ vẫn song song tự hoàn thiện và phát triển mình lên một mức cao hơn (có thể là Senior Manager). Chính điều này kích thích họ luôn thử sức, rèn luyện bản thân để có những trải nghiệm phong phú hơn. 

Một Senior “cừ khôi” sẽ phát huy tốt óc sáng tạo, năng lực thích ứng, các kỹ năng của mình một cách thuần thục. Các lập trình viên cấp cao phải có khả năng quản lý các project, lập kế hoạch, đặt ra định hướng; dẫn dắt, hướng dẫn, hỗ trợ team để đạt được các mục tiêu đề ra.

Tố chất để trở thành một Senior Developer

Không ngại thất bại!

Một Senior Developer chắc chắn sẽ phải trải qua nhiểu áp lực. Biết đâu những thời gian đầu, bạn đã gặp lại các thất bại. CV cho sinh viên IT mới ra trường (CV IT student)  hoặc CV IT Developer của bạn không tạo được ấn tượng với nhà tuyển dụng. Hoặc khi đi làm, bạn chịu sự áp lực từ sếp, từ đồng nghiệp,…Đôi khi nó nhiều đến mức khiến bạn bị stress.

CV cho sinh viên IT mới ra trường
Senior Developer có những tố chất đặc biệt.

Áp lực từ nhiều phía và rất nhiều sự mâu thuẫn sẽ nảy sinh. Đó cũng chính là lúc bạn rơi vào trạng thái phức tạp. Ai cũng thích sự đơn giản. Nếu đã là một Senior Developer, bạn phải sống trong áp lực tổn tại của ngành lập trình.

Đừng đánh giá thấp bất cứ ai!

Đây có lẽ nghiêng về phần giá trị của nhân cách nhiều hơn. Thế nhưng, bạn phải hiểu Senior Developer chỉ là một thuật ngữ mô tả các cá nhân với bề dày kinh nghiệm. Tuy vậy, ứng với từng vị trí được phân chia cụ thể, thì mỗi Senior Developer là một mảnh ghép trong doanh nghiệp. 

Đừng bao giờ đánh giá thấp bất kỳ ai vì mỗi người đều có điểm mạnh – điểm yếu riêng. Dù bạn có là một người hoàn hảo những chắc chắn, bạn vẫn có những nỗi sợ của riêng mình. Thay vào đó, hãy học hỏi lẫn nhau để nâng cao trình độ, kỹ năng; kết nối các khía cạnh chuyên sâu để phát triển một cách toàn diện hơn.

Điểm nhấn từ sự kết nối

Xây dựng phần mềm cần có sự kết nối giữa trình độ (tức vận dụng lý thuyết khoa học chuyên ngành, trải nghiệm thực tiễn) và nhu cầu, mong muốn của khách hàng. Bên cạnh đó, sự kết nối này sẽ trở nên chặt chẽ hơn nhờ vào sự ảm hiểu các công cụ; tinh thần đồng đội, sự quản lý vận hành của tổ chức. Do đó, mỗi Senior Developer cần tìm ra sự kết nối trong mọi quy trình làm việc. Có thể mỗi sản phẩm, mỗi dự án, mội thành quả sẽ mang lại những giá trị tương xứng.

Tố chất của người lãnh đạo

Đây được xem là tố chất quan trọng. Vì nó không những giúp hình thành nên một Senior Developer giỏi mà còn quyết định đến sự phát triển nghề nghiệp.

Một Senior Developer phát triển độc lập, họ có thể làm bất cứ điều gì. Thế nhưng, để phát triển họ cần cộng tác với team. Bản thân họ tự hiểu rằng để thực hiện các nhiệm vụ lớn, họ cần một team luôn hổ trợ nhau. Một Senior Developer cần có trách nhiệm dẫn dắt đồng đội; luôn phấn đấu để cải thiện trình độ – kỹ năng của chính bản thân mình. Họ sẽ biết cách tạo điều kiện để bản thân và team của mình có thể phát triển tốt nhất.

Đặc biệt hơn, Senior Developer sẽ hiểu rằng bản thân họ không tạo ra quyền lực để buộc người khác làm việc. Họ cần sở hữu tố chất lãnh đạo để trao quyền cho mọi người. Họ phải là một đàn anh, một người dẫn dắt, một người truyền đạt kinh nghiệm để giúp mỗi cá nhân trong team đều có thể phát triển.

Nếu một team có một Senior Developer với vai trò lãnh đạo tốt, team sẽ thành công. Điều này giúp team dễ dàng đạt được những kế hoạch; cùng nhau nâng cao chuyên môn nghề nghiệp. Và biết đâu, mỗi cá nhân Developer đều có những định hướng cụ thể hơn trong sự nghiệp lập trình IT của mình.

Một Senior Developer sẽ làm những gì?

Những công việc chính

+ Connect với khách hàng; lắng nghe cá feedback, các phát sinh từ vấn đề từ khách hàng

+ Phân tích, đánh giá và thảo luận với team để cùng tìm ra các giải pháp/cách thức phù hợp. Đồng thời, quy định mức thời gian dự kiến hoàn thành. Chủ động liên hệ khách hàng, đảm bảo sự kết nối và thông tin về sự cam kết giải quyết nhiệm vụ.

+ Phân chia nhỏ các công việc; hướng dẫn các thành viên còn “non” trong tay nghề. Hỗ trợ họ, giúp họ bắt nhịp chung với các cá nhân khác để đạt hiệu suất cao nhất.

+ Duyệt code và thực hiện chạy thử các phương án test. Theo dõi và đánh giá tiềm nang mỗi giải pháp.

+ Fix lại các chỗ bị lỗi và chưa hoàn thiện. Senior Developer cần đảm bảo chu trình chạy thử chương trình ổn định, không phát sinh lỗi và đạt những yêu cầu như mong muốn.

Có thể nói, Senior Developer là một người dẫn đầu với năng lực toàn diện được thể hiện ở tất cả các khía cạnh. Mọi quy trình đều được họ nắm bắt, điều tiết và quản lý một cách tốt nhất. Họ có sự cầu tiến, do vậy họ thật sự tỉ mỉ và chỉn chu trong việc tổ chức thực hiện các giai đoạn công việc.

Đối với Senior Developer, họ không quá khó để khai thác và kết nối chính xác với nhu cầu của khách hàng. Dựa trên những trải nghiệm, họ biết đâu là những cách thức phù hợp để tìm ra sự phụ ứng với mong muốn từ các khách hàng khó tính nhất.

  Hãy commit code có tâm như Senior Developer

Lộ trình thăng tiến của một Senior Developer có gì thú vị?

Một điều đáng lưu tâm

Mỗi người sẽ có một thời điểm phù hợp để phát triển sự nghiệp của mình. Đỉnh cao sự nghiệp là do mỗi cá nhân tự thỏa mãn. Và việc so sánh hoặc áp đặt lộ trình thăng tiến là điều hạn chế. Vì đơn giản mọi thứ đều có tính chất tương đối. 

Do vậy, sự hướng dẫn dưới đây không thể phù hợp với tất cả dân lập trình. Với một số người, vai trò quản lý có thể tốt hơn. Hoặc đơn giản bạn chỉ dừng lại ở việc thích viết code.

Đồng thời, các yếu tố khác có thể chi phối nhiều hơn. Điều này quyết định sự thành công của bạn. Hãy hiểu bản thân trước tiên, bạn thật sự mong muốn điều gì? Từ đó lập kế hoạch phát triển lộ trình thăng tiến cho riêng mình. 

Fresher

Fresher chỉ những sinh viên mới ra trường. Sự va chạm chưa nhiều và có thể nói, họ đều là những “lính mới” của giới lập trình viên. Lợi thế của họ là sự chuẩn bị gần như là kỹ lưỡng về hành trang do quá trình dài rèn luyện tại giảng đường.

Nếu bạn đang apply vị trí Mobile App Developer tại một doanh nghiệp thì chiếc CV IT Developer chuẩn có thể giúp các newbie nâng cao khả năng ghi điểm của mình. Tuy nhiên, để thành công và nhanh chóng hòa nhập môi trường lập trình chuyên nghiệp, họ cần phải nỗ lực rất nhiều.

Junior Developer

Với số năm kinh nghiệm ít ỏi, cái họ nó là nền tảng trải nghiệm; những bước đi đầu trong việc tiếp cận thế giới lập trình. Họ sẽ bắt đầu đi sâu hơn vào việc phân tích lập trình ứng dụng dựa vào thực tế nhiều hơn. Hiểu biết về cơ sở dữ liệu, lưu trữ và xuất dữ liệu, nắm bắt các chức năng là những họ cần phải phát huy.

Senior Developer

Bạn có thể tự hào đôi chút khi bản thân được công nhận là một Senior Developer chính hiệu. Bạn hoàn toàn có thể xử lý các vấn đề; chịu trách nhiệm đảm nhận các dự án lớn; quản lý, áp dụng, thực hiện và giải quyết nhiệm vụ phức tạp nhất. Một điểm nhấn quan trọng của Senior Developer chính là mức độ am hiểu sâu sắc về cơ sở dữ liệu và các dịch vụ ứng dụng,…

Xem thêm việc làm Senior developer trên TopDev

Tech lead

Để đạt được level này, tất nhiên sẽ phụ thuộc vào sự cố gắng của bạn. Bạn dường như đào sâu hơn trong chính chuyên môn của mình. Bạn là người đưa ra các quyết định quan trọng về cách thức thực hiện của một hoặc nhiều dự án. Vì đơn giản, bạn hiểu rõ về cơ chế hoạt động, sự liên kết giữa các công cụ công nghệ,… Bạn dần trở thành một chuyên gia quản trị con người, quản lý một quy trình phát triển phần mềm hơn là một người đội trưởng hướng dẫn đồng đội.

Quản lý cấp trung

Hai chức danh quan trọng thường sẽ là Product Manager hoặc Project Manager. Ở giai đoạn này, bạn sẽ có vai trò lớn trong việc quy định về chuẩn chất lượng/đầu ra mà một sản phẩm nào đó thông qua nghiên cứu, phân tích.

Quản lý cấp cao

Bạn từng nghe về CTO hoặc CEO chưa? Vâng, chính xác là nó. Bạn không chỉ đơn thuần là một chuyên gia về lập trình, một người hiểu sâu rộng về công nghệ, mà bạn còn là người truyền cảm hứng; tạo động lực, vạch ra các chiến lược phát triển và dẫn dắt các leader theo một sứ mệnh, tầm nhìn nào đó. Điều này có nghĩa, bạn đang là nhân tố quyết định đến số phẫn thành hay bại của một tổ chức.

Đâu là những kỹ năng quan trọng của một Senior Developer?

Nhiều kỹ năng quan trọng có thể chi phối đến quá trình phát triển của một Senior Developer. TopDev sẽ chỉ ra một số kỹ năng ảnh hưởng trực tiếp đến sự thăng tiến của một Senior Developer.

CV IT Developer
Những kỹ năng nào quan trọng đối với một Senior Developer?

Chuyên sâu về công nghệ

Khác với Junior, Senior Developer phải là người có nhiều kinh nghiệm. Những kinh nghiệm đó được phát triển hơn thông qua quá trình dài làm việc với công nghệ/ngôn ngữ lập trình. Càng nhiều dự án với các đặc thù tính chất, môi trường làm việc khác nhau, bạn sẽ có cơ hội nâng cao năng lực của mình. Nhận ra thế mạnh về chuyên môn, đặc biệt là về khía cạnh công nghệ – kỹ thuật. Đồng thời lại biết được đâu là những hạn chế cần khắc phục. 

Không chỉ có kỹ năng đánh giá năng lực bản thân, là một Senior, bạn còn phải biết cách đánh giá mức độ hiệu quả của các công cụ công nghệ. Dự án nào dùng công cụ nào để xử lý. Mọi thứ cần được diễn tiến một cách khoa học.

Kỹ năng “múa” code

Chuyên nghiệp trong việc viết code đôi khi khó thể hiện toàn diện năng lực của một Dev. Thế nhưng, nếu xét trên khía cạnh kỹ năng, Junior chỉ cần viết code cho chạy là được. Còn nếu là Senior, bạn không chỉ đơn thuần viết đúng hạn deadline, mà việc viết code phải tinh gọn, nhanh chóng. Yếu tố quyết định chính là khả năng bảo trì code. Đó cũng là điều mọi Senior Developer cần nhớ.

Tính đa nhiệm

Khi là một Senior Developer, bạn cần phải tiếp cận với các task lớn hơn. Điều đó đồng nghĩa, bạn phải am hiểu nhiều công cụ hơn. Senior Developer sẽ chia nhỏ thành từng task khác nhau. Đồng thời, phải quan tâm đến vấn đề đánh giá, phân tích mức độ khả thi, tính hiệu quả của các giải pháp. Điều này cho thấy họ phải là người hiểu rõ về cơ chế hoạt động của doanh nghiệp. Đó là cơ sở quan trọng để Senior tìm ra các mấu chốt, cách thức giải quyết phù hợp – khả thi nhất cho mọi vấn đề.

Thái độ cầu tiến

Nếu bạn đã giỏi, hãy làm cách nào đó để mình trở nên giỏi hơn. Senior Developer có thể tự học thêm vì mọi kiến thức đều có thể được cập nhật mới hơn mỗi ngày. Là một Senior, bạn cần phải hỗ trở nhiều đàn em khi họ có những vấn đề chưa giải quyết được; trực tiếp góp ý kiến, đưa ra các phán đoán trước những quyết định. Thái độ cầu thị và giúp đỡ; tính trách nhiệm với mỗi thứ mình làm đều góp phần tạo ra chân dung của một Senior Developer chuyên nghiệp.

Thu nhập của một Senior Developer như thế nào?

Mức lương phụ thuộc rất nhiều vào trình độ và số năm kinh nghiệm mà mỗi cá nhân sở hữu. Và tùy vào từng công ty, mức độ chênh lêch về lương có thể rơi vào các mức sau đây:

+ Dưới 1 năm kinh nghiệm: 5 – 10M 

+ Từ 1-3 năm kinh nghiệm: 12 – 24M

+ Từ 3- 5 kinh nghiệm: 20 – 35M (Senior Developer)

+ Trên 5 kinh nghiệm: 30M – 100M (tuỳ thuộc trình độ chuyên môn)

Trên thực tế mức lương có thể sẽ thay đổi dựa trên những nỗ lực cá nhân của bạn. Vì vậy, bạn hãy chứng tỏ bản thân là một Senior Developer thực thụ để có những phúc lợi xứng đáng.

Lời kết

Senior Developer là những cá nhân thuộc nhóm ngành đang phát triển bật nhất. Họ được quan tâm và có cơ hội được tào đạo bài bản hơn. Tuy vậy, bản thân chính họ cũng tự rèn luyện để bản thân được hoàn thiện hơn. Thông qua bài viết này, TopDev hi vọng bạn sẽ biết được thế nào là Senior Developer. Đồng thời, đây là những thông tin cơ sở để bạn tự nhìn nhận, đánh giá lại bản thân. Từ đó, điểm lại những thiếu sót trong kinh nghiệm, kỹ năng để lập kế hoạch bồi dưỡng cho bản thân. Chúc cho con đường phát triển ngành lập trình của các bạn sẽ thật sự may mắn!

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

Xem thêm việc làm IT trên TopDev

Sự phát triển của các ngôn ngữ lập trình

Sự phát triển của các ngôn ngữ lập trình

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

Ngôn ngữ lập trình bản thân chúng không phải là 1 thành phần trong kiến trúc nhưng sẽ là thiếu sót nếu chúng ta không đề cập đến chúng trong loạt bài viết này.

Cùng điểm sơ qua lịch sử phát triển của các ngôn ngữ lập trình cùng các mô hình lập trình (programming paradigm) qua thời gian và các vấn đề mà chúng giải quyế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
  10 ngôn ngữ phát triển nhanh nhất theo GitHub thống kê năm 2024

1950S – NON-STRUCTURED PROGRAMMING (LẬP TRÌNH PHI CẤU TRÚC)

Assembly ~1951
Vào thời điểm sơ khai của lĩnh vực phát triển phần mềm, Assembly là ngôn ngữ hot nhất thời điểm bấy giờ. Nó sử dụng các lời gọi hàm bậc thấp như add, sub, goto và thao tác trực tiếp trên thanh nhớ. Mất khá nhiều thời gian chỉ để build 1 ứng dụng đơn giản. Để thực hiện một lệnh IF, ta cần đến vài dòng code, và sẽ là vài chục dòng code cho vòng loop… Lúc này, khả năng tái sử dụng và cấu trúc các thành phần hầu như là rất khó vì độ phức tạp của ngôn ngữ, các dòng lệnh chủ yếu được thực thi một cách tuần tự, nếu muốn sử dụng logic này ở chỗ khác thì chỉ có cách copy-paste.

1960S – STRUCTURED PROGRAMMING (LẬP TRÌNH CẤU TRÚC)

Algol ~1958
Lập trình cấu trúc là bước tiến hóa tiếp theo sau đó. Nó mang đến khả năng cấu trúc các dòng lệnh theo block, cung cấp các giao diện (key word) để sử dụng các lệnh if, else, loop, case, … và các sub-routines (giống như global method để reuse). Từ đây chúng ta có thể tập trung vào việc lập trình các flow của chương trình (thay vì phải đau đầu với các “mật mã” assembly). Ý tưởng về re-useable code cũng khởi nguồn ở giai đoạn này.

1970S – PROCEDURAL & FUNCTIONAL PROGRAMMING (LẬP TRÌNH THỦ TỤC & CHỨC NĂNG)

Pascal ~1970, C ~1972
Lập trình thủ tục và lập trình chức năng được giới thiệu vào những năm đầu của thập niên 70, với các đặc điểm như:
Procedures: Tập các dòng lệnh để thực hiện một công việc gì đó và không trả về dữ liệu
Functions: Tập các dòng lệnh dùng để tính toán trả về dữ liệu
Data structures: dùng để diễn đạt thông tin của một sự vật, sự việc, hoặc để nhóm các thông tin có cùng một mục đích vào trong đó. (Lưu ý lúc này vẫn chưa có OOP nên mình tránh dùng từ đối tượng ở đây)
Modules: Các file code hoặc tập tin đã được biên dịch có thể dùng cho những chỗ khác.

Trong giai đoạn này, ý tưởng về Event Oriented Programming cũng đã xuất hiện trong một báo cáo về MVC (sử dụng các event) của Trygve Reenskaug.

Như vậy, trong giai đoạn này, các ngôn ngữ lập trình đã làm tăng tính tái sử dụng các module, cũng như cho phép tạo ra các cấu trúc để gom nhóm data cũng như việc sử dụng event để phân tách các thành phần với nhau. (Key work cần nhớ: decoupling and modularity)

1980S – OBJECT ORIENTED PROGRAMMING

C++ ~1980, Erlang ~1986, Perl ~1987,
Phyton ~1991, Ruby ~1993, Delphi, Java, Javascript, PHP ~1995
Một trong những mô hình lập trình linh hoạt và theo tôi là tốt nhất cho đến thời điểm hiện tại đó là OOP. Lập trình hướng đối tượng cho phép chúng ta phân tích các bài toán thành các thực thể được gọi là các đối tượng và xây dựng các dữ liệu, các hàm xung quanh các đối tượng này. Dữ liệu được liên kết với các hàm thành các vùng riêng mà chỉ có các hàm đó tác động lên, các hàm bên ngoài không được truy cập vào. Các đối tượng có thể tác động và trao đổi thông tin với nhau thông qua các thông điệp.

MỘT SỐ KHÁI NIỆM TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

ĐỐI TƯỢNG

Đối tượng là sự kết hợp giữa dữ liệu và thủ tục (còn gọi là phương thức) thao tác trên dữ liệu đó. Ta có công thức:
Đối tượng = Dữ liệu + Phương thức

LỚP

Lớp là một tập các đối tượng cùng loại (có cấu trúc dữ liệu và phương thức giống nhau). Một đối tượng sẽ thể hiện cụ thể từng lớp. Trong lập trình mỗi lớp được xem là một kiểu, còn các đối tượng sẽ là các biến có kiểu lớp khác.

ĐÓNG GÓI DỮ LIỆU

Trong lập trình cấu trúc các hàm được sử dụng mà không cần biết cụ thể nội dung. Người dùng chỉ cần biết chức năng của hàm cũng như các tham số để chạy hàm, không cần quan tâm đến những lệnh cụ thể bên trong. Người ta gọi chức năng đó là đóng gói dữ liệu.

Trong lập trình hướng đối tượng, cả chức năng và dữ liệu đều phải được đóng gói, mỗi đối tượng sẽ không thể truy cập trực tiếp vào các thành phần dữ liệu mà phải thông qua các thành phần chức năng để làm việc đó. Như vậy, đóng gói cho phép dữ liệu của đối tượng sẽ bị che đi một phần khi nhìn từ bên ngoài.

KẾ THỪA

Kế thừa là khả năng cho phép xây dựng một lớp mới dựa trên các cơ sở (định nghĩa) của một lớp có sẵn và có bổ sung phương thức hay thành phần dữ liệu. Khả năng sử dụng kế thừa các module chương trình rất dễ dàng mà không cần thay đổi module khác.

ĐA HÌNH

Tính đa hình sẽ xuất hiện khi có khái niệm kế thừa và có khả năng cho phép gửi cùng một thông điệp đến những đối tượng khác nhau mà không cần biết đối tượng nhận thuộc lớp dữ liệu nào, chỉ cần tập hợp các đối tượng nhận có chung hoặc gắn liền với một tính chất nào đó.

1990S – SUBJECT & ASPECT ORIENTED PROGRAMMING

Subject Oriented Programming gọi cho các biểu diễn khác nhau của các đối tượng, theo người đang “nhìn” vào nó. Ví dụ, trong khi con người có thể nhìn thấy gỗ khi nhìn vào cái cây, một con chim có thể thấy một lượng thức ăn và nơi trú ẩn. Để mô hình hóa việc đó trong lập trình, nó có nghĩa là thuộc tính và hành vi của đối tượng có thể khác nhau, tuỳ thuộc vào ai gửi thông điệp đến đối tượng.

Aspect Oriented Programming (AOP) – lập trình hướng khía cạnh: là một kỹ thuật lập trình (kiểu như lập trình hướng đối tượng) nhằm phân tách chương trình thành cách moudule riêng rẽ, phân biệt, không phụ thuộc nhau.
Khi hoạt động, chương trình sẽ kết hợp các module lại để thực hiện các chức năng nhưng khi sửa đổi 1 chức năng thì chỉ cần sửa 1 module.
AOP không phải dùng để thay thế OOP mà để bổ sung cho OOP.

SAU OOP

Sau OOP thì hầu như không có mô hình lập trình mới nào đáng chú ý. Tất cả đổ dồn vào việc tùy biến các ngôn ngữ lập trình hiện tại để tối ưu cho các mục đích cụ thể nhất định, các framework, ngôn ngữ dành riêng cho phát triển web, mobile hoặc 1 nền tảng nào đó như Go cho Google, Hack của Facebook, …

KẾT LUẬN

Chúng ta đã điểm qua sơ bộ về một số mô hình lập trình chính, tất nhiên là tôi không quá chú trọng về nội dung chi tiết, vì chúng đã được nhắc đến rất nhiều trên mạng internet. Phần tôi muốn nhấn mạnh ở đây chính là chiều hướng phát triển của các mô hình lập trình, chúng tiến hóa theo chiều hướng của Modularity (low coupling – liên kết lỏng lẽo) và Encapsulation (high cohesion – độ gắn kết cao). Trong những bài viết tiếp theo, chúng ta sẽ tiếp tục thấy sự phát triển của các mô hình kiến trúc cũng theo chiều hướng nhằm đạt được tối đa 2 tính chất quan trọng NHẤT vừa đề cập.

Nếu bạn muốn hiểu rõ hơn về low coupling và high cohension, tôi khuyến nghị nên đọc thêm về nó ở đây trước khi bắt đầu vào loạt bài tiếp theo.

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

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

Programming Language evolution

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

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

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

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

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

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

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

(Xem lại: Function trong Python là gì?)

Khái niệm method thường dùng trong lập trình hướng đối tượng như java, c#… Còn khái function thường dùng trong lập trình hàm như javascript, c…

Method trong Python

  • Method là một phần của Object (method chính là hành động của object). Hay nói cách khác, method nằm bên trong class.
  • Method có thể trả về hoặc không trả về dữ liệu
  • Method có thể xử lý dữ liệu được chứa bên trong class.

Cấu trúc method trong Python:

class class_name 
def method_name () : 
 ...... 
# method body 
 ...... 

Ví dụ:

class Person:
def __init__(self, name):
 self.name = name

def show_name(self):
print("My name is " + self.name)

def say_hello(self):
print("hello")

person = Person("kai")
person.show_name()
person.say_hello()

Kết quả:

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

Function trong python

  • Function là một khối code gồm nhiều câu lệnh liên quan cùng thực hiện một công việc gì đó.
  • Function có thể trả về hoặc không trả về giá trị
  • Function không liên quan tới Class (Không nằm trong class, không truy cập dữ liệu trực tiếp của class)

Cấu trúc function:

def function_name ( arg1, arg2, ...) : 
 ...... 
# function body 
 ...... 

Ví dụ:

def subtract(a, b):
return (a-b)

def say_hello():
print("Hello World")

say_hello()
print("10 - 5 = %d" % subtract(10, 5)) # prints -2

Kết quả:

Hello World
10 - 5 = 5
  Tạo kho lưu cho các gói thư viện Python

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

  • Cả Method và Function đều khá giống nhau trong cách hoạt động.
  • Điểm khác nhau chính giữa Method và Function chính là khái niệm Class và Object.
  • Function có thể được bởi tên trong khi method phải gọi thông qua class hoặc đối tượng.
  • Method được định nghĩa bên trong một class và phụ thuộc vào class đó.

Okay, Done!

References: https://docs.python.org/2.0/ref/function.html

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

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

KISS PRINCIPLE (Nguyên tắc KISS Trong JAVA)

Nguyên tắc KISS trong Java

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

Nguyên tắc KISS trong Java.

KISS là gì?

KISS ở đây là: Keep ISimple, Stupid! không phải “hun nhau” đâu nhé.

Hiểu nôm na thì KISS cõ nghĩa là giữ cho code của bạn thật đơn giản, càng đơn giản, ngắn gọn càng tốt.Bạn viết code, người khác vừa đọc đã hiểu bạn đang viết cái gì, code của bạn thực hiện cái gì thì bạn đang áp dụng thành công rồi đấy.

Tuyển lập trình Java lương cao mới ra trường

Ví dụ 1:

mình có 1 method:

public int addTwoNumber(int a, int b) {
return a + b;
}

Khi bạn đọc nó bạn có thể hiểu luôn method đó làm cái gì. Với những method có logic phức tạp hơn, dài dòng hơn thì bạn cần phải biết đặt tên biến, tên hàm, comment thế nào để cho code của bạn dễ hiểu. (Có thời gian thì bạn hãy đọc cuốn ‘clean code’ của Robert C. Martin, bạn sẽ pro ngay mấy cái này =)) )

Ví dụ 2:

mình có 2 method đều thực hiện trả về true nếu số truyền vào là số chẵn:

// method 1
public static boolean isEven(int input) {
return (input & 1) == 0;
}


// method 2
public static boolean isEven(int input) {
return (input % 2) == 0;
}

Rõ ràng, method 1 nhanh hơn method 2 vì nó thực hiện trực tiếp với bit. Nhưng method 2 lại dễ hiểu hơn, người đọc không cần nhớ lại toán tử ‘&’ thực hiện như nào.

Ở đây mình chọn method 2 vì nó dễ hiểu, rõ ràng. Còn method 1 có nhanh hơn nhưng tính tổng thể thì nó không nhanh hơn quá nhiều chỉ  tính bằng mini giây (chỉ khi nào bạn thực hiện lập trình nhúng, big data… thì có lẽ lúc đó người ta sẽ xem xét lại.)

Ví dụ 3:

bạn có biết  hàm tìm kiếm string cài đặt sẵn trong java được viết theo thuật toán ‘Naive Search’, trong khi bạn chỉ cần lên google là có hàng tá thuật toán cùng chức năng với ‘Naive Search’ mà có tốc độ cao hơn nhiều nhưng người ta vẫn dùng ‘Naive Search’ vì nó dễ hiểu, dễ cài đặt. Còn nếu bạn muốn nhanh hơn thì tất nhiên phải viết lại method mới phù hợp cho mục đích của mình rồi.

Với cấp độ cao hơn, khi mà người ta áp dụng các pattern, framework… bản chất code đã trở nên phức tạp hơn nhiều nên tùy theo nhu cầu (khả năng mở rộng, chịu tải, nâng cấp version…), thực sự cần thì người ta mới áp dụng. Chứ mấy cái app con con bạn cũng áp dụng vào vào thì nó sẽ khiến bạn tốn thời gian viết code, thời gian debug…
Nếu bạn đọc code của đứa nào đó thấy khó hiểu thì đừng vội cho đó là cao siêu, hãy hỏi nó sao code mày khó hiểu thế =))

  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

Áp dụng KISS vào code của bạn.

  • Đặt tên hàm, biến, method, class, package, comment rõ nghĩa.
  • Không lạm dụng framework, pattern.
  • Chia vấn task của bạn thành các task nhỏ hơn để code 1 cách rõ ràng.
  • Giới hạn mỗi method chỉ nên từ 30-50 lines, và mỗi method chỉ nên thực hiện 1 chức năng.
  • Hiểu rõ các vấn đề trước khi code.
  • Không nên sử dụng nhiều câu lệnh If trong 1 method, hãy tách nó ra thành các method khác nhau.

Khi áp dụng được nguyên tắc KISS rồi bạn sẽ thấy nó có rất nhiều lợi ích:

  • Các vấn đề được giải quyết nhanh hơn, tránh được các issue phức tạp
  • Code dễ sử dụng, dễ test
  • Bản thân code đã chính là tài liệu, comment cho chính nó
  • Và dễ dàng bảo trì, sửa lại code khi cần

Bạn có thể xem thêm một số nguyên tắc lập trình khác tại đây

Source: https://people.apache.org/~fhanik/kiss.html

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 việc làm ngành cntt hấp dẫn tại TopDev

Tự viết Messenger Desktop cho Linux với Nativefier

Tự viết Messenger Desktop cho Linux với Nativefier

Bài viết được sự cho phép của tác giả Trần Khôi Nguyên Hoàng

Nguyên nhân

Mình không dùng Facebook nhiều mà chỉ dùng mỗi Messenger để nhắn tin chat chit cho công việc và bạn bè – Mặc dù mình thích thằng Telegram hơn, ngon hơn thằng Messenger của anh Mark 3000 lần. Thằng Messenger thì hiện tại hình như bên Windows thì đã có Official rồi thì phải, còn bên Linux như con ghẻ, chả có gì, toàn phải dùng bản Web App. Mỗi lần sử dụng toàn phải tìm lại trong đống tab của mình. Nên mình tim hiểu tự làm một cái thử xem. Sau một lhời gian tìm hiểu thì thấy có một package làm giúp cho mình việc này, tất nhiên nó không phải là native app, mà làm wrapper của Electron.

  Discord đã lưu trữ hàng tỉ messages mỗi ngày như thế nào?
  Messaging App sẽ định hình lại E-commerce

Nativefier

Nativefier là một wrapper của Electron dùng để tạo Desktop Application cho Linux và các platform khác. Tuy nhiên mình chỉ dùng cái này trên Linux thôi nên không test được ở platform khác nha. Ngoài ra, có thể vọc vạch thêm một chút cho application này, ví dụ như inject javascript hay css.

Tự viết Messenger Desktop cho Linux với Nativefier

Cài đặt và cách sử dụng

Cài đặt package này, rồi gắn global flag rồi để sau này có gì sử dụng cho nó tiện cũng được. Nếu không thì bỏ cái global flag ra cũng ok.

sudo npm i nativefier -g
Bash

Sử dụng thì đơn giản cực kỳ. Sử dụng nativefier để convert web app messenger.com cho platform linux.

nativefier https://www.messenger.com -p linux
Bash

Sau khi chạy command này xong thì nativefier sẽ generate ra một folder là Messenger-linux-x64

Tự viết Messenger Desktop cho Linux với Nativefier
Cấu trúc folder khi generate ra

Tới lúc này thì start lên với câu lệnh

./Messenger.com
Bash

Thế là xong, có một Desktop Application rồi.

Mở rộng

Tất nhiên là nếu như vậy không thôi thì cũng không tận dụng hết được tính năng của Nativefier. Ở đây thì mình sẽ mở rộng thêm một chút, mình sẽ làm Dark Mode cho con ứng dụng ghẻ của mình. Electron là một framework dùng để build desktop application bằng html, css, javascript. Thì thằng nativefier này được build dựa trên thằng electron. Như vậy thì muốn thay đổi giao diện của ứng dụng thì chỉ việc add thêm dark mode css là xong. Để inject được css trong natifier thì dùng flag —inject. Vì thế mình sửa code lại một tí.

nativefier https://www.messenger.com -p linux --inject dark.css
Bash

Sau đó vào trong Messenger-linux-x64/resources/app/inject ****để sửa file dark.css như sau. Mình bợ của anh nào đấy trên github

Thế là có một Messenger Dark Mode Desktop Application rồi.

Các bạn có thể xem thêm các API hay ho khác của Nativefier ở đây nhé. Còn nhiều thứ hay ho có thể dùng lắm.

Đến đây thì có vẻ như chưa đủ, mình còn phải tạo shortcut cho nó để bấm là chạy nữa chứ. Lúc này thì phải dùng một số câu lệnh SHELL của Linux.

Đầu tiên là tạo shortcut cho nó tên là shortcut.sh

#!/bin/sh
set -e
WORKING_DIR=`pwd`
THIS_PATH=`readlink -f $0`
cd `dirname ${THIS_PATH}`
FULL_PATH=`pwd`/Lotion
cd ${WORKING_DIR}
cat <<EOS > Messenger.desktop
[Desktop Entry]
Name=Messenger
Name[en_US]=Messenger
Comment=Unofficial Facebook Messenger application for Linux
Exec="${FULL_PATH}/Messenger"
Terminal=false
Categories=Social
Type=Application
Icon=${WORKING_DIR}/icon.png
StartupWMClass=Messenger
EOS
chmod +x Messenger.desktop
## This can be updated if this path is not valid. 
cp -p Messenger.desktop ~/.local/share/applications
Bash

Tiếp theo là tạo file install.sh

#!/bin/bash
PD=`pwd`
INSTALL_DIR=$PD"/Messenger"
echo $INSTALL_DIR
mkdir -p $INSTALL_DIR
tar xvf $PD/Messenger-linux-x64.tar.xz -C $INSTALL_DIR --strip 1
/bin/bash $PD/shortcut.sh
Bash

Rồi làm nốt file remove.sh cho nó đủ bộ

#!/bin/bash
PD=`pwd`
INSTALL_DIR=$PD"/Messenger"
rm -r $INSTALL_DIR
rm ~/.local/share/applications/Messenger.desktop
Bash

Kết luận

Trên đây đơn giản chỉ là một package giúp mình convert một Web App ra Desktop App. Tuy nhiên, nếu Custom tốt thì cũng không đến nổi nào. Ngoài ra thì mình có thể xài thằng này để làm một số App cho mình, ví dụ như thằng Zalo, hay Whatsapp. Cũng là một ứng dụng, vì có app vẫn thích hơn là dùng browser.

Các bạn có thể xem repo tại GIthub của mình nhé.

Bài viết gốc được đăng tải tại htknguyen.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

Tuổi 25 – Bạn có suy ngẫm gì về hành trình ấy?

CV IT Manager
CV IT Manager

CV IT Manager thiếu kinh nghiệm? Chưa năm bắt về những cơ hội? Đâu là những suy ngẫm về giá trị của tuổi 25? 

Con số 25 nói lên được nhiều điều. Chắc chắn bạn đã trải qua nhiều vấp ngã đầu đời và các áp lực từ cuộc sống. Có khi nào bạn đã từng ngẫm lại những gì đã trôi qua hay chưa? Hay chỉ đơn thuần là mãi bị cuốn vào guồng quay của công việc. Nếu chưa thì có lẽ, bài viết này là dành các bạn đấy!                                               

Nhìn nhận tổng quan: Điều gì đến rồi cũng sẽ đến, mọi chuyện rồi sẽ ổn thôi

Mọi chuyện khó khăn, như cơn gió thoảng – những gì trắc trở, tệ hại nhất rồi sẽ chóng qua thôi.

CV IT Manager
Tuổi 25 đều có những điều đáng suy ngẫm. Vậy điều gì khiến bạn phải lắng lại để cảm nhận?

Ví dụ như thuở mới vào nghề, bạn gặp nhiều áp lực khi quyết định theo đuổi ngành IT. Bạn chưa biết cách viết một CV IT Manager chuyên nghiệp. Chưa kể nếu bạn apply thử sức ở nhiều vị trí khác nhau như Mobile App Developer, bạn cần phải viết CV IT tiếng Anh (CV IT English), liệu bạn có tự tin về khả năng của mình? Khi quyết tâm và dành sự tập trung cho nó, bạn nhận thấy nó rất mệt mỏi.

Đồng thời các vấn đề khác về lương, phúc lợi; mối quan hệ giữa bạn và sếp, đồng nghiệp; sự thăng tiến đều là những điều khiến bạn phải suy ngẫm rất nhiều. 

Đừng để bản thân rời vào tuyệt vọng!

Đôi khi, bạn đừng để bản thân lạc lõng với những áp lực. Vì điều đó sẽ khiến bạn đánh mất đi nhiều cơ hội đang hiện hữu chung quanh mình. Tất nhiên, cũng đừng để những cơ hội xấu kéo bạn đi quá xa. Việc nhận ra được những cảm xúc, mong muốn của bản thân rất quan trọng. Chính vì vậy, đừng bao giờ cho phép bản thân đánh mất chính mình. Hãy cố gắng phát huy hết những khả năng nếu được trao cơ hội.

25 tuổi, mọi mùi vị của thanh xuân có cái nào chưa từng trải nghiệm đâu. Quan trọng là hãy học cách trân trọng những mối quan hệ. Nhận thức đúng, sống tích cực để không bị chi phối quá nhiều bởi những tác động từ môi trường xung quanh.

Đánh giá hiện tại – Chưa muộn để xác định tầm nhìn dài hạn

Có thể nói, tuổi 25 là tuổi chạm độ chín của việc phát triển sự nghiệp. Tuy nhiên, điều này không phải là mặc định cho mỗi người. Việc xây dựng và phát triển sự nghiệp đều khác nhau.                     CV IT Manager

cv it tiếng anh
Tầm nhìn dài hạn rất quan trọng, liệu bạn đã thật sự đầu tư cho nó chưa?

Đây cũng là điều TopDev muốn chia sẻ. Bạn không nên so sánh bản thân với sự thành công của người khác để rồi quá tự ti. Một người bạn dev của mình với mức lương được tăng lên 20; thậm chí 30 củ do họ nhận được sự tín nhiệm. Điều này đồng nghĩa họ cũng phải nhận những trách nhiệm lớn hơn. Việc họ thành công có thể gói trọn trong 3 từ “đúng thời điểm”. Đừng quá áp đặt để rồi trở nên chán nản! Vì mỗi người đều sẽ có những thời điểm phù hợp cho riêng mình để tỏa sáng. 

Điều bạn cần làm là đảm bảo sẵn sàng lên một kế hoạch dài hạn cho sự nghiệp. Đồng thời linh hoạt xử lý kế hoạch đầu tư cho nó. 25 chưa phải là thời điểm quá muộn để bạn tạo dựng sự nghiệp.

Phấn đầu từ junior lên senior hoặc leader trong lĩnh vực IT, từ nhân viên thành người quản lý/nhà lãnh đạo nhân sự trẻ là điều khả thi nếu bạn có đủ sự cố gắng và niềm tin vào chính mình. 

Những hành động cụ thể

Chủ động đầu tư cho bản thân! 

Dù bạn đang ở giai đoạn nào, bạn vẫn phải chủ động tìm kiếm sự phát triển. Việc học tập, đầu tư cho bản thân rất cần thiết. Ví dụ khi đi xin việc vị trí Programmer, ngoài các kỹ năng thì IT Programmer CV, CV IT Manager,… được xem là một “tấm vé quyền năng” giúp bạn ghi điểm với nhà tuyển dụng.                                  cv it manager

CV cho sinh viên IT mới ra trường
Hãy quan tâm đến việc đầu tư cho bản thân

Nhiều cá nhân họ cho rằng việc đào tạo và phát triển năng lực chuyên môn thuộc về trách nhiệm của chính tổ chức/doanh nghiệp. Đó là một sai lầm lớn. Không phải công ty nào cũng có những nhà quản trị nhân sự đủ tầm nhìn để vạch ra những đường hướng, chiến lược; hoạch định ra lộ trình thăng tiến phù hợp cho mỗi nhân viên. Đừng suy nghĩ ỷ lại vào công ty! Vì có thể bạn sẽ gặp những cú twist đầy bất ngờ đó.  

Một điều đặc biệt quan trọng là bạn phải tự đầu tư cho bản thân. Kiến thức của bạn tự tìm tòi thì mới đáng giá. Vì chúng theo bạn, được cập nhật và phát triển hơn mỗi ngày. 

Lợi thế tiếp cận từ mạng lưới quan hệ xã hội 

Năng lực, sự may mắn, xây dựng, tạo cầu nối liên kết giữa các mối quan hệ đều là những yếu tố giúp gia tăng cơ hội thành công. Tuy nhiên, nhiều người cho rằng việc thiết lập quan hệ để thăng tiến là điều không mấy tự hào.                 CV IT Developer

Tuy nhiên, nếu đủ tư duy của một người thành công, bạn cần nhiều mối quan hệ. Và tất nhiên, chúng được tạo lập dựa trên uy tín, sự phù hợp khả năng chuyên môn. Như việc khi bạn đang là một newbie về công nghệ, việc nắm bắt một CV cho sinh viên IT mới ra trường (CV IT student) dường như còn hạn chế. Hãy tin rằng bạn thật sự có năng lực để tạo ra sự kết nối các mối quan hệ. Sức mạnh từ mạng lưới xã hội được xem như một “vũ khí” lợi hại để gia tăng lợi thế cạnh tranh cho một cá nhân.

Lưu ý, bạn không thể thành công nếu chỉ cố gắng tạo sự kết nối đơn thuần. Việc xây dựng một mạng lưới tốt đòi hỏi bạn phải có đủ khả năng giao tiếp, đàm phán, tư duy phản biện. Điều này giúp họ nhận thấy mục đích nghề nghiệp và những mong muốn phát triển của bạn. Từ đó, mới có đủ cơ sở để tạo dựng mối quan hệ cho đôi bên cùng có lợi. Nhiều khi bạn thực hiện những điều thú vị sẽ khiến chúng ta tạo ra sự thay đổi tích cực hơn trong công việc. 

Lời kết

Không bao giờ là quá trễ cho những ai nỗ lực, phấn đấu. Những cơ hội mới sẽ luôn mở ra và điều quan trọng là bạn có kiên nhẫn chờ đợi và chớp lấy thời cơ. Những điều suy ngẫm ở tuổi 25 sẽ trở thành động lực hay là khủng hoảng, tất cả phụ thuộc vào nhận thức và sự cố gắng cá nhân của bạn.

MMA Impact Vietnam 2020 – Nơi các chuyên gia Mobile Marketing hàng đầu chia sẻ những bài học đắt giá 

MMA IMPACT
MMA IMPACT

MMA Impact 2020 – sự kiện lớn nhất về tiếp thị di động trong năm sẽ có sự góp mặt của những chuyên gia hàng đầu từ lĩnh vực tiếp thị, quảng cáo và truyền thông. Hãy cùng đặt mua vé ngay hôm nay để không bỏ lỡ cơ hội tham gia diễn đàn đặc biệt sẽ diễn ra vào ngày 19 tháng 11 sắp tới!

Dàn diễn giả uy tín của MMA Impact Việt Nam 2020 – Khi “anh tài” hội tụ

MMA Impact Việt Nam 2020 vinh dự chào đón sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề. Tất cả sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành. 

MMA IMPACT
Sự kiện MMA Impact 2020 với sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.

Sự kiện MMA Impact 2020 với sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.

Đến với Impact 2020, người tham gia sẽ được luận bàn về một xu hướng nổi bật trong năm 2020: Purposeful Marketing (Tiếp thị Ý nghĩa) và vai trò cốt lõi của phương châm này trong ngành tiếp thị hiện đại. Trong năm 2020 với đại dịch COVID-19 diễn biến phức tạp, ngành truyền thông và công nghệ đã chứng kiến tốc độ phát triển kỷ lục để đáp ứng được nhu cầu mua sắm trực tuyến của người tiêu dùng. Vì thế, các doanh nghiệp cần phải tìm được “purpose” (mục đích) cho thương hiệu của mình, từ đó có thể tạo dựng được những chiến dịch quảng bá hiệu quả, có sức ảnh hưởng lan toả và lâu dài. Người tham dự sẽ được chia sẻ về tầm quan trọng của Purposeful Marketing cũng như cách nắm bắt sức mạnh của nó để vượt qua đại dịch lần này.

Danh sách diễn giả sẽ góp mặt tại MMA Impact Việt Nam bao gồm ông Sundar Bharadwaj – Giáo sư Marketing của Trường Đại học Georgia và Trường Terry College of Business, bà Trâm Nguyễn – Country Director của Google Việt Nam/Lào/Campuchia, ông Rohit Dadwal – Managing Director của MMA APAC, ông Tom Simpson – Senior Vice President của AdColony APAC, bà Bessie Lee – Co-founder và CEO của Withinlink, và nhiều chuyên gia đầu ngành khác. 

Xem thêm: Tuyển dụng Mobile hấp dẫn nhiều ngành nghề

Cơ hội lắng nghe những bài học đáng giá sau một năm 2020 đầy biến động

Xoay quanh chủ đề “Kiến tạo tương lai của Tiếp thị hiện đại”, MMA Impact 2020 được thiết kế để nâng cao và xây dựng tiềm năng “modern marketing” của các nhà tiếp thị. Không chỉ mang tới cho người tham dự một kho tài liệu lớn thông qua các báo cáo do MMA Global tổng hợp, hơn hết đây là dịp để các chuyên gia, đối tác của MMA bàn bạc về những vấn đề “nóng” nhất của ngành tiếp thị.

MMA IMPACT
MMA IMPACT
MMA IMPACT
Các chuyên gia tiếp thị chia sẻ về tình hình tiếp thị di động tại Việt Nam ở sự kiện của MMA

Trong panel với chủ đề “Sự trỗi dậy của nền kinh tế Internet Việt Nam”, đại diện từ Google sẽ chia sẻ thứ hạng của Việt Nam trên trường quốc tế dựa trên mức độ tăng trưởng và doanh thu của nền kinh tế Internet. Phiên đối thoại sẽ đào sâu vào xu hướng mới của người tiêu dùng hiện nay, khi họ bắt đầu chuyển qua tiêu dùng trên Internet ở nhiều lĩnh vực đa dạng như bán lẻ, giáo dục, và tài chính. Người tham dự cũng sẽ được lắng nghe các thương hiệu hàng đầu chia sẻ cách mà họ đang thúc đẩy tăng trưởng cho doanh nghiệp trong nền kinh tế Internet hiện nay. 

Tiếp theo, làm thế nào để thiết kế một chiến dịch marketing thành công trong thời dịch? Anh Cường Nguyễn từ Biti’s sẽ chia sẻ cách mà thương hiệu quốc gia này đã đối mặt với COVID-19 một cách khác biệt và truyền cảm hứng, tạo nên một chiến dịch quảng bá ý nghĩa và thành công nhất của Biti’s nửa đầu năm 2020. 

Một trong những chủ đề thú vị khác tại MMA Impact 2020 chính là “Live Streaming trong Thương mại điện tử 4.0”. Bà Bessie Lee từ Withinlink sẽ bàn về một trong những xu hướng đang gây sốt tại Trung Quốc: live streaming. Với việc 5G sắp được phổ biến, live streaming là một kênh bán hàng tiềm năng và đầy sáng tạo giúp doanh nghiệp có thể kết nối nhanh hơn với khách hàng. Bà Bessie Lee cũng sẽ đề cập đến những thách thức mà doanh nghiệp sẽ phải đối mặt khi tích hợp live streaming vào chiến dịch kinh doanh của mình.  

Ngoài ra, một số chủ đề tiêu biểu khác sẽ được thảo luận và chia sẻ tại MMA Impact bao gồm: “Số liệu về người tiêu dùng nông thôn tại Việt Nam” từ Cốc Cốc, “Tiếp thị bằng Influencer” từ Samsung, bàn tròn “Mở khóa những cơ hội tiềm ẩn xung quanh ngành Trò chơi điện tử” với sự tham gia của AdColony và Oppo. Qua những chia sẻ cực kỳ giá trị này, người tham dự có thể trau dồi, cập nhật những xu hướng và thách thức sắp tới của ngành để chuẩn bị cho kế hoạch 2021 của doanh nghiệp mình.

MMA Impact Việt Nam 2020 sẽ được tổ chức vào lúc 8:00 – 12:00 ngày 19/11/2020 tại TP.HCM Tất cả các CEO và CMO từ các doanh nghiệp, nhãn hàng, agency, tập đoàn công nghệ, viễn thông,… đều được chào đón tại sự kiện. 

Đặc biệt, hãy nhanh tay đăng ký ngay hôm nay tại https://www.mmaglobal.com/impactvietnam2020#register hoặc liên hệ theo số hotline: 0834.269.997 (Ms. Xuân)/ 0978.757.275 (Ms. Hân).

Và đừng quên tham dự Đêm trao giải Smarties để cùng theo dõi danh sách các chiến dịch tiếp thị di động xuất sắc nhất sẽ được vinh danh vào cùng ngày – 19/11/2020 sắp tới. 

Giới thiệu về Hiệp hội Tiếp thị Di động (MMA) 

MMA là hiệp hội tiếp thị di động thương mại phi lợi nhuận hàng đầu thế giới bao gồm hơn 800 công ty thành viên, đến từ gần 50 quốc gia trên thế giới. Các thành viên của chúng tôi đến từ mọi mảng trong hệ sinh thái tiếp thị di động, bao gồm brands marketer, agency, nền tảng công nghệ, công ty truyền thông,… Sứ mệnh của MMA là đẩy nhanh quá trình chuyển giao và đổi mới của marketing thông qua thiết bị di động, thúc đẩy tăng trưởng kinh doanh với sự tương tác mạnh mẽ hơn của người tiêu dùng. Dẫn dắt sứ mệnh của MMA là bốn trụ cột cốt lõi: Nuôi dưỡng cảm hứng bằng cách thúc đẩy sự đổi mới cho các CMO; Xây dựng tiềm năng tiếp thị di động cho các tổ chức tiếp thị thông qua việc cung cấp kiến thức và sự tự tin; Nâng cao hiệu quả và tác động của thiết bị di động thông qua nghiên cứu ROI hữu hình; và ủng hộ các nhà tiếp thị di động. Ngoài ra, các Committee của MMA còn hợp tác để phát triển và hỗ trợ các phương pháp tốt nhất và tiên phong trong những phát triển đúng tiêu chuẩn.  

Các thành viên của MMA tại Việt Nam bao gồm Facebook, Google, CocCoc, Adtima, GroupM, Coca-Cola, Unilever,… và rất nhiều tên tuổi lớn khác. Trụ sở toàn cầu của MMA được đặt tại New York với các hoạt động khu vực ở Châu Âu / Trung Đông / Châu Phi (EMEA), Châu Mỹ Latinh (LATAM) và Châu Á Thái Bình Dương (APAC). Để biết thêm thông tin về MMA, vui lòng truy cập www.mmaglobal.com.

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

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

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

I.Kiểu dữ liệu

Swift cung cấp cho chúng ta đầy đủ các kiểu dữ liệu cơ sở giống như C và Obiective-C. Ví dụ: Int, Double, Float, Bool, String, …).

Các kiểu dữ liệu mới trong Swift:

Chúng ta có thể demo và học các câu lệnh cơ bản  trong Xcode nó sẽ chạy và show kết quả từng câu lệnh cho chúng ta.

  Hằng và biến trong Swift
  Các cách sử dụng AS, AS?, AS! một cách hiệu quả và an toàn trong code Swift

Apple có cung cấp cho chúng ta công cụ tuyệt vời để test code-Swift: playgroundChúng ta sẽ sử dụng tool playground để học swift3.

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Bạn click vào “Get started with a playground ”

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Các bạn click next và chọn nơi lưu project

Và đây là giao diện giúp chúng ta code.

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Array
Các phần tử trong 1 array phải chung kiểu dữ liệu. Có thể khai báo array bằng những cách sau:

Khai báo mảng rỗng

  • let emptyArr = [Int]() // mảng Int rỗnglet emptyArr : Array<Int> = [] // mảng int rỗng

Thêm mới 1 phần tử:

  • arr.append(6) // thêm vào cuối mảng arr.insert(0, atIndex: 0) // thêm mới theo index

Dictionary

Dictionary dùng để chứa các biến có cùng kiểu dữ liệu. Khác với array là dictionary gọi biến theo key – value chứ không phải theo index.

Khai báo dictionary theo 2 cách như sau:

  • var dict : Dictionary<String,String> = [“HN” : “HaNoi” , “HCM” :“HoChiMinh”];var dict2 : [String : String] = [“HN” : “HaNoi”];

II.Biến và hằng

1.Biến

Trong ngôn ngữ Swift, các biến được khai báo bằng từ khóa “var”

Khai báo biến dùng từ khóa var theo sau là tên biến được khởi tạo giá trị. Kiểu dữ liệu của biến khai báo theo cách này phụ thuộc vào giá trị nó khởi tạo. Bạn có thể khai báo nhiều biến trên một dòng, mỗi biến cách nhau bởi dấu “,”.

var Tên biến: kiểu dữ liệu = Giá trị

Ví dụ:

  • var str: String = “Học swift”

//Khai báo biến, khởi tạo giá trị cho nó là //số nguyênvar bien1 = 123 //Khai 2 biến trên một dòng bien2 và biến3 var bien2 = “XYZ”, biến3 = bien1 + 10

2.Hằng

Khai báo hằng số

– Hằng số để sử dụng lưu giá trị nào đó mà không cần thay đổi,không giống với biến chúng ta có thể thay đổi được giá trị nhưng khi chúng ta đã khai báo 1 hằng số thì không thể thay đổi giá trị cho hằng số đó.

– Để khai báo 1 hằng số trong swift chúng ta sử dụng từ khóa “let”,cũng giống với biến thì hằng số cũng có nhiều cách khai báo hằng đó là có thể gắn luôn kiểu dữ liệu hoặc không gắn kiểu dữ liệu và gắn giá trị mặc định hoặc không.

Khi chúng ta không gắn kiểu giá trị cho hằng số mà gắn giá trị mặc định thì lúc đó Swift sẽ tự động gắn kiểu cho hằng đó như kiểu của giá trị.

Để khai báo hằng số thì dùng từ khóa let theo sau là tên hằng và giá trị hằng số.

Ví dụ:

  • let SỐ_PI = 3.14

3.Quy tắc đặt tên biến và hằng

Tên biến và hằng bạn có thể gõ tên bất kỳ (kể cả dùng ký tự Unicode, gõ tiếng việt …), miễn là đảm bảo những nguyên tắc sau sẽ được chấp nhận:

  • Không được có khoảng trắng, ký hiệu toán học (+ / …), mũi tên (← → ↑ ↓ …), các tên và ký hiệu dùng bởi ngôn ngữ Swift trong tên biến
  • Tên biến có thể chứa ký tự số nhưng không được phép dùng số để bắt đầu tên biến. bien123 thì được, 123bien thì không được

Bài viết gốc được đăng tải tại codecute.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

Open Source Story: Agar.IO Clone

Open Source Story: Agar.IO Clone

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

Những gì sắp kể ra ở đây là về hành trình của mình đến với thế giới open source, đây là một dự án làm cho vui nhưng rốt cuộc lại đóng vai trò khá quan trọng đối với con đường làm kĩ thuật của mình, nhất là khi nó cũng mở ra khá nhiều cơ hội lúc mình đặt chân đến Mỹ (khi có dịp mình sẽ nói về cái này sau). Từ đó đến giờ cũng khá lâu rồi, nên mình không thể nhớ hoàn toàn mọi chi tiết cũng như rất nhiều tư liệu trong quá trình viết game này đã bị mất, hôm nay quyết định viết ra chứ để lâu nữa có khi lại quên sạch luôn.

  Các resources mới dành cho web dev
  OpenCV là gì? Học Computer Vision không khó!

Vào khoảng nửa đầu năm 2015, thì trò chơi Agar.IO bắt đầu trở nên nổi tiếng và tình trạng chơi Agar trong giờ làm việc dần trở nên phổ biến, team mình lúc đó cũng không ngoại lệ 

Thú thực thì công ty outsource, ở thời điểm mới thành lập, dự án cũng không có nhiều và gắt nên anh em cũng khá rảnh rỗi. Rảnh đến mức mình cài luôn Diablo III vào máy để chơi cơ mà.

Nhưng chơi game cả ngày thì cũng chán, thế là mình chuyển qua làm game ở trên công ty luôn (thời điểm đó mình vẫn còn hoạt động trong mảng game dev, đối với mình, làm game là đam mê, còn chuyện đi làm outsource cũng chỉ là vì cơm áo gạo tiền, quyết không bán mình đi làm game vì tiền, một phần khác thì vì cty outsource này trả lương cũng khá là cao).

Làm game gì bây giờ nhỉ? Lúc đó mình đang chơi 2 game là Diablo và Agar, làm Diablo thì đương nhiên là không làm nổi rồi, trình đếu đâu, thôi thì làm game Agar vậy.

Bản prototype đầu tiên

Tính từ lúc start đến lúc hoàn thành bản prototype chơi được đầu tiên là khoảng 1 buổi sáng, chắc tầm 3 tiếng, bản prototype khá đơn giản, hoàn toàn không có chế độ chơi online, nhưng các thành phần cơ bản của gameplay thì đều có đầy đủ:

  • Cơ chế dịch chuyển/điều khiển, collision detection (nói cho sang, chứ chỉ là kiểm tra một điểm có nằm trong một đường tròn không thôi), food spawning, cơ chế ăn food, cơ chế growth khi ăn.
  • Game được render trên một thẻ <canvas>, xóa toàn bộ màn hình sau mỗi lần di chuyển 
  • Toàn bộ diện tích game là diện tích của màn hình hiện tại, chưa có scrolling và viewport

Thực ra ban đầu mình không có ý định làm bản online, mà dự định sẽ viết thêm bot và chơi offline. Nhưng mấy anh bạn trong team sau khi thấy mình làm ra được thế thì muốn mình share ra để chơi chung, nên đành phải viết thêm chức năng online.

Bản prototype tiếp theo: Multiplayer

Việc add thêm chức năng multiplayer cho một bản prototype game đang chạy offline cũng có nhiều cái thú vị cần nói tới, vì ngay từ bước này mình mắc phải nhiều sai lầm nghiêm trọng nhưng bản thân mình lúc đó chưa hề hay biết.

Về cơ bản thì logic của game vẫn được xử lý hoàn toàn trên phía client (!!!), server gần như chỉ làm nhiệm vụ nhận và broadcast các sự kiện được truyền lên từ các client.

Ví dụ có 2 player cùng kết nối vào game, khi player A di chuyển đến một vị trí (x, y) thì nó sẽ gửi một tín hiệu đến server, bảo là “Ê, tao chạy đến (x, y) nè”, server sẽ nhận tín hiệu đó và thông báo cho tất cả những player khác rằng “Chúng mài ơi, thằng A nó chạy đến (x, y) nhá”.

Hoặc khi player B ăn được một miếng food, thì nó sẽ thông báo lên server là “Này, tao vừa ăn được một cục, kích thước của tao giờ +1 rồi nhé”, với bản chất là một cái loa phóng thanh, server cũng sẽ hét lên rằng “Bớ làng nước ơi thằng B nó tăng thêm một đơn vị rồi kìa”.

Open Source Story: Agar.IO Clone

Nếu quan tâm, các bạn có thể đọc thêm về toàn bộ những cách liên lạc từ các client lên server trong phiên bản đầu tiên này tại đây Game Architecture – huytd/agar.io-clone.

Sau khi có bản multiplayer, mình liền share cho mấy anh em trong team chạy thử, kết quả có vẻ như khá thành công, mình quyết định sẽ chia sẻ mã nguồn lên GitHub, kèm theo đó là viết một bản document thiệt hoành tráng mô tả cách xây dựng game của mình.

Lên sóng

Đây là commit đầu tiên khi game được publish lên GitHub: edf3fec.

Tiếp sau đó, mình share cái repo này lên Hacker News và nhận được khá nhiều sự chú ý của cộng đồng, đứng ở vị trí top 1 được hơn 1 ngày, kết quả là lượng star cho project tăng lên vùn vụt, đó cũng là lần đầu tiên mình tạo được nhiều sự chú ý đến vậy trên phạm vi ngoài nước.

Từ đó kéo theo rất nhiều chuyện vui, như là, một anh thầy giáo đến từ Brazil đã sử dụng source game của mình và deploy lên mạng nội bộ của trường cho học trò chơi, từ đó ảnh có thể ngắt hoàn toàn internet trong lớp, không cho lũ trẻ duyệt web trong giờ học nữa, cơ mà đám trẻ rất thích. Và rất nhiều người cũng gửi mail đề nghị mình làm freelance cho họ một bản game hoàn chỉnh để cạnh tranh với Agar.io, hoặc clone thành một trò có phong cách giống vậy, tất nhiên nhận ra tính chất chụp giựt của các con buôn, và tinh thần làm vì đam mê chứ không bán rẻ công sức, nên mình đã từ chối, giờ nghĩ lại thấy hơi tiếc tiền.

Bên cạnh đó cũng có rất nhiều bài học quý giá mà mình nhận được trong quá trình cộng tác với những người bạn không quen biết từ khắp nơi trên thế giới.

Đập đi làm lại

Gần như ngay lập tức sau khi mình publish source lên mạng, rất nhiều người đã thấy ngay sai lầm về mặt design trong kiến trúc client-server mà mình sử dụng, vì nó hoàn toàn quá dễ để hack.

Vì game logic được kiểm soát bằng cách để cho client gửi messages lên server, và server phân phát lại cho toàn game, một client hoàn toàn có thể hack tọa độ hoặc hack tăng kích thước lên cực bự, hoặc nếu thích thì có thể giết toàn bộ các player khác chỉ bằng việc gửi lên server vài messages đã được thay đổi.

Vì thế nên mình đã phải viết lại toàn bộ sau khi publish source lên GitHub (xem commit 547134c)

Việc kiểm soát logic của game (dịch chuyển, cập nhật tọa độ các player, collision detect, xử lý việc ăn và bị ăn của các player,…) phải được thực hiện hoàn toàn ở phía server, và client chỉ làm một nhiệm vụ duy nhất là render ra theo những gì server bảo.

Nếu mà nói về Networking Programming cho game thì nó rất là rộng, rộng đến mức có thể tách nó thành một phạm trù riêng và không liên quan gì đến chuyện làm game luôn, chính vì thế nên mình lười, không học  cho nên đến lúc trước khi đụng phải vấn đề này, mình cũng chỉ biết mang máng là cách làm của mình nó sai lè ra đấy, nhưng không hình dung được phải làm sao cho nó đúng. Rất may, nhờ việc khoe cái ngu của mình lên mạng, nên mình đã chữa được cái ngu đấy của bản thân.

Một lần khác, project lại nhận thêm một issue nữa để bàn về vấn đề tại sao không sử dụng một cấu trúc dữ liệu khác tốt hơn thay cho việc dùng mảng để quản lý player.

Nói về vấn đề này, có thể hiểu nôm na rằng, ban đầu, tất cả các player được lưu vô một mảng ở trên server, và khi có sự tương tác xảy ra giữa các user, server sẽ phải kiểm tra bằng cách duyệt hết toàn bộ mảng đó:

// khởi tạo mảng chứa các player
const players = [];

// khi có player join vào game thì đưa vô mảng
server.on('playerJoined', (player) => players.push(player));

// kiểm tra va chạm giữa các players khác và player A
for (let player of players) {
	if (hitTest(playerA, player)) {
		// ... do something ...
	}
}

Tất nhiên làm như vậy thì rất ngu, vì server phải tốn công xử lý cho cả những user mà trên thực tế đang ở cách nhau rất xa (đầu screen và cuối screen chẳng hạn).

Open Source Story: Agar.IO Clone

Sau khi thảo luận, mọi người thống nhất sẽ dùng Quadtree để quản lý các player theo tọa độ tương ứng, từ đó giúp cho việc tìm ra player nào đụng nhau hiệu quả hơn. Thú thực thì đây cũng là một thứ mình chưa bao giờ đụng đến, và chỉ được biết về nó sau cuộc thảo luận này, ngay cả việc implement cũng do một anh bạn tốt tính nào đó thực hiện giúp luôn .

Open Source Story: Agar.IO Clone

Trên đây chỉ là ví dụ cho hàng tá thứ mà mình học được từ cộng đồng sau khi public mã nguồn của game lên GitHub.

Miniclip, DCMA và hưởng lợi

Phải nói thêm là, project của mình không phải là project duy nhất liên quan đến game Agar.IO ở thời điểm này, nhưng phần lớn các dự án khác trên GitHub lúc bấy giờ, bên cạnh các dự án written from scratch giống như mình làm, còn có các dự án kiểu rip off lại game cũ bằng cách dịch ngược client, deploy lại lên một server khác để gắn ads vào, hoặc viết lại client nhưng reverse engineering lại protocol để kết nối vào server chính,…

Sau khi game Agar.IO (bản gốc) được Miniclip mua lại, gần như ngay lập tức, họ gửi request đến GitHub để gỡ xuống hàng loạt các dự án liên quan đến Agar.IO hoặc có xài tên gọi Agar.IO

Lúc đó thì mình nghĩ, “thôi thế là xong phim con mẹ nó rồi”, vì project của mình kiểu gì cũng sẽ nằm trong danh sách bị gỡ bỏ. Nhưng bất ngờ thay, sau một tuần thì mọi thứ vẫn an toàn.

Đồng thời, nhờ việc các “đối thủ cạnh tranh” bị tiêu diệt hết, và “đối thủ chính” đã bị hốt về tay Miniclip, hàng loạt những thủ đoạn kiếm tiền trắng trợn được đưa vào Agar.IO khiến cho cộng đồng bất mãn, và họ bắt đầu đi tìm một giải pháp vừa open source vừa có thể self-hosted được, tất nhiên ứng cử viên sáng giá không ai khác ngoài kẻ còn sót lại sau cơn bão dữ, là dự án của mình  nên số lượng star cho dự án lại càng tăng lên từng ngày, từng ngày một.

Bên cạnh vai trò làm kẻ thay thế đại diện cho chính nghĩa trước thủ đoạn “xảo trá con buôn” của nhà phát hành game bản gốc, project của mình còn đóng vai trò là một nguồn tư liệu tham khảo cho nhiều developer khác khi họ có ý định bắt tay vào làm một game giống như Agar.IO – hẳn là bạn đang thắc mắc học hỏi được cái gì? mình cũng thắc mắc y thế khi thấy các repo khác mentioned tên mình và tên project của mình, chắc họ nhìn vào mình như là một case điển hình của code thối và kiến trúc tồi .

Về sau thì mình mới biết lý do project của mình còn sót lại là vì “người ta” không coi mình là đối thủ  https://news.ycombinator.com/item?id=9976643. Thêm một bài học nữa, ở hiền thì gặp lành, chỉ cần mình đừng làm hại đến người ta, thì dù có tiền, người ta cũng sẽ để yên cho mình.

Vấn đề kiểm soát dự án

Tất nhiên không phải bài học miễn phí nào cũng dễ chịu, bên cạnh những người bạn vô danh sẵng lòng đem kiến thức của họ ra mở mang tầm mắt cho mình một cách nhiệt tình và nhã nhặn, có không ít những cá nhân thoải mái mạt sát, chửi đổng khi gặp những điều họ không vừa ý về project, hoặc lên các diễn đàn, website khác để nói xấu, cũng có vô số người tạo issue xong lặn đâu mất, 2, 3 năm sau mới vô comment lại 

Tuy khó chịu thật, đôi lúc đọc issue xong chán chả buồn comment, nhưng nghĩ lại thì qua mỗi một trường hợp như thế, mình đều học được thêm về cách deal với từng loại người khác nhau trên internet, và quan trọng hơn nữa, đây là công sức và cống hiến của mình cho cộng đồng, ở đâu đó, dự án của mình đã ít nhiều tạo được một chút impact tốt đẹp (ví dụ như trường hợp anh thầy giáo Brazil ở trên), mình lấy đó làm động lực để tiếp tục fix bug 

Nếu mà nói về một bài học đắt giá nhất, thì có lẽ đó là bài học về cách để kiểm soát dự án một cách hiệu quả.

Hồi đầu khi project vừa được ra mắt, mình rất là ba phải, ai tạo issue gì hay suggest cái gì mình cũng đều accept, gần như là merge hết không chừa một cái PR nào (thằng bé lần đầu được nhiều người tặng star và contribue cho dự án, nên gặp ai cho cái gì cũng hốt).

Và hậu quả thì chỉ sau vài tháng, toàn bộ codebase đã trở nên hoàn toàn lạ lẫm đối với mình   , đến mức chính bản thân mình còn không hiểu được code nữa, còn thời gian dành cho việc fix bug do user report còn nhiều hơn cả thời gian làm việc ở công ty. Mặc dù đến lúc đó đã có thêm 2 bạn contributor khác cũng join vào để maintain dự án. Danh sách issue thì ngày một dài lên.

Nếu ở thời điểm đó mình biết cách nói không với các feature request, hay giữ thái độ cứng rắn hơn khi nhận được các pull request, biết cách sắp xếp và quản lý được roadmap cho dự án hiệu quả hơn thì có lẽ mình sẽ không bị quá tải và dẫn đến việc chán nản mà bỏ luôn dự án.

Tại sao lại bỏ?

Vì sao mình không làm tiếp dự án này?

Mặc dù những ai biết mình thì đều biết rằng mình nổi tiếng với việc làm giữa chừng là bỏ, nhưng nói thật là trong dự án này mình có lý do hẳn hoi đấy nhé.

Đầu tiên, phải nói đến đó là vision và motivation khi bắt đầu dự án. Mình hoàn toàn không có một định hướng gì rõ ràng cho dự án này, và mình bắt đầu làm nó chỉ vì rảnh quá không biết dùng thời gian để làm gì.

Và mình chỉ trở nên nghiêm túc với nó sau khi nhận được một vài sự chú ý nhất định.

Cho nên khi số lượng issue và feature request tăng lên, các vấn đề khó hơn xuất hiện càng nhiều, không còn quá quen thuộc với chính dự án do mình khởi xướng lên từ đầu, nên thời gian để fix bug cũng tăng lên, mức độ interest của mình đối với dự án càng lúc càng đi xuống.

Một lý do khác nữa, là mình không thực sự cảm thấy tự hào về dự án này, nhiều star để làm gì?  trong khi bản thân dự án có kiến trúc cực kì non nớt, performance cực kì kém và các kĩ thuật sử dụng trong dự án cũng cực kì lởm. Điểm sáng duy nhất có lẽ là project rất đơn giản và đi kèm với nó là tài liệu mô tả khá chi tiết.

Những vấn đề còn bỏ ngỏ

Vẫn còn rất nhiều những vấn đề quan trọng mà mình chưa có cơ hội / và không còn hứng thú để giải quyết trong dự án này, roadmap còn rất nhiều những task chưa được tick, nhưng có lẽ một trong những vấn đề lớn nhất đó là performance khi có nhiều người cùng chơi – có rất nhiều lý do đằng sau chuyện này, phần lớn là từ phía xử lý logic game trên server, từ việc sử dụng JSON để xử lý tín hiệu trong game,…

Có lẽ một lúc nào đó mình sẽ viết lại hoàn toàn game này, hoặc cũng có thể là mình sẽ sửa sai bằng một project hoàn toàn mới không biết chừng (rồi cũng sẽ bị drop thôi ).


Dù sao thì đây cũng là một project thú vị, và hành trình đưa nó đến với cộng đồng cũng đã đem lại cho mình rất nhiều kinh nghiệm và bài học quý giá. Và tất nhiên đây không phải là trải nghiệm duy nhất của mình, còn rất nhiều những dự án khác nữa mà mình sẽ kể trong các bài viết tới, mong các bạn đón đọc.

Bài viết gốc được đăng tải tại thefullsnack.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