Nghề lập trình viên làm việc nhiều giờ liên tục, cường độ cao với máy tính là điều không thể tránh khỏi. Đó chính là nguyên nhân của các vấn đề về mắt cảm giác mệt mỏi, mờ nhạt đôi khi đi kèm những cơn nhức đầu vào buổi chiều muộn. Đặc biệt, khi cùng một lúc sử dụng nhiều thiết bị: máy tính, điện thoại, máy tính bảng, tivi,.. thì những dấu hiệu này càng đến sớm hơn. Đó là những dấu hiệu cho thấy mắt bạn bắt đầu có vấn đề, và đã đến lúc cần quan tâm tới nó nhiều hơn.
Với đặc thù công việc của mình, thật khó để yêu cầu lập trình viên hạn chế hay không sử dụng máy tính. Nhưng may mắn thay, có một vài lời khuyên từ chuyên gia có thể giúp bạn có được đôi mắt sáng, khỏe mà vẫn có thể đảm bảo tốt công việc của mình:
Sử dụng style chữ hợp lý
Có thể bạn chưa biết, cỡ chữ và màu sắc của trang văn bản được hiển thị cũng rất quan trọng đối với thị giác. Cỡ chữ lý tưởng là cỡ chữ gấp 3 lần cỡ chữ nhỏ nhất mà bạn có thể đọc được dù đứng xa máy tính một khoảng cách gấp 3 lần khoảng cách thông thường khi sử dụng máy. Bạn nên chọn chữ đen trên nền trắng hoặc chữ đậm trên nền sáng. Cần nhớ không nên chỉnh cho độ tương phản giữa chữ và nền quá kém hoặc đọc chữ trên một nền quá rối rắm sẽ không tốt cho thị giác của bạn chút nào.
Chớp mắt đúng cách
Nhìn chằm chằm vào máy tính liên tục nhiều giờ liền khiến chung ta quên chớp mặt, dẫn tới tình trạng mắt bị khô gây cảm giác khó chịu. Khi tập trung thật khó để nhớ phải chớp mắt. Giải pháp dành cho bạn là sử dụng nước mắt nhân tạo để giúp ngăn ngừa và làm giảm khô mắt. Thuốc nhỏ mắt không có chứa chất bảo quản có thể sử dụng một cách thường xuyên. Còn nếu sử dụng thuốc nhỏ mắt chứa chất bảo quản thì không nên dùng quá 4 lần/ngày.
Đặc biệt lưu ý là bạn cần tránh nhầm lẫn giữa thuốc nhỏ mắt thông thường với các loại thuốc nhỏ mắt đặc dụng chữa các bệnh về mắt vì chúng có thể làm trầm trọng thêm các triệu crứng khô mắt, không có lợi cho đôi mắt của bạn.
Tùy chỉnh độ sáng
Màn hình chói có thể gây mỏi mắt và đau đầu. Điều chỉnh độ sáng của bạn để tránh phản xạ trên màn hình của bạn hoặc xem xét nhận phim chống lóa.
Không chỉ ánh sáng từ màn hình máy tính mới là nguyên nhân khiến đôi mắt bạn gặp vấn đề. Ánh sáng hoàn hảo là phải nên kết hợp hài hoà giữa nguồn sáng tự nhiên và nguồn sáng nhân tạo. Ánh sáng mờ hay quá rõ, ánh sáng trắng hay ánh sáng vàng đều khiến mắt bạn phải điều tiết, sẽ tác động tiêu cực tới thị giác. Ví dụ khi làm việc trong phòng tối sẽ làm cho mắt bạn mệt mỏi vì mắt phải điều tiết theo độ sáng của màn hình và bóng tối xung quanh.
Quy tắc 20-20-20
Sau 20 phút làm việc, mất 20 giây để nhìn vào thứ gì đó cách xa 20 feet (~6m). Đôi mắt của bạn có các cơ giúp chúng di chuyển và tập trung vào các vật thể khác nhau, nhưng nếu chúng ta nhìn chằm chằm vào màn hình cùng khoảng cách trong nhiều giờ tại một thời điểm, những cơ đó sẽ khó điều chỉnh khi chúng ta di chuyển trở lại.
Bố trí màn hình máy tính hợp lý
Trong quá trình làm việc, ánh sáng chói và ánh sáng phản xạ từ màn hình máy tính chiếu trực tiếp tới mắt sẽ khiến mắt bạn khó chịu và căng thẳng. Bạn nên điều chỉnh độ tương phản và độ sáng trên màn hình đến một mức độ thoải mái, đảm bảo các chữ cái trên màn hình rất dễ đọc hoặc đặt thêm kính lọc cho màn hình.
Đồng thời, bạn cần giữ cho màn hình trong tầm mắt hoặc dưới tầm nhìn một chút, vị trí màn hình máy tính nên được đặt cách mắt 50 đến 60 cm. Lưu ý là bạn phải lau sạch bụi từ màn hình máy tính thường xuyên nếu không lượng bụi sẽ làm giảm độ tương phản, khúc xạ và ánh sáng của màn hình.
Tư thế ngồi làm việc
Tư thế ngồi sử dụng máy tính thường rất hay bị mọi người bỏ qua. Nghển cổ hoặc nghiêng đầu khi nhìn vào máy tính sẽ gây đau đầu và nhìn mờ. Việc duy trì khoảng cách giữa mắt với màn hình không những làm giảm tác động xấu mà còn giúp mắt nhìn được tốt hơn. Hãy chú ý để có tư thế ngồi làm việc hiệu quả mà vẫn thoải mái nhất.
Ăn uống đủ chất
Bổ sung thêm chế độ ăn giàu vitamin, đặc biệt các loại vitamin A, E, C, B2… có nhiều trong các loại rau xanh, quả đỏ và uống nhiều nước nữa bạn nhé. Việc ăn uống đầy đủ chất, giúp cơ thể bổ sung năng lượng và làm mới thực đơn hàng ngày là liều thuốc giúp dân văn phòng phòng ngừa nhiều bệnh về mắt.
Một bí kíp nho nhỏ được đúc kết từ một senior developer với nhiều năm kinh nghiệm xông pha chiến trường.
Ngã ở đâu – đứng dậy từ chỗ đấy
Có công mài sắt có ngày nên kim! Không phải tự nhiên một lão làng trong giới lập trình lại có thể chễm chệ ngồi ở vị trí đấy. Sau đây tôi sẽ chia sẻ cho anh em một chu trình để tu luyện đến cảnh giới bất khả chiến bại: mắc sai lầm – sửa lỗi sai – học được gì từ những lỗi sai đó – chia sẻ với anh em và quay lại bước 1.
Nhiều anh em dev nghĩ rằng chỉ cần trưng cái CV cộp mác +2, +5 năm thì các nhà tuyển dụng sẽ bị mờ mắt bởi những con số. Thực chất, khi thật sự bắt tay vào công việc, một điều sẽ sớm lộ ra rằng thực chiến mới sử dụng được trong cuộc chiến mạng khốc liệt ngày nay. Sẽ thật đáng buồn nếu trong số 5 năm kinh nghiệm bạn trải qua, bạn chưa từng vấp ngã và rút ra bài học cho những sai lầm đó.
Biết người biết ta – trăm trận trăm thắng
Dù không phải là một điều trong list dài dặc JD, nghiên cứu thị trường là công việc một dev chuyên nghiệp dành thời gian để thực hiện. Nếu chỉ dựa vào kinh nghiệm cá nhân, các dev sẽ dễ “chủ quan khinh địch” và dễ bị tấn công bởi những lỗi mới chưa gặp. Khi mang những “đứa con” của bạn ra thử nghiệm thực tế, bạn sẽ biết được ưu nhược một cách khách quan hơn.
Chuyện một tay mơ trong làng “cốt” bị phang ngay câu chốt “vì nó vốn như thế, anh gặp rồi, không sửa được” là điều thường xuyên như cơm bữa. Cái thằng nó dám lẳng lặng gõ gõ bàn phím để lục tung bằng được lỗi là ở đâu chính là cái thằng sẽ sớm làm nên chuyện! Đó là lý do có những lão làng kinh nghiệm lên đến 6,7 năm nhưng kiến thức chưa hẳn bằng một bé 3 năm vì họ có thói quen skip những lỗi mắc phải. Trong quá trình làm việc, đụng đến bug, không biết fix và chỉ ước rằng giá như được quay lại quá khứ để dũng cảm đối mặt với những sai lầm đó hơn.
Nếu không có lỗi, hãy cố gắng đào cho ra lỗi bởi một chương trình hoàn hảo là một chương trình mong manh và dễ bị tấn công nhất.
Người ta nói cách xào lại kiến thức hiệu quả nhất là hướng dẫn cho người khác cách làm việc sao cho hiệu quả hơn. Một dev xuất sắc phải chứng minh được năng lực thông qua cách anh ta làm việc nhóm và hỗ trợ những người khác. Với những kinh nghiệm chia sẻ, những junior dev sẽ “tò mò” tìm tòi được hướng đi riêng cho chính mình, đồng thời những đàn anh dev sẽ rèn luyện các kĩ năng mềm của bản thân. Chưa kể, những câu chuyện trong đoạn hội thoại của người mới biết đâu sẽ giúp các senior dev cập nhật những xu hướng mới mà họ bỏ lỡ khi đang dành thời gian cày cuốc bên bàn phím.
Freakonomics – một tiểu thuyết gia bán chạy nhất thời đại có một câu châm ngôn rất nổi tiếng: “Ba từ khó nói nhất đối với con người không phải là “tôi yêu bạn” mà là “tôi không biết””.
Thật khó để một ai đó tự thừa nhận rằng họ không biết, đặc biệt khi họ đã đạt đến level “dev siêu cấp”. Một nghiên cứu chỉ ra rằng chỉ có những dev với kiến thức nửa vời mới cố gắng “giấu dốt”. Một lập trình viên đẳng cấp sẽ chứng minh năng lực của anh ta thông qua những điều chưa biết, và hãy quay lại điều 3: đụng vấn đề, đặt câu hỏi tại sao và tìm hiểu để giải quyết nó.
Kết luận
Chúc anh em sớm nắm trọn bí kíp tu luyện để trở thành những ngôi sao sáng trong làng code nhé.
Theo thông tin được cập nhật về thị trường IT mới nhất của TopDev, hiện nay có đến 62% ứng viên IT bị động, gấp gần 5 lần số lượng ứng viên chủ động tìm việc chỉ với 14%. Xu hướng này đã gây ra nhiều trở ngại cho các nhà tuyển dụng, đòi hỏi họ phải ngày một chủ động hơn trong việc tìm kiếm nhân tài. Chủ động hơn đồng nghĩa với việc các nhà tuyển dụng phải nỗ lực hơn, đầu tư nhiều thời gian để tìm kiếm và thu hút kiểu ứng viên này.
Nào hãy cùng TopDev tìm hiểu kĩ về ứng viên IT bị động, các ưu khuyết điểm, cũng như các biện pháp thực tiễn và chi tiết để cải thiện các vấn đề phát sinh từ kiểu ứng viên khó nhằn này nhé!
1. Ứng viên IT bị động là gì?
Ứng viên IT bị động – nôm na là những ứng viên IT không chủ động tìm việc nhưng được các nhà tuyển dụng chủ động tìm kiếm để lấp đầy cho các vị trí trống. Nói cách khác, họ không hề chủ động nộp CV ứng tuyển, mà chính những người tuyển dụng mới là người tìm kiếm thông tin liên lạc và trực tiếp mời họ ứng tuyển.
Như bạn có thể thấy hiện nay có hơn 2/3 ứng viên IT khảo sát là ứng viên bị động, trong khi ứng viên chủ động chỉ dừng lại ở con số hạn chế 14%. Nói tới đây, bạn có thể thắc mắc kiểu ứng viên này có gì đặc biệt khiến cho mọi đội ngũ tuyển dụng phải “cuống cuồng” lên tìm kiếm? Cùng TopDev tìm hiểu kĩ hơn về điểm mạnh yếu của ứng viên IT bị động nhé!
2. Ưu khuyết điểm của ứng viên IT bị động?
Ưu điểm
Nguồn ứng viên đếm không xuể
Hiển nhiên là số người không quan tâm vị trí công việc của bạn gấp nhiều lần người quan tâm, tỉ lệ này cũng na ná khi bạn đăng một ảnh lên Instagram, số người like chắc chắn sẽ thấp hơn nhiều số người theo dõi bạn! Hãy nhớ rằng bất kì ai trong độ tuổi lao động ngoài kia đều có thể là những nhân tài tiềm năng góp phần không hề nhỏ cho doanh nghiệp.
Quan trọng hơn là để việc vận hành doanh nghiệp lâu dài, tiếp cận những ứng viên IT bị động là không thể tránh được, như số liệu TopDev đề cập ở trên, chỉ với 14% ứng viên trong thị trường là chủ động tìm đến bạn, theo dõi website của bạn thường xuyên, thì liệu nguồn ứng viên này có đủ để lấp đầy vị trí trống mỗi lúc một nhiều trong thời kì mật độ nhảy việc cao như hiện nay?
Giảm bớt căng thẳng về mặt thời gian
Một trong những ưu điểm cực lớn mà các nhà tuyển dụng thường hay bỏ qua khi nhắc tới tuyển ứng viên IT bị động là họ bớt thấy áp lực hơn trong tình huống phải ra quyết định tức thời.
TopDev sẽ giúp bạn rõ hơn với so sánh nhỏ sau. Với ứng viên chủ động tìm việc, có khả năng rất cao họ đang ứng tuyển cho nhiều công ty khác nhau. Nếu quá trình tuyển dụng của bạn không tinh gọn và mất nhiều thời gian, ứng viên đó đã có thể chấp nhận làm ở một công ty khác. Và cho dù bạn có tăng độ hấp dẫn cho offer ngay từ đầu, họ vẫn chờ xem những công ty khác sẽ offer cho họ những gì. Kết quả là bạn sẽ đứng ngay ranh giới giữa sắp để mất một nhân tài và tăng chi phí cho doanh nghiệp.
Ứng viên IT bị động – ngược lại, thường sẽ không ứng tuyển cho nhiều công ty đơn giản vì họ đâu có chủ động tìm việc! Nếu quá trình tuyển của bạn khá dài và rườm rà, bạn cũng không phải lo lắng ứng viên sẽ được mời gọi offer hấp dẫn hơn.
Thẳng thắn, khách quan và công bằng
Do ứng viên IT bị động không tìm kiếm việc làm, có khi là họ đã có chỗ làm ổn thỏa, nên bạn không phải sợ việc bị ứng viên nói dối, phóng đại khả năng bản thân, làm mọi cách để được chấp nhận vào công ty. Chỉ đơn giản là bạn tiếp cận họ, nêu rõ những gì bạn cần, bạn cho họ, họ cân nhắc và chấp nhận ứng tuyển mà thôi. Vừa tiết kiệm thời gian cho cả hai, mà quyền lợi của 2 bên cũng dễ dàng thống nhất và đảm bảo hơn.
Ứng viên tiềm năng trong tương lai
Điều hiển nhiên là không phải ứng viên nào bạn tiếp cận cũng chấp nhận làm cho bạn ngay lúc đó. Bạn có thể không nhận được phản hồi nào từ cái email đầu tiên, nhưng đừng bỏ cuộc. Bây giờ họ không chấp nhận không có nghĩa là vài tháng sau họ vẫn thế.
Thay vì bỏ cuộc hoặc theo đuổi họ đến cùng (càng khiến họ thấy hoảng sợ hơn với doanh nghiệp của bạn) thì TopDev khuyên là bạn nên giữ liên lạc với họ với mật độ ổn định, 1 lần/tháng chẳng hạn, vừa duy trì được mối liên hệ về lâu dài, vừa có thể thuyết phục họ ứng tuyển trong tương lai.
Khuyết điểm
TopDev cũng tin rằng bạn có thể lường trước rằng khuyết điểm cực kì lớn của ứng viên bị động là “Quá tốn công để thu hút”. Vừa tốn sức tìm kiếm, vừa tốn thời gian làm mọi cách để thu hút, khiến doanh nghiệp mình hấp dẫn hơn trong mắt họ. Có thể nói đây là một bài toán cực kì nan giải cho các doanh nghiệp hiện nay.
Một cách cơ bản cũng như quan trọng nhất mà TopDev thường hay nhấn mạnh trong các bài blog của mình là bạn phải đẩy mạnh “Thương hiệu tuyển dụng”. TopDev sẽ gợi ý cho bạn 2 cách để thu hút ứng viên bị động bằng qua việc thúc đẩy Employer Branding nhé.
Cách 1: Thương hiệu tuyển dụng gián tiếp qua Digital Channels
-Bài đăng trên các trang Blog: Theo báo cáo thị trường IT mới nhất của TopDev, có đến 70% ứng viên cập nhật kiến thức qua Tech blog, điều đó chứng tỏ rằng bạn có thể gia tăng mức độ nhận diện cho doanh nghiệp mình bằng việc đăng tải các bài blog với kiến thức hữu dụng, thông tin cần thiết để ứng viên dễ dàng tiếp cận.
Bạn có thể tận dụng trang Blog của doanh nghiệp bạn với vài nội dung như:
-Kiến thức lập trình hữu dụng
-Case studies thực tế từ công ty
-Chia sẻ kỹ thuật chuyên sâu từ team dev cũng như về môi trường và văn hóa làm việc…
Bên dưới là một số dữ liệu mà TopDev đã tiếp cận các dev để để tìm hiểu sâu hơn về thị hiếu, xu hướng cập nhật thông tin IT và học ngôn ngữ lập trình mới. Bạn có thể tham khảo và cân nhắc áp dụng vào xây dựng thương hiệu tuyển dụng cho doanh nghiệp mình nhé:
Tuy nhiên, nếu việc đó mất nhiều thời gian hay chưa thành công như mong đợi thì đừng quên là TopDev có cung cấp các bài viết xây dựng thương hiệu qua Techtalk.vn và Blog Topdev.vn nhé. Techtalk là chuyên trang tin tức và thông tin công nghệ hàng đầu Việt Nam với 1.500.000 lượt truy cập mỗi tháng. Bên cạnh đăng bài qua Techtalk, TopDev còn chia sẻ lên các Fanpage công nghệ với cộng đồng IT dày đặc như như TopDev, Hội những Dev vui tính, Tech Talk, Lập Trình Viên Confession, Anh Lập Trình Viên…giúp việc xây dựng thương hiệu đơn giản hơn rất nhiều.
-Banner trên Techtalk: Hiển thị banner trên các website công nghệ lớn (như Techtalk.vn, TopDev.vn). Như đã đề cập ở trên, Techtalk có gần 1.500.000 truy cập/tháng và đến 99% đối tượng là lập trình viên, đây là những người thường xuyên truy cập Techtalk để cập nhật thông tin, dĩ nhiên là khi banner của bạn được đặt ở những web có lượng traffic cao như thế, bạn đang dần cải thiện mức độ nhận diện và khơi gợi sự tò mò từ những ứng viên tiềm năng về doanh nghiệp bạn đó.
-Email Marketing: Một cách vô cùng quen thuộc để tiếp cận ứng viên bị động là trực tiếp gửi email quảng bá về doanh nghiệp, những vị trí còn trống cũng như những điều thú vị về công ty. Tuy nhiên vấn đề là làm sao để có database ứng viên IT dồi dào và sáng tạo được nội dung cực kì thu hút? Cả 2 điều kiện cần trên là cực kì thiết yếu để một chiến dịch Email Marketing hiệu quả. Thiếu yếu tố đầu thì sẽ không ai có động lực mở email bạn cả, nếu không có yếu tố 2 thì bạn đã bỏ lỡ quá nhiều ứng viên bị động bên ngoài kia.
TopDev có thể giúp kế hoạch Email Marketing hiệu quả hơn với kho dữ liệu 300.000 ứng viên IT, tỉ lệ mở trung bình lên đến 20% và tỉ lệ chuyển đổi cực ấn tượng.
Cách 2: Thương hiệu tuyển dụng trực tiếp qua Event
-Tech Event/Workshop: Không gì bàn cãi khi các event chuyên ngành là nơi hội tụ những ứng viên tiềm năng đến tham gia và tìm hiểu thêm về IT, đây là cơ hội cực kì lớn để bạn đẩy mạnh thương hiệu tuyển dụng của mình. Có thể nói đây là cách tốt nhất để branding và tiếp cận trực tiếp với ứng viên ngay tại event.
Bạn có thể tổ chức event với nội dung như: chia sẻ những bài toán kĩ thuật khó nhằn và cách xử lý mà doanh nghiệp bạn đã áp dụng thành công; câu chuyện có thật từ những người đứng đầu công ty hay từ 1 anh dev tiêu biểu chẳng hạn,..bất kì nội dung hấp dẫn nào để thu hút các ứng viên IT tham gia. Tuy nhiên, việc xây dựng nội dung hấp dẫn không quyết định 100% sự thành công trong tuyển dụng của bạn, bạn và doanh nghiệp phải nỗ lực nhằm tạo cho ứng viên cảm giác gần gũi, thân thiện, nắm rõ hơn về công ty bạn cũng như những tiềm năng cơ hội phát triển mà bạn mang lại cho họ.
Nếu như việc tự tổ chức mất nhiều chi phí và thời gian, TopDev có thể là trợ thủ đắc lực cho doanh nghiệp của bạn từ khâu lên nội dung, truyền thông, logistics và vận hành sự kiện. Với năng lực tổ chức nhiều sự kiện lớn trong năm và tần suất hơn 15 sự kiện mỗi tháng, doanh nghiệp cũng có thể tận dụng xuất hiện thương hiệu tuyển dụng của mình tại các kỳ sự kiện này, với nội dung phong phú với các chủ đề từ Mobile, Database tới hot trend như Machine Learning, AI,..Tìm hiểu thêm tại đây nhé!
-Tham gia các sự kiện công nghệ lớn: Bên cạnh các Tech event/Workshop đề cập bên trên, TopDev sẽ gợi ý 1 vài event lớn thường niên để bạn cân nhắc tham gia nhé:
Forbes Vietnam’s Tech Summit: hội nghị về công nghệ với diễn giả là các nhà đầu tư mạo hiểm, doanh nhân công nghệ tầm cỡ thế giới cùng chia sẻ tầm nhìn, tư duy về xu hướng công nghệ, thúc đẩy doanh nghiệp khởi nghiệp và mở ra khả năng phát triển mới.
Techfest Vietnam:còn gọi “Ngày hội Khởi nghiệp đổi mới sáng tạo”được tổ chức vào ngày 4-6/12 năm nay. Mục tiêu là nhằm quy tụ hệ sinh thái khởi nghiệp sáng tạo, kết nối đầu tư trong nước và quốc tế cũng như đề xuất cơ chế chính sách phục vụ Khởi nghiệp.
DevDay Da Nang: sự kiện phi lợi nhuận với những buổi hội thảo đầy tính tương tác theo xu hướng CNTT mới nhất, gian hàng tuyển dụng thu hút các ứng viên tiềm năng và buổi tiệc đêm giao lưu gắn kết cộng đồng lập trình viên tại Đà Nẵng.
Vietnam Mobile Day: tập trung vào lĩnh vực ứng dụng di động, hơn 100 chủ đề chuyên sâu cùng đối tượng đa dạng như developer, marketer và designer. Ngoài ra đây cũng là nơi để triển lãm các sản phẩm, tiếp cận ứng viên tiềm năng phục vụ cho việc tuyển dụng hiệu quả.
Vietnam Web Summit: sự kiện IT lớn và qui mô nhất Việt Nam tập trung về Công nghệ với diễn giả gồm quản lí cấp cao và chuyên gia hàng đầu. Điều quan trọng hơn đây là cơ hội lớn không được bỏ lỡ khi bạn muốn thu hút ứng viên IT bị động bởi có gần 10.000 người tham gia và hơn 3 triệu online reach. Ngày hội được tổ chức vào ngày 6,13/12 lần lượt tại HCM và Hà Nội với dự kiến hơn 10.000 người tham gia.
Nếu còn gì chưa rõ, hãy vào đây và đội ngũ TopDev sẽ giúp bạn giải đáp mọi thắc mắc !
Có thể trong quá trình làm việc với người thông minh chú ý quan sát thì chỉ cần vài tháng, nhưng với những người kém thông minh hơn hay lười hơn thì phải mất cả năm để nhận ra code mình có vấn đề và Bốc mùi đến như thế nào, rõ ràng việc code sạch đẹp, dễ maintain nó cũng như cách sống vậy, có người gọn gàng ngăn nắp, người thì bừa bộn, luộm thuộm (Mình không nói những bạn code không sạch là bừa bộn nhé cái này chỉ là ví dụ).
Mình tự nhận là người khá ngăn nắp nhưng code thì không sạch (chán). Và mình nghĩ cũng đã đến lúc chúng ta cần tự trau chuốt lại cả cách sống và cách code nếu chúng ta còn tiếp tục muốn sống sót được trong cái nghề mà mỗi ngày càng có nhiều người giỏi hơn, thông minh hơn chúng ta xuất hiện. Chúng ta không thể thông minh, nhanh nhẹn hơn họ được nhưng bù lại chúng ta có sự chỉn chu và những kinh nghiệm xương máu. Để tự thanh lọc mình trong việc code mình bắt đầu lang thang đi tìm những design patterns, Principles … thứ mà những anh hùng đi trước để lại cho hậu thế. Mình đã tìm hiểu DDD, DI …tuy nhiên thấy chúng khá khó hiểu và gây lú (vì mình già rồi chăng). Và nguyên lý SOLID xuất hiện trong quá trình tìm kiếm, đọc … ồ mình nên bắt đầu từ đây, nó khá dễ hiểu, có nhiều người đã áp dụng và chia sẻ trước đây rồi. Tại sao mình lại không chứ. Đầu tiên hãy cùng bắt đầu thanh lọc cơ thể bằng những khái niệm cơ bản nào.
1. Single responsibility principle
Nguyên lý đầu tiên có nghĩa là:
Một Class chỉ nên có một chức năng duy nhất, chỉ sửa đổi với một lý do duy nhất. Giúp dễ dàng quản lý code và bảo trì hơn.
Hãy cùng xem ví dụ sau:
class QuanLySinhVien {
public function getListSV() {}
public function getDSLopHoc() {}
public function getDSMonHoc() {}
public function saveSV() {}
Public function editSV() {}
public function deleteSV() {}
}
Trước giờ khi học ở trường chúng ta thường viết code theo kiểu 3 trong 1, tức là có gì cũng tống chung vào một class, đôi khi chúng ta lại nghĩ class này thật đa năng nhưng nó chỉ đa năng khi chúng ta đi học ở trường, làm mấy cái project nho nhỏ, và đương nhiên cũng chẳng thầy cô nào phàn nàn về vấn đề đó. Kể cả khi đi làm nhiều lúc chúng ta vẫn thường thấy có những function nghe tên thì đã thấy ngay nó thuộc class B nhưng vẫn có người cố nhét nó vào class A. Nguyên nhân là bởi trong class A đó đang có một số biến mà function này muốn sử dụng mà họ lười khai báo lại ở class B. Điều này là hoàn toàn sai lầm cho sự maintain sau này.
Vậy theo nguyên lý 1, chúng ta sẽ tách class trên ra thành những class con, mà mỗi class thể hiện một đối tượng cụ thể, giữ những chức năng của riêng nó.
class LopHoc {
public function getDSLopHoc() {}
}
class MonHoc {
public function getDSMonHoc() {}
}
class SinhVien {
public function getListSV() {}
public function saveSV() {}
Public function editSV() {}
public function deleteSV() {}
}
Khi đã có những class với những chức năng cụ thể của riêng nó, chúng ta sẽ gặp tình huống trong khi làm việc là spec thay đổi vậy nên chúng ta bắt buộc phải sửa lại code. Chúng ta cùng xem nguyên lý thứ 2.
2. Open/closed principle
Nội dung của nguyên lý này là :
Chúng ta có thể mở rộng một class, nhưng hạn chế thay đổi bên trong class đó.
Thoạt nghe thì thấy không đúng cho lắm, nhưng nghe lại thì thấy không đúng thật (haha) . Các bạn để ý mình đã tô đậm từ Hạn chế bởi lẽ với nguyên lý này chũng ta không nên áp dụng một cách máy móc là cứ có tính năng mới là tôi lại tạo ra một class con kế thừa class cha. Điều này làm cho code các bạn không dễ hiểu mà còn loằng ngoằng hơn. Mà theo mình class mới chỉ nên sinh ra khi nó là một thực thể riêng biệt, không có nó thì thực thể khác vẫn không ảnh hưởng gì, còn nếu sau khi phân tích chúng ta thấy rằng thiếu đi chức năng này sẽ làm ảnh hưởng đến tất cả thì đương nhiên là code cũ đang thiếu, ta nên bổ sung thêm vào cho class đó. Nếu là framework hay plugin thì chúng ta nên tạo commit để contribute cho framework/plugin đó. Giả sử như trong ví dụ về quản lý sinh viên trên, chúng ta muốn tạo chức năng thêm môn học thì thay vì máy móc ta viết class con kế thừa class MonHoc chỉ để thêm tính năng addMonHoc thì ta nên thêm luôn nó vào class MonHoc vì việc thêm môn học là tính năng mà bắt buộc môn học nào cũng cần có.
Hoặc cùng xem class SinhVien, nếu muốn thêm tính năng đăng ký nội trú thì chúng ta nên tách riêng class con kế thừa từ class SinhVien, bởi lẽ không phải tất cả sinh viên đều muốn đăng ký ở nội trú, ví dụ thích ra ở trọ chẳng hạn.
class NoiTru extends SinhVien {
public function DangKyNoiTru(SinhVien $id) {}
}
3. Liskov Substitution Principle
Nguyên lý này có nội dung như sau:
Các đối tượng thuộc loại con có thể thay thế các đối tượng thuộc loại cha mà không làm thay đổi tính đúng đắn của chương trình.
Nguyên lý này rất trừu tượng và khó hiểu, nên các bạn hãy cố gắng tiêu hóa nhé. Đã có rất nhiều tranh cãi đúng sai về nguyên lý này. Chúng ta có thể hình dung ví dụ: Các đối tượng HinhVuong đều có thể xem là các đối tượng HinhChuNhat.
Bởi vì chúng ta đều biết hình vuông là hình chữ nhật có 2 cạnh kề bằng nhau, vì thế hình vuông sẽ kế thừa hết các thuộc tính của hình chữ nhật.
4. Interface Segregation Principle
Nội dung của nguyên lý này là :
Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể
Nguyên lý này khá đơn giản đó là chúng ta không nên có một interface quá lớn vài trăm method, mà chúng ta nên tách chúng ra thành từng loại nhỏ, mỗi loại thể hiện một mục đích cụ thể nào đó.
Ví dụ thay vì viết tất cả các thuộc tính của class DongVat như bên dưới
interface DongVat {
public function chay();
public function boi();
public function bay();
}
Chúng ta có thể tách ra thành class cha và các interface như sau:
interface DongVatTrenCan {
public function chay();
}
interface Chim {
public function bay();
}
interface Ca {
public function boi();
}
Mỗi loại tách riêng theo từng đặc tính, như vậy sẽ giúp chúng ta dễ dàng quản lý và maintain sau này cũng như dễ dàng đọc hiểu và sửa code.
5. Dependency inversion principle
Nội dung của nguyên lý này là:
Các module cấp cao không nên phụ thuộc vào các module cấp thấp. Cả 2 nên phụ thuộc vào abstraction.
Abstraction không nên phụ thuộc vào detail. Detail nên phụ thuộc vào abstraction. (Các class giao tiếp với nhau thông qua interface, không phải thông qua implementation.)
Trước tiên chúng ta nên hiểu Interface là một chuẩn kết nối giữ class cấp cao hơn và class cấp thấp, để thiết bị A có thể kết nối được với thiết bị B chúng cần giáo tiếp thông qua 1 chuẩn riêng, chỉ cần một thiết bị có chuẩn như vậy là có thể giao tiếp được với thiết bị A. Ví dụ thường thấy đó là chân sạc điện thoại, Iphone và SAMSUNG có một chân cắm riêng và chỉ cần cái sạc nào có rắc cắm phù hợp là có thể cắm vào sạc được.
class Backend {
public function codeJava() {
// code here
}
}
class Frontend {
public function codeJS() {
// code
}
}
class Project {
public function build() {
$backend = new Backend();
$frontend = new Frontend();
$backend->codeJava();
$frontend->codeJS();
}
}
Như chúng ta có thể thấy qua ví dụ trên class Project đang phụ thuộc vào 2 class Backend và Frontend, Nếu sau này công nghệ thay đổi back end không còn là java nữa, hay frontend không còn là js nữa thì chúng ta phải thay đổi cả code của class cấp thấp và cấp cao. Chúng ta sẽ tạo ra một interface Develop để cho các modules trên phụ thuộc vào:
interface Develop {
public function develop();
}
class Backend implements Develop {
public function develop()
{
$this->codeJava();
}
private function codeJava() {
// code here
}
}
class Frontend implements Develop {
public function develop()
{
$this->codeJS();
}
private function codeJS() {
// code
}
}
class Project {
protected $develop;
public function __construct(Develop $develop)
{
$this->develop = $develop;
}
public function build() {
$this->develop->develop();
}
}
6. Kết luận
Vậy là mình đã giới thiệu cho các bạn về nguyên lý SOLID, việc vận dùng như thế nào trong quá trình code còn là cả quá trình dài, vì không dễ dàng gì để thay đổi một thói quen đã ăn sâu vào tính cách trong một khoảng thời gian dài. Hy vọng bài viết này sẽ phần nào giúp các bạn có cái nhìn sâu sắc hơn và tự nhìn lại code của chính mình xem đã đủ sạch sẽ chưa. Ngoài có còn có bao nhiêu nguyên lý khác sinh ra với mục đích làm cho code sạch đẹp hơn, các bạn cũng có thể áp dụng để tự nâng cao chất lượng sản phẩm của chính mình tạo ra. Một lần nữa cảm ơn các bạn đã đón đọc, trong quá trình viết bài mình có tham khảo nhiều nguồn, dùng nhiều ví dụ trên mạng, có thể đúng hoặc sai hy vọng các bạn thông cảm (bow).
Technical leader đảm nhiệm công việc giám sát một nhóm tập trung vào các vấn đề kỹ thuật, bao gồm phát triển phần mềm, phát hành sản phẩm và các nhiệm vụ kỹ thuật khác. Đôi lúc, technical leader cũng hợp tác với các nhân viên để xác định và sửa chữa các vấn đề kỹ thuật. Họ thường đánh giá các quy trình làm việc của nhóm và thực tiễn tốt nhất và thực hiện các thay đổi để hợp lý hóa các hoạt động. Hy vọng, Mẫu bảng mô tả công việc Technical Leader này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.
Mẫu bảng công việc Technical Leader
YÊU CẦU CÔNG VIỆC
Đảm bảo các ứng dụng hiện tại được cập nhật và phù hợp với việc triển khai các ứng dụng mới;
Phân tích nhu cầu của end-users và chọn ứng dụng để đáp ứng các nhu cầu đó;
Các nhiệm vụ khác có thể bao gồm phát triển các chương trình khắc phục sự cố và giám sát sửa đổi hệ thống;
Tạo và thực hiện các quy trình giảm thiểu rủi ro và tiến hành kiểm toán bảo mật để xác định điểm yếu trong các ứng dụng
MÔ TẢ CÔNG VIỆC
Có kinh nghiệm trong việc quản lý một nhóm phát triển
Có nhiều kinh nghiệm thiết kế cơ sở dữ liệu, thiết kế cơ bản, thiết kế chi tiết, UML
Có nhiều kinh nghiệm về ngôn ngữ lập trình: PHP, C#, Ruby on Rails, Java …
Có nhiều kinh nghiệm về design patterns and code refactoring…
Khả năng nhận yêu cầu trực tiếp từ người quản lý sản phẩm, sau đó phân tích và thảo luận giữa các bên liên quan để làm rõ
Có thể đề xuất ý tưởng tốt / giải pháp sáng tạo cải thiện sản phẩm của công ty ngay cả khi không có vấn đề gì cả;
Giải quyết vấn đề: đưa ra ý tưởng, thiết kế, coding, code reviewing. “
Lập trình .NET làm việc trong nhóm phần mềm, sử dụng các ngôn ngữ lập trình C# để phát triển các ứng dụng, website dựa trên nền tảng .NET. Đồng thời, .NET Developer cũng tham gia vào toàn bộ quá trình phát triển sản phẩm, từ lên concept, phân tích, thiết kế, đến kiểm tra, vận hành vào thực tế dựa trên kế hoạch đã đề ra…Mẫu bảng công việc lập trình .NET này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.
Về lập trình viên .NET: Để trở thành một .NET Developer thực thụ, bạn cần vững nền tảng C# và .NET căn bản cũng như có kiến thức và kỹ năng về SQL server, HTML, CSS và Javascript. Bạn có thể học thêm về .NET Core và ASP.NET Core vì đây chính là tương lai của .NET. Khi đã vững vàng, bạn có thể bắt đầu chọn cho bản thân con đường đi theo ASP.NET hoặc Winform.
Mẫu bảng công việc lập trình .NET
YÊU CẦU CÔNG VIỆC
Thành thạo lập trình .NET Webform, Winform hoặc C#, ASP.NET MVC/ MVC5.
Nắm vững lập trình OOP, MVC.
Có kiến thức tốt về HTML, CSS, Javascript/ JQuery/ Bootstrap.
Có kinh nghiệm sử dụng database (SQL, NoSQL).
Có kiến thức tốt về RESTful service/ Web API.
Kỹ năng tư duy logic và thuật toán tốt, phân tích và giải quyết vấn đề
Trong ngành IT chúng mình, học cũng là một phần của công việc
Để làm mới những skill của bản thân, để theo kịp thời đại, không bị thụt lùi so với thế giới, chúng ta phải tự học.
Đôi khi vì yêu cầu của dự án, vì nhu cầu tìm việc chúng ta phải học và tìm hiểu những ngôn ngữ/công nghệ mới.
Thế nhưng, khi bắt đầu học một thứ gì đó, bạn sẽ dễ dàng thấy ngộp, thấy bối rối, vì có quá nhiều kiến thức cần phải học.
Vậy làm sao để học dễ vào hơn, làm sao để không còn “ngộp” khi học kiến thức mới?
Hãy xem những kinh nghiệm mình chia sẻ qua bài viết này nha. Bài này sẽ rất có ích cho các bạn sinh viên, cho những bạn vừa ra trường hoặc đang đi làm đấy.
Tại sao việc học cái mới lại khó và gây “ngộp” như vậy?
Để tìm cách giải quyết chuyện, trước tiên chúng ta phải tìm hiểu vì sao học cái mới lại khó, tại sao ta lại dễ thấy ngộp và choáng?
Lý do đơn giản là vì: Trong ngành mình, khi học và sử dụng ngôn ngữ/công nghệ, ta không chỉ học nó, mà còn phải tìm hiểu về toàn bộ hệ sinh thái (ecosystem) của nó, những công nghệ liên quan tới nó.
Những kiến thức này vô cùng rộng và … không có giới hạn.
Mỗi ngôn ngữ/công nghệ luôn đi kèm với một hệ sinh thái “to bự” và phức tạp
Khi thử tìm hiểu React, các bạn sẽ thấy có… vô vàn những thứ liên quan đến nó mà các bạn phải học:
React là gì? Các khái niệm trong React như Component, Props, State
Các tổ chức code React, phân tách component cho hiệu quả
Cú pháp ES6 của Javascrip
Cách setup Babel để transpile code React thành code JS chạy trên trình duyệt
Cách setup Webpack để bundle source code, build source code thành JavaScript
CSS in JS, cách dùng JS để setup style CSS cho các component
Redux hoặc Mobx dùng kèm với React, state management để quản lý state cho ứng dụng
React – Redux – Webpack – Babel và đủ thứ hầm bà lằng khác
Các bạn thấy đấy, học React chỉ cần học 1 và 2. Nhưng để sử dụng React cho hiệu quả, ta phải học và biết cách dùng 3 đến 7. Khi tìm hiểu 6, 7 các bạn sẽ thấy lòi ra những cái 8,9 khác nữa.
Càng học, bạn càng cảm thấy có quá nhiều thứ mình không biết, có quá nhiều thứ cần phải học. Bạn sẽ ngộp, sẽ thấy nản vì … chả biết học bao giờ mới xong, dẫn đến chuyện bỏ cuộc.
Vậy làm sao để giải quyết chuyện này? Hãy đọc phần dưới nhé!
Phương pháp chống “ngộp” hiệu quả
Ngày xưa, mình cũng từng thấy “ngộp” khi học cái mới như bạn vậy, về sau mới quen dần. Đây là một số kinh nghiệm mà mình rút ra được:
1. Đặt ra mục tiêu rõ ràng
Đây là thứ quan trọng nhất. Trước khi học, hãy đặt ra mục tiêu là, mình học xong sẽ làm được gì, chứ đừng học chỉ để học.
Học React/VueJS, hãy đặt ra mục tiêu là hiểu architecture của chúng, làm được một web app đơn giản bằng React/VueJS.
Học Android/React-Native hãy đặt mục tiêu là biết cách tạo các screen, viết được một app note/to-do list.
Những khi học thấy mệt hay nản, hãy nhìn vào mục tiêu, bạn sẽ biết mình đã đi được bao xa, sắp đạt được hay chưa ngay.
2. Tìm hiểu bức tranh toàn cảnh (overview), chọn học thứ quan trọng nhất
Quay lại chuyện React, sau khi đã có bức tranh toàn cảnh, các bạn sẽ thấy mối tương quan giữa các công nghệ.
Bạn sẽ nhận ra rằng 1 và 2 là thứ quan trọng nhất cần học, những thứ khác chỉ cần biết sơ, về sau tìm hiểu dần là được.
Thấy được toàn cảnh, bạn sẽ biết thứ gì nên tập trung học, thứ gì chỉ cần tìm hiểu qua. Khi học mà gặp những thứ mới, bạn sẽ biết nó có quan trọng hay không, có cần học ngay hay có thể để sau.
3. Học tập trung, học dần dần chứ đừng dàn trải
Để chống ngộp, bạn hãy học tập trung chứ đừng học dàn trải. Tập trung vào những thứ quan trọng, sau đó mới đến những thứ “râu ria”.
Ví dụ như lúc học React, hãy dùng create-react-app để có thể bắt tay ngay vào việc viết code React.
Sau khi đã nắm vững các khái niệm React cơ bản và nâng cao, bạn mới bắt đầu tìm hiểu cách hoạt động của Babel, của Webpack, cách setup một dự án React từ đầu.
Khi dự án đã lớn, code React bắt đầu rối rắm, lúc này bạn có thể tìm hiểu về Redux/MobX để xem quản lý state ra sao, component giao tiếp thế nào cho hiệu quả.
Học tập trung, tìm hiểu dần dần chứ đừng dàn trải
Vì mỗi lần ta chỉ tập trung vào học và thành thục một thứ duy nhất, bạn sẽ không cảm thấy ngộp hay nản nữa.
Kết
Việc học luôn luôn là một hành trình dài. Hành trình ngàn dặm chỉ bắt đầu từ một bước chân. Hãy biết nhìn xa, nhưng hãy đi từng bước nhỏ.
Với việc học, ta cũng phải học dần dần, biết dần dần. Bạn không thể nào học một phát là biết hết, mà cũng không cần phải biết hết tất cả. Chỉ cần biết đủ là bạn đã có thể áp dụng thứ vừa học vào công việc được.
Việc học có thể làm việc cảm thấy ngộp và nản, but that’s okay.
Đừng so sánh việc học của mình với người khác. Nếu người có nhiều kinh nghiệm, có kiến thức liên quan, họ sẽ học nhanh hơn. Nếu bạn không đủ kiến thức nền, bạn sẽ học chậm hơn.
Tuy nhiên, việc học không phải là cuộc đua đi nhanh hay đi chạm thì cuối cùng cũng đến đích cả! Quan trọng là bạn có chịu khó đi tới cuối cùng hay không mà thôi!
Bản thân bạn thì sao, đã bao giờ bạn cảm thấy ngộp, cảm thấy nản khi học chưa? Hãy chia sẻ về cảm xúc của mình, những cách bạn vượt qua trong phần comment nhé!
Hế lô! Sau 1 thời gian tu luyện trên núi mình đã quyết định xuống núi để quay lại chiến đấu cùng các anh em. Hôm nay mình xin giới thiệu đến các bạn 1 thứ hoàn toàn mới và khá hay ho mang tên “Viu gi ét” :))
Nếu bạn là một dev front-end chân chính thì chắc hẳn ít nhất một lần đã nghe và có thể là đang làm với framework này rồi nhỉ.
Mình cũng vậy, sau khi bị nó thả thính và bắt đầu mê nó nên mình đã quyết định áp dụng dùng thử nó với 1 plugin của WordPress.
Trước đây mình cũng đã từng dev AngularJS, rồi Angular 2+ và cũng suýt tẩu hỏa nhập ma với nó. Vì vậy mình đã xách mông lên tìm một môn võ mới mang tên VueJS. Sau 1 thời gian dev với VueJS thì mình đã phải thốt lên “Sao mày không đến với cuộc đời tao sớm hơn :))” bởi vì nó quá tuyệt vời và phù hợp với những nhu cầu của mình.
Và để bắt đầu với seri lầy lội cùng VueJS mình xin giới thiệu 1 trick khá hay mà VueJS có thể làm được đó là:
Cách sử dụng các plugins của Jquery trong ứng dụng VueJS một cách mượt mà.
Source code:
Các bạn có thể xem qua source code và demo tại đây.
Vấn đề
Hẳn là khi các bạn làm với các project áp dụng mấy framework kiểu như VueJS này thì một số thư viện cũng chưa hỗ trợ mà vẫn phải dùng thêm các plugins của jQuery đúng không nào?
Bình thường thì nếu bạn làm với ứng dụng Web kiểu Server-Side Rendering thì phần html đã được render ra khi người dùng load trang và chỉ cần áp dụng vài dòng code Javascript với Jquery là chạy ngay. Nhưng với các framework như VueJS thì cấu trúc DOM không được load ngay từ đầu nên ta không thể chạy các plugin của jQuery theo cách thông thường.
Ở đây mình xin demo 1 trường hợp sử dụng plugin select2 của Jquery để chạy trong ứng dụng VueJS.
Component này sẽ có 2 props là options là list options để select và selected nếu muốn set 1 option nào đã được select.
Để làm được ta cần phải tìm hiểu 1 chút về life cycle của VueJS nhé.
Như các bạn thấy trong ảnh thì đến đoạn mounted là thời điểm mà Vue render html và replace vào cấu trúc DOM và đây chính là cơ hội để mình có thể chạy plugin select2. Và thời điểm thứ 2 ta cần quan tâm là lúc component chuẩn bị xóa đi khỏi DOM đó là beforeDestroy – đây là thời điểm tốt để các bạn xóa tất cả các sự kiện trên component đó đồng thời hủy select2 chạy trên component đó.
Xong rồi đó, component đã có thể chạy được ngay. Nhưng vẫn còn một vấn đề nữa đó là bạn cần phải cập nhật sự thay đổi lên parent component chứ nhỉ. Để làm được điều đó ta bắt sự kiện change của select đó rồi dùng $emit để đẩy sự kiện cho thằng cha.
mounted: function() {
var vm = this;
$(this.$el).select2();
$(this.$el).on('change', function(e) {
vm.$emit('change', vm.$el.value);
});
},
Sau đó ở thằng cha bắt sự kiện @change để cập nhật trạng thái option đã được select (trong demo mình dùng tính kiểu two-way binding để chuyền ngược lại cho thằng cha luôn).
Xong rồi đó, ở demo trên kia thì mình có thêm 1 số tính năng nữa để demo khi thằng cha thêm option hoặc thay đổi option đang được select thì thằng con cũng cập nhật được trạng thái của nó.
Kết luận
Mình xin tổng kết lại nhé. Ở đây chỉ có 2 bước quan trọng là:
Chọn thời điểm component được thêm vào DOM để chạy plugin của Jquery và thời điểm để hủy các sự kiện khi component đó bị hủy đi.
Tìm sự kiện thay đổi trạng thái của component con để cập nhật lên compnent cha để biết sự thay đổi.
Quá đơn giản phải không nào. Mình cũng bắt đầu thích VueJS vì sự tương thích của nó với các plugin của jQuery vì jQuery nó đã quá to rồi và hệ sinh thái của nó quá lớn nên thời gian này mình vẫn còn phụ thuộc vào nó rất nhiều trong khi các thư viện hỗ trợ cho VueJS còn chưa nhiều.
Bạn có biết khi nào nên dùng Golang? Dùng Golang đúng cách như thế nào? Sau 8 năm hoạt động, ngôn ngữ Go của Google ra mắt phiên bản 1.8.1 vào tháng 4 năm 2017 được lựa chọn bởi các chuyên gia lập trình để trở thành ngôn ngữ lập trình dành cho những dự án cloud-centric quan trọng nhất thế giới.
Tại sao Go được chọn bởi các nhà phát triển của những dự án như Docker và Kubernetes? Đặc điểm của Go là gì? nó khác gì với các ngôn ngữ lập trình khác và phù hợp cho loại dự án nào nhất? Trong bài này, chúng ta sẽ khám phá những tính neăng của Go, trường hợp tối ưu, điểm thiếu sót và hạn chế của Golang.
Go nhỏ gọn và đơn giản
Go hay Golang là sản phẩm được phát triển bởi các nhân viên của Google, đặc biệt là kỹ sư nổi tiếng của Google, một chuyên gia về Unix, ông Rob Pike, tuy nhưng đó không phải là một dự án của Google. Thay vào đó, Go được phát triển như một dự án open source.
Go đơn giản để học, dễ làm việc và dễ dàng đọc bởi các nhà phát triển khác. Và Go không hề có một bộ tính năng lớn, đặc biệt là khi so sánh với các ngôn ngữ như C ++. Ngoài ra Go còn gợi nhớ đến C bởi cú pháp của nó, điều đó giúp các lập trình viên C lâu năm tương đối dễ dàng học nó. Điều đó nói rằng, nhiều tính năng của Go, đặc biệt là tính năng concurrency.
Tương tự như ngôn ngữ C được dùng để xây dựng và duy trì các ứng dụng cross-platform, thì Go cũng có nhiều điểm chung với Java. Và khi nào nên dùng golang? Nó như một phương tiện cho phép lập trình một cách nhanh chóng mà có thể chạy ở bất cứ nơi nào, thì bạn có thể tưởng tượng Go và Python giống nhau ở điểm này, mặc dù giữa chúng có nhiều điểm khác biệt hơn là tương đồng.
Tài liệu về Go, mô tả Go là “một ngôn ngữ biên dịch nhanh, static type, compiled language (ngôn ngữ biên dịch), nhưng lại giống như một dynamic, interpreted language (ngôn ngữ thông dịch)”. Ngay cả khi một chương trình Go lớn, cũng sẽ được biên dịch chỉ trong vòng vài giây. Thêm vào đó, Go còn tránh được những điểm hạn chế của C liên quan đến các file và thư viện. Nói tóm lại, Go giúp cuộc sống của lập trình viên trở nên dễ dàng bằng nhiều cách:
Tiện lợi:
Go được so sánh với các scripting language (ngôn ngữ kịch bản) như Python với khả năng đáp ứng nhiều nhu cầu lập trình phổ biến. Một số tính năng này được tích hợp vào trong chính ngôn ngữ, chẳng hạn như “goroutines” là một hàm cho concurrency và kiểu giống như behavior, ngoài ra các tính năng bổ sung được có sẵn trong các package thư viện Go chuẩn, như http package của Go. Giống như Python, Go cung cấp khả năng quản lý bộ nhớ tự động bao gồm việc garbage collection (dọn file rác).
Không giống các ngôn ngữ kịch bản như Python, Go biên dịch (compile) code ra nhị phân một cách nhanh chóng. Và không giống như C hoặc C ++, Go biên dịch cực nhanh, nhanh đến mức khiến bạn cảm thấy khi làm việc với Go giống như là làm việc với một ngôn ngữ kịch bản hơn là một ngôn ngữ biên dịch.
Hơn nữa, hệ thống Go build đơn giản hơn so với các ngôn ngữ biên soạn khác. Phải trải qua một vài bước và lập kế hoạch để xây dựng và vận hành một dự án Go.
Tốc độ:
Run nhị phân chậm hơn so với C, nhưng sự khác biệt về tốc độ này không đáng kể đối với hầu hết các ứng dụng. Hiệu suất của Go tốt ngang với C trong phần lớn công việc và nói chung là nhanh hơn so với các ngôn ngữ khác nổi tiếng về tốc độ (ví dụ: JavaScript, Python và Ruby).
Linh hoạt:
Các file executable được tạo bằng toolchain của Go có thể hoạt động độc lập mà không cần external dependencies mặc định. Toolchain hỗ trợ cho nhiều hệ điều hành, hardware platform (chuẩn phần cứng của máy tính) khác nhau và có thể được sử dụng để biên dịch các chương trình nhị phân qua các nền tảng.
Khả năng tương thích:
Go cung cấp tất cả những điều trên mà không bị mất quyền truy cập vào hệ thống bên dưới (underlying system). Phương mềm Go có thể liên kết với thư viện C bên ngoài hoặc thực hiện các lệnh call hệ thống native. Ví dụ trong Docker, Go interface với các chức năng Linux low-level, cgroups và namespace (tạm dịch: không gian tên), để hoạt động với container.
Hỗ trợ:
Toolchain Go có sẵn dưới dạng binary của Linux, MacOS hoặc Windows hoặc như là một container trong Docker. Go được đặt mặc định trong nhiều bản phát hành phổ biến của Linux, như Red Hat Enterprise Linux và Fedora, giúp cho việc triển khai Go source trở nên dễ dàng hơn đối với các nền tảng trên. Go cũng hỗ trợ mạnh mẽ cho nhiều development environment (môi trường phát triển) của bên thứ ba, từ Microsoft Visual Studio Code đến Komodo IDE của ActiveState.
Khi nào nên dùng Golang?
khi nào nên dùng golang? Và dùng trong trường hợp nào? Không có ngôn ngữ nào phù hợp với mọi loại công việc, nhưng có một số ngôn ngữ phù hợp với nhiều mục đích hơn những ngôn ngữ khác. Mạnh mẽ khi phát triển một số loại ứng dụng chính:
Phân phối các network service (dịch vụ mạng).
Các chương trình ứng dụng mạng (network application) sống hay chết là dựa vào concurrency và các tính năng native concurrency của Go, các goroutines và các channel, rất phù hợp cho các tác vụ đó. Do đó, có nhiều dự án Go dành cho mạng, các chức năng distributed (phân phối) và dịch vụ đám mây: API, web server, minimal frameworks cho các web application và các loại tương tự.
Sự phát triển của cloud-native.
Các tính năng concurrency và network của Go và tính linh hoạt cao của nó làm cho nó phù hợp với việc xây dựng các ứng dụng cloud-native. Trên thực tế, Go đã được sử dụng để xây dựng một trong những nền tảng phát triển ứng dụng dựa trên cloud-native, ứng dụng hệ thống containerization Docker.
Thay thế cho cơ sở hạ tầng hiện có.
Phần lớn các phần mềm của chúng tôi phụ thuộc vào cơ sở hạ tầng Internet đã lạc hậu. Việc viết lại những thứ như vậy bằng Go mang lại nhiều lợi ích, như giữ an toàn bộ nhớ tốt hơn, triển khai trên nhiều nền tảng dễ dàng hơn và một code base “sạch” để hỗ trợ bảo trì trong tương lai. Một server SSH mới được gọi là Teleport và một phiên bản mới của Network Time Protocol được viết bằng Go, được cung cấp như phương pháp thay thế cho các đối tác thông thường của họ.
Go không phù hợp với việc gì?
Go được thiết kế nhỏ gọn và dễ hiểu, vì vậy dẫn đến một số tính năng nhất định bị bỏ qua. Thế nên một số tính năng phổ biến có trong các ngôn ngữ khác thì lại không có trong Go.
Một trong những tính năng Go không có là generics, là kiểu biểu diễn của Types dưới dạng tham số khi định nghĩa lớp, hàm và interfaces. Go không bao gồm generics và steward của ngôn ngữ này ngăn cản việc thêm generics vào vì cho rằng điều đó sẽ làm giảm tính đơn giản. Tuy vẫn có thể làm việc tốt với Go, nhưng rất nhiều lập trình viên vẫn muốn thêm generics vào nó.
Nhược điểm khác của Go là kích thước của các chương trình. Code được biên dịch kiểu static (tĩnh) theo mặc định. Cách này làm đơn giản hóa quá trình xây dựng và triển khai, nhưng dẫn đến việc chỉ một đoạn code đơn giản “Hello, world!” lại nặng đến khoảng 1,5MB trên Windows 64-bit. Nhóm nghiên cứu của Go đang cố gắng để giảm kích thước của những chương trình này trong những bản phát hành kế tiếp. Có những giải pháp cho việc này là nén file hoặc xoá bỏ thông tin về debug của Go.
Tuy nhiên, một tính năng khác của Go, quản lý bộ nhớ tự động (AMM), có thể được xem như là một nhược điểm, vì garbage collection (quá trình thu gom file rác) đòi hỏi một số memory nhất định để xử lý. Theo thiết kế, Go không thể quản lý bộ nhớ bằng tay và việc dọn dẹp file rác ở Go bị chỉ trích là không thể giải quyết tốt các loại memory load (bộ nhớ tải) xuất hiện trong các ứng dụng của doanh nghiệp.
Xét về mặt tích cực, Go 1.8 mang lại nhiều cải tiến trong quản lý bộ nhớ và dọn dẹp file rác để giảm độ trệ (lag). Tất nhiên, các nhà phát triển Go có thể sử dụng phân bố (allocation) bộ nhớ bằng tay trong một extension của C hoặc bằng cách sử dụng thư viện quản lý bộ nhớ thủ công của bên thứ ba.
Tình hình xung quanh việc xây dựng một GUI (giao diện đồ họa người dùng) phong phú cho các ứng dụng của Go, chẳng hạn như trong các ứng dụng dành cho desktop, vẫn còn rải rác.
Hầu hết các sản phẩm từ Go là các command-line tool hoặc các dịch vụ network. Mặc dù vậy, vẫn có rất nhiều dự án đang được thực hiện để mang lại một GUI phong phú cho các ứng dụng của Go. Có các framework như GTK và GTK3. Một dự án khác nhằm cung cấp platform-native UI, mặc dù các giao diện này dựa vào các binding của C và không được viết bằng Go. Ngoài ra, bởi vì Go được thiết kế là nền tảng độc lập, nên không có bất kỳ cái gì được nêu ở trên có thể trở thành một phần của package chuẩn.
Mặc dù Go có thể tương tác với các chức năng của native system nhưng nó không được thiết kế để tạo ra các component của low-level system, chẳng hạn như kernel (hạt nhân) hoặc device driver hoặc các embedded system (hệ thống nhúng).
Sau cùng, tốc độ run ứng dụng và trình dọn dẹp file rác cho các ứng dụng Go phụ thuộc vào hệ điều hành nằm bên dưới. (Các lập trình viên quan tâm đến một ngôn ngữ dành cho loại công việc này có thể tìm hiểu Rust của Mozilla.)
Go có thể đang ở một “ngã ba đường”. Giai đoạn phát triển tiếp theo của Go có thể được thúc đẩy bởi nhu cầu phát triển cơ bản của nó, Go cần chú ý về việc thay đổi ngôn ngữ để có thể đáp ứng tốt hơn, chứ phải cứ cứng đầu mà không thay đổi. Nói cách khác, Go hoàn toàn có thể thêm các tính năng mà ban đầu nó không có, giống như generics.
Các lập trình viên sử dụng Golang rõ ràng muốn những điều này. Một cuộc khảo sát ý kiến người dùng Golang vào năm 2016 đã xác định được khi nào nên dùng golang, và generic là một trong những thay đổi mang tính cải thiện nhất, tiếp theo là dependency và package management. Những thay đổi này có thể giúp Go đạt một vị trí cao trong giới lập trình nơi mà Java, JavaScript và Python hiện đang thống trị .
Ngay cả khi không có bất kỳ sự thay đổi lớn nào đối với Go, thì tôi luôn mong được thấy Go sử dụng cho việc xây dựng lại cơ sở hạ tầng và trở thành một phần của dự án sử dụng multi-language (đa ngôn ngữ). Một dự án có sử dụng Go trong một phần của việc lập trình hệ thống đó là Ethos, một hệ điều hành như một phần mềm bảo mật chất lượng cao. Kernel được viết bằng C, nhưng userspace của ứng dụng được viết bằng Go, đây là một cách thông minh để tận dụng những gì phù hợp với C, trong khi vẫn có thể tận dụng các thế mạnh của Go.
Việc triển khai của bên thứ ba đối với công cụ Go cũng đang lan rộng. ActiveGo của ActiveState cung cấp một phiên bản được hỗ trợ về mặt thương mại của Golang và cả LLVM cùng các dự án gccgo được triển khai open source của Go bằng toolchain.
Một cách khác mà Go có thể phát triển là tồn tại như một nền tảng để phát triển các ngôn ngữ hoàn toàn mới khác. Một ví dụ là ngôn ngữ Have. Sử dụng nhiều ý tưởng từ Go và transpile vào Go để dễ thực hiện, nhưng tinh gọn cú pháp của Go và hiện thực hoá một số các concept tương tự những theo cách riêng. Một dự án khác có tên Oden, tiếc là không còn được phát triển, sử dụng assembler và toolchain của Go để biên dịch một ngôn ngữ mới được thiết kế dựa trên cảm hứng từ các ngôn ngữ khác như Lisp và Haskell.
Tương lai của Golang chỉ mới bắt đầu giờ bạn đã biết khi nào nên dùng golang. Nhưng chắc chắn nó sẽ được sử dụng trong cloud, nơi mà tốc độ và sự đơn giản của nó giúp dễ dàng xây dựng một cơ sở hạ tầng có thể mở rộng, có thể được duy trì trong thời gian dài.
Mô tả công việc Devops – DevOps Engineers là sự kết hợp giữa Developers (Dev) và System Admins (“Op”-erations) với mục đích giảm chi phía và vòng lập của dự án, là cầu nối giữa Developers và nhóm IT khác.
DevOps Engineers hiểu cặn kẽ vê vòng đời phát triển phần mềm và các công cụ tự động hóa được sử dụng để tạo CI / CD Pipeline (tích hợp liên tục / phân phối liên tục), giúp giảm thiểu lỗi, tạo điều kiện triển khai nhanh chóng các sản phẩm với chất lượng tốt hơn và đồng thời cải thiện khả năng duy trì cơ sở hạ tầng.
Hy vọng, Mẫu bảng mô tả công việc lập trình Devops này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.
iOS Developer chịu trách nhiệm xây dựng và phát triển các ứng dụng cho thiết bị di động được cung cấp bởi hệ điều hành Apple Apple iOS. Một iOS Developer giỏi phải thành thạo một trong hai ngôn ngữ lập trình cho nền tảng này: Objective-C hoặc Swift. Hy vọng, Mẫu bảng mô tả công việc lập trình iOS này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.
Mẫu bảng công việc lập trình iOS
YÊU CẦU CÔNG VIỆC
Có kinh nghiệm làm việc với Ruby on Rails
Có kiến thức về ngôn ngữ và công nghệ của Front-End (JavaScript, HTML, CSS và JQuery)
Thành thạo với Objective-C hoặc Swift
Kinh nghiệm làm việc với các thư viện và API của bên thứ ba
Làm quen với các nguyên tắc thiết kế OOP
Hiểu biết về các nguyên tắc thiết kế và hướng dẫn giao diện của Apple
Hiểu biết thành thạo các công cụ phiên bản mã như Git, SVN,…
Kỹ năng phân tích tuyệt vời và thái độ giải quyết vấn đề tốt
Webpack là công cụ giúp gói gọn toàn bộ file js, css(bao gồm cả scss,sass,..). Nó giúp bạn compile các module Javascript theo cấu trúc project. Ngoài ra nó có thể tối ưu tùy chọn theo môi trường khác nhau như development hay production.
Ngày nay các website đang có xu hướng trở thành những web app với các đặc tính như:
Càng ngày càng sử dụng JS nhiều hơn
Những browser ngày càng hỗ trợ những công nghệ mới
Những trang full-page-reload ít đi, single page app lên ngôi
Dẫn đến phần code client-side ngày càng nhiều. Điều đó có nghĩa chúng ta cần phải có một công cụ để quản lí chúng một cách hiệu quả. Và webpack là một công cụ rất mạnh để làm điều đó. Nó là một module bundler rất mới nhưng đã gây sốt gần đây. Nó nhận vào các module cùng với các dependencies và generate ra các static assets tương ứng. Các bạn xem thêm Webpack cho người mới bắt đầu tại đây nhé!
Team webpack đang làm việc tích cực để cho ra thế hệ thứ 4. Mình xin giới thiệu sơ qua các chức năng mới của bản này.
Webpack 4 gần như không cần cấu hình module bundler
Webpack rất mạnh mẽ và có không ít các feature khá độc nhưng bên cạnh đó cũng có không ít các điểm khá hạn chế, một trong số đó là configuration file.
Cung cấp 1 cấu hình cho webpack không phải là một vấn đề lớn trong các dự án vừa và lớn. Tuy nhiên đối với các dự án nhỏ thì nó tỏ ra hơi khó nhằng. Sean và team webpack đang thay đổi điều đó cho thân thiện hơn: webpack 4 sẽ không cần 1 file cấu hình mặc định.
Nào chúng ta thử nó 1 chút, tạo 1 thư mục mới và đi vào trong:
mkdir webpack-4-quickstart && cd $_
Khởi tạo 1 package.json bằng cách chạy lệnh:
npm init -y
Bây giờ kéo về webpack 4. Hiện tại webpack 4 đang trong quá trình beta, điều đó có nghĩa chúng ta nên lấy về từ nhánh Next:
npm i webpack@next --save-dev
Ta cần cài thêm webpack-cli nữa:
npm i webpack-cli --save-dev
Bây giờ mở package.json và thêm khai báo sau:
"scripts": {
"build": "webpack"
}
Lưu file và chạy:
npm run build
Và xem điều gì xảy ra:
ERROR in Entry module not found: Error: Can't resolve './src' in '~/webpack-4-quickstart'
webpack 4 đang muốn tìm kiếm entry point trong ./src, nói chung đó là điểm bắt đầu để bạn xây dựng gói javascipt bundle của bạn. Đọc thêm tại đây để hiểu rõ hơn nhé: webpack. Trong phiên bản trước của webpack, entry point được define bên trong file cấu hình với tên là webpack.config.js.
Nhưng bây giờ với webpac 4 thì chúng ta không cần define cái entry point này nữa. Nó sẽ được đặt mặc định trong ./src/index.js . Thử test cái feature mới này thấy thật dễ dàng, tạo ./src/index.js :
console.log('Tui là webpack 4);
và build lại xem:
npm run build
Bạn sẽ lấy được bundle trong ~/webpack-4-quickstart/dist/main.js. Khoan đã? chờ 1 chút, nó đâu cần define ở file output đâu nhỉ??!!
Trong webpack 4 không cần phải define entry point, cũng không cần trong out put file.
Tôi biết rằng đối với rất nhiều người thì điều này không quá thú vị. Sức mạnh chính của webpack là split code. Nhưng tin tui đi, file cấu hình lằng nhằng lắm, nhất là anh em mới tiếp xúc hay cần làm nhanh cái gì đó. Sau khi set up xong thì webpack 4 nó xem ./src/index.js như là entry point mặc định.
Trong phần tiếp theo chúng ta sẽ tìm hiểu thêm một số feature khá ngon: production và development mode.
Webpack 4: production và development mode
Có 2 file cấu hình phổ biến trong webpack:
1 file cấu hình cho development, để mình define webpack dev server và những thứ khác.
1 cho production, để define UglifyJSPlugin, sourcemaps…
Khi mà gặp những project lớn thì có thể cần phải có cả 2 file này, trong webpack 4 bạn có thể sử dụng 2 trạng thái của nó mà không phải làm bất kỳ một dùng cấu hình nào.
Bằng cách nào?
Thì nó giới thiệu chức năng này có sẵn mà dùng thôi :v. Trên thực tế khi bạn chạy dòng lệnh npm run build thì bạn sẽ thấy 1 thông báo:
The 'mode' option has not been set. Set 'mode' option to 'development' or 'production' to enable defaults for this environment.
Thông báo này có nghĩa là gì? Mở file package.json và update thêm script sau:
Trong những năm sắp tới, Việt Nam sẽ chứng kiến sự xuất hiện của những kỳ lân mới. Vừa qua, chính phủ đã ban hành nhiều chính sách với ưu đãi cho các doanh nghiệp khởi nghiệp lĩnh vực khoa học công nghệ, gửi gắm vào trong đó sự kỳ vọng “tăng tốc” và bứt phá của cộng đồng startup đặc biệt là ở những lĩnh vực liên quan đến AI và Machine Learning.
Theo các chuyên gia cho biết, đến năm 2021, trí tuệ nhân tạo sẽ khai sinh ra một 2100 tỷ USD giá trị cho các doanh nghiệp, góp phần tiết kiệm 6.2 tỷ USD giờ làm việc trên toàn cầu. Cuộc chơi AI không chỉ còn là cuộc chơi của những ông lớn, các doanh nghiệp startup cũng đang dần khẳng định mình bằng những sản phẩm không hề thua kém.
Đón đầu thị trường bằng những công nghệ mới, chính là chiếc chìa khóa thành công cho bất kỳ doanh nghiệp nào “Điểm đến tiếp theo của công nghệ là đâu?”. Hãy lắng nghe câu trả lời và tranh luận từ các CEO của các công ty công nghệ, những anh tài startup, full stack developer, devops, software engineer, users and commercial ventures – Dù là lập trình viên hay marketer, sự kiện năm nay chắc chắn sẽ đem lại cho bạn vô số kiến thức, mở ra cánh cửa của đổi mới sáng tạo.
Vietnam Web Summit xoay quanh những trục chính đang là tâm điểm của công nghệ thế giới:
Digital Transformation: Survive and Thrive – Cách mạng số và những bước ngoặt lịch sử.
Beyond Digital Marketing: Humanize Customer Experiences – “Người hóa” trải nghiệm khách hàng thời đại số.
AI-Powered Future: Data drive product – Trí tuệ nhân tạo vận hành thế giới.
Operations in a ‘Serverless’ World – Vận hành doanh nghiệp trong thời đại serverless
Cloud-based & Intelligence-driven Cybersecurity – An ninh mạng và những giải pháp của thời đại mới.
The new era of web development – Kỷ nguyên mới của công nghệ phát triển web.
Vietnam Web Summit là chuỗi sự kiện thường niên dành cho cộng đồng phát triển web, quảng cáo web. Được đánh giá là một trong những sự kiện web lớn nhất tại Việt Nam, với sự tham gia của các ông lớn như Amazon, Google, Facebook, Nielsen…, Vietnam Web Summit 2019 hứa hẹn là đại tiệc công nghệ được mong chờ nhất trong giai đoạn cuối năm!
Bên cạnh đó, Vietnam Web Summit sẽ tiếp tục hỗ trợ triển lãm với sự trình diễn của các doanh nghiệp và startup. Đây cũng là nơi demo rất nhiều sản phẩm, công nghệ của các doanh nghiệp. Tuyển dụng cũng là một trong những hoạt động mang lại giá trị hữu ích cho cả doanh nghiệp và người tham dự.. Đây là cơ hội lớn để các doanh nghiệp, developer cập nhật những công nghệ mới nhất, trao đổi trực tiếp cùng các chuyên gia đầu ngành.
Thay vì nóng lòng chờ đợi một mùa Vietnam Web Summit nữa thì hãy giữ ngay cho mình một slot tham dự cùng bạn bè nào, cùng nhau cập nhật những kiến thức mới năm 2019 bạn nhé!
Assembly Language (ASM), tiếng Việt là hợp ngữ. Mục đích của mình học ASM chỉ cơ bản là muốn hiểu thêm về người bạn thân thiết nhất của mình, cái máy tính mà suốt ngày mình ngồi trước nó. Mình chỉ thật sự muốn biết là đằng sau những dòng lệnh mình code thường ngày thì bên dưới nó làm cái gì?!
Thật tiếc là sau khi đã tìm hiểu được một số khái niệm về kiến trúc CPU, các loại Registers (thanh ghi), Data Segments, Data Moving thì mình buộc phải bỏ cuộc ở Control Flow.
Lý do đầu tiên là … do mình dở. Mình thấy nó thật sự quá khó với mình, vốn là lập trình viên ứng dụng với ngôn ngữ bậc cao (high level language) và chưa biết gì về Computer Scientic. Thứ hai là cách tiếp cận bottom-up (từ lý thuyết lên) này cũng không tốt. Mình nghĩ là trong tương lai nếu có dự án nào cần tới ASM thì mình sẽ có thể vừa học và practice tốt hơn (hướng tiếp cận top-down hay còn gọi là end to end). Cùng tìm hiểu xem Assembly là gì và chúng ta có nên học Assembly không trong bài viết này nhé!
Assembly Language (hay viết tắt là ASM) là ngôn ngữ bậc thấp, chính xác nó là ngôn ngữ thuộc thế hệ thứ 2 (2nd generation). ASM sử dụng các từ gợi nhớ (mnemonics) để viết các chỉ thị (instructions) lập trình cho máy tính thay vì bằng những dãy 0 và 1.
Các ASM sẽ cần một chương trình Assembler phù hợp (NASM, AS, DASM) để dịch chúng thành những file binary và một trình linker để link các thành phần lại và chỉ định nơi bắt đầu của chương trình và đây là việc bắt buộc.
VD: Hàm main trong C mặc định là nơi chương trình khởi chạy. Lệnh dịch source C ra binary trên thực tế nó đã làm 2 bước trên: dịch và link (xác định luôn nơi khởi chạy chương trình là main).
Một trong các đặc tính của chương trình viết trực tiếp bằng ASM là: chúng có tốc độ thực thi cao và tiêu tốn bộ nhớ ít hơn các chường viết bởi các ngôn ngữ lập trình bậc cao.
Việc học assembly code cũng sẽ giúp chúng ta hiểu thêm về kiến trúc phần cứng máy tính, cách chúng hoạt động và tương tác với nhau.
Ví dụ như các thành phần cơ bản trong máy tính, cách chúng truyền thông tin cho nhau.
ASM có thể tương tác rất sâu dưới hệ thống, chúng có thể giao tiếp trực tiếp với các phần cứng và bắt chúng hoạt động theo ý người lập trình. Vì thế mà chúng ta có hẳn một ngành mang tên là “lập trình nhúng”. Xem thêm WebAssembly là gì.
Cái khó của việc học assembly là gì?
Thông thường khi học một ngôn ngữ lập trình chúng ta chỉ đơn giản là cài đặt môi trường lập trình, công cụ biên dịch và sử dụng các editor hoặc IDE nếu có thể học lập trình. Viết một chương trình đơn giản rồi biên dịch và chạy thử trên các ngôn ngữ bậc cao (C, C++, Java) là rất dễ dàng. Nhưng với ASM thì bạn sẽ dễ bị “nản” vì không thể dịch và chạy code ASM đúng như hướng dẫn.
Lý do là ASM lập trình các chỉ thị cho phần cứng tuy nhiên chúng lại lệ thuộc vào kiến trúc CPU (ARM, x86-32, x86-64), hệ điều hành (Linux, Windows, Mac) và các tập chỉ thị mà nhà sản xuất phần cứng đưa ra. Đa số các hướng dẫn, sách vở được viết cho kiến trúc iA-32. Một số hướng dẫn mới gần đây hơn thì viết cho kiến trúc x86-64 trên Linux, sử dụng Assembler của GNU.
Khác với ngôn ngữ C, về lý thuyết chúng ta có thể dịch lại mà không cần đổi source code ban đầu. Tuy nhiên thực tế thì điều này khó xảy ra vì chúng ta chỉ có thể làm được điều trên nếu không gọi tới các API của hệ điều hành. Nói tới đây lại thấy yêu Java hơn, Java thật sự là cuộc cách mạng viết một lần, chạy mọi nơi và cũng chẳng cần phải dịch lại. Mọi thứ đã có máy ảo Java lo.
Thêm một khó khăn nữa cho những người học ASM trên máy Mac như mình. Apple chỉ định riêng bộ linker (Match-O) cho ASM, chúng sử dụng một số chỉ thị riêng, padding memory riêng (có 4 lớp padding). Việc viết ASM cho máy Mac thật sự có rất ít bài viết hướng dẫn, doc của Apple thì như kinh thánh … Việc nhớ các thanh ghi, các chỉ thị thôi đã đuối lắm rồi, thêm Apple hành nữa thật là khó càng thêm khó !!! Chi tiết Apple OS X Assembler Reference.
VD: Một chương trình in ra “Hello World” viết bằng ASM trên Mac OS như sau:
as hello.asm -o hello.old hello.o -o hello -e _main./hello
Như các bạn đã thấy việc in một đoạn text ra màn hình với ngôn ngữ assembly khá phức tạp, đó là chưa kể ta phải viết đúng chỉ thị của OS và CPU hiện tại. Tất cả chỉ là các chỉ thị cho các thanh ghi chứ không có kiểu 1 lệnh in ra tất cả như C.
ASM sẽ chẳng có ý nghĩa gì nếu chúng ta không thuộc tập sau đây:
Những người cần lập trình phần cứng, mạch điện tử, các chip vi xử lý.
Những người lập trình compiler, hệ điều hành. (Trong đó có anh Chris Lattner, tác giả của LLVM và Swift mà mình rất ngưỡng mộ vì anh rất trẻ – SN 1978)
Hacker chuyên nghiệp.
Reverse Engineer: nếu dịch là kỹ sư đảo thì không hay và cũng ko đủ ý. RE là những kỹ sư chuyên phân tích, mổ xẻ các chương trình để hiểu rõ chi tiết bên trong nó thế nào, RE thường ứng dụng trong an ninh: phát hiện mã độc, đánh giá thuật toán mã hoá … và các lĩnh vực khác có liên quan.
Một số lợi ích khác của ASM là:
Có thể dùng debug chương trình mà không cần source code.
Có thể dùng để tối ưu hoá chương trình: một số dân code ASM chuyên nghiệp dùng C để code và dịch ra ASM rồi edit lại cho phù hợp với kiến trúc và các chỉ thị riêng và tối ưu của nhà sản xuất chip. Lý do là các compiler chỉ dịch ra ASM chung nhất cho các dòng chip.
Một số tài liệu liên quan tới ASM
Mình xin chia sẻ lại một số tài liệu mà trong thời gian qua mình có được, để ai đó có đang tìm hiểu ASM có thể tham khảo qua:
Professional Assembly Language : Quyển này tác giả nói rất sâu về cơ chế, tất cả các thông số register, cơ chế vận hành phần cứng … Tiếc là tác giả viết cho kiến trúc IA-32 và phần code ASM cũng chỉ cho Linux x86-64 thôi.
Hacking: The Art of Exploitation: Dành cho ai thích hack, cuốn này nói rất sâu về kỹ thuật hacking đặc biệt là sử dụng ASM để can thiệp hệ thống.
x86 Assembly Guide: bài này mình hay dùng để tra cứu nhanh các chỉ thị và thanh ghi (vì não cá vàng chưa thể nhớ nổi @@)
OS X Assembler Reference: Guide về Assembler cho OS X của Apple, mình dùng doc này để convert code bên Linux qua. Cái này thật sự không giúp mình nhiều, chủ yếu coi phần Data Segment và memory padding để sử dụng thanh ghi EAX cho chính xác. Nếu không chương trình sẽ chạy ra lỗi bus error.
Mặc dù dừng lại khá sớm với việc học ASM nhưng mình cũng hài lòng với kết quả đạt được. Mình thu được một mớ kiến thức kha khá về CPU, cơ bản về việc các process cấp phát bộ nhớ. Và quan trọng là bây giờ khi cái màn hình debug trong XCode hiện lên 1 mớ ASM mình có thể hiểu được phần nào chứ không coi nó như thứ ngôn ngữ ngoài hành tinh nữa.
Đây là một hướng dẫn ngắn và đơn giản về docker, khá hữu ích cho các anh em Nodejs.
Tại sao bạn nên sử dụng Docker?
Khi công việc kinh doanh cần tới nhiều ứng dụng web khác nhau, khi mà bây giờ framework hay ngôn ngữ lập trình chỉ là công cụ. Các công ty không bị giới hạn và có thể sử dụng bất kỳ ngôn ngữ nào cần. Vì vậy chúng ta cần có một môi trường mà nhiều ứng dụng khác nhau có thể chạy cùng nhau trên đó.
Virtual Machines (VM) cho phép chúng ta chạy nhiều app trên cùng 1 server. Nhưng cũng có hạn chế. Mỗi VM cần toàn bộ OS để chạy. Mỗi OS lại cần CPU, RAM,… để chạy, rồi nó cần patching và licensing, do đó làm tăng chi phí và khả năng phục hồi.
Google bắt đầu sử dụng mô hình container từ lâu để giải quyết các thiếu sót của mô hình VM. Về cơ bản thì mô hình container có nghĩa là nhiều container trên cùng một máy chủ sử dụng cùng một máy chủ, giải phóng CPU, RAM để có thể được sử dụng ở nơi khác.
Nhưng nó giúp các lập trình viên như thế nào?
Nó đảm bảo môi trường development tương đồng với môi trường production với tất cả lập trình viên và tất cả máy chủ.
Bất kể ai có thể làm project chỉ trong vòng vài giây, không cần phải vật lộn với config, thiết lập thư viện, cài đặt dependency,…
Nói một cách đơn giản, Docker là một nền tảng cho phép chúng ta develop, deploy và run các ứng dụng với các container.
Quay lại một chút, hệ thống container trông như thể nào và nó khác với VM như thế nào?
1.1 Khác biệt giữa VM và Docker
Như bạn có thể thấy host và tài nguyên được chia sẻ trong container nhưng không có trong VM.
Cách sử dụng Docker?
Chúng ta cần làm quen với một số thuật ngữ, bạn có thể đọc thêm Docker là gì:
1.2. Mô tả docker image và docker container
Docker image: là một file thực thi có chứa những hệ điều hành được cắt giảm và tất cả các thư viện và cấu hình cần thiết để chạy ứng dụng. nó có nhiều lớp xếp chồng lên nhau và được biểu diễn dưới dạng một object đơn. Một docker image được tạo ra để sử dụng file docker, chúng ta sẽ bàn về nó sau.
Docker Container: Nó là một instance đang chạy của docker image. Có thể có nhiều container chạy từ cùng một docker image.
Chúng ta sẽ thử container hóa một ứng dụng node.js rất đơn giản, và tạo 1 image:
Ứng dụng Node.js của bạn
Hãy bắt đầu với việc tạo folder my-node-app
mkdir my-node-app
cd my-node-app
Hãy tạo một server node đơn giản trong index.js và thêm dòng code bên dưới vào đó:
//Load express module with `require` directive
var express = require('express')
var app = express()
//Define request response in root URL (/)
app.get('/', function (req, res) {
res.send('Hello World!')
})
//Launch listening server on port 8081
app.listen(8081, function () {
console.log('app listening on port 8081!')
})
và lưu file này vào trong folder my-node-app
Giờ chúng ta tạo một file package.json và thêm dòng code dưới này vào:
Ở điểm này bạn không cần cài đặt express hay npm trong máy chủ, vì hãy nhớ là dockerfile xử lý tất cả các thiết lập dependency, lib và cấu hình.
DockerFile
Hãy tạo dockerfile và lưu nó trong folder my-node-app. File này không có extension và được đặt tên là Dockerfile. Tiếp tục thêm dòng code bên dưới vào dockerfile
# Dockerfile
FROM node:8
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 8081
CMD node index.js
Giờ chúng ta đang làm gì ở đây nào
FROM node:8 – pull docker image node.js từ docker hub, bạn có thể tìm ở đây https://hub.docker.com/_/node/
WORKDIR /app – cái này đặt thư mục làm việc cho code của chúng ta trong image, nó được sử dụng bằng tất cả các lệnh tiếp theo như COPY, RUN và CMD.
COPY package.json /app – cái này copy package.json từ host folder my-node-app đến image trong folder /app
CRUN npm install – chúng ta chạy lệnh này trong image để cài đặt dependency (node_modules) cho app.
COPY . /app – Chúng ta báo với docker để copy file từ folder my-node-app và dán nó vào /app trong docker image.
EXPOSE 8081 – Chúng ta đang mở cổng trên container bằng lệnh này. Tại sao lại có cổng này? Vì trong server, index.js listen cổng 8081. Theo mặc định container được tạo từ image sẽ bỏ qua tất cả các request thực hiện cho nó.
Build Docker Image
Mở terminal, đến folder my-node-app và gõ dòng lệnh sau:
Như bạn có thể thấy nó chạy các bước vào file docker và output một docker image. Có thể sẽ mất vài phút khi bạn thử lần đầu, nhưng từ lần tiếp theo sẽ bắt đầu sử dụng cache và build nhanh hơn nhiều với output cũng giống như trên. Bây giờ thử dòng lệnh bên dưới trong terminal để xem image của bạn có ở đó không nhé:
# Get a list of images on your host
docker images
Sẽ có một list các image trong host của bạn, giống như thế này:
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest c80301fa07b2 22 minutes ago 896MB
Chạy Docker Container
Với image của chúng đã tạo, có thể tạo một container từ image này
# Default command for this is docker container run <image-name>
docker container run -p 4000:8081 hello-world
Dòng lệnh này được sử dụng để chạy docker container
-p 4000:8081 – Đây là lệnh cho phép, nó đánh dấu host 4000 sang cổng container 8081 mà chúng ta đã mở thông qua lệnh expose trong dockerfile. Bây giờ tất cả các request đến cổng host 4000 sẽ được chuyển thành cổng containter 8081
hello-world – Đây là tên chúng ta đặt cho image mới nhất khi chúng ta chạy lệnh docker-build
Bạn sẽ nhận một vài output giống thế này:
app listening on port 8081!
nếu bạn muốn truy cập vào container và gắn terminal bash vào nó, bạn có thể gõ
# Enter the container
docker exec -ti <container id> /bin/bash
Để kiểm tra container chạy chưa, mở terminal khác và gõ
docker ps
Bạn sẽ thấy container chạy như thế này
CONTAINER ID IMAGE COMMAND CREATED
`<container id>` hello-world "/bin/sh -c 'node in…" 11 seconds ago
STATUS PORTS NAMES
Up 11 seconds 0.0.0.0:4000->8081/tcp some-random-name
Nó nghĩa là container của chúng ta với id <container id> được tạo từ image hello-word, và được up lên và chạy theo cổng 8081.
Ứng dụng Node.js thông minh sẽ hoàn toàn được container hóa. Bạn có thể vào http://localhost:4000/ trên trình duyệt và thấy thế này:
1.3 Ứng dụng Node.js đã được containerise
Và thế là bạn đã containerise ứng dụng đầu tiên của mình rồi đấy. Chúc các bạn thành công!
Tuyển dụng IT trên social media luôn là vấn đề gây đau đầu nhà quản lí, chưa nhắc đến việc phải tạo ra một phương hướng phát triển lâu dài. Hơn nữa, social media tiếp tục thống trị Internet như các kênh truyền thông hàng đầu. Đây không chỉ là công cụ để bạn kết nối với mọi người mà là nơi bạn có thể tìm thấy khối nhân tài. Không ngạc nhiên khi có đến 90% nhà tuyển dụng dùng social media để tìm kiếm, chiêu mộ và tuyển chọn ứng viên tài năng. Vì thế việc cạnh tranh nhau của hàng triệu công ty để thu hút nhân tài ngày một khốc liệt.
Hiểu được nỗi trăn trở đó, TopDev sẽ tóm gọn 7 bước chính yếu để xây dựng một chiến lược tuyển dụng IT trên social media hiệu quả. Ngoài ra bạn có thể xác định nền tảng mạng xã hội hợp lí, chọn lựa đúng ứng viên cũng như cách tiếp cận họ qua cách kênh truyền thông!
Bước 1: Chọn đúng nền tảng cho tuyển dụng IT trên social media
Việc lựa chọn nền tảng cho đóng vai trò vô cùng quan trọng trong chiến lược tuyển dụng IT. Theo Harver, có đến 87% nhà tuyển dụng dùng LinkedIn để tìm kiếm ứng viên, 55% dùng Facebook, 47% là Twitter.
Tương tự, nội dung bạn đăng tải cũng thế. So với Twitter và Instagram, LinkedIn được xem là hiệu quả hơn để đăng các bài blog. Vì thế hãy xác định rõ kì vọng và đảm bảo chọn một (hoặc vài) nền tảng cho xu hướng ngành của bạn.
Bước 2: Xác định cụ thể từng ứng viên khi tuyển dụng IT trên social media
Tìm kiếm một ứng viên là không hề dễ dàng. Bạn tự hào vì có một quảng cáo công việc tốt nhưng nếu ở sai thị trường sẽ không ai ứng tuyển cả. Đặc biệt với tuyển dụng IT trên social media, hãy xác định được kiểu ứng viên mà bạn muốn lựa chọn vào công ty.
Một số câu hỏi giúp bạn rõ hơn về loại ứng viên công ty thực sự cần:
Bạn muốn tuyển sinh viên mới ra trường, chuyên gia hay tầm trung?
Bạn có yêu cầu đặc biệt nào như đạo đức công việc, lý lịch, tình trạng gia đình?
Ngoài ra, bạn có thể tiết kiệm thời gian bằng việc khắc họa chân dung ứng viên và đặt trọng tâm chiến lược vào đó. Nhờ thế, ứng viên không phù hợp sẽ được lọc sớm cũng như khuyến khích ứng viên khác nộp CV.
Bước 3: Thiết lập lịch nội dung
Thu hút ứng viên tài năng đòi hỏi sự kiên trì và bền bỉ. Hãy đảm bảo bạn chuẩn bị kĩ bằng việc lên kế hoạch nội dung tuyển dụng IT vài tuần trước đó.
Lịch không chỉ giúp tự động hóa nội dung định sẵn còn giúp mọi người dễ thấy quảng cáo công việc của bạn hơn.
Khi đăng tải thường xuyên thì cơ hội các ứng viên thấy vị trí ứng tuyển càng cao hơn. Tuy nhiên đừng lạm dụng, vì nếu đăng quá nhiều thì bạn có thể bị liệt trong danh sách đen vì “spam” đấy.
Bước 4: Đẩy mạnh sự tương tác – điều thiết yếu trong tuyển dụng IT trên social media
Thông thường khi tìm việc, họ sẽ phản ứng ngay với các công việc họ thấy thu hút, vì vậy cần đảm bảo điều này xảy ra khi bạn đăng tải vị trí nào đó. Vì vậy bạn cần bổ sung thông điệp mang tính động lực và thúc đẩy vào quảng cáo công việc.
Một số câu truyền động lực như “sign up today- change your tomorrow” nên được lồng ghép vào các bài đăng. Chúng dễ lĩnh hội cũng như khiến cho người dùng social media thích thú hơn. Việc họ sẽ cân nhắc và cuối cùng quyết định nộp CV dễ dàng hơn bao giờ hết.
Trong tuyển dụng IT trên social media, khi viết mô tả công việc, bạn cần chú ý, cân nhắc từng chi tiết liên quan. Trước khi đăng tải điều gì, bạn cần xác định và xem xét toàn bộ quá trình tuyển dụng IT.
Chiến lược tuyển dụng IT trên social media không giống tuyển dụng truyền thống khi nhắc tới quy định. Điều cần làm là đặt ra quy định liên quan tới định dạng, quy tắc CV cho ứng viên của bạn.
Tuy nhiên, đừng mong đợi CV nào cũng như mong muốn. Trong trường hợp đó, những ai không theo đúng nguyên tắc vẫn sẽ như thế nếu bạn chấp nhận tuyển họ.
Bước 6: Giao tiếp qua social media
Bản chất của các social media là thúc đẩy giao tiếp trực tiếp. Vì vậy, chúng có thể đóng vai trò hỗ trợ đắc lực cho bất kỳ ứng viên tiềm năng nào.
Khả năng lớn ứng viên sẽ hỏi thêm về vị trí, công ty cũng như quá trình tuyển dụng. Hãy hướng dẫn cho người quản lí kênh social media cách trả lời bất kì câu hỏi nào liên quan. Nhờ thế, việc tuyển dụng IT trên social media của bạn sẽ mang lại trải nghiệm tích cực hơn cho ứng viên đấy.
Đừng bao giờ bỏ lơ bất kì tin nhắn nào vì họ có thể thấy tiêu cực về tổng thể doanh nghiệp. Facebook và Twitter thường hiển thị trang thường xuyên trả lời tin nhắn hơn là trang không có. Vì thế, hãy thể hiện thiện chí của bạn bằng việc trả lời mọi câu hỏi.
Bước 7: Đừng để ứng viên phải chờ
Social media về bản chất khuyến khích thời gian phản hồi và quay vòng thông tin nhanh chóng. Hãy theo logic này nếu bạn có kế hoạch sử dụng tuyển dụng phương tiện truyền thông xã hội.
Khi CV đến, đảm bảo bạn liên hệ với ứng viên càng sớm càng tốt. Hoặc bạn có thể tạo tin nhắn tự động để bảo đảm ứng viên có trải nghiệm tích cực!
Công ty đôi khi phải chịu tiếng xấu khi bạn cố tình lờ đi những tin nhắn trực tiếp. Nhớ rằng bất cứ ai gửi CV chứng tỏ họ đang rất cần việc làm. Hãy cho họ thấy sự trân trọng của bạn bằng giải đáp và sắp xếp phỏng vấn sớm nhất có thể. Nhờ thế, những trải nghiệm không tốt với công ty có thể được giảm thiểu.
KẾT LUẬN
Khi dùng social media cho chiến lược tuyển dụng IT thì bạn cần tập trung vào chất lượng từng bài đăng. Không chỉ thế, bạn phải tạo cho ứng viên cảm xúc tích cực bằng việc duy trì và thúc đẩy sự tương tác với họ. Dĩ nhiên việc thực hiện không hề dễ dàng tí nào. Tuy nhiên, nếu bạn nghiêm túc và kiên trì, vị trí ứng tuyển của bạn sẽ hiệu quả hơn mong đợi rất nhiều đấy!
Nếu còn gì chưa rõ, ấn vào đây và đội ngũ TopDev sẽ giúp bạn giải đáp mọi thắc mắc !
Golang Developer là lập trình viên có kiến thức và kinh nghiệm về ngôn ngữ lập trình Golang. Golang là một trong những ngôn ngữ lập trình mới nhất trong ngôn ngữ lập trình hiện đại. Golang được tự mô tả là một ngôn ngữ lập trình mã nguồn mở giúp dễ dàng xây dựng phần mềm đơn giản, đáng tin cậy và hiệu quả. Hy vọng, Mẫu bảng mô tả công việc lập trình Golang này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này
Về lập trình viên Golang : Để thành một Golang Developer, xác lập trình viên cần nắm rõ cấu trúc dữ liệu và giải thuật, kỹ thuật lập trình hướng đối tượng cũng như có kinh nghiệm về ngôn ngữ Golang để cùng tham gia nghiên cứu, thiết kế, phát triển và tích hợp các các giải pháp và hệ thống ứng dụng phục vụ công việc quản trị, vận hành và điều hành cho sản phẩm công ty/ khách hàng.
Mẫu bảng công việc lập trình Golang
YÊU CẦU CÔNG VIỆC
Nắm vững chắc về ngôn ngữ lập trình Golang, mô hình, cấu trúc và thành ngữ
Hoặc Thành thạo một hoặc nhiều ngôn ngữ lập trình: C / C ++ / Java / Golang
Kiến thức về các mẫu Goroutine và kênh phổ biến
Có kinh nghiệm làm việc với với các công cụ code versioning (như Git, SVN và Mercurial)
Có kinh nghiệm làm việc với các Framework và tools của Go, bao gồm:+ Các công cụ quản lý phụ thuộc như Godep, Sltr, v.v.
+ Go’s code generation tools, như Stringer
+ Go web frameworks, như Revel
+ Gói bộ định tuyến, chẳng hạn như Gorilla Mux
MÔ TẢ CÔNG VIỆC
Tham gia thiết kế và phát triển các ứng dụng kinh doanh hiệu suất cao, từ phân tích yêu cầu đến sản xuất
Không ngừng nâng cao chất lượng phần mềm
Phân tích và cải thiện hiệu suất ứng dụng
Phối hợp với thành viên trong team để tối ưu hóa các phương pháp kỹ thuật
Đóng vai trò quan trọng trong các quyết định thiết kế và kiến trúc, xây dựng hướng tới một kiến trúc phân tán dịch vụ vi mô hiệu quả.
Tham khảo thêm những công việc lập trình hot nhất thị trường tại đây
Sau một thời gian “ngưng log” các request API và SQL query thì đã mạnh dạn tìm kiếm 1 SaaS log management vừa túi tiền để thử, bởi nếu các bạn cũng biết mấy ông này rất đắt tiền, bèo bèo cũng 50$/tháng và cũng lưu được vài GB.
Vô tình phát hiện ông LogDNA với chi phí khá cool 1.5$/GB/tháng. Thiết nghĩ chắc Teamcrop tầm 3, 4GB tháng là cùng. Cuối cùng đã quyết định đẩy toàn bộ log lên LogDNA, do hệ thống Teamcrop Microservices dùng docker và đang sử dụng Syslog-NG để ghi log local, nên chỉ cần mount 1 file config mới để trỏ tới UDP IP & Port mới là xong.
Sau khi kết nối và thấy raw log được thì khá là ưng ý và cũng đã apply lên production sau 1 ngày thử nghiệm. Ác mộng mới bắt đầu, sau 2 ngày chạy thiệt, hệ thống log đã ghi nhận gần 16 triệu line, và tổng dung lượng gần 4.5GB. Tính nhẩm nhẩm thì 1 tháng tầm 50GB là ít, tính ra chi phí cũng không ít, chả khác gì mấy ông như Loggly, Papertrail, Sematext…có vẻ không ổn nên lại tính cài lại Graylog hoặc ELK nhưng quá khứ cho thấy làm việc với các hệ thống này mặc dù tự cài nhưng khá chua, lỗi lên lỗi xuống, rườm rà và giao diện cũng phức tạp (performance tệ).
PHP 7 & Swoole Extension để dựng UDP Socket Server
Sau một ngồi suy nghĩ thì tính đến chuyện sao không viết 1 UDP server luôn và lắng nghe log và ghi xuống “một nơi nào đó”, và nơi này phải tối ưu cho truy vấn thống kê (chứ MySQL là nghe đến trăm triệu record là bỏ của chạy lấy người). Viết UDP Socket server khá dễ, chỉ vài phút là dựng được cũng như viết được parser cho log. Nhân đây giới thiệu với các đồng đạo extension Swoole của PHP, tìm hiểu để mở rộng thêm tầm nhìn về PHP nhé.
Kết hợp với Supervisord thì script PHP này chạy ngầm đỡ dở chứng.
Công đoạn thiếp theo là lưu log ở đâu để truy vấn cho lẹ, vô tình tìm ra Clickhouse, được sinh ra để tối ưu cho OLAP và trên nhiều dữ liệu. Lại tương thích với SQL nên hầu như khi sử dụng (truy vấn) sẽ không khác MySQL bao nhiêu. Cài đặt Clickhouse cũng dễ nên sau vài giờ là đã test đọc ghi dữ liệu. Cũng có PHP client để kết nối nên việc tích hợp vào code PHP khá nhẹ nhàng và không có vấn đề gì. Cho chạy thử nghiệm production thì dữ liệu đẩy vào khá smooth. Hiện tại được vài triệu record nhưng query khá nhanh.
Khâu cuối cùng là Select data & UI thì tùy mỗi người nhu cầu gì thì viết chart mà thôi, cái này dễ như làm việc với web bình thường. Bên Teamcrop thì sử dụng cơ chế insight có sẵn và UI trên React nên khâu này khá nhẹ nhàng, tha hồ làm chart mình thích.
Hoặc làm biếng thì có clickhouse-client, có thể vào và viết query để xem kết quả ngay như mysql client.
Toàn bộ giải pháp hiện đang chạy 1 con server 20$/tháng, nếu log nhiều thì có thể xóa record quá cũ hoặc thuê server bự hơn. Dù sao thì hiện tại log khá sướng, chủ động ở khâu parser và query data. Hy vọng những chia sẻ này sẽ giúp anh chị em tiết kiệm kha khá tiền cho log management. Khi nào xịn xịn xíu, có GUI sẽ viết blog hoặc open source phần setup này cho bà con triển khai nhé, đỡ tốn tiền và muốn log bao nhiêu log. Tất cả chỉ tốn 1 ngày R&D và tiết kiệm bộn tiền cho vụ log này.
—
Một số công nghệ đề cập:
– Syslog-Ng để nhận log local và đẩy lên UDP Server
– PHP 7 & Swoole Extension để dựng UDP Socket Server
– Supervisord để quản lý PHP Background Process
– Clickhouse để làm database và truy vấn dữ liệu