Điểm bắt đầu
Hành trình
Kinh nghiệm
1. Khởi động:








Thị trường thanh toán điện tử được giới chuyên gia đánh giá là có sự tăng trưởng khá tốt trong năm nay. Trong báo cáo thị trường thanh toán điện tử Landscape 2020 đã đưa ra rất nhiều thông số đáng tin cậy về sự tăng trưởng này. Vì sao thị trường thanh toán điện tử lại có xu hướng tăng trưởng dù dịch bệnh vẫn chưa hoàn toàn rút khỏi Việt Nam?
Trong hơn 6 tháng đầu năm 2020, mặc dù Việt Nam cũng là một trong những nước bị ảnh hưởng bởi đại dịch thế kỷ – Covid19 thế nhưng dường như những ngành nghề liên quan đến công nghệ lại không chịu quá nhiều ảnh hưởng tiêu cực nhiều như những ngành khác. Điển hình như thị trường thanh toán điện tử vẫn luôn “tấp nập” bất chấp dịch bệnh.
Theo báo cáo thị trường thanh toán điện tử Landscape 2020, trong riêng năm 2020, các giao dịch qua Internet, điện thoại di động tăng trưởng đến 238% (số liệu được trích từ báo cáo của Cục Thương mại điện tử và Kinh tế số – Bộ Công Thương).
Trong bài báo cáo còn cho thấy mức độ phát triển mạnh mẽ của những ứng dụng thanh toán điện tử mới và lâu đời với hơn 78 tổ chức, công ty cung ứng dịch vụ thanh toán qua Internet và 45 tổ chức cung ứng dịch vụ thanh toán qua điện thoại di động (mobile payment).
Thanh toán điện tử đang là xu hướng phát triển mua sắm hiện nay trên toàn thế giới và cả Việt Nam, phương thức thanh toán này được coi như là phương thức sẽ thay thế hình thức thanh toán truyền thống bằng tiền mặt như trước kia.
Trong báo cáo chi tiết của Bộ Công Thương trong những năm trở lại đây, những người tiêu dùng có thói quen mua sắm trong các siêu thị, trung tâm thương mại có xu hướng chuyển đổi từ việc thanh toán truyền thống thành thanh toán điện tử. Ngành thương mại điện tử phát triển, đồng nghĩa với việc kéo theo sự phát triển của thanh toán điện tử vì hàng hóa, sản phẩm được mua trên các sàn điện tử 90% được thanh toán online thông qua thẻ ngân hàng.
Trong 90 triệu người Việt Nam, số người sử dụng internet chiếm 49%, số người sử dụng internet thông qua thiết bị điện thoại chiếm 34%, chính vì thế Việt Nam được xem như là 1 thị trường béo bở để phát triển thương mại điện tử cũng như thanh toán điện tử.
Lợi ích của việc thanh toán điện tử là hoàn toàn không thể chối bỏ, chính vì thế nó mới có thể phát triển mạnh mẽ và tăng trưởng vượt bậc đến như vậy. Cụ thể doanh thu từ thị trường thanh toán điện tử 2020 đã tăng trưởng 14.2% so với cùng kỳ năm ngoái, doanh thu đạt được là 8,904 triệu USD. Lượng người dùng cũng đã tăng trưởng lên đến 36,2 triệu, tăng 12.1% so với năm ngoái.


Bắt đầu từ thời điểm các ngân hàng triển khai kế hoạch phát hành thẻ ngân hàng, thì cho đến nay, người dùng thẻ ngân hàng thanh toán cũng đã đạt đến con số tăng trưởng khá kinh ngạc. Có thể nói, xu hướng thanh toán điện tử đã làm thay đổi thói quen tiêu dùng của người Việt Nam. Hiện nay, có các loại hình thanh toán điện tử sau:
Đây là hình thức thanh toán điện tử đầu tiên và đặc trưng nhất trong thị trường thanh toán điện tử. Tỷ lệ thanh toán bằng hình thức này lên đến 90% trong tổng tỷ lệ thanh toán điện tử. Với phương thức thanh toán bằng thẻ này, người dùng có thể dễ dàng thanh toán bằng cách cà thẻ tại chỗ hoặc thanh toán online thông qua thẻ khi mua hàng trên các sàn TMĐT.
Hình thức thanh toán này phần lớn thường xuất hiện ở các trang TMĐT, hình thức hoạt động của thanh toán này rất đơn giản, nó giúp chuyển tiền từ tài khoản người mua thành 1 đơn vị tiền ảo trên Internet nhưng không thay đổi thuộc tính và giá trị tiền. Vì thế người mua hàng vẫn có thể sử dụng tiền đó để mua sắm bình thường.
Để có thể sử dụng hình thức thanh toán này, người tiêu dùng cần phải tạo 1 account, trong đó được điền đầy đủ thông tin đã được xác thực. Điểm mạnh của hình thức thanh toán điện tử này là tính chất bảo mật cao, một số cổng thanh toán nổi tiếng hiện nay như: payoo, vnpay, vtcpay, kaokim.vn… đều có tính bảo mật cao và có lượng người dùng lớn.


Đây là hình thức thanh toán khá tiện dụng và rất phổ biến trong giới trẻ ngày ngay. Ví điện tử không chỉ được sử dụng trong các trung tâm thương mại lớn, sàn giao dịch điện tử mà còn sử dụng được đối với bất gì nhà hàng, quán ăn/ nước uống, shop đồ bất kỳ nào có ký hợp đồng liên kết với ví điện tử. Điều kiện kiên quyết khi muốn sử dụng ví điện tử là bạn phải có thẻ ngân hàng có liên kết với ví điện tử.
Với hình thức thanh toán bằng ví điện tử như thế này, người tiêu dùng có thể dễ dàng thanh toán bằng cách quét mã QR của shop và nhập đúng số tiền cần thanh toán là có thể hoàn tất việc mua hàng/ sản phẩm. Những ví điện tử nổi tiếng hiện nay gồm: Momo, Smartpay, Payoo, Airpay….
Đây là hình thức thanh toán bằng phương thức chuyển khoản từ tài khoản ngân hàng này qua tài khoản ngân hàng khác bằng điện thoại di động. Nói đơn giản nghĩa là bạn dùng Mobile Banking/ App của ngân hàng để chuyển khoản hoặc quẹt mã khi thanh toán.
Không phổ biến như ví điện tử, các nhà hàng thường ít liên kết thẳng với ngân hàng mà thường thông qua các loại Ví điện tử hơn. Chính vì thế, người dùng chủ yếu dùng Smartphone để thanh toán chuyển khoản là đa số.


Với số liệu tăng trưởng từng năm theo báo cáo thị trường thanh toán điện tử landscape 2020, thì trong tương lai không xa chắc hẳn loại hình thanh toán không tiền mặt sẽ lên ngôi. Trong 1 bài phỏng vấn, ông Vương Đình Huệ, phó thủ tướng Việt Nam cũng đã nêu lên ý kiến ủng hộ hình thức thanh toán không tiền mặt.
Ông chia sẻ “Lợi ích của thanh toán không tiền mặt đã quá rõ, giảm chi phí và đem lại nhiều tiện ích cho người dân, doanh nghiệp. Đến giờ mà người dân phải đi xa, xếp hàng chờ nộp học phí cho con thì rõ ràng là quá bất tiện”. Theo ông, việc thanh toán điện tử có thể làm nguồn tiền tiêu thụ trở nên minh bạch, chống được việc tham nhũng hay rửa tiền hoặc các vụ án về kinh tế.
Vào năm 2010, ngài Garadahew Warku đã từng đề cập và đưa ra một số đặc điểm về lợi ích của việc thanh toán điện tử như:
Ngoài ra, hình thức thức thanh toán điện tử này cũng mang đến nhiều lợi ích cho những người chủ, bán hàng Online vì giúp họ tiết kiệm chi phí thuê mặt bằng, nhân viên cửa hàng, người mua hàng và người bán hàng thậm chí còn không cần phải gặp mặt nhau nhưng vẫn có thể xuất hiện giao dịch hàng hóa.
Có thể nói, thanh toán điện tử là hình thức thanh toán khá tiện lợi và thuận tiện, người tiêu dùng/ mua sắm chỉ cần cung cấp chính xác thông tin tài khoản thanh toán ngân hàng, đia chỉ giao hàng và sản phẩm cần mua là đã có thể mua hàng một cách nhanh gọn lẹ, không làm mất quá nhiều thời gian của người mua hàng như cách truyền thống. Khó mà có thể phủ nhận 1 phần công lao làm kích thích tiêu dùng của người mua sắm nhờ thanh toán điện tử.


Với sự ủng hộ từ Chính phủ, hình thức thanh toán điện tử tại Việt Nam hiện nay đang có những chuyển đổi theo chiều hướng tích cực hơn. Trong khoảng thời gian từ 2018 đến thời điểm hiện tại, Momo là một trong những ví điện tử đứng đầu về số lượng người dùng, hợp tác với hơn 100.000 đối tác đa ngành nghề và đã có hơn 100.000 địa điểm có thể thanh toán bằng Momo.
Dường như thời kỳ hoàng kim của thanh toán điện tử đã lên ngôi cũng kéo theo thị trường thẻ tín dụng Việt Nam phát triển. Tuy số liệu trong báo cáo thị trường thanh toán điện tử Landscape 2020 tăng trưởng là thế nhưng hiện nay tiền mặt vẫn là loại hình được người Việt Nam ưa chuộng nhất.
Chiếm đến 80% tỷ lệ giao dịch, điều này đồng nghĩa đến việc dù đã có sự tăng trưởng vượt bậc nhưng thị trường thanh toán điện tử cũng chỉ chiếm có 20% tỷ lệ giao dịch trên toàn Việt Nam.
Ngân hàng Nhà nước vừa đưa ra thông tin trong năm 2020 đó là hiện nay số người sử dụng thẻ ngân hàng chỉ chiếm có 30% dân số Việt Nam, 70% dân số còn lại sử dụng tiền mặt làm công cụ lưu thông mua hàng chính. Đa số 70% lượng người không sử dụng thẻ ngân hàng tập trung ở các vùng xa thành thị như thôn quê, vùng sâu hẻo lánh chưa được cập nhật kiến thức về sử dụng các sản phẩm hiện đại.
Cốt lõi của việc thanh toán bằng hình thức điện tử là bắt buộc phải có tài khoản ngân hàng, đây cũng chính là một trong những khó khăn lớn nhất trong việc phát triển phương thức thanh toán điện tử.
Ngoài ra, còn một vấn đề nữa cũng làm ảnh hưởng không nhỏ đến tình hình phát triển thanh toán điện tử, đó là trong 30% người sử dụng thẻ còn lại chưa hẳn đã thanh toán điện tử. Họ có xu hướng sử dụng thẻ ngân hàng chỉ để đặt hàng online sau đó lại chọn phương thức thanh toán bằng tiền mặt.
Như vậy, để giải quyết được bài toán tăng trưởng thị trường thanh toán điện tử, các ngân hàng, công ty, doanh nghiệp kinh doanh ví điện tử nên cập nhật thêm nhiều ứng dụng tiện lợi hơn và đơn giản hóa cách sử dụng để có thể kích thích người tiêu dùng chuyển sang sử dụng.
Với sự ủng hộ từ phía nhà nước cùng với sự tăng trưởng vượt bậc như hiện nay, thì có lẽ trong tương lai hình thức thanh toán điện tử sẽ lên ngôi làm thay đổi thói quen người tiêu dùng. Theo báo cáo của Vietnam IT Landscape 2020 cho thấy thị trường thanh toán điện tử 2020 có sự phát triển gia tăng đáng kể dù dịch bệnh vẫn còn, vì người tiêu dùng vẫn luôn có nhu cầu mua sắm.
Trong thời điểm như thế này, cơ hội phát triển thị trường thanh toán điện tử sẽ mạnh mẽ hơn bao giờ hết vì xu hướng mua sắm sẽ chuyển sang mua online và thanh toán điện tử trong mùa dịch này. Chính vì thế, các số liệu trong báo cáo Vietnam IT Landscape 2020 đã thể hiện sự tăng trưởng từ năm này sang năm khác là hoàn toàn hợp lý.
Các bạn có thể truy cập vào báo cáo Vietnam IT Landscape 2020 hoặc nhấn nút xem báo cáo dưới đây để có thể tìm hiểu thêm các thông số báo cáo không chỉ của riêng thị trường thanh toán điện tử 2020 mà còn nhiều ngành liên quan đến công nghệ khác nữa!
Nguồn tổng hợp từ TopDev
Có thể bạn muốn xem:
Xem thêm việc làm IT hấp dẫn từ TopDev!
Business Intelligence – BI là gì? Để hiểu đơn giản, BI (hay còn được gọi là trí tuệ doanh nghiệp) là một dạng công nghệ giúp doanh nghiệp hiểu biết về quá khứ, qua đó đưa ra quyết định, hành động và dự đoán tương lai. Trong đó BI bao gồm các kỹ năng, quy trình, công nghệ hay ứng dụng để hỗ trợ ra quyết định. BI là các hoạt động kết hợp giữa phân tích kinh doanh, khai thác dữ liệu, trực quan hóa dữ liệu, công cụ dữ liệu và cơ sở hạ tầng và thực tiễn để giúp tổ chức ra các quyết định-dựa trên data (data-driven decision).
Trong mục chuyên gia nói kỳ này, cùng TopDev trò chuyện với một chuyên gia về Business Intelligence – anh Phan Nguyễn Minh Trường – Technical Architect tại NashTech để hiểu hơn về cách mà nó hoạt động, cũng như những bài học kinh nghiệm rút ra trong quá trình áp dụng và triển khai.
Tuyển dụng business intelligence lương cao cho bạn
Vì sao anh lựa chọn gắn bó trong thời gian khá dài tại các công ty ấy? Và quan điểm của anh về “xu hướng nhảy việc” ở người trẻ như thế nào?
Thật ra mình lười đi tìm việc mới, lười tìm công ty khác. Với lại thực ra lúc đầu mình cũng hạnh phúc với công việc hiện tại, trừ phi có một số lý do nào đó thì mình thay đổi thôi. Xu hướng hiện tại các bạn thường thay đổi công việc chắc đâu đó có một vài lý do chính, ví dụ như là họ không hợp với môi trường, hoặc là họ cần có mức sống cao hơn, có một số bạn cần phải hỗ trợ gia đình. Nhưng có một số bạn thì thấy là mình không phát triển được nữa, có đâu đó mình đọc mình thấy là nếu mình là người giỏi nhất trong công ty đó thì mình nên đi, tại vì giỏi thì mình nên đi để trau dồi và thử thách bản thân mình hơn. Cái sau cùng có một lý do hơi kỳ lạ đó là thích, một số bạn thích chuyển việc thôi, họ nghiện chuyển việc, họ làm 1, 2 năm rồi họ chuyển công việc khác.


Khi mà anh làm việc ở ACB thì động lực nào khiến anh ở lâu như vậy?
Hồi xưa mình làm việc với sếp ở ACB, mình thấy hạnh phúc lắm, mình thấy rất thích phong cách của sếp quản lý tại thời điểm đó. Sếp luôn giúp đỡ mọi người và luôn nâng cấp nghề nghiệp của mình, đó là lý do chính mà mình gắn bó lâu dài với ACB
Khi nào một coder mới đủ độ “chín” để phát triển một tầm cao mới?
Mình nghĩ lý do quan trọng nhất đó là thuyết phục, làm sao để thuyết phục được người khác nói điều mình đang nói, cái đó là quan trọng nhất. Bạn coder đó cần phải có kỹ năng về quản lý người, kỹ năng về trình bày một số vấn đề để người khác hiểu được, kỹ năng thuyết phục khách hàng, thì lúc đó là thời điểm chín muồi để bạn có thể chuyển sang một title mới. Mình nghĩ là trước khi thành một leader thì mình phải biết sharing, nghĩa là mình cần chia sẻ kiến thức mình đang có, sau đó mình học lại từ các bạn khác, kể cả những bạn yếu hơn, bạn sẽ hỏi mình một số câu hỏi rất ngớ ngẩn nhưng mà mình suy nghĩ lại, mình tìm kiếm và trả lời cho bạn một cách hợp lý nhất. Từ đó mình sẽ nâng kiến thức của mình lên, nhiều khi mình làm việc với khách hàng, khách hàng cũng hỏi ngớ ngẩn như vậy, nhưng mình biết cách mình trả lời thì từ từ mình nâng cấp mình lên.
Định nghĩa của anh thì Business Intelligence – BI là gì? BI giúp gì cho doanh nghiệp và nó sẽ giúp như thế nào (cách hoạt động)?


Về mặt học thuật thì có rất nhiều định nghĩa về BI, có những định nghĩa gần đây nói rằng BI là một skill, rồi ngoài ra là application, rồi information, rồi technology, hoặc là những định nghĩa trước đó thì nói là sẽ lấy tổng hợp dữ liệu có sẵn rồi sau đó đưa ra hỗ trợ quyết định.
Nhưng mà mình nghĩ thực tế nhất, để hiểu BI là gì cũng giống như là hồ sơ giúp mình quản lý sức khỏe, nó lưu thông tin lại để mình kiểm tra sức khỏe định kỳ, rồi sau đó mình sẽ biết được sức khỏe trong tương lai mình sẽ bị bệnh gì, và sức khỏe mình sẽ yếu ở đâu và nó sẽ báo được cái đó và mình nghĩ cái đó là đơn giản nhất. Đa phần BI giúp monitor doanh nghiệp, bên cạnh đó còn hỗ trợ ra quyết định.
BI phù hợp với những doanh nghiệp thế nào và SMEs có cần phải có một hệ thống BI? Nếu không có thì họ sẽ bỏ lỡ những gì?
Tùy doanh nghiệp có kích thước, kích cỡ khác nhau thì mình có thể áp dụng BI có cồng kềnh hay không cồng kềnh hoặc là nó hoành tráng hay không hoành tráng. Đại loại là mình hình dung hồi xưa sức khỏe của một đứa trẻ sơ sinh, sinh ra cũng cần phải có hồ sơ sức khỏe rồi, khi mình lớn mình cũng cần, khi mình già mình cũng cần, nhưng nếu mình không theo dõi sức khỏe thường xuyên, đùng một phát minh bị bệnh ngã ra thì mình sẽ bị bệnh nặng hơn, lúc đó trở tay không kịp. Nếu mình theo dõi sức khỏe định kỳ, làm tốt chuyện đó thì sẽ phát triển tốt hơn và nắm được sức khỏe của doanh nghiệp.
Ý nghĩa của BI trong banking là gì?
Trong banking có rất nhiều bộ phận khác nhau, mà chính vì nhiều bộ phận tài chính khác nhau mà họ đều có khả năng tự làm tài chính báo cáo được, nó sẽ gây ra chuyện là một báo cáo lên thì mỗi bộ phận báo cáo một con số khác nhau, người quản trị ở trên nhìn vào sẽ thấy sao anh này báo cáo một số, anh kia báo cáo một số.
Quay lại câu chuyện của BI khoảng năm 2007 trở về trước, lúc mà tờ báo của Việt Nam mình ra thì có hình BI được mô tả là thầy bói sờ voi, có nghĩa là mỗi người sờ một chỗ và nói là BI như vậy thì đó là lý do chính tại sao cần phải có hệ thống dữ liệu tập trung và mình sẽ dùng BI đó báo cáo xuyên suốt, thuật ngữ hay dùng là one-cross, nghĩa là một sự thật duy nhất thôi, do có nhiều bộ phận báo cáo quá thì sếp không biết số nào là số đúng, bên nào cũng muốn lấy phần có lợi về mình cho nên không phần nào chịu thiệt
Xem thêm BI là gì? Vì sao có nhiều doanh nghiệp đầu tư vào BI?
Quá trình để đi từ raw data đến khi chúng trở thành những thông tin có giá trị để có thể ra quyết định cần qua những giai đoạn nào, “qua tay” những ai?
Để có thể làm phần phân tích dữ liệu có giá trị thì tất nhiên phải có nhiều yếu tố, nhiều con người cùng hợp sức để làm. Đầu tiên mình cần phải biết business need đó là gì, sau đó mình sẽ xác định được nguồn dữ liệu, ví dụ như nãy business need cần phải có BI hỗ trợ cùng, rồi sau đó lấy dữ liệu về thì cần có data engineer, sau khi có cái đó rồi mình mới làm giàu dữ liệu lên, mình làm sạch dữ liệu, mình visualize data lên, sau đó mình mới dùng, người mà involve vào là data analyst, sau đó thì họ báo cáo. Chìa khóa quan trọng ở đây là cái tốn thời gian nhiều nhất là quá trình xử lý dữ liệu nhưng mọi người sẽ nhìn vào chìa khóa chính là visualization thôi, đó là phần data analyst làm
Những lưu ý gì khi một doanh nghiệp áp dụng, sử dụng hệ thống BI?
Các doanh nghiệp khi xác định hệ thống BI họ cần phải xác định là cái số lượng người dùng trước đã, rồi cái lượng báo cáo của họ, tần suất báo cáo như thế nào và đặc biệt quan trọng nhất là họ phải xác định, hồi nãy mình có mô tả về quá trình xử lý dữ liệu thì business mới là cái quan trọng nhất, họ cần phải xác định cái business trước tiên, họ cần define những loại báo cáo nào họ sẽ điền vô để quản lý, giống như chỉ số sức khỏe của mình vậy đó, mình đi khám huyết áp thì cần có chỉ số về đường huyết, về máu mình phải đi kèm theo.
Cần chuẩn bị kỹ năng gì khi theo đuổi BI?
Để làm BI thì phần về kỹ thuật nặng hơn phần business nhưng mà giá trị phần business, cho nên các bạn bên Công nghệ thông tin sẽ có lợi thế hơn về cái phần kỹ thuật nắm khá vững, mình phải tìm hiểu thêm 1 số business mình cần nữa, thì lúc đó mình làm việc trực tiếp với BI thôi mình có thể cover được chuyện đó.
Anh có thể gợi ý nguồn học tập Business cho Devs?
Mình nghĩ chắc qua Đại học Kinh tế học đi, hoặc là Đại học Kinh tế luật cũng có khóa chuyên về dữ liệu mới mở.
Case Study đáng nhớ nhất trong quá trình làm việc của anh là gì?
Lúc đó là năm 2011, lúc đó mình mới lấy vợ thôi như sếp mua công cụ Cognos BI của IBM , công cụ đó là chưa có ngân hàng nào ở Việt Nam sử dụng hết mà sếp kêu là làm trong vòng mấy tháng cuối năm thôi, mới lấy vợ không được đi đâu hết. Phải vô công ty làm từ sáng tới tối, làm sao tới 5h sáng mình dậy rồi về nhà tắm rửa quay lại công ty làm trong vòng có vài tháng thôi mà Cognos BI của IBM không có bất kỳ tài liệu nào để tham khảo, lúc đó là mình tự research, team thì chỉ có 3 người và 1 số bạn làm ITL với BI là riêng. Phần đó khiến mình nhớ nhất luôn, nhưng có giận cũng phải chấp nhận thôi.
Anh có lời khuyên nào dành cho các bạn junior mới làm về data không?
Mình cũng làm chung với các bạn senior hay các bạn làm lâu 1 chút xíu, nhưng các bạn học thiên về xu hướng hiện đại mà quên phần kiến thức căn bản, rồi các bạn học R, học Python nhưng bạn không học cơ sở dữ liệu cơ bản, bạn không học làm cách nào để tổ chức dữ liệu cho hợp lý và mình khai thác nó tối ưu ví dụ như cách mình bố trí file, cách mình bố trí những bảng biểu ra sao, mình bỏ quên cái đó luôn.


Mình cứ hình dung là mình đang có nguyên 1 cái tòa nhà, các bạn muốn làm gì làm nhưng mà mình không có quy hoạch kiến trúc tòa nhà đó chỗ nào sẽ chứa dữ liệu này hay dữ liệu nào, thì cuối cùng nguyên tòa nhà đó mỗi phần bạn làm ra rất là đẹp đẽ, nhưng cuối cùng tới chừng làm tự động hóa lại không được, hoặc scalable nó rất là khó.
Về doanh nghiệp thì anh có lời khuyên nào không?
Doanh nghiệp thì mình không dám nói nhưng mình chỉ nói người dùng thôi, người dùng thường so sánh BI với Excel. Excel chính xác là công cụ làm report rất mạnh, không thể từ chối điểm đó luôn, nhưng mà sẽ liên quan tới chuyện security thì Excel rất khó để quản lý cái đó. Họ có thể đem cái file đi bất kỳ đâu cũng được, 1 số doanh nghiệp cứ dùng Excel thì về sau cái phần linked in data thì mình sẽ khó kiểm soát hơn, hoặc là nó sẽ tập trung vào 1 số người.
Mình có 1 số người quen làm trong lĩnh vực ngân hàng và bố trí excel mà như chạy đua vũ trang vậy, họ làm 1 cái file excel rất là bự, hoặc họ sử dụng máy 16GB không được họ dùng máy 32GB rồi tới 64GB, máy laptop cá nhân, mà trong khi những cái trường hợp đó mình chỉ lưu trữ trong database là có thể hoàn toàn query được hết data đó ra, mình không cần phải bố trí 1 file excel rất bự và tốn thời gian như vậy.
Khi thiết kế Dashboard nên lựa chọn những nguồn tham khảo nào? Anh hay gặp những vấn đề gì khi thiết kế Dashboard?
Đầu tiên là về UI, khi mà thiết kế Dashboard đưa cho người sử dụng người ta lúc nào cũng nói là phải đẹp trước đã, chứ không quan tâm tới phần thông tin mình cung cấp cho họ và đặc biệt là dân kỹ thuật mình làm thiết kế luôn xấu. Tức là các bạn kỹ thuật thiết kế màu sắc bạn không quan tâm tới, ý nghĩa của chart họ cũng không quan tâm tới, thì đó chính là điểm yếu của các bạn kỹ thuật, thiếu phần nghiên cứu về các màu sắc.
Xem thêm UX là gì? UX Designer thì làm những gì?
Cái phần thứ 2 là business user có quá nhiều điều muốn nói trên một dashboard. Mình có làm tư vấn cho 1 công ty bảo hiểm, họ có rất nhiều thông tin muốn đưa lên đầy đủ nhưng mà trên cái dashboard là 1 màn hình để cho người ta nhìn nhanh thì đâu thể cung cấp đủ hết thông tin. Lúc này mình có khoảng 20 câu hỏi, mình sẽ hỏi là user nào sử dụng, tần suất sử dụng ra sao, kích thước màn hình ra sao, thông tin nào quan trọng nhất, thông tin nào đi kèm theo đó. Lúc đầu có 20 mấy thông tin, đánh số thứ tự 1-2-3-4… sau đó mình lựa chọn thông tin để đưa lên màn hình này thì chọn cái nào, và những thông tin liên quan sẽ nhảy qua 1 trang kế tiếp. Mình có nguyên cái luồng gọi là navigation để cho người ta có tư duy đi phân tích, chứ không phải nguyên cái màn hình nhìn tất cả, rất là khó. Do não người nhìn vào cái dashboard không thể nào nhớ hết được tất cả các chỉ số. Thông tin đó mình đọc và idol trong cái quyển sách của ông Stephen Few – Dashboard Design hoặc Show Me the Numbers, các bạn có thể tìm trên Amazon.
Xin cảm ơn những chia sẻ của anh Phan Nguyễn Minh Trường, hy vọng bài viết này đã cung cấp những định nghĩa BI là gì một cách đơn giản và sát với thực tế nhất. Các bạn mong chờ những chia sẻ về những thuật ngữ công nghê nào ở các số sắp tới, hãy cho TopDev biết nhé!
Xem thêm các việc làm mảng it tại hấp dẫn tại TopDev
Trong ngành Nhân sự, việc thu hút và giữ chân nhân tài là quan tâm hàng đầu đối với các nhà tuyển dụng. Để tối ưu hóa mục tiêu tuyển dụng, nhiều doanh nghiệp đã phối hợp chặt chẽ giữa yếu tố về không gian và trên hết chính là sự hợp tác giữa nhân sự (HR) và công nghệ (IT).
Không ai nghĩ rằng sự hợp tác ấy lại tạo ra một lực lượng mạnh mẽ như vậy. Việc kết hợp ngẫu nhiên nhưng nhìn dưới góc độ của bối cảnh thời đại, HR & IT như một thỏi nam châm xích lại gần nhau, từ đó tạo ra một đội ngũ lãnh đạo vững mạnh với những sáng kiến, hành động và các chiến lược nhân sự cụ thể nhất.
Trên hết, nhận thức và nắm bắt chính xác về thị trường nhân sự để có thể thiết lập một chiến lược thu hút, giữ chân và phát triển nhân tài là một điều không hề đơn giản. Đó không chỉ đơn thuần là câu chuyện về việc lên kế hoạch tuyển dụng, tạo ra các gói và lợi ích cạnh tranh từ phúc lợi,… mà còn là về các chương trình đào tạo song song, hướng dẫn và bổ trợ kiến thức giúp tạo động lực và duy trì tính ổn định về sự đồng hành của các nhân viên hiện tại.


Nếu nói đến một sự hợp tác hoàn hảo trong “cuộc chơi” về tuyển dụng nhân sự, ngoài HR và IT, chúng ta cần xem xét đến yếu tố không gian chi phối đến sự kết hợp đó. Yếu tố không gian được xem là phương tiện để tối ưu hóa danh mục đầu tư vào kế hoạch bất động sản của doanh nghiệp. Điều này hiểu đơn giản là việc phân bổ các trang thiết bị, cải thiện và nâng cao thiết kế không gian làm việc. Chính những điều này cũng góp phần tạo nên cái gọi là môi trường văn hóa doanh nghiệp – một yếu tố quan trọng được nhân viên cân nhắc xem xét trước khi bắt đầu lựa chọn đồng hành lâu dài.
Mỗi thành phần đều có những đặc trưng riêng biệt. HR cũng không ngoại lệ. Chính cái tên HR đã cho thấy một bản mô tả chi tiết về những công việc cần làm, nên làm và sẽ làm. HR là yếu tố cơ sở tạo ra các lõi giá trị cần xem xét như tiêu chí về việc xây dựng nguồn lực nhân sự tiềm năng, đào tạo và phát triển con người, thiết lập và mở rộng nguồn tuyển chọn nhân sự,… Và tất nhiên việc thu hút và giữ chân nhân tài là hai yếu tố nhỏ chịu ảnh hưởng từ việc đào tạo và phát triển con người trong ngành nhân sự.


Nhóm công nghệ thông tin thường tập trung vào việc làm thế nào để đảm bảo nhân viên được làm việc trong một môi trường đầy đủ các thiết bị, phần mềm từ chuyên môn cho đến hỗ trợ. Đồng thời, công nghệ chính là yếu tố dẫn dắt con người xử lý các yêu cầu bảo trì, khắc phục các sự cố và đảm bảo rằng công nghệ của công ty đang được vận hành một cách hiệu quả.
Đây là điều mà các nhà tuyển dụng nhân sự đang tiến hành thực hiện. Mặc dù mỗi bộ phận có chức năng và chuyên môn riêng, nhưng họ liên tục hỗ trợ nhau để làm thế nào tuyển dụng được một nguồn lực nhân sự hiệu quả.
Nếu yếu tố văn hóa cho phép tạo ra một không gian làm việc giúp nâng cao giá trị văn hóa công ty theo chiều hướng tích cực thì sự kết hợp giữa HR và IT chịu trách nhiệm cung cấp cái nhìn sâu sắc giúp nhân viên định hình về những gì họ cần phải làm.
Ví dụ, yếu tố không gian quyết định việc nhận viên đồng ý lựa chọn đồng hành cùng công ty. Lúc này, sự kết hợp giữa Nhân sự và IT cho phép họ nhận thấy rõ hơn điều gì mình cần làm. IT giúp hỗ trợ các đầu công việc; mỗi công cụ, những chương trình về công nghệ sẽ được phân chia tương ứng với từng loại công việc nhân sự khác nhau. Điều đó giúp họ xác định rõ công việc mà mình được giao phó.


Ngoài ra, khi nhân viên đánh giá về khả năng đồng hành cùng doanh nghiệp, họ cũng dựa vào khả năng kết hợp giữa các ứng dụng công nghệ vào các hoạt động nhân sự. Ví dụ như bạn cần phải hiểu các yêu cầu về không gian để truy cập cáp hoặc Wi-Fi. Công nghệ có thể giúp bạn giải quyết vấn đề thay đổi của lực lượng lao động: Có chuyển từ máy tính để bàn sang máy tính xách tay không? Cần các thiết bị di động mới hoặc khác nhau? Đây đều là mối quan tâm của nhân viên.
Liệu bạn sẽ nghĩ rằng có bao nhiêu nhân viên thường xuyên bị thất vọng bởi những hạn chế về công nghệ tại tổ chức của mình? Dịch vụ bị ngừng hoạt động dẫn đến tình trạng làm chậm hoặc trì hoãn hoàn toàn công việc; phần mềm hoạt động bị lỗi, phải sửa thậm chí phải cập nhất nhiều lần nhưng vẫn không hiệu quả.
Hệ quả là, ảnh hưởng đến tiến độ thực hiện, tác động xấu đến sự phát triển lâu dài của tổ chức. Vì vậy, sẽ không quá khó hiểu để nói rằng HR và IT có thể giúp nâng cao những trải nghiệm của nhân viên. Với sự hiểu biết đầy đủ về các thiết bị công nghệ mà công ty bạn cung cấp, HR có thể hỗ trợ những chương trình, khóa học đào tạo phù hợp để nhân viên có thể sử dụng công nghệ đó, giúp phát huy tối đa tiềm năng trong công việc của mình.
Tóm lại, cả 3 yếu tố về không gian, HR và IT đều có những ý nghĩa nhất định. Chúng là sự kết hợp hoàn hảo giữa không gian văn hóa, tính chất vật lý, xã hội nảy sinh từ yếu tố nhân sự và cả khả năng thích với kỹ thuật số. Hơn hết, cả ba đã góp phần xây dựng nên cái gọi là văn hóa của công ty, những hoạch định cụ thể về việc phát triển chiến lược nhân sự đồng thời thực hiện các mục tiêu thu hút, đào tạo và giữ chân các nhân tài.
Có thể bạn quan tâm:
Xem thêm Việc làm TOP IT Jobs trên TopDev


Ngoài 3 thành phần đã được chỉ ra trong ảnh thì còn một thành phần cực kỳ quan trọng nữa đó là một checkbox (đã được ẩn đi), checkbox có tác dụng xác định trạng thái của cái Switch kia.
Các thẻ trong HTML mà chúng ta cần:
– Cấu trúc HTML:
<html> <label class="container"> <input type="checkbox"> <span class="background"></span> <span class="mask"></span> </label> </html>
– Code CSS cho thành phần “Container”:
.container { display: block; /* Xác định kiểu hiển thị có dạng là block */ position: relative; /* Xác định vị trí của phần tử là tuyệt đối */ width: 55px; height: 30px; margin: 50px auto; /* Phần tử cách lề trên 50px và căn giữa 2 bên */ }
Giải thích code: display: block; vì thẻ label là một thẻ có kiểu hiển thị là inline nên không thể sử dụng width, height để xét kích thước cho phần tử vì thế chúng ta cần chuyển kiểu hiển thị của nó sang block để có thể xét kích thước cho nó.
– Code CSS cho thẻ <input>:
.container > input[type = checkbox] { display: none; }
Giải thích code: container > input[type = checkbox] truy cập tới thẻ input nằm trong container có type là checkbox sau đó tắt hiển thị của cái input này (display: none;).
– Code CSS cho thành phần “Background”:
.background { display: block; position: absolute; /* Xác định vị trí của phần tử là tuyệt đối so với phần tử bao ngoài */ width: 100%; height: 100%; background-color: white; border-radius: 30px; /* Xác định độ bo cong góc của phần tử */ transition: 0.25s; /* Xác khoảng thời gian để phần tử biến đổi trạng thái */ border: 2px solid #eeeeee; /* Xác định đồ dầy viền là 2px, có kiểu nét liền và có màu #eeeeee*/ }
Giải thích code:
– Code CSS cho thành phần “Mask”:
.mask { display: block; position: absolute; width: 30px; height: 30px; background-color: white; box-shadow: 1px 1px 3px silver; border-radius: 50%; /* Bo cong các góc để phần từ chuyển từ hình vuông sang hình tròn */ left: 2px; /* Cách lề trái của phần tử container 2px */ top: 2px; /* Cách lề trên của phần tử container 2px */ transition: 0.25s; cursor: pointer; /* Xác định kiểu hiển thị của con trỏ chuột khi rê con trỏ chuột vào phần tử là pointer */ }
Giải thích code: cursor: pointer; khi chúng ta rê chuột vào phần từ thì kiểu hiển thị của con trỏ chuột sẽ chuyển sang dạng bàn tay giống như khi chúng ta rê chuột vào một đường link vậy.
– Code CSS cho phần sự kiện On và Off switch:
.container > input[ type = checkbox ]:checked + .background { background-color: #4cd964; border-color: #4cd964; }
Giải thích code: Nếu như checkbox được chọn (checked) thì phần tử nằm ngay sau nó có tên class là “background” (ở đây là phần tử background) sẽ được cập nhật các thuộc tính trong ngoặc nhọn vậy nên phần tử background sẽ được cập nhật lại background-color và border-color và khi checkbox không được chọn nữa thì các giá trị của các thuộc tính của background sẽ quay lại giá trị ban đầu.
.container > input[ type = checkbox ]:checked ~ .mask { left: 27px; }
Giải thích code: Tương tự câu trên chỉ khác là câu lệnh selector sẽ thay dấu + thành dấu ~, dấu + để chọn phần tử ngay sau còn dấu ~ sẽ chọn tất cả các phần tử nằm sau checkbox có tên class là “mask”.
Trên đây là phần code, để có thể xem được kết quả các bạn có thể vào đây để xem nhé.
Bài viết gốc được đăng tải tại laptrinhbasic
Có thể bạn quan tâm:
Xem thêm các IT Jobs Developer hấp dẫn tại TopDev
Bài viết được sự cho phép của tác giả Lưu Bình An
Cùng luận bàn những vấn đề liên quan đến time zone
Như Việt Nam chúng ta thì giá trị time zone chỉ có một GMT+7, với những nước to bự như Mỹ, Canada, Nga thì có phải tới vài ba cái time zone trong cùng một nước ( ko hiểu sao Trung Quốc thì chỉ có 1 giá trị Time zone, nên nhiều khu vực ở Trung Quốc mặt trời mọc lúc 10 AM)
GMT (Greenwich Mean Time) là thời gian tính theo cái đồng hồ Royal Observatory ở Greenwich, UK
UTC là một hệ thống tính toán thời gian quốc tế hơn, giá trị chuẩn xác hơn và được sử dụng rộng rãi hơn trong lập trình.
Offset
Giá trị +09:00 trong UTC+09:00 nghĩa là giờ địa phương đang trước mốc giờ chuẩn UTC 9 tiếng, khoảng khác biệt giữa giờ địa phương và giờ lấy làm mốc đó gọi là offset.
Một vài nước thích đặt tên time zone của mình theo tên riêng luôn, như Hàn Quốc thì nó là KST = UTC+09:00, giá trị time zone này cũng là giá trị của Nhật, Indo, và vài nước khác.
Giá trị offset lại ko phải căn cứ theo giờ, mà có thể chứa cả phút nữa, như Bắc Hàn thì dùng +08:30, Úc +08:45, +09:30 một số vùng
Đôi khi chúng ta hay dùng time zone và offset mang ý nghĩa tương tự nhau, như vậy thì chưa chuẩn xác. Lý do:
Khái niệm này sẽ không gặp ở nhiều nước, đa phần các nước ở châu u sẽ dùng đến thuật ngữ “Summer time” này, nó có tên khoa học khác là Daylight Saving Time (DST) nghĩa là trong mùa hè thời gian nó sẽ đi trước một tiếng so với giờ chuẩn
Lấy một ví dụ, California USA dùng PST ( Pacific Standard Time) trong mùa đông và PDT (Pacific Daylight Time, UTC-07:00) trong mùa hè. Những khu vực sử dụng 2 time zone như vậy gọi là Pacific Time (PT)
Câu hỏi tiếp theo là như vậy căn cứ vào đâu để tính mùa hè và mùa đông bắt đầu/kết thúc. Phủ phàng là giá trị ngày DST ở các nước khác nhau là khác nhau và vào các năm khác nhau cũng khác nhau nốt. Như ở Canada và Mỹ, DST tính từ 2:00AM ngày chủ nhật đầu tiên của tháng 4 cho tới 12:00AM ngày chủ nhật cuối cùng tháng 10 cho tới năm 2006, nhưng sang năm 2007, thì nó từ 2:00AM ngày chủ nhật thứ 2 của tháng 3 đến 2:00AM ngày chủ nhật đầu tiên tháng 11
Nếu bạn thấy như vậy đã đủ phức tạp, thì bạn chưa biết gì đâu, Time zone nó còn phụ thuộc vào cả tình hình kinh tế, chính trị của một nước. Cụ thể năm 2007, tổng thống George Bush ký thỏa thuận năng lượng hồi năm 2005, làm giá trị DST này thay đổi trong năm 2007.
Vì quá rắc rối và phức tạp, Nga và Hy Lạp đã ko dùng luôn DST từ năm 2011
Trước đây Samoa sử dụng UTC-10:00, nhưng sau này nó chuyển sang UTC+14:00 để cắt giảm các thương vụ thất bại với Úc và New Zealand vì sự khác nhau về time zone. Vụ này lên báo toàn thế giới năm 2011, vì nó mất đi hẳn một ngày 30 tháng 12 để điều chỉnh time zone
Bây giờ hình dung bạn làm một cái app để lên lịch công việc, bạn lấy giá trị thời điểm user. Chọn ở phía client truyền xuống server rồi lưu lại giá trị đó, sau đó giá trị này được hiển thị lên phía client
Chuyện sẽ ra sao nếu client truy xuất từ những time zone khác nhau. Thí dụ lúc tạo lịch ở Việt Nam, nhưng sau đó nó đi công tác ở Mỹ rồi mở lên xem, giá trị lưu ở phía server phải là giá trị cố định và ko phụ thuộc time zone. Như vậy client chỉ cần làm việc là hiển thị giá trị đó đúng với time zone hiện tại.
Ngoài ra, lúc user tạo một mốc thời gian, chúng ta cũng chuyển nó qua đơn vị Unix time theo chuẩn ISO-8601 để chứa luôn thông tin offset 2017–03–10T11:30:00+09:00. Cái chúng ta làm đó thuật ngữ chuyên ngành hay dùng 2 từ để mô tả là parsing và formatting
Trong native javascript, chúng ta có đối tượng Date để làm việc với kiểu date, nhưng chắc không dev nào chịu xài đâu, vì nó có rất nhiều vấn đề, nên đa phần đều dùng thêm 1 thư viện bổ sung, đọc thêm bài Vì sao quần hùng kéo nhau không xài moment.js nữa
Bài viết gốc được đăng tải tại VuiLapTrinh
Có thể bạn quan tâm:
Xem thêm các tuyển dụng IT mới nhất hấp dẫn tại TopDev
Bài viết đã được sự cho phép của tác giả Huy Trần
Trước khi bắt đầu: Nếu vì lý do gì đó mà bạn quyết định không đọc bài viết này vì bạn đang xài VSCode và thấy nó đủ xịn với bạn rồi, thì hãy suy nghĩ lại, đọc bài này, và tải về phiên bản Vim mình đã build. Nó không chỉ có mọi thứ hay ho mà VSCode có, mà còn có nhiều thứ khác xịn hơn mà VSCode không hề có.
Neovim từ phiên bản 0.4 có một chức năng cực kì hay ho đó là floating windows, giúp hiển thị một buffer ở bất kì vị trí nào trên màn hình. Nên nhớ là chúng ta đang nói đến Neovim, một editor hoạt động trên terminal, nơi mà mọi thứ chỉ là text và không hề có các khái niệm về giao diện đồ họa.
Sau khi chức năng này được release thì cộng đồng Neovim đã adopt nó khá nhanh, rất nhiều plugin áp dụng nó khá hiệu quả ví dụ như coc.nvim hay denite.nvim.
Trong bài viết này, chúng ta sẽ cùng tìm hiểu về floating window thông qua việc build một chức năng giúp cho Neovim có thể mở nhanh một cửa sổ terminal emulator, nằm floating trên màn hình. Mình thường dùng chức năng này khi cần thực hiện nhanh một thao tác nào đó như tạo git branch, push hoặc pull code mà lười xài Tmux.


Neovim đã có sẵn terminal emulator built in, đó là lệnh :terminal, khi chạy lệnh này, cửa sổ hiện tại sẽ được thay thế bằng một terminal buffer. Vậy, ý tưởng sẽ là: Tạo một cửa sổ mới, làm cho nó float ở giữa màn hình và chạy lệnh :terminal trong đó.
Theo như document về floating windows để tạo một floating window, chúng ta cần hai thứ: 1) một buffer và 2) gọi hàm nvim_open_win() trên buffer đó.
Để tạo mới một buffer, ta có thể dùng hàm nvim_create_buf(). Kết hợp hai hàm này với nhau như thế này:
let buf = nvim_create_buf(v:false, v:true) let opts = { \ 'relative': 'cursor', \ 'width': 10, 'height': 2, \ 'col': 0, 'row': 1, \ 'anchor': 'NW', \ 'style': 'minimal' \ } let win = nvim_open_win(buf, 0, opts)
Nói qua về đối tượng opts, đây là các thông số thiết lập cho cửa sổ sẽ được tạo, có mấy thông số cần nói tới như là:
relative: cho biết cửa sổ mới sẽ có tọa độ dựa trên đối tượng nào, nếu là editor thì tọa độ sẽ dựa trên toàn bộ màn hình Vim, là win thì tọa độ sẽ dựa trên split window hiện hành, là cursor thì tọa độ sẽ dựa trên vị trí con trỏ hiện tại (dùng trong trường hợp làm autocomplete chẳng hạn).style: hiện chỉ nhận 1 giá trị là minimal, nếu truyền giá trị này thì các thành phần như line number, cursor line,… sẽ được ẩn đi hết.width, height chắc khỏi cần nói tới.col và row là để chỉ định tọa độ ban đầu của cửa sổ.Cả hai hàm nvim_create_buf() và nvim_open_win() đều trả về id của buffer / floating window vừa tạo ra, chúng ta sẽ dùng các id này khi cần thực hiện các thao tác thiết lập khác.
Như vậy, chúng ta đã biết cần phải sử dụng những hàm nào trong API của Neovim để có thể implement chức năng floating terminal. Cụ thể các bước cần thực hiện là:
:terminalNgoài ra, chúng ta muốn cửa sổ được tạo ra phải nằm chính giữa màn hình, trong trường hợp này, Neovim có hai biến &lines và &columns cho chúng ta biết kích thước của toàn bộ màn hình Neovim là bao nhiêu, để có thể tính toán ra các giá trị width, height, row và col thích hợp.


Mặc định, sau khi khởi tạo terminal trong một buffer, thì buffer đó vẫn còn trong chế độ Normal Mode, để tiện hơn chúng ta có thể dùng lệnh startinsert, đưa buffer đó vào chế độ Insert Mode luôn.
Implement như sau (chắc không nói thì các bạn cũng biết là chúng ta đang gõ vào file init.vim):
function! OpenFloatTerm() let height = float2nr((&lines - 2) / 1.5) let row = float2nr((&lines - height) / 2) let width = float2nr(&columns / 1.5) let col = float2nr((&columns - width) / 2) let opts = { \ 'relative': 'editor', \ 'row': row, \ 'col': col, \ 'width': width, \ 'height': height, \ 'style': 'minimal' \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) terminal startinsert endfunction
Xong rồi, giờ reload Neovim và chạy thử, kết quả sẽ như hình:
:so % | call OpenFloatTerm()


Trông cũng xịn phết! Nhưng mà hơi xấu một tí.
Hiện tại thì Neovim chưa hỗ trợ các thành phần như margin, padding hay border cho floating windows, nên nhìn cái cửa sổ terminal hiện lên chưa đã con mắt cho lắm.
Trong phần tiếp theo, chúng ta sẽ cùng tìm cách fix.
Có một trick, hơi hacky một tí để giải quyết vấn đề padding đó là tạo một cửa sổ to hơn nằm bên dưới cửa sổ terminal hiện tại, trông như thế này:


Lưu ý, vì Neovim là môi trường text mode, một ô trên màn hình sẽ là một hình chữ nhật đứng, có tỉ lệ gần như là 1:2, nên việc tính lại tọa độ cũng như kích thước của cửa sổ làm border cũng sẽ được thực hiện với tỉ lệ 1:2.
Tọa độ của cửa sổ border sẽ nằm về phía trên và bên trái của cửa sổ terminal, tương tự kích thước của cửa sổ border cũng sẽ dài và cao hơn cửa sổ terminal:
column border=column main−2row border=row main−1width border=width main+4height border=height main+2column border=column main−2row border=row main−1width border=width main+4height border=height main+2
Hàm OpenFloatTerm() bây giờ sẽ có 2 bước:
function! OpenFloatTerm() let height = float2nr((&lines - 2) / 1.5) let row = float2nr((&lines - height) / 2) let width = float2nr(&columns / 1.5) let col = float2nr((&columns - width) / 2) " Border Window let border_opts = { \ 'relative': 'editor', \ 'row': row - 1, \ 'col': col - 2, \ 'width': width + 4, \ 'height': height + 2, \ 'style': 'minimal' \ } let border_buf = nvim_create_buf(v:false, v:true) let border_win = nvim_open_win(border_buf, v:true, border_opts) " Main Window let opts = { \ 'relative': 'editor', \ 'row': row, \ 'col': col, \ 'width': width, \ 'height': height, \ 'style': 'minimal' \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) terminal startinsert endfunction
Giờ chạy thử xem:












Trông có vẻ thuận con mắt hơn tí rồi. Nhưng mà chúng ta lại gặp bug! Khi đóng cửa sổ terminal thì cửa sổ border nó vẫn còn nằm yên không chịu biến mất.
Nguyên nhân thì rõ ràng, chúng ta chỉ tương tác với cửa sổ terminal mà không làm gì cửa sổ border hết. Để giải quyết vấn đề này, chúng ta có hàm nvim_close_win(), dùng để đóng một cửa sổ bất kì, ta có thể gọi hàm này khi cửa sổ terminal bị đóng.
Lại tra tài liệu, chúng ta sẽ thấy sự kiện TermClose được gọi khi chúng ta rời khỏi chế độ Terminal. Để bắt sự kiện này, ta dùng lệnh autocmd, như thế này:
autocmd TermClose * ++once :q | call nvim_win_close(<window-id>, v:true)
Tham số * ở đây có nghĩa là lệnh áp dụng cho mọi buffer, tham số ++once sẽ làm cho lệnh này chỉ thực thi 1 lần. Đồng thời, khi terminal bị tắt, Neovim sẽ không đóng buffer chứa terminal đó đi, mà hiện dòng chữ [Process exited 0], chúng ta phải gửi thêm lệnh :q để đóng nó.
Đây là implementation hoàn chỉnh:
function! OpenFloatTerm() let height = float2nr((&lines - 2) / 1.5) let row = float2nr((&lines - height) / 2) let width = float2nr(&columns / 1.5) let col = float2nr((&columns - width) / 2) " Border Window let border_opts = { \ 'relative': 'editor', \ 'row': row - 1, \ 'col': col - 2, \ 'width': width + 4, \ 'height': height + 2, \ 'style': 'minimal' \ } let border_buf = nvim_create_buf(v:false, v:true) let s:border_win = nvim_open_win(border_buf, v:true, border_opts) " Main Window let opts = { \ 'relative': 'editor', \ 'row': row, \ 'col': col, \ 'width': width, \ 'height': height, \ 'style': 'minimal' \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) terminal startinsert " Hook up TermClose event to close both terminal and border windows autocmd TermClose * ++once :q | call nvim_win_close(s:border_win, v:true) endfunction
Và đây là thành phẩm:


Hy vọng qua bài viết này, các bạn sẽ hiểu được phần nào chức năng Floating Windows của Neovim, cũng như những ứng dụng mà nó mang lại. Từ đầu tới giờ viết dông dài vậy thôi chứ nếu bạn chỉ xài Vim như là một user bình thường thì không cần đọc bài này đâu.
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 IT Jobs for Developer hấp dẫn tại TopDev
Trước đây khi nhắc đến thư viện xử lý ngày tháng, là trong đầu mọi developer frontend sẽ nghĩ ngay tới Moment.js, tuy nhiên dạo gần đây, đâu đâu cũng nghe cũng thấy đến các bài viết khuyên chúng ta bỏ ngay moment.js hoặc ít nhất là xài một cách cẩn trọng hơn.
Thằng Date object build sẵn của javascript thì ko đủ xài. Sớm hay muộn chúng ta cùng cần đến một thư viện thứ 3 để làm việc với ngày tháng, và lựa chọn hiển nhiên trước đây là moment.js. Một thư viện tất cả trong một, giải quyết tuốt tuồn tật các vấn đề liên quan đến ngày tháng.
Vậy tại sao bây giờ người ta chê nó?
Trong quá trình thực hiện optimize cho dự án, tác giả bài này (ko phải mình nhé) đã phát hiện ra rằng, phần lớn những chổ tắt nghẽn là ở chỗ parsing ngày chuẩn ISO8601 từ database, cụ thể là hàm moment(ISO8601_DATE_HERE), khá là sốc với kết quả này, vì ko dùng bất cứ một định dạng đặc biệt nào, một input chuẩn ISO bình thường, nếu mà dùng moment(new Date(ISO8601_DATE_HERE)) thì nhanh hơn gấp 7 lần.
Thực hiện test và so sánh với một số thư viện khác


Moment.js tốn khoảng 9 giây để parse 100.000 giá trị ngày ISO8601, trong khi đó Day.js chỉ mất .5 giây, các API cung cấp khá giống nhau, tuy nhiên thằng Day.js khôn hơn, nó xác định giá trị z ở cuối string, nếu có nó sẽ gọi new Date(string). Trong khi Moment.js, Luxon và JS-Joda sử dụng một regex của từng thằng để làm.
Lưu ý không dùng Day.js hay Date-Fns nếu bạn cần hỗ trợ IE9, hy vọng là bạn không xui tới vậy, từ ES5 thì Date.parse mới làm việc tốt với ISO 8601
Kết quả parse EPOCH Time thì các thư viện cho kết quả tương đương, tuy nhiên nếu bạn là đứa nghiện tốc độ, khuyến nghị sử dụng Date-Fns
Về vấn đề format, các thư viện lại gần như ko cung cấp hàm nào cả, đa phần tụi nó sẽ dùng regex để thực hiện. Riêng thằng JS-Joda sử dụng một hàm trong đó nó ì các kiểu để kiểm tra, rồi charAt nên nhanh hơn một chút so với những thằng dùng regex
Các phép toán trên ngày tháng đúng là lằn xà ngoằn, moment.js làm khá tốt hơn hẳn Day.js và Luxon, tuy nhiên vô đối vấn là JS-Joda trên vụ này.
Kiểm tra 2 giá trị ngày có là bằng nhau tương đối phức tạp hơn so sánh 2 ngày có lớn hơn nhau, bởi vì chúng ta không thực hiện so sánh giá trị khoảng thời gian (timestamps) Mấy thư viện khác ngoài Luxon có vẻ ok, không rõ vì sao Luxon lại lấp vấp vụ này.


Moment.js dung lượng khoảng 232kB (zip lại thì cỡ 66 kB), mà theo Yoshihide Jimbo thì có thể cắt bớt chỉ còn 68 kB ( 23 kB zip) bằng cách loại bỏ locale.
JS-Joda chỉ nhẹ hơn Moment.js chút xíu, tuy nhiên do nó cũng là thư viện nặng vì phải chứa period và time zone, 2 thằng này dùng Moment.js bạn phải cài thêm dạng plugin
Mấy thằng còn lại như Luxon, Day.js, Date-Fns thì nhẹ khỏi nói, ít nhất cũng phải nhẹ hơn 22 lần so với moment.js
Nếu bạn đang dùng moment.js ở Backend thì ko sợ nhiều, chứ còn ở Frontend thì 1kb cũng có giá của nó.
Ví dụ bạn đang làm một cái app lịch hiển thị những sự kiện sắp diễn ra.
const startedAt = moment() const endedAt = startedAt.add(1, 'year') console.log(startedAt) // > 2020-02-09T13:39:07+01:00 console.log(endedAt) // > 2020-02-09T13:39:07+01:00
startedAt, endedAt đều là mutable (có thể thay đổi), rõ ràng chúng ta không muốn giá trị của startedAt bị thay đổi sau khi gọi hàm add
const init = moment() const add = init.add(1, 'year') const sub = init.subtract(10, 'months') const start = init.startOf('year') const end = init.endOf('year') const utc = init.utc() const local = init.local() const offset = init.utcOffset(480)
Tất cả đống biến này đều trỏ tới cùng 1 object. Giải quyết cũng đơn giản
const startedAt = moment() const endedAt = moment(startedAt).add(1, 'year')
Khi dùng Moment.js luôn nhớ dùng cách này để tạo một instance mới
Nếu giá trị input đẹp đẽ, sạch sẽ, mọi việc đều sẽ trót lọt (ko tính đến vụ mutation nhé). Tuy nhiên đời mà ai lại ko có lỗi lầm
Giờ chúng ta thử ví dụ, có object là. person { lastVisitedAt }
const person = { lastVisitedAt: '2017-11-11T00:00:00.000Z' } moment(person.lastVsitedAt).format() // > '2019-02-08T16:01:45+01:00'
Nếu bạn lỡ gõ nhầm tên property như vậy đi lastVsitedAt, thì moment(undefined) cũng không throw error luôn.
Giờ thử đưa mấy giá trị lạ lạ như sau vào moment()
moment().format() // > 2019-02-08T17:07:22+01:00 moment(undefined).format() // > 2019-02-08T17:07:22+01:00 moment(null).format() // > Invalid date moment({}).format() // > 2019-02-08T17:07:22+01:00 moment("").format() // > Invalid date moment([]).format() // > 2019-02-08T17:07:22+01:00 moment(NaN).format() // > Invalid date moment(0).format() // > 1970-01-01T01:00:00+01:00
Moment.js ko throw error mà chỉ trả về Invalid Date object
Khi gọi toISOString() nó lại lạ kỳ trả về null chứ ko phải chuỗi Invalid Date
moment().toISOString() // > 2019-02-08T16:14:10.835Z moment(undefined).toISOString() // > 2019-02-08T16:14:10.835Z moment(null).toISOString() // > null moment({}).toISOString() // > 2019-02-08T16:14:10.836Z moment("").toISOString() // > null moment([]).toISOString() // > 2019-02-08T16:14:10.836Z moment(NaN).toISOString() // > null moment(0).toISOString() // > 1970-01-01T00:00:00.000Z
Nói cách ngắn gọn, undefined không hợp lệ trong moment(), nhưng null thì ok. Bị lỗi ư, nó trả về một Invalid Date object, null hoặc custom object tuỳ vào nó vui hay buồn.
Bài viết gốc được đăng tải tại VuiLapTrinh
Có thể bạn quan tâm:
Xem thêm các việc làm JavaScript hấp dẫn tại TopDev
Những nhận định về thời gian làm việc, đồng hành và gắn bó với một tổ chức luôn là vấn đề mà nhiều nhân viên quan tâm. Đặc biệt là những “lính mới” vừa gia nhập chuyến hành trình nghề nghiệp.
Một câu hỏi lớn đặt ra là liệu bản thân mình sẽ gắn bó với công ty trong bao lâu. 1 năm, 2 năm hay nhiều hơn. Tất nhiên đó chỉ là những con số mang tính ước định. Cùng TopDev đi tìm lời giải đáp cho vấn đề này.
Mỗi cá nhân sẽ có những suy nghĩ riêng về các mốc thời gian tương ứng cho sự rời đi của mình. Đó có thể là chỉ là sự hình dung thời khoảng thời gian mà mỗi nhân viên có thể đồng hành và gắn bó cùng công ty. Song song đó là những phân tích, sự nhìn nhận chung mà bản thân nhân viên rút ra được để làm hài lòng “kịch bản” cho riêng mình.
![]()
![]()
Đây có thể là quyết định bất ngờ, nảy ra trong chớp nhoáng hoặc khi bạn phải trải qua quá nhiều áp lực công việc chăng?
Áp lực có thể đến từ khối lượng công việc, mức phúc lợi, môi trường làm việc, các mối quan hệ công sở,..tất tần tật mọi yếu tố đó đều có thể dễ khiến nhân viên nản chí. Điều này chứng tỏ họ là một cá thể “cả thèm chóng chán”, thiếu năng lực thích nghi và vì thế họ nhảy việc liên tục. Họ thiếu nghị lực và sự cố gắng cần có, vì thế họ sẽ khó thành công.
Chúng ta sẽ có hai khía cạnh cần xem xét. Trong trường hợp nếu bạn được đảm nhận nhiều vị trí khác nhau hoặc có sự thăng tiến riêng thì khả năng đồng hành và gắn bó sẽ cao hơn. Khi đến một giai đoạn không còn đủ niềm vui trong công việc, bạn buộc phải dừng lại và tìm kiếm những điều mới mẻ, phù hợp hơn với mình.
Còn ngược lại thì sao? Bạn sẽ tự nghi ngờ về khả năng, sự phù hợp của mình với công việc và doanh nghiệp mình đang đồng hành. Hàng tá câu hỏi sẽ xoay quanh bạn: Mình chưa đủ nỗ lực sao? Có lẽ mình không còn biết làm thế nào để phát triển bản thân cả?,..
Cho dù bạn rời đi, đó cũng là quyết định của bạn nhưng nhớ, đừng bao giờ để bản thân mình phải đến mức thật sự tuyệt vọng vì cuộc sống này còn nhiều thứ còn khắc nghiệt hơn.
Con số 10 nó không là gì khi đặt nó trong phạm trù toàn học. Tuy vậy, khi suy xét ngoài thực tế, 10 năm là một quá trình làm việc dài, đòi hỏi ở bạn nhiều sự kiên trì, đôi lúc phải đánh đổi nhiều thứ về thời gian, công sức, các mối quan hệ để có được một chỗ đứng, vị thế như hiện tại.


Và tất nhiên, chúng ta sẽ đề cập đến những người với bề dày kinh nghiệm thuộc hàng top, họ đã được có cơ hội thử sức và trải nghiệm với nhiều vị trí khác nhau từ thấp đến cao. Vậy liệu họ có nên chuyển công ty trong giai đoạn này? Có hoặc không tùy thuộc vào mỗi người.
Trên thực tế, họ là những người đã có chuyên môn vững chắc, nền tảng nghề nghiệp tốt nhưng cái họ mất đi chính là sự mạo hiểm và dấn thân – cái mà tuổi trẻ họ đã từng làm. Họ e ngại rằng khi qua một công ty khác với một thế hệ trẻ hơn, năng động hơn, tiếp cận với một lối văn hóa, môi trường làm việc khác họ sẽ khó thích nghi. Khoảng cách về tuổi tác và kinh nghiệm có thể sẽ làm họ shock và khó có thể trụ lại được.
Nếu tất cả các dấu hiệu xung quanh bạn đều chứng tỏ rằng bạn đã chọn sai công việc, thì việc lựa chọn đổi việc là điều đúng đắn và cần thiết phải diễn ra. Miễn là, khi nhảy việc có ý nghĩa thật sự với mục tiêu công việc tổng thể và dài hạn của bạn. Nếu được lựa chọn, bản thân chủ bài viết này sẽ chọn khoảng thời gian từ 1-2 năm để gắn bó và hợp tác, tất nhiên trước đó phải có 2 hoặc 3 tháng để trải nghiệm, tìm hiểu công ty thông qua quá trình thử việc.
Ngoài ra, việc nhìn nhận luôn luôn là điều cần phải lưu tâm, nếu mình nhận thấy cá nhân mình tạo được những giá trị và được tổ chức công nhận, mình sẽ tiếp tục gắn bó và lập kế hoạch hoạt động cho những năm tiếp theo.
Để có những quyết định chính xác trong vấn đề này, bạn có thể tìm những “lối tắt” cho riêng mình. Hãy đặt ra những câu hỏi:
Đây đều là những câu hỏi giả định nhưng chúng có vai trò quan trọng vì giúp bạn đánh giá được mức độ tự nhìn nhận về khả năng chịu áp lực trước các công việc, những đòi hỏi cần phải thích nghi khi quyết định bắt đầu trải nghiệm một công việc mới hoặc những lợi thế, triển vọng phát triển, thăng tiến khi bạn rời đi và gia nhập một “ngôi nhà mới”.
Chuyện nhảy việc đã không còn xa lạ trong môi trường làm việc hiện đại. Nhiều cơ hội luôn mở ra và chờ đón bạn nếu bạn có những quyết phù hợp. Hãy tự hỏi bản thân và đánh giá nhiều yếu tố xung quanh về sự đồng hành và gắn bó trước khi đi đến những quyết định nhảy việc.
Có thể bạn quan tâm:
Xem thêm Top Việc làm ngành cntt trên TopDev
Phía sau thành công của MoMo – Ví điện tử số 01 Việt Nam trên hành trình phát triển và mang đến người dùng các dịch vụ thanh toán đa tiện ích chính là dấu ấn của đội ngũ nhân lực đầy tài năng. Trong đó, nguồn nhân lực trẻ mảng công nghệ thông tin – sản phẩm được MoMo quan tâm, đầu tư phát triển như “át chủ bài” trước nhu cầu ngày càng cao của thị trường.
Chia sẻ về vai trò của nguồn nhân lực nói chung đối với sự phát triển không ngừng của MoMo những năm gần đây, bà Manisha Shah, Phó Tổng giám đốc cấp cao cho hay:
“MoMo là một tổ chức chuyển động rất nhanh. Với bốn giá trị cốt lõi gồm tinh thần đồng đội, đổi mới sáng tạo, học hỏi không ngừng và thực thi xuất sắc, chúng tôi tìm kiếm những nhân tố biết làm việc theo nhóm, mong muốn kiến tạo, có tài năng và đam mê hướng tới mục tiêu chung. Điều tiên quyết là bạn phải thoải mái với môi trường làm việc thay đổi liên tục để phát triển tại MoMo.” – Bà Manisha Shah, Phó Tổng giám đốc cấp cao tại MoMo chia sẻ.
Trong bối cảnh đến năm 2025, theo dự báo của Ngân hàng Nhà nước Việt Nam, tín dụng cá nhân sẽ chiếm khoảng 24% thị trường ứng dụng công nghệ trong dịch vụ tài chính (Fintech). Theo đó, nhu cầu tài chính cá nhân ở Việt Nam được cho là sẽ tiếp tục tăng trưởng khi cách mạng 4.0 bùng nổ mạnh mẽ. Như hệ quả tất yếu, “làn sóng công nghiệp 4.0” này đã mở ra nhiều cơ hội việc làm cho các bạn trẻ tài năng đam mê lĩnh vực công nghệ thông tin và phát triển sản phẩm ở các công ty Fintech. MoMo, ở vị thế Ví điện tử số 01 Việt Nam, vì vậy luôn chú trọng phát triển nguồn nhân lực trẻ, tài năng này.


“MoMo Talents 2020 – Future in your hands” hứa hẹn là bệ phóng phát triển sự nghiệp toàn diện cho các bạn trẻ đam mê công nghệ và phát triển sản phẩm.
Để đón đầu xu hướng tuyển dụng này, những năm qua, chương trình tuyển dụng MoMo Talents được MoMo đầu tư, tổ chức thường niên theo quy mô ngày càng lớn.


Thông tin chương trình MoMo Talents 2020 thu hút nhiều sự quan tâm, tìm hiểu của các bạn sinh viên trẻ, tài năng tại các job fair.
Nhìn lại không khí háo hức chào đón sự trở lại của MoMo Talents mùa thứ 4 lần này từ các bạn sinh viên trẻ, bạn Trần Thị Lạng – Tech Trainee của MoMo Talents 2019 cho hay:
“Việc tham gia MoMo Talents là quyết định lớn, có ý nghĩa quan trọng với sự nghiệp của mình khi còn là một sinh viên sắp ra trường. Chương trình đã cho mình rất nhiều trải nghiệm và cơ hội thú vị. Mình đã được tham gia vào quy trình làm việc chuyên nghiệp và cũng không kém phần ‘’thử thách” tại MoMo. Có thể nói, bản thân mình ngày càng học hỏi được nhiều thứ mới mẻ và phát triển bản thân nhiều hơn. Điều mình thích thích là team mình có những người rất giỏi, mọi người luôn luôn chia sẻ với nhau những vấn đề trong cả công việc và cuộc sống, qua đó có thể hiểu nhau hơn cũng như cùng nhau giải quyết những vấn đề một cách dễ dàng hơn.”


“Mình trưởng thành hơn nhiều cả kiến thức chuyên môn lẫn kinh nghiệm sống khi được các anh chị đi trước hướng dẫn, hỗ trợ” – Bạn Trần Thị Lạng – Tech Trainee MoMo Talents 2019 chia sẻ về môi trường làm việc tại MoMo.
Trong khi đó, bạn Nguyễn Phi Hùng, Tech Trainee MoMo Talents 2019, hiện đang là Data Engineer ở MoMo, nhắn gửi đến các thí sinh MoMo Talents 2020:
“Hãy tự tin đăng ký tham gia MoMo Talents 2020 bạn nhé. Chỉ cần bạn tự tin, không ngừng học hỏi và có tinh thần trách nhiệm với công việc, dưới sự hướng dẫn hỗ trợ nhiệt tình của các anh chị trong team, chắc chắn bạn sẽ trở thành một “phiên bản” tốt hơn khi tham gia chương trình MoMo Talents đó. Hy vọng sẽ sớm được gặp các bạn tại MoMo.”
Ngày 22/07 vừa qua, MoMo Talents 2020 đã chính thức mở đăng ký tại website: http://career.momo.vn/. Với nhiều đổi mới đầy hấp dẫn, mùa giải thứ 4 của MoMo Talents hứa hẹn sẽ mang đến cho các bạn sinh viên trẻ, tài năng nhiều trải nghiệm thú vị. Cánh cửa đến MoMo – Nơi làm việc tốt nhất châu Á 2020 đã mở cửa, đừng chần chờ nữa, đăng ký ngay bạn ơi!
Bài viết được sự cho phép của tác giả Huy Trần
Một phút dành cho việc tra từ điển liên quan đến Iterator:
Kể từ sau đây thì mình sẽ dùng những chữ này mà không dịch ra tiếng Việt nữa, lý do là dịch ra thì viết dài dòng, bài đã dài rồi, bớt được gì thì bớt lại chút.
Trong JavaScript, vòng lặp for...of có tác dụng iterate qua nội dung của các đối tượng iterable (iterable objects).
const text = "hello"; // String là một iterable object for (const c of text) { console.log(c); } // Output: "h" "e" "l" "l" "o"
Một đối tượng được coi là iterable nếu như nó thõa mãn iterable protocol, theo đó, nó phải được implement phương thức Iterator @@iterator, hay còn có thể ghi là Symbol.iterator, như này:
a["@@iterator"] = ... // hoặc a[Symbol.iterator] = ...
Hồi xưa các cụ phải xài "@@iterator" vì Symbol chưa được support rộng rãi, tuy nhiên đến bây giờ thì hầu như ai cũng đã hỗ trợ Symbol, tất nhiên là trừ IE ra.


Việc implement phương thức [Symbol.iterator] này phải trả về một object thỏa mãn iterator protocol.
const obj = ...; for (const o of obj) { } // không chạy được vì obj không iterable obj[Symbol.iterator] = () => { ... }; for (const o ob obj) { } // giờ thì đã iterable rồi
Một object thỏa mãn giao thức iterator protocol nếu nó có một hàm next(), hà này không nhận vào tham số nào, và trả về một kết quả có dạng:
next() { return { value: ..., done: false }; }
Giá trị của value sẽ là giá trị xuất hiện trong mỗi iteration. Vòng lặp sẽ tiếp tục cho đến khi kết quả trả về có done là true.
Chúng ta có thể dễ dàng tạo ra một object thỏa mãn cả hai giao thức iterable và iterator theo cách sau:
let obj = { next: function() { // ... }, [Symbol.iterator]: function() { return this; } };
Cú pháp như này thì rất ngắn gọn, trông rất ngầu, nhưng mà đọc vô sẽ khó hiểu hơn, nên ở các phần tiếp theo chúng ta sẽ không viết như này nữa, mà viết theo cách khác dễ hiểu hơn (cũng dễ reuse hơn).
Thêm tí, nếu không lặp bằng for...of, chúng ta cũng có thể lặp thủ công như với generator:
let iter; while (iter = iterator.next(), !iter.done) { // ... }
Có thể thấy, iterator là một công cụ giải quyết vấn đề khá là lợi hại, để hiểu rõ hơn, hãy cùng xem qua một vài ví dụ với nó.
Ví dụ: Tách chuỗi


Giả sử chúng ta muốn implement một hàm words() cho kiểu dữ liệu String trong JavaScript, theo đó, hàm này sẽ có nhiệm vụ tách chuỗi hiện tại thành một mảng chứa các từ trong chuỗi.
const text = "The quick brown fox jump over a lazy dog";
Đầu tiên, chúng ta cần phải tạo ra một iterator, đây sẽ là một class tên WordIterator, class này sẽ có constructor làm nhiệm vụ tách chuỗi hiện tại thành nhiều từ, bằng hàm String.prototype.split(). Cuối cùng, ta sẽ implement hàm next(), có nhiệm vụ từng bước trả về mỗi từ đã được tách cho đến khi không còn từ nào nữa thì kết thúc.
class WordIterator { constructor(data) { this.data = data.split(/\s/); this.index = -1; } next() { this.index++; if (this.index < this.data.length) { return { value: this.data[this.index], done: false } } return { done: true }; } }
Tiếp theo, chúng ta sẽ implement hàm words() cho kiểu String, trong hàm này, chúng ta sẽ implement phương thức [Symbol.iterator] cho chuỗi đang được xử lý.
String.prototype.words = function() { const iterable = this; iterable[Symbol.iterator] = () => new WordIterator(this); return iterable; };
Ở trên, chúng ta tạo một biến trung gian iterable và implement phương thức [Symbol.iterator] cho biến này thay vì implemen trực tiếp vào kiểu String, vì chúng ta không muốn thay đổi behavior mặc định của kiểu String.
Thế là xong, chạy thử:
for (let word of text.words()) { console.log(word); } // Output: // "The" "quick" "brown" "fox" "jump" "over" "a" "lazy" "dog"
Quá dễ, phải không nào?
Oh, và các bạn biết sao không? Trong cách implement trên, chúng ta đã bỏ qua một thực tế là, kiểu Array đã là một iterable object rồi, để rồi phức tạp hóa cái solution lên trên thực tế, chúng ta chỉ cần implement hàm words() như này:
String.prototype.words = function() { return this.split(/\s/); }
Ví dụ: Python’s range function
OK, giờ lấy ví dụ khác nhé.
Hẳn các bạn ai cũng đã từng dùng qua Python, hay cũng từng gặp hàm range() hay xrange() của Python. Nếu như các bạn không biết nó là gì, thì nói đơn giản, hàm này tạo ra Đây chỉ là một dạng đơn giản của hàm range(), trên thực tế hàm này còn có nhiều cách sử dụng khác nữa.một dãy số trong phạm vi của hai giá trị đầu vào, ví dụ range(5, 15) sẽ tạo ra dãy số [5, 6, 7,... 14].


Chúng ta sẽ mô phỏng hàm này trong JavaScript bằng iterator.
Hàm range() của chúng ta sẽ nhận vào hai tham số, from và to. Với mỗi lượt iterate của hàm next(), chúng ta sẽ tăng giá trị from lên một đơn vị cho tới khinào nó đụng giá trị to.
const range = (from, to) => { return { [Symbol.iterator]: function() { return this; }, next: function() { if (from < to) { from++; return { value: from - 1, done: false }; } return { done: true }; } } };
Ở đây chúng ta cũng sử dụng cú pháp implement kiểu rút gọn như đã nói ở phần trước chứ không cần tạo class, vì ở ví dụ này cũng không phức tạp gì mấy, và mục đích của chúng ta là sử dụng hàm range() luôn nên cũng không cần quan tâm đến chuyện reuse code làm gì.
Và đây là cách sử dụng:
for (const i of range(0, 100)) { console.log(i); }
Nếu để ý kĩ cách implement trên, có thể các bạn sẽ nhận ra là, hàm range() chỉ sinh ra giá trị tiếp theo chỉ khi nào nó được gọi, chứ không phải tạo sẵn ra luôn một dãy các số từ from tới to, đó cũng chính là đặc tính “laziness” của hàm xrange() trong Python.
Ví dụ: Lazy Evaluation
Call-by-need là một đặc điểm của Lazy Evaluation (đối lập với call-by-name, đặc tính chỉ các thanh niên nhanh nhẩu, chỉ cần gọi tên là xuất kích) – một khái niệm từ functional programming, giải thích một cách đơn giản không đầy đủ, thì đây là phương pháp xử lý mà khi ta có các biểu thức nối tiếp nhau, chỉ khi nào biểu thức phía sau cần sử dụng kết quả tính toán từ biểu thức phía trước, thì biểu thức trước mới được thực thi.


Giả sử, ta có một hàm evenNumbers() trả về một dãy các số chẵn bắt đầu từ 0, và ta muốn lấy ra n giá trị đầu tiên trong dãy số đó.
const list = evenNumbers();
console.log(list.slice(0, n));
Nếu
evenNumbers()là một hàm call-by-name, thì ngay từ sau câu khai báolist, hàm này sẽ được thực thi ngay, và vìevenNumbers()là một hàm không có điểm dừng, chương trình trên sẽ không bao giờ chạy được đến dòng lệnh thứ 2, và nó sẽ treo.Nếu
evenNumbers()là một hàm call-by-need, thì nó sẽ chưa được gọi chừng nào giá trị trả về của nó vẫn chưa cần thiết được sử dụng, và trong trường hợp này, nó chỉ được sử dụng sau khi chúng ta kết thúc câu lệnhslice(), lúc chúng ta in kết quả ra màn hình. Và mặc cho logic của hàmevenNumbers()chạy không có điểm dừng, vì nó là lazy, nên nó chỉ trả về một lượng dữ liệu vừa đủ dùng, trong trường hợp này là n giá trị mà thôi.Với iterator, ta có thể mô phỏng lại hoạt động của hàm
evenNumbers()call-by-need trong JavaScript kiểu như sau, tất nhiên là không hoàn toàn đúng theo mô tả ở trên:
const evenNumbers = () => { let index = 0; return { [Symbol.iterator]: function() { return this; }, next: function() { index+=2; return { value: index, done: false }; }, take: function(n) { let values = []; for (let i = 0; i < n; i++) { values.push(this.next().value); } return values; } } }; console.log(evenNumbers().take(5));
Có thể thấy, ta có thể viết theo cách mà người bình thường không ai điên gì mà làm, đó là code logic của hàm next() không cần có điểm dừng.
Để nói kĩ hơn về Lazy Evaluation, sẽ có một bài viết khác vào một ngày nào đó.
Mặc dù khá là hữu ích, nhưng iterator hiện nay vẫn còn một nhược điểm đó là không thể thực hiện các thao tác bất đồng bộ (asynchronous) được, ví dụ, bạn muốn thực hiện HTTP request trong mỗi iteration, hoặc bạn muốn implement một iterator làm nhiệm vụ đọc một file và trả về từng byte hoặc từng line của file đó. Giải pháp thay thế thì hiện đã có proposal, đó là Async Iteration, và nó đã ở stage 4.
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 JavaScript hấp dẫn tại TopDev
Để master React, điều đầu tiên cần nằm lòng là tất cả những gì React xây dựng điều xoay quanh component. Thế thì component là gì. Ví dụ tuyệt vời nhất là select HTML element, select có thể xem như một component được định nghĩa sẵn với kiểu hiển thị riêng của nó (màu xám, có label, nút tam giác nằm ở góc phải) và tự nó xử lý tác vụ đóng mở mấy cái option


Giờ tưởng tượng là chúng ta sẽ tự build ra một cái component tương tự như select với giao diện và event chúng ta tự kiểm soát


Đó là những gì React giúp chúng ta làm, xây dựng một đối tượng không chỉ output ra một HTML templete thông thường, chúng ta sẽ viết ra những function để control những event trên cái template đó
Để tạo ra một React component căn bản nhất
class MyComponent extends React.component {
render(){
return Hello World!;
}
}
Có thể thấy là với cách tạo ra một component như React thì javascript và HTML sống chung một nhà. Vũ khí bí mật của React để làm được chuyện “what-the-heck” đó là JSX language.
Ngày xưa, đi học được dạy phải tách biệt HTML ra một file và JS ra một file, thời gian sau này anh em làm frontend thấy làm gom như vậy làm thấy nhanh hơn, mà cũng không quá evil như mấy ông thầy dạy
class MyComponent extends React.component {
render(){
returnToday is: {new Data()};
}
}
Để ý cái cách ta chèn code javascript ở trong HTML bằng cách đưa nào vào bên trong dấu {}, đó là cách viết JSX
Tuyển dụng lập trình viên React lương cao
Bạn chắc chắn biết đến attribute href cho thẻ a , chưa biết? về lại w3com học nhé. Với một component của React những attribute như vậy được gọi là props . Props là cách mà các component tương tác lẫn nhau
class ParentComponent extends React.Component{
render(){
return <ChildComponent message="Hello World" />;
}
}
class ChildComponent extends React.Component{
render(){
return And then I said, "{this.props.message}";
}
}
Dữ liệu trong component có thể truyền từ cha xuống con và không có ngược lại
Đôi khi dữ liệu sẽ không phải được truyền từ cha xuống con, mà nó chỉ là một dữ liệu tạm thời nào đó, ví dụ như giá trị input của user chẳng hạn, lúc đó nó được gọi là state
Cho dễ hình dung, nếu xem cái bảng nam châm là một component thì props là nút gạt xóa, state là những gì viết trên bảng


Bên trong một component, state được quản lý bằng hàm setState thường được viết lòng trong một hàm xử lý sự kiện
class MyComponent extends React.Component {
handleClick = (e) => {
this.setState ({clicked: true});
}
render(){
return <a href="#" onClick={this.handleClick}> Click Me</a>;
}
}
Những hàm như render và setState là một phần của component API, ngoài ra nó còn một số hàm hữu ích khác nữa như constructor để khởi tạo state và kích hoạt các phương thức, một số hàm trigger trước khi component được load, sau khi load, sau khi unmounting. vâng vâng.
Thật ra việc master được React phần nhiều là master được việc lập trình và khái niệm để kiến trúc ra một component hơn là một loạt các API được hỗ trợ sẵn, vậy nên phần này kết thúc ở đây.
Mấy ví dụ trên, định nghĩa một component được khai báo dạng class
class MyComponent extends React.Component{
}
Giờ thì hãy quên cách viết này đi! Bây giờ ai cũng viết một component ở dạng function component
Một functional component là một function nhận một props object như tham số truyền vào và trả về một đống HTML lằn xà ngoằn. Y hệt như cách viết template kinh điển, khác biệt cơ bản là ở chổ mình có thể xài JavaScript bất cứ chổ nào khi cần
const myComponent = props => {
return Hello {props.name}, Today is {new Date()};
}
Viết cách này có một hậu quả là mình không thể access được phương thức của component, trên thực tế việc này không ảnh hưởng gì làm vì phần lớn trường hợp ta không dùng tới.
Và như vậy component này sẽ không có phương thức setState , không có state luôn, người ta còn gọi là stateless functional component.
Cách viết này rất là gọn gàng, phù hợp cho những trường component đơn giản, nên áp dụng khi có thể.
Bài viết gốc được đăng tải tại VuiLapTrinh
Có thể bạn quan tâm:
Xem thêm các việc làm công nghệ thông tin hấp dẫn tại TopDev
Chúng tôi thích thuê những người thông minh, chứ không thích người biết rõ về một kỹ thuật nào đó, nhưng lại thiếu sáng tạo, thiếu logic và thiếu biện chứng.
Dù là quan điểm nào đi nữa, nhưng phỏng vấn thì coding challenge vẫn là một phần quan trọng trong phỏng vấn.
Tuyển dụng Javascript lương cao cho bạn
Câu hỏi Javascript 1:
Chuỗi đối xứng là chuỗi khi đảo ký tự từ trái qua phải và từ phải qua trái không thay đổi, như chữ “racecar”, “anna”, “tenet”. (Film tenet không biết khi nào mới chiếu, nghe đâu hoãn dài hơi vì covid)
Yêu cầu, cho bạn một chuỗi, xác định nó phải là đối xứng không
isPalindrome('racecar') === true
isPalindrome('table') === false
Đáp án
const palindrome = str => {
// chuyển qua lowercase trước
str = str.toLowerCase()
// chuyển thành array, reverse rồi so sánh
return str === str.split('').reverse().join('')
}
Câu hỏi Javascript 2:
Yêu cầu: viết một function đáp ứng những chuyện sau
fizz nếu là bội số của 3fizzBuzz(5) // 1 // 2 // fizz // 4 // buzz
Để giải quyết bài toán này, chúng ta cần nhớ đến cách dùng % để biết được số dư của phép chia, trả về 0 là chia hết, ngược lại thì không chia hết
12 % 5 // 2 -> 12 không phải bội số của 5 12 % 3 // 0 -> 12 là bộ số của 3
Đáp án
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// kiểm tra xem có là bội số của cả 3 và 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // có phải là bội số của 3
else if(i % 3 === 0) {
console.log('fizz')
} // có phải là bội số của 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}
Yêu cầu: viết một function, params truyền vào 2 chuỗi, trả về true nếu 2 chuỗi này là dạng đảo của nhau và false cho trường hợp ngược lại.
2 chuỗi gọi là đảo nhau nếu số ký tự hoàn toàn giống nhau (không kể hoa thường), chỉ khác thứ tự.
anagram('finder', 'Friend') --> true
anagram('hello', 'bye') --> false
Đây là một cách làm
// hàm helper để build một object làm nơi lưu trữ
const buildCharObject = str => {
const charObj = {}
for(let char of str.replace(/[^\w]/g).toLowerCase()) {
// nếu object đã chứa giá trị đang loop qua
// tăng giá trị nó lên 1,
// ngược lại, thêm mới ký tự này vào object với giá trị = 1
charObj[char] = charObj[char] + 1 || 1
}
return charObj
}
// hàm chính
const anagram = (strA, strB) => {
// lưu giá trị của strA vào object
const aCharObject = buildCharObject(strA)
// lưu giá trị strB vào object
const bCharObject = buildCharObject(strB)
// so sánh độ dài giữa 2 object
if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
return false
}
// đã chắc chắn về length giống nhau
// kiểm tra tiếp số lượng các ký tự có giống nhau
for(let char in aCharObject) {
if(aCharObject[char] !== bCharObject[char]) {
return false
}
}
return true
}
Câu hỏi Javascript 3:
Nguyên âm: anh-ôm-em-ú-ì, a, o, e, u, i.
Viết một function nhận vào string, trả về số lượng nguyên âm có trong string
findVowels('hello') // --> 2
findVowels('why') // --> 0
Đáp án
const findVowels = str => {
let count = 0
const vowels = ['a', 'o', 'e', 'u', 'i']
for (var char = str.length - 1; i >= 0; i--) {
if (vowels.includes(char.toLowerCase())) {
count++
}
}
return count
}
Có thể dùng regular expression
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matches.length : 0
}
Câu hỏi Javascript 4:
Cái này kinh điển. Mọi dân lập trình đều đụng tới dãy số fibonacci, thật thiếu sót nếu không đề cập ở đây.
Fibonacci là dãy số, mà số bên phải = tổng 2 số đứng bên trái. Như thế này: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Yêu cầu: một function nhận params là n, trả về giá trị n trong dãy fibonacci
fibonacci(3) // --> 2
Đáp án
const fibonacci = num => {
const result = [0, 1]
for (let i = 2; i <= num; i++) {
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
return result[num]
}
hoặc dùng đệ quy
const fibonacci = num => {
// nếu là 1 hoặc 0
if (num < 2) {
return num
}
// từ 2 trở lên
return fibonacci(num-1) + fibonacci(num-2)
}
Chúc các bạn phỏng vấn vui vẻ!
Bài viết gốc được đăng tải tại VuiLapTrinh
Có thể bạn quan tâm:
Xem thêm các việc làm JavaScript job hấp dẫn tại TopDev
Có được 1 công việc lập trình đầu tiên luôn là mục tiêu hàng đầu của rất nhiều các bạn lập trình viên trẻ mới hành nghề, nhưng mình lại phát hiện ra rằng khá ít các lập trình viên muốn tiến bước xa hơn trên con đường sự nghiệp của họ.
Vì cũng vướng vào trường hợp tương tự, nên là mình đã lập nên hẳn 1 kế hoạch để định hướng sự nghiệp lập trình viên của mình. Trải qua 5 tháng ròng rã, mình đã tích lũy được mọi thứ cần thiết để có thể nhận được tới 3 lời đề nghị công việc tại vị trí lập trình viên mà phần lương bổng của nó còn gấp đôi lương hiện tại của mình. Thật sự đạt được điều này là không hề dễ dàng gì, nhưng rõ ràng là mình rất xứng đáng để nhận được nó.
Chắc hẳn các bạn cũng đang rất tò mò, và mình xin chia sẻ cách để biến nó thành hiện thực, từng bước một để bạn có thể làm theo.
Nhưng trước tiên vì đây là 1 bài viết khá chuyên sâu nên mình sẽ tóm tắt sơ lược các lời khuyên của mình.
1. Quyết định mục tiêu của bạn. Hãy tự hỏi kiểu công việc lập trình viên nào mà bạn muốn và khi nào thì bạn muốn công việc đó? Bạn có thể học được nhiều thứ trong 6 tháng học tập bán thời gian nếu bạn thực sự bỏ công cho nó.
2. Hãy tìm từ 10 tới 20 mô tả công việc hiện tại cho các công việc lập trình viên mà cuối cùng bạn muốn nhận. Tạo 1 danh sách về tất cả những yêu cầu và bao nhiêu lần mà mỗi thứ đưa ra.
3. Tìm từ 3 tới 5 kỹ năng chính thường được yêu cầu bởi các công việc đó, nhất là những cái mà bạn hiện chưa có.
4. Sử dụng các khóa học để tăng tốc độ việc bạn học 1 kỹ năng mới nhanh như thế nào. Các khóa có thể là 1 ý tưởng tuyệt vời vì chúng sẽ giúp bạn tiết kiệm thời gian và công sức.
5. Áp dụng vào công việc trước khi bạn đã học mọi thứ. Phỏng vấn tốt cũng là 1 kỹ năng bạn nên luyện tập.
6. Xây dựng các dự án với những gì bạn đã học được, đó cũng là cách tốt nhất để đảm bảo kỹ năng của bạn cứng rắn hơn.
7. Hãy nhận công việc mà bạn đã nỗ lực để có được.
Mình đã lên kế hoạch để du lịch vòng quanh Đông Nam Á khoản 3 – 6 tháng, và biết rằng mình muốn có 1 công việc tốt hơn khi mình trở về nhà. Công việc lập trình viên JavaScript với vai trò Junior của mình đã cho mình thấy được 3 thứ:
Với sự hiểu biết này, mình đặt mục tiêu cho nơi mà mình muốn đến khi mình kết thúc hành trình, và những gì mình cần để học để đạt được việc đó.
Mục tiêu của mình là trở thành 1 lập trình viên Mid-level full stack.
Để trở thành 1 lập trình viên Mid-level full stack mà mình muốn, và để tìm ra mình còn thiếu gì để cải thiện, mình đã nhìn qua hàng tá công việc mà cuối cùng mình thực sự sẽ muốn nhận.
Đầu tiên, mình thấy những gì công việc yêu cầu ở 1 ứng viên và những gì nhà tuyển dụng lập trình viên mong muốn. Mình đã lập 1 danh sách của tất cả các kĩ năng và rồi sắp xếp chúng theo thứ tự bằng cách xem chúng xuất hiện bao nhiêu lần trong những mô tả công việc lập trình viên.
Với danh sách này mình đã xem qua các kỹ năng có thứ hạng cao nhất mà mình chưa có. Bạn không cần phải có khả năng làm tất cả mọi thứ trong danh sách để có thể nhận được những không việc này. Trung bình người trúng tuyển chỉ có khoản 70 – 80% những gì trong danh sách yêu cầu cho 1 vai trò nhất định. Hầu hết mọi lúc, những thứ thực sự là ‘yếu tố thành bại’ chỉ nằm ở 1 vài điểm quan trọng. Chúng ta đang nhắm để nhận được cấp độ đó và rồi bất kỳ kỹ năng nào khác cũng chỉ là ‘bonus’.
Qua nghiên cứu này, mình đã lập 1 danh sách các thứ mà hầu hết các công việc mà mình đang tìm kiếm yêu cầu:
Quá trình này có thể thực sự được dùng cho bất ai trong bất kỳ con đường sự nghiệp nào. Nhưng nó sẽ thực sự hiệu quả với việc lập trình, vì họ thường dùng 1 danh sách cụ thể về các kỹ năng mà 1 vai trò cần có.
Với thông tin này, mình biết rằng mình cần phải cố gắng ở 1 vài điểm mấu chốt:
1. Tôi cần phải hoàn thành quyển ‘You Don’t Know JS’. Sê-ri sách này thực sự giúp mình hiểu rõ phần căn bản của JavaScript, nên mình suy đoán rằng sẽ rất tuyệt cho việc học thêm các thứ nâng cao hơn.
2. Mình cần phải trở nên thực sự giỏi 1 framework front-end. Mình đã xem thử Angular, Vue, và React và quyết định sẽ chọn React. Trước đây mình đã thử 1 chút về React và mình thích nó, mình không thực sự kết Angular cho lắm, và Vue thì lại ít khi được yêu cầu trong nhiều quảng cáo tìm việc.
3. Cho dù mình chỉ có thể tạo 1 API express từ scratch, mình không thực sự tự tin cho lắm và chỉ có thể làm phần cơ bản. Mình cần phải tự update bản thân sớm thôi, đặc biệt nếu mình đã muốn có được công việc back-end mà mình đã ưu tiên.
4. Mình có thể vừa kề bên phần cơ sở dữ liệu quan hệ – relational database (postgreSQL) hay học 1 DB mới. Mình đã quyết định rằng mình sẽ chọn học món MongoDB vì nó đã nổi tiếng rồi và mình cũng thêm NoSQL database vào CV của mình.
Mình không chắc là bao lâu mình sẽ khởi hành với những chuyến đi, nên tự quyết định luôn để lên kế hoạch cho việc học như vầy:
Mình đã thực hiện điều này cho 1 lý do tốt. Nếu mình kết thúc chuyến đi sau 3 tháng và đã hoàn tất mục #1 nhưng vẫn chưa thực hiện được nửa đường tới mục 2#, thì mình sẽ rất có khả năng xin được 1 công việc lập trình viên ở mức mid-level vì chúng chỉ bị giới hạn bởi hầu hết các công việc front-end.


Tôi đã thử làm 1 chút về React trước đây rồi, bằng cách coi mấy video Youtube hay mấy bài hướng dẫn thông thường trên web, nhưng lần này mình muốn để đảm bảo rằng mình đã học nó theo đúng cách. Thế là nó làm mình mua luôn khóa huấn luyện ‘React JS và Redux: Mastering Web App từ Udemy.
Khóa này thực sự rất công phu, với 1 chút kinh nghiệm mà mình đã có với React cũng giúp mình khá nhiều, nhưng về Redux thì mình mù tịt. Xong khóa học, mình cảm thấy đã xây dựng được 1 website khá phức tạp và cũng tự tin cả về phần syntax, phần format của React và phần kiểm soát dữ liệu của Renux nữa.
Mình tốn tới 2 tuần cho khóa này, vì chỉ dành khoản 1-2 giờ và 1-2 tuần 1 lần cho nó. Mình đang tận hưởng kỳ nghỉ ở châu Á nên đây cũng không hẳn là ưu tiên của mình.
Cũng như việc dành thời gian cho khóa học khi mình dùng laptop, mình đọc theo cách riêng qua vài cuốn mới ra gần đây trong seri You Don’t Know JS. Mình lưu cả phiên bản Github online trên điện thoại và đọc nó luôn khi mình nghỉ giải lao.
Có được vài kinh nghiệm đời thực, mình hiểu ra rất nhiều hơn lần gần đây mình cố đọc những quyển này. 1 số cuốn như Promises rất khó hiểu khi bạn chưa bao giờ đụng vào chúng.
Xem ngay các vị trí HOT tuyển dụng React, tuyển lập trình Redux tại TopDev
Giờ đây mình khá thoải mái khi tạo các thứ về front-end, đã đến lúc tập trung lại phần kỹ năng back-end của minh.
1 lần nữa mình quyết định hốt thêm 1 khóa Udemy nữa. Mình nhận ra bởi vì chúng đi cùng nhau như 1 gói hoàn tất, các thứ vận hành mượt hơn và kết nối 1 cả quá trình học. Dĩ nhiên bạn có thể học tất cả những thứ giống nhau miễn phí trên Youtube hay các bài hướng dẫn online khác, nhưng chúng chưa bao giờ có vẻ liền lạc như 1 chủ đề bao quát.
Câu hỏi tiếp theo là nên chọn khóa nào. Có 1 số cái miễn phí và cả tốn phí, khóa dài và khóa ngắn.
Mình quyết định đầu tư bản thân và mua hẳn hoi 1 khóa (10$ tuy nhỏ nhưng mà kèo này thơm phết) và mình đã quản để thu hẹp xuống còn 3 khóa thôi. Dao động thời lượng từ 7 tiếng tới 25,5 tiếng.
Mình bị khóa 7 tiếng mê hoặc hoàn toàn, và mình cũng hoàn thành nó trong khoản 1 – 2 tuần trong khi vẫn tận hưởng được kỳ nghỉ. Khóa 25 tiếng rõ là sẽ cần nhiều thời gian hơn, nhưng có vẻ nó bao gồm nhiều chủ đề trong đó. Tới thời điểm này trong chuyến đi, mình quyết định vẫn sẽ đi du lịch tiếp miễn là số dư trong ngân hàng mình vẫn ở mức ổn định, và thế là mình chiến tiếp khóa 25 giờ luôn.
Tham khảo ngay các vị trí tuyển dụng MongoBD lương cao
Mình thực sự đã làm 1 review đầy đủ về khóa này, và nó khá là tuyệt.
Mình đã xong khóa React và Redux trước đây, và các thứ React cũng lặp đi lặp lại. Nên là bạn không hao tốn thời giờ đâu, bạn có thể skip bớt video phần bạn đã biết rồi hay x2 tốc độ mà xem, và phần ‘skim watch’ cho nó frest hay để kiểm tra bất kỳ lời khuyên hữu dụng nào.
Các thứ về back-end là phần xịn nhất về khóa này. Nó bao hàm lượng chủ để rất đa dạng bao gồm: oAuth, xử lý email, chi trả, API, xử lý chính (?), MongoDB, mongoose, và deploy nâng cao.
Lý do khóa này dài vậy là do nó có nhiều chủ đề quá mà còn chi tiết đến tuyệt vời nữa. Cũng có lợi và có hại, nhưng mình đã xem xong gần hết video với tốc độ x1.5 và dừng ở nơi cần.
Khóa này lâu hơn khóa đầu, nhưng mình đã có thể kết thúc nó trong vòng 1 tháng rưỡi.
1 trong những thứ làm mình chật vật nhất chính là phần DevOps, cách để triển deploy và host ứng dụng theo 1 cách đáng tin. Nếu mình làm điều này bây giờ mình chắc chắn sẽ chọn Serverless vì nó gỡ bỏ kha khá rào cản cho phần lập trình back-end.
Ở 1 vài thời điểm, trong khi đang ở Trung Quốc, mình quyết định viết 1 chủ đề về độ khó khăn khi phải làm lập trình ở Trung Quốc. Nó được chấp nhận như bài công khai trên freeCodeCamp, và giờ đã có 7,1k lượt xem và 1300 cái vỗ tay. Mình khá kinh ngac rằng mọi người đọc thứ mình viết và còn thích nó.
Mình quyết định rằng mình đã cố viết nhiều bài hơn về những gì mình đang làm và những thứ hay ho xoay quanh công việc lập trình viên mà mình tìm ra. Nó còn cho mình 1 nơi trò chuyện khá tuyệt cho việc phỏng vấn sau này.
Mình tiếp tục viết và đã mở ra được các cơ hội đáng kinh ngạc. Mình đã được highlight như 1 Top Contributor trên Freecodecamp, còn có lời đề nghị cho công việc freelance, và ngay cả 1 contract viết sách.
Viết 1 blog cũng là cách hay để nhập quá trình của bạn và cho phép bạn đã cải thiện như thế nào.


Giờ mình đã có tất cả tool cần thiết, mình muốn tạo 1 cái gì đó với chúng. Mình đã đi chơi được 3 tháng rưỡi và dự kiến rằng mình sẽ có thể tiếp tục chuyến đi thêm 1 – 3 tháng nữa.
Điều này có nghĩa rằng mình có thể cần phải suy nghĩ về công việc sớm nếu mình muốn bắt đầu càng nhanh càng tốt khi mình trở về.
Để ứng tuyển cho vị trí lập trình viên, mình cần phải update CV và portfolio của mình. Điều này cho mình 1 cơ hội tuyệt hảo để dùng những gì mình đã học để dựng 1 portfolio bằng Node và React.
Đây chính xác là điều mình làm, như đã nói trước đây, mình không phải là dân thiết kế, nhưng cũng đủ xài. Mình còn dùng 1 API WordPress để host các bài blog trên trang.
Mình biết là phần thiết kế hơi tởm, nên mình đã post nó trong phần subreddit review thiết kế web. Mình đã có khá nhiều lời khuyên hay, hầu hết các thứ xoay quanh việc dành thêm vài tháng tiếp theo để nghiên cứu và học phần căn bản thiết kế web. Điều này không hẳn là thứ mình đang tìm nhưng bù lại cũng có nhiều lời khuyên xịn lắm.
1 chút lời khuyên mình nhận được là tận dụng các thiết kế framework có sẵn. Điều này dẫn đến kết quả 1 website mới hoàn toàn, không cần dùng tới kỹ năng lập trình viên nào mình đã sử dụng trước kia, nhưng nó trông bớt lòe loẹt hơn. Nếu mình làm nó lại, mình sẽ chắc chắn thử và theo 1 cái gì đó như là Material UI.
Nơi tiếp theo tôi ghé thăm là 1 vùng núi xa xôi hẻo lánh tại Lào. Ở thời điểm này mình biết là mình có 2 tuần ở đây, rồi thêm 4 tuần nữa tại Trung Quốc lần nữa trước khi về nhà. Đã đến lúc kiếm việc thôi!
Nếu bạn không có deadline căng não như mình thì cũng nên thử. Nó thực sự giúp tăng động lực bạn để hoàn thành dự án hay để tìm việc (chả ai thích tìm bảng công việc cả).
Nếu bạn không muốn set 1 deadline thì hãy set 1 điểm trong kiến thức học của bạn khi bạn bắt đầu đi tìm việc.
Tốt nhất là sau khi bạn đã học mọi thứ thì nên là như vầy! Học cách phỏng vấn cho vị trí lập trình viên cũng là 1 kỹ năng và bạn nên có thêm kinh nghiệm với nó càng nhiều, càng thường xuyên càng tốt. Bắt đầu xin việc mà bạn ít quan tâm để thực hành suốt quá trình.
Tìm việc lập trình junior lương cao trên TopDev
Qua khóa học suốt 1 tháng rưỡi tiếp theo sau khi đã nộp đơn cho hơn 50 công việc chỉ liên quan đến lập trình viên, mình cũng nhận được email và nhiều cuộc trò chuyện Linkedin với khoản 25 người, và đã nắm trong tay được 5 cuộc phỏng vấn công việc cho tuần tôi trở về.
Hầu hết các tương tác của mình là qua email, nhưng nếu ai đó muốn gọi trực tiếp thì mình đã cố hết khả năng để phù hợp với nó (Mình còn 8 giờ phía trước)
Mình nghĩ rằng có 1 cuộc trò chuyện thực sự là cách tuyệt vời để cải thiện mối quan hệ giữa bạn và người khác, tăng cơ hội họ mời bạn tới buổi phỏng vấn hay giới thiệu 1 công việc cho bạn.
Nếu bạn không thấy thoải mái việc gọi điện hay Skype với mọi người thì hãy đu theo email, nhưng mình nghĩ bạn sẽ phải bỏ lỡ nhiều cải thiện các cơ hội đấy.
1 trong những cuộc phỏng vấn cho vị trí lập trình viên đã yêu cầu mình làm nguyên mẫu những gì sẽ làm cho 1 công ty với 1 trang web tệ hại và dịch vụ khách hàng tối thiểu. Điều này thật tuyệt khi nó thúc đẩy mình để học về phần tạo mẫu.
Mình đã viết 1 seri các bài viết về cách nguyên mẫu mình làm và tạo ra 1 website. Bạn có thể xem website ở đây và đọc các bài viết do mình viết về lập trình viên ở đây.
Nó còn cho mình cơ hội để lấy những gì mình đã học suốt 4 tháng qua, luyện tập nó và dựng 1 cái gì đó mà phô diễn những gì mình có thể làm.
Cái cuối cùng mình làm trên dự án này là tạo ra 1 chat bot cho việc return các order.
Mình đã phải tìm hiểu về cách hoạt động của các chat bot và tốn 1 tuần để có được 1 phiên bản hoạt động tốt. Đây là 1 yếu tố lớn trong việc mình nhận 1 công việc và nó dẫn tới nhiều cơ hội khác nữa.
Học 1 hoặc 2 kỹ năng nhẹ khác mà bạn có thể thể hiện cũng có thể có tác dụng tốt. Chỉ cần đảm bảo rằng sau khi bạn đã sắp xếp các kỹ năng cốt lõi của mình.


Giờ đây mình đã có danh sách 5 cuộc phỏng vấn, mình phải chuyển hóa chúng thành lời đề nghị cho công việc.
Mình đã viết các bài về chuẩn bị cho buổi phỏng vấn JavaScript và thành thục tiến trình phỏng vấn. Mình đảm bảo là đã tick mọi ô rồi.
Mình biết tất cả các điểm mình muốn nhấn mạnh, cách để trả lời các câu hỏi về điểm yếu của mình và những gì mỗi công ty đã làm.
Mình đã luôn khá là giỏi trong các cuộc phỏng vấn mặc dù bình thường mình hơi hướng nội 1 chút. Mình đã phải dạy bản thân hành động hướng ngoại nhiều hơn và tham gia với những người phỏng vấn mình.
Nếu bạn thấy bản thân hành động nhút nhát và dè dặt trong các cuộc phỏng vấn, mình khuyên bạn nên thực hành điều này như bất kỳ kỹ năng nào khác. Tìm một nguồn tài nguyên tốt (charisma on command là một kênh Youtube tuyệt vời) và sau đó lặp lại những gì bạn học được. Bắt đầu với bạn bè và gia đình cho bạn các cuộc phỏng vấn giả nhưng sau đó thử và tìm những người mà bạn không quen thuộc và có thể giống với nhà phát triển thực sự hơn.
Mình đã có các bài kiểm tra công nghệ tại 3/4 các cuộc phỏng vấn (hai phần còn lại đã thực hiện online) và sự chuẩn bị của mình đã được đền đáp. Cũng có vài lúc lúng túng, nhưng mình đã tự nói với bản thân và hoàn thành tốt mọi nhiệm vụ của một lập trình viên cần có.
Việc bạn đi phỏng vấn cũng là một cơ hội để tìm hiểu thêm về công ty và khi làm việc ở đó sẽ ra sao. Một công ty có thể sẽ tuyệt vời trên giấy tờ nhưng thực sự lại không giống sự cường điệu đó hoặc có thể theo cách nào khác. Chọn đúng công ty là một quyết định lớn vì vậy hãy chắc chắn rằng bạn hãy yêu cầu tất cả thông tin bạn cần cho vị trí lập trình viên này.
Từ ba cuộc phỏng vấn đầu tiên của tôi, tôi đã có hai lời đề nghị. Sau cuộc phỏng vấn thứ tư, tôi biết rằng họ là công ty cho tôi, vì vậy hãy cho họ biết rằng tôi sẽ xem xét lời đề nghị từ họ. Nếu bạn đã từng ở trong một tình huống tương tự, hãy cố gắng không dẫn dắt họ nếu bạn biết bạn sẽ không chấp nhận lời đề nghị từ họ.
Bây giờ tôi đã có đề nghị từ hai công ty rất muốn thuê tôi. Đó là thời gian để đàm phán. Tôi không bao giờ tuyệt vời trong việc đàm phán hoặc yêu cầu nhiều hơn, nhưng tôi đã đọc một vài bài báo và đã đi cho nó.
“Bạn có thể tự nghĩ rằng: “à , mình không muốn đặt các kỳ vọng cao quá, và các lời đề nghị cũng khá rộng rãi rồi, nên mình cứ nhận nó thôi”
Không. Hãy đàm phán.
“Hoặc là: “mình không muốn bắt đầu với các bước sai lầm và có vẻ tham lam với các ông chủ tương lai.”
Không. Cứ đàm phán đi.
“Nhưng công ty này cũng nhỏ và…”
Không. Im miệng và đàm phán thôi.
Từ 10 quy tắc đàm phán 1 lời đời nghị công việc. Mình xin giới thiệu là bạn nên xem qua nó nếu bạn đang đi tìm việc.
Mình rõ ràng đã không làm điều này hoàn hảo (hay thực ra không hài lòng lắm), nhưng mình đã làm 1 số thứ để tăng cường cho đôi bàn tay này. Mình đã có 2 lời đề nghị khá là công bằng, nhưng mình cũng ưu tiên cho 1 công ty. Mình đã tự viết 1 script nhỏ và (sau vài bài tập hít thở để giúp mình bĩnh tĩnh lại) mình đã gọi cho vị giám đốc của công ty mình kết nhất.
“Chào Dave, mình đang gọi tới anh để cập nhật về việc mình đang ở đâu. Cảm ơn đã cho mình 1 lời đời nghị, mình rất vui khi được xem như 1 mảnh ghép tuyệt vời đến công ty.
Mình đã có lời đề nghị khác cũng khá hấp dẫn và sẽ quyết định vào cuối tuần này, mình sẽ cho anh biết ngay 12h trưa thứ hai.
Có 1 thứ thực sự sẽ làm lời đề nghị này được tốt hơn nữa. Mình sẽ tái định cư ở bất cứ nơi nào mình nhận được việc, và vài sự hỗ trợ với chi phí cho việc này sẽ rất tuyệt.”
Câu chuyện không kết thúc y như thế, nhưng nó cũng khá hữu ích. Mình đã cám ơn họ vì lời đề nghị, nói cho họ biết deadline để mình đưa ra 1 quyết định, và hỏi về việc cải thiện lời đề nghị mà không phải yêu cầu mức lương cao hơn.
Mình đã tìm ra được những gì mình cần để có được công việc mình muốn. Mình dùng điều này để tạo 1 kế hoặc và rồi sử dụng các khóa học online để tăng tốc quá trình học tập.
Mình đã nộp đơn 1 đống việc và nhận lại được 5 buổi phỏng vấn. Việc chuẩn bị cho những buổi phỏng vấn kết thúc với 4 lời đề nghị, và 2 cái thực sự làm mình muốn chọn 1 trong 2. Mình đã thương thuyết lời đề nghị từ 2 công ty mình thích nhất và cuối cùng cũng nhận được công việc lập trình viên tuyệt vời tại 1 công ty tuyệt vời khác.
Nếu chủ đề này cũng truyền cảm hứng cho bạn để tiến tới bước tiếp theo để trở thành 1 lập trình viên full-stack rồi bạn sẽ cần biết các kĩ năng mà cần. May thay, mình đã có 1 bài hướng dẫn miễn phí về các kỹ năng và công cụ bạn sẽ cần để trở thành 1 lập trình viên full-stack.
Có thể bạn muốn xem thêm:
Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev
Bài viết được sự cho phép của tác giả Tino Phạm
Thế giới lập trình là rộng lớn với rất nhiều lĩnh vực và cơ hội mang lại cho bạn sự trải nghiệm, cũng như con đường đi mà bạn sẽ chọn lựa cho sự nghiệp, đam mê của mình.
Bạn là một người mới và đang mong muốn trở thành một web developer. Và thời điểm này bạn vẫn chưa thể xác định sẽ bắt đầu từ đâu khi đi trên con đường này.
Với kinh nghiệm của bản thân, mình sẽ chia sẽ để giúp bạn có định hướng và cái nhìn tổng quan hơn trước khi bước chân vào con đường trở thành web developer.


Trong lĩnh vực lập trình ứng dụng web, chúng ta có lập trình cho Front-end và lập trình cho Back-end. Bắt đầu từ hướng lập trình Front-end là dễ dàng hơn cho bạn. Vì sao ư?
Để trở thành một Front-end developer bạn chỉ cần học một số công nghệ chính bên dưới:
Trong khi để trở thành một Back-end developer bạn cần phải nắm được những công nghệ sau:
Qua các thông tin ở trên, bạn dễ dàng nhận ra rằng để trở thành một Back-end developer bạn phải hiểu biết nhiều công nghệ hơn Front-end developer. Hơn nữa, Back-end developer còn phải có kiến thức về Architectural Styles, Architectural Patterns, Design Patterns để có thể đi tiếp con đường trở thành một Senior Developer hay xa hơn là trở thành một Software Architect.
Nhìn chung thì để trở thành một Back-end developer đòi hỏi bạn phải có nhiều nổ lực và kiên trì hơn. Vì vậy trở thành một Front-end developer tương đối dễ và nhanh hơn Back-end developer.
OK, con đường là do bạn lựa chọn. Hãy tìm hiểu và đi lựa chọn công việc mà bạn đam mê và chào mừng bạn đến với hội anh em “coder”.
Bài viết gốc được đăng tải tại Thangphampt
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
Bài viết được sự cho phép của BBT Tạp chí Lập trình


Khi phát triển phần mềm trên Swing nhiều lập trình viên gặp khó khăn trong việc thay đổi diện và tái sử dụng giao diện bởi họ đã thiết kế ngay trên JFrame. Có một cách khác là chúng ta sẽ thiết kế từng giao diện trên các JPanel. Sau đó sẽ dùng phương thức setContentPane() của JFrame để thay đổi nội dung của JFrame chính.
Sau đây ta sẽ xem một ví dụ trên Netbeans về phát triển một ứng dụng: Ứng dụng có giao diện đầu tiên là đăng nhập (login). Sau đó nếu đăng nhập thành công thì sẽ chuyển sang giao diện chính (home)






//panel sẽ được hiển thị khi login thành công
private JPanel pnLoginSuccess;
/**
* Xác định panel sẽ hiển thị khi đăng nhập thành công
* @param pnLoginSuccess
*/
public void setPnLoginSuccess(JPanel pnLoginSuccess) {
this.pnLoginSuccess = pnLoginSuccess;
}
Click chuột phải vào nút Login và chọn Events ==> Action ==> actionPerformed
JFrame parent = Utitilities.findJFrameOf(this);
if (parent != null) {
parent.setContentPane(pnLoginSuccess);
parent.pack();
} else {
JOptionPane.showMessageDialog(parent,
"Panel Login only used for JFrame");
System.exit(1);
}
Phương thức Utitilities.findJFrameOf(this) là để tìm JFrame chứa một component
package tap.chi.lap.trinh;
import java.awt.Component;
import java.awt.Container;
import javax.swing.JFrame;
/**
*
* @author cibervn
*/
public class Utitilities {
/**
*
* @param component
* @return top level container JFrame
*that contains component
*/
public static JFrame findJFrameOf(Component component) {
Container c = component.getParent();
while (c.getParent() != null) {
c = c.getParent();
}
if (c instanceof JFrame) {
return (JFrame) c;
}
return null;
}
}
JFrame này chứa các panel có thể có, và cần phải xác định navigation giữa các giao điện
private PnLogin pnLogin;
private PnHome pnHome;
/**
* Creates new form Main
*/
public Main() {
//
initComponents();
//Khởi tạo các Panel của ứng dụng
initPanels();
//Xây dựng giao diện ban đầu cho ứng dụng
setContentPane(pnLogin);
pack();
}
private void initPanels() {
pnLogin = new PnLogin();
pnHome = new PnHome();
//Xác định navigation
//Sau khi đăng nhập thành công sẽ
//chuyển sang giao diện của PnHome
pnLogin.setPnLoginSuccess(pnHome);
}
5. Tương tự như PnLogin ta xây dựng giao diện cho các panel khác.
Source code
Bài viết gốc được đăng tải tại Tạp chí Lập Trình
Có thể bạn quan tâm:
Xem thêm các việc làm web Developer hấp dẫn tại TopDev
Diễn đàn Chuyển đổi số trong lĩnh vực xuất nhập khẩu hàng hóa lần thứ 2 (VOIEF – Vietnam Online Import-Export Forum) do Hiệp hội Thương mại Điện tử Việt Nam (VECOM) được tổ chức vào ngày 28/07 tới đây sẽ là sự kiện quy mô toàn quốc thu hút sự quan tâm lớn của cộng đồng.
Theo Báo cáo Chỉ số Thương mại điện tử Việt Nam 2020, nhiều doanh nghiệp Việt Nam đã triển khai thương mại điện tử nhằm hỗ trợ xuất nhập khẩu theo cả mô hình doanh nghiệp tới doanh nghiệp (B2B) cũng như doanh nghiệp tới người tiêu dùng (B2C).
Với chủ đề “Giải pháp chuyển đổi số”, Diễn đàn tập trung cung cấp các giải pháp quan trọng đối với lĩnh vực xuất nhập khẩu hàng hóa đồng thời tạo cơ hội cho các bên liên quan tới lĩnh vực xuất nhập khẩu hàng hoá nắm bắt những cơ hội có được từ các hiệp định thương mại tự do, bao gồm EVFTA. Diễn đàn với sự tham gia của những tập đoàn toàn cầu với hệ sinh thái thương mai điện tử hàng đầu trong và ngoài nước như: Alibaba, Amazon, Facebook, Google… cùng nhiều doanh nghiệp lớn trong nước về TMĐT cũng như XNK.v
Đặc biệt, sự cấp bách của chuyển đổi số của các doanh nghiệp trong nước và các doanh nghiệp Việt Nam ở châu Âu để nắm bắt ngay cơ hội của Hiệp định Thương mại tự do Việt Nam – EU (EVFTA) có hiệu lực từ tháng 8/2020. Vì vậy, các vấn đề về thuế, thủ tục hải quan, mẫu xác nhận C/O truy xuất nguồn gốc xuất sứ là nền tảng cơ bản cần nắm bắt để có thể bắt tay đưa sản phẩm Việt ra thị trường thế giới.
Diễn đàn VOIEF 2020 sẽ được tổ chức tại Hà Nội kết hợp phát trực tuyến miễn phí tới mọi đối tượng quan tâm trong nước và nước ngoài.


Thông qua sự kiện giúp các doanh nghiệp xuất nhập khẩu giao lưu, kết nối, trao đổi cơ hội hợp tác kinh doanh với các doanh nghiệp cung cấp dịch vụ hỗ trợ như thương mại điện tử, ngân hàng, bảo hiểm, logistics…
Tham gia diển đàn, bạn sẽ được:
2. Cơ hội tiếp cận trực tiếp các cơ quan hoạch định chính sách và thực thi pháp luật về xuất nhập khẩu, hải quan… đồng thời cập nhật nhiều xu hướng xuất nhập khẩu mới, gặp gỡ hàng trăm doanh nghiệp kinh doanh xuất nhập khẩu tiềm năng.
3. Thúc đẩy liên kết , hợp tác kinh doanh với các đối tác
4. Rà soát các chính sách, giải pháp trong bối cảnh kinh tế số tác động sâu sắc tới quản lý, hỗ trợ hoạt động xuất nhập khẩu.
5. Điều chỉnh mô hình, phương thức hoạt động của các hiệp hội nhằm hỗ trợ tốt hơn hoạt động xuất nhập khẩu của doanh nghiệp hội viên.
Thông tin diễn đàn:
Diễn đàn VOIEF 2020 sẽ được tổ chức tại Hà Nội dưới cả 2 hình thức: trực tuyến (online) và tại chỗ (offline), miễn phí chi phí tham dự.
– Thời gian:8h00 – 12h00, thứ Ba, ngày 28/7/2020
– Địa điểm: Hanoi Tower, 49 Hai Bà Trưng, Hà Nội
Để BTC chuẩn bị chu đáo, Đại diện quý Doanh nghiệp tham dự Diễn đàn vui lòng đăng ký tại website sự kiện: http://voief.vecom.vn hoặc trực tiếp tại link: https://bit.ly/voief2020 trước ngày 24/07/2020
“Có làm thì mới có ăn” – Câu nói được xem là khá thực tế trong xã hội hiện đại và dưới áp lực cạnh tranh của thời đại công nghệ kỹ thuật số, con người cần phải lao động nhiều hơn để tạo ra giá trị.
Nhiều người trẻ với mong muốn sớm có những thành tựu nhanh chóng nhưng lại không chấp nhận “lăn xả” hoặc họ chấp nhận “nỗ lực tạm thời” nhưng thái độ làm việc thì thiếu chuyên nghiệp. Cùng TopDev tìm hiểu về khuynh hướng đạn này qua bài viết sau đây nhé!
Bạn có biết không, cuộc sống là do bạn lựa chọn. Bạn có thể chọn cố gắng hết sức để đạt được thứ bạn mong muốn. Do đó, việc bạn phải đánh đổi bằng việc thức khuya, dậy sớm là điều hiển nhiên cần thực hiện để có được một mức lương cao. Không thể chấp nhận cái tư tưởng muốn an nhàn mà lại không cố gắng. Lương bèo bọt hay lương cao là do tự thân bạn nỗ lực mà đạt được, nếu cứ hi vọng có một công việc nhẹ nhàng với mức thu nhập cao ngất ngưỡng thì có lẽ bạn đang quá ảo tưởng về năng lực bản thân. Đồng thời tự hạ gục chính mình trước cuộc chơi đầy sự cạnh tranh về nghề nghiệp, trở thành kẻ thua cuộc trong phút chốc.
Hoặc là bạn tiếp tục phấn đấu hoặc là bỏ cuộc, điều quan trọng là bạn có lựa chọn được một công ty phù hợp với định hướng phát triển bản thân và thật sự quan tâm đến sức khỏe của mình hay không? Người trẻ cần nỗ lực nhưng điều đó không đồng nghĩa bạn sẽ chọn việc quá sức với mình. Tuy nhiên, nếu chọn việc nhàn rỗi với mức lương thấp thì bạn lại không có động lực và thiếu trách nhiệm. Đó tuy là một nghịch lý nhưng nó vẫn tồn tại trong tư tưởng của các bạn trẻ đang bắt đầu gia nhập cuộc chơi nghề nghiệp.
Ảo tưởng quá sớm về cái gọi là “đỉnh cao” nghề nghiệp dường như đã khiến bạn mất phương hướng. Bạn quên mất rằng, mọi thành công đều đến từ những nỗ lực mà có. Dù cho đó là sự may mắn khi bạn đạt được thành tựu khi còn trẻ nhưng việc chấp nhận nó và rồi thiếu đi những nỗ lực cần phải có khi bước sang giai đoạn mới, đó là suy nghĩ sai lầm của các bạn trẻ hiện nay. Cái gì nhanh đến thì sẽ nhanh đi và điều bạn thiếu chính là những trải nghiệm, sự kiên trì, không ngừng thay đổi để đạt đến những thành quả lớn hơn.
Bạn đã làm tại một công ty chuyên về tuyển dụng IT. Cũng xấp xỉ 30 rồi còn gì, về tuổi đời và tuổi nghề, bạn đều khá tự tin vì có một thời gian đủ lâu để bản thân phát triển kỹ năng, chuyên môn của mình về nghề nghiệp. Tuy nhiên, bạn cảm thấy bất mãn vì sếp từ chối giao cho mình vị trí Phó Giám đốc và khi ngẫm lại, bạn cũng cho rằng mức lương bạn nhận được cũng chẳng thấm vào đâu.
Vậy lý do là gì? Rất nhiều lý do khiến bạn tất nhiên bị loại khỏi danh sách ứng cử viên cho sự thăng tiến. Thứ nhất, những người được chọn khác bạn, họ chưa bao giờ xem mình là những người ở tuổi 30 cả. Họ làm việc hết mình với năng suất như những chàng trai/cô gái trẻ, họ không ngừng học tập những cái mới, tự chịu áp lực và khi đương đầu với khó khăn họ đều bình tĩnh vượt qua, tìm cách tháo gỡ chúng. Đó là những biểu hiện xác đáng nhất khiến họ đủ tố chất và khả năng để được giao phó cho một trọng trách mới.
![]()
![]()
Còn bạn thì sao? Bạn chê lương thấp nên đi làm không tuân thủ giờ giấc. Điều này khiến các đồng nghiệp cảm thấy khó chịu. Chính vì lương thấp nên bạn tự cho mình cái quyền làm việc qua loa, đi trể về sớm và không nỗ lực trong công việc của mình. Khi được cấp trên giao cho các dự án tuyển lập trình viên, bạn chỉ đơn thuần phân bổ nhiệm vụ mà không kiểm soát tốt, công tác tuyển dụng thì chưa chặt chẽ, hời hợt từ việc truyền tải thông tin đến chăm sóc các ứng viên. Từ đó, dẫn đến hiệu suất làm việc không cao, trễ deadline, thiếu KPI và quan trọng là tác phong làm việc chưa tốt thì việc bạn nhận được mức lương “cao” là điều dễ hiểu.
Hãy dẹp ngay suy nghĩ bạn đã làm việc lâu năm, đủ những trải nghiệm và chuyên môn rồi nên nỗ lực quá nhiều là điều không thật sự cần thiết nữa. Sự lười nhát, thiếu cố gắng chỉ khiến bạn mãi dậm chân và khó phát triển. Bạn từng cố gắng rất nhiều để có những thành quả ở tuổi 20 nhưng lại lạc lõng vào năm 30 tuổi. Dù tuổi tác chỉ là một con số ước định nhưng bạn cần nhớ rằng sự nỗ lực là điều luôn luôn cần thúc đẩy. Dừng nỗ lực khi đạt được một chút thành công vào ở cái tuổi đời còn quá trẻ chưa nói lên được điều gì cả. Quan trọng là bạn hãy nhớ rằng không ai trả tiền cho bạn thông qua bằng cấp mà những gì bạn làm được mới là thước đo chính xác nhất thể hiện đúng những gì bạn được nhận.
Nỗ lực là bí quyết dẫn đến thành công bên cạnh trí thông minh sẵn có. Mọi người thường nói rằng nếu bản thân họ quá già hay nói cách khác là có thâm niên trong lĩnh vực nghề nghiệp mình theo đuổi thì việc đào tạo nhân sự tuyển dụng dường như quá khó khăn do áp lực lương cao. Ngược lại, nếu lương thấp thì họ lại thiếu hứng thú với công việc.
![]()
![]()
Trên thực tế, không có bất kỳ công việc nào là kiếm tiền một cách dễ dàng. Điều đó đồng nghĩa bạn phải đánh đổi công sức, chất xám của mình để đầu tư lâu dài cho việc phát triển nghề nghiệp.
Và tất nhiên, không có độ tuổi nào là không làm việc chăm chỉ cả. Có những người làm việc chăm chỉ hơn bạn và cũng có không ít người có mức lương thấp hơn. Tất cả đều do mọi nỗ lực tạo ra giá trị và thành quả của bạn. Chính vì vậy, bạn phải học cách quên đi tuổi tác của mình, đừng xem nó là rào cản bởi vì nỗ lực là chuyện không của riêng ai.
Có thể nói rằng, cổ phiếu đáng giá nhất của người trẻ chính là sở hữu một tình thần mạnh mẽ, một sức khỏe tốt để họ có cơ hội phát huy tối đa năng lực của mình. Còn trẻ, đừng vội nghĩ đến việc nghỉ ngơi mà hãy cố gắng tạo ra giá trị. Khó có thể phán đoán được liệu thành quả mà bạn tạo ra sau 2 năm, 10 năm hay 30 năm sau sẽ như thế nào nhưng hãy tin rằng, bạn sẽ hài lòng và cảm thấy hạnh phúc vì trong quá khứ, mình đã từng nỗ lực rất nhiều để đạt đến thành công.
Chung quy lại, bạn hãy nhớ rằng: Khi đến một thời điểm thật sự thích hợp, giai đoạn mà khả năng của bạn được ghi nhận, tổng hợp và xem xét xứng đáng cho một vị trí nào đó, giá trị của sự nỗ lực lúc này rất quan trọng vì nó là điểm cộng lớn giúp bạn có cơ hội được thăng tiến cao hơn. Nỗ lực phải luôn luôn hiện hữu và được thúc đẩy từng ngày, không chỉ đơn thuần dừng lại ở việc là phương tiện giúp thỏa mãn những đòi hỏi sớm của người trẻ.
Có thể bạn quan tâm:
Xem thêm IT Jobs Developer trên TopDev
Nối tiếp báo cáo thị trường IT Landscape 2019, báo cáo mới nhất về thị trường vận chuyển và giao nhận 2020 vừa mới ra mắt, thông số trong báo cáo khá khả quan bất chấp dịch bệnh Covid được xem là một trong những đại dịch làm ảnh hưởng nghiêm trọng đến các ngành nghề khác nhau ở hầu hết các quốc gia, đặc biệt là Châu Âu.
Theo báo cáo thị trường Vietnam IT Landscape 2020, tuy 6 tháng đầu năm các ngành có xu hướng “tuột dốc” nhưng với tình hình hiện này thì chúng ta có thể thấy rõ nền kinh tế Việt Nam đang dần khởi sắc ở các ngành nghề nói chung và các công ty công nghệ nói riêng. Trong bài báo cáo này, chúng ta sẽ chỉ tập trung đến tình hình của ngành dịch vụ thị trường vận chuyển và giao nhận. Nhìn chung, tại Việt Nam, các dịch vụ vận chuyển khá được ưa chuộng, nhất là các dịch vụ vận chuyển của những công ty công nghệ như Grab, Goviet, Lalamove, Giaohangnhanh…
Theo báo cáo thị trường vận chuyển và giao nhận 2020, trong năm 2011-2017 (6 năm), các dịch vụ vận chuyển, giao nhận công nghệ trong đó có ứng dụng đi lại chỉ có 2 ứng dụng phát triển đó là Uber và Grab, còn ở ứng dụng giao đồ ăn thì có ông trùm độc quyền Now tại thời điểm này. Ứng dụng vận chuyển hàng hóa thì có Vietnam Post, Viettel Post, Grab Express… đa số là các ứng dụng giao hàng được phân nhánh từ các công ty lớn của nhà nước. Nhưng kể từ năm 2018 trở đi, thì dịch vụ vận chuyển và giao nhận phát triển khá nhanh, các ứng dụng giao nhận, vận chuyển được ào ào ra mắt ví dụ như goviet, be, fastgo… đối với các ứng dụng đi lại. Ứng dụng giao đồ ăn cũng khá khả quan với các ứng dụng Grabfood, Loship, Gofood, Baemin… đã ra đời nhằm đáp ứng nhu cầu ăn uống được giao hàng tận nơi.
Xem thêm báo cáo về Thị trường vận chuyển và giao nhận 2020
Dù các ứng dụng giao hàng, vận chuyển phát triển mạnh mẽ là thế nhưng khi đến giai đoạn từ khoảng đầu năm 2020, thời điểm dịch dịch mon men phát triển tại Việt Nam thì thị trường vận chuyển giao nhận 2020 lại có 1 pha “hú hồn” vì dịch. Dịch bệnh đã làm ảnh hưởng rất nhiều đến hành vi của User khi sử dụng dịch vụ giao nhận, cụ thể, theo thống kê, thị trường vận chuyển và giao nhận Landscape 2020, ứng dụng Grab thì trong năm 2019, Grab Express có mức tăng trưởng 97%, Grab Food tăng trưởng tầm 1.800% trong năm.
Nhưng trong năm nay, theo báo cáo thị trường vận chuyển và giao nhận 2020 thì tổng doanh thu từ thị trường đặt xe đã giảm mạnh từ 3,126 triệu $/năm (2019) xuống thấp nhất từ trước đến nay là 2,000 triệu $/năm. Đây là một con số đáng báo động về sự suy thoái trong ngành. Tuy thị trường đặt xe “bê bết” là thế nhưng vẫn còn một thị trường có thể gỡ lại 1 chút, đó là thị trường đặt đồ ăn qua ứng dụng. Vì tình hình dịch bệnh làm thay đổi hành vi người dùng nên thay vì kéo nhau ra ngoài ăn thì mọi người sẽ order đồ ăn để ăn tại chỗ, nền tảng giao đồ ăn “soán ngôi”, tỷ lệ giao đồ ăn tăng vọt.
Dự kiến thị trường giao thực phẩm Đông Nam Á sẽ tăng từ 2 tỷ USD (2018) lên 8 tỷ USD (2025) – theo báo cáo của Google và Singapore Temasek. Trong riêng năm 2020, doanh thu của ngành vận chuyển và giao nhận nói chung tại Việt Nam là 302 triệu USD (tăng 45,9% so với cùng kì năm ngoái, người dùng (User) là 9.5 triệu người (tăng 37.1% so với năm ngoái). Tuy trong thời gian ảnh hưởng dịch bệnh từ thế giới, ngành này tuy có bị ảnh hưởng một ít nhưng may mắn thay chính phủ Việt Nam đã đưa ra những chủ trương phòng bệnh rất hiệu quả nên cũng đỡ được phần nào ảnh hưởng. Ngoài ra, dịch vụ đặt đồ ăn qua ứng dụng đã “gánh team” cho thị trường vận chuyển và giao nhận 2020 tại Việt Nam.


Mới đây, Grab cũng đã đưa ra thông cáo báo chí rằng sẽ cắt giảm 5% đội ngũ nhân sự trên toàn thế giới trong đó có Việt Nam, tương đương với 360 người. Khi được hỏi tại sao Grab lại có những động thái này dù dịch bệnh đã phần nào nguôi ngoai, CEO của Grab Việt Nam – ông Anthony Tan đã chia sẻ trong tiếc nuối: “Grab phải áp dụng chiến lược bảo toàn nguồn vốn phù hợp hơn để dự phòng cho giai đoạn phục hồi có thể kéo rất dài, cần có một bộ máy tinh gọn hơn để đáp ứng được những thách thức của nền kinh tế hậu COVID-19”. Đồng thời ông cũng cam kết rằng sẽ không để cho sự việc tương tự như việc cắt giảm nhân sự này xảy ra thêm lần nào nữa.
Trong khoảng từ cuối tháng 4 năm nay, Grab đã khuyến khích nhân viên chủ động nghỉ hoặc giảm thời gian làm trong ngày để tránh việc phải cắt giảm nhân sự trong mùa dịch, nhưng dường như chiến dịch ấy vẫn không quá khả quan, chính vì vậy mới xảy ra sự việc cắt giảm 5% nhân viên Grab trong giữa tháng 6. Ông Anthony Tan, chỉ cho biết Việt Nam cũng là 1 trong những nước phải cắt giảm nhân sự nhưng lại không tiết lộ chính xác con số.
Xem thêm báo cáo về Thị trường vận chuyển và giao nhận 2020
Ngoài việc chia sẻ về sự việc không mong muốn như trên thì ông cũng chia sẻ thêm rằng kể từ tháng 2/2020 thì Grab đã cảm nhận rõ ràng về sự ảnh hưởng mạnh mẽ của dịch đối với dịch vụ vận chuyển và giao nhận. Định hướng cũng Grab trong tình hình này là Grab sẽ tập trung vào những mảng mạnh của công ty như di chuyển, giao nhận và thanh toán, hạn chế những dự án đang phát triển để bảo toàn nguồn vốn lưu động.
Đối với ứng dụng đặt xe Be, đại diện phía Be cũng cho biết, các hoạt động dịch vụ của Be cũng bị ảnh hưởng kể từ sau Tết Nguyên đán năm nay. Nhìn chung, các công ty của ngành dịch vụ vận chuyển và giao nhận đều có khó khăn chung trong tình hình hiện tại.


Chia sẻ thực tế với các phóng viên các tờ báo lớn, một tài xế của ứng dụng xe ôm công nghệ Be cho hay vào thời điểm trước dịch, thông thường mỗi ngày anh có thể chạy với năng suất 20-25 chuyến/ngày, tính thêm cả điểm thưởng từ app thì thu nhập của các tài xế Be giao động trong khoảng từ 300.000-400.000 đồng/ngày. Nhưng trong thời điểm dịch bùng phát thì thu nhập của các tài xế bị ảnh hưởng trầm trọng, cụ thể là các chuyến xe giảm từ 25 chuyến/ngày còn 5 chuyến/ngày, dẫn đến việc không thể nhận thưởng, thu nhập giảm mạnh, sau khi trừ hết tất cả chi phí thì tiền thu về chỉ ở khoảng 30.000/ngày.
Đó là đối với tài xế của ứng dụng Be, còn với ứng dụng có quy mô lớn hơn như Grab thì các tài xế chia sẻ, vào thời điểm trước dịch, lượng người dùng sử dụng Grab rất mạnh mẽ. Hầu như lúc nào mở ứng dụng Grab Driver lên cũng sẽ có khách ngay lập tức, một ngày có thể nhận đến 30-40 chuyến nếu chịu khó chạy liên tục cả ngày, nhưng khi dịch đến thì dù có mở app cả ngày vẫn chỉ có 2, 3 chuyến.
Không riêng gì các dịch vụ vận chuyển 2 bánh, những khó khăn ấy còn bao trùm lên cả các tài xế xe hơi công nghệ, khó khăn sẽ càng nặng trĩu hơn nếu những tài xế xe hơi này phải trả góp ngân hàng tiền mua xe. Khó khăn này chồng chất lên khó khăn kia làm những người lao động trong thị trường vận chuyển và giao nhận trở nên điêu đứng.
Trong mùa dịch này, khi may mắn bắt được một chuyến xe thì sự lo lắng vẫn luôn thường trực trong tâm trí của các tài xế xe ô tô vì không gian trong xe ô tô rất kín và khoảng cách ngồi giữa tài xế và hành khách cũng rất gần.
May mắn thay, trong báo cáo về thị trường vận chuyển và giao nhận 2020 thì chúng ta vẫn thấy những chỉ số khả quan, các chỉ số đã gia tăng đáng kể trong năm 2020 dù bị ảnh hưởng từ dịch bệnh.


Nguyên nhân của những thông số khả quan này phải kể đến công của thị trường ứng dụng giao đồ ăn và ứng dụng vận chuyển hàng hóa.
Dịch bệnh nổ ra làm thay đổi thói quen người tiêu dùng, chính vì thế thị trường giao đồ ăn và vận chuyển hàng hóa có dịp lên ngôi. Nguồn khách hàng chính của 2 thị trường này đến từ lao động khối văn phòng là chính, thay vì ra ngoài ăn thì mọi người lại có xu hướng mời gọi nhau ăn cùng 1 quán, sau đó đặt giao đồ ăn đến ăn tại ngay chỗ làm.
Cùng chung hoàn cảnh với thị trường giao thực phẩm, thị trường giao hàng cũng được ưa chuộng vì trong thời gian giãn cách mọi người ở nhà có nhu cầu shopping online hoặc gửi đồ đều sử dụng dịch vụ giao hàng như lalamove, ahamove, 60 giây, giao hàng tiết kiệm, giao hàng nhanh… thậm chí đôi khi đơn hàng quá tải, các ứng dụng giao hàng không chuyển hàng đến khách kịp nên phải tuyển thêm rất nhiều shipper trong mùa dịch. Vì tính tiện dụng cao nên việc đặt đồ ăn và giao hàng khá bùng nổ trong mùa dịch này, dẫn đến 1 cơ hội mới, 1 xu hướng sử dụng dịch vụ vận chuyển và giao nhận mạnh mẽ hơn.
Trong bối cảnh tình hình hiện tại, các công ty, doanh nghiệp dịch vụ vận chuyển và giao nhận rất tất bật trong việc tuyên truyền các giải pháp tự bảo vệ bản thân cho cánh tài xế để có thể phòng ngừa và tránh lây nhiễm nguồn dịch bệnh không mong muốn khi tác nghiệp.
Giải pháp chung của các doanh nghiệp dịch vụ vận chuyển, giao nhận như Grab, Be, Goviet, Lalamove, Ahamove, Giao Hàng Nhanh, Giao Hàng Tiết Kiệm… là:
Đối với các tài xế không tuân thủ các quy tắc phòng chống trên thì sẽ bị các ứng dụng giao hàng phát bằng nhiều hình thức khác nhau và nặng nhất là khóa tài khoản, không cho các tài xế ấy hoạt động nữa.
Bên cạnh đó, ứng dụng Be đã có kế hoạch cho việc “sống chung với lũ” nhằm giúp doanh nghiệp có thể duy trì qua mùa dịch và thúc đẩy hoạt động kinh doanh của thị trường. Còn đối với ứng dụng Grab, tình hình kinh tế của Grab cũng vẫn duy trì khá cân bằng nhờ có những bước đi hợp lý.
Theo báo cáo của Vietnam IT Landscape 2020 cho thấy thị trường vận chuyển và giao nhận Landscape 2020, dù nhu cầu sử dụng dịch vụ vận chuyển giao nhận có thay đổi và giảm mạnh, tuy nhiên ngành này vẫn “ăn điểm” so với những ngành khác nhờ có dịch vụ giao đồ ăn và giao hàng hóa tận nơi. Phần lớn người dùng trong thị trường này chỉ chuyển cách thức sử dụng dịch vụ chứ không hẳn là từ bỏ thế nên thông số trong báo cáo Vietnam IT Landscape 2020 đã thể hiện sự tăng trưởng từ năm này sang năm khác là hoàn toàn hợp lý.
Các bạn có thể truy cập vào báo cáo Vietnam IT Landscape 2020 hoặc nhấn nút xem báo cáo dưới đây để có thể tìm hiểu thêm các thông số báo cáo không chỉ của riêng thị trường vận chuyển và giao nhận 2020 mà còn nhiều ngành liên quan đến công nghệ khác nữa!
Nguồn tổng hợp từ TopDev
Có thể bạn muốn xem:
Xem thêm việc làm IT hấp dẫn từ TopDev!