Có nhiều lý do để người quản lý buộc thôi việc nhân viên mình. Đó có thể dựa trên những đánh giá từ kết quả công việc, sự phù hợp – tính ổn định về lâu dài, phẩm chất nhân viên,… hay bất cứ một lý do nào đó.
Thực tế đã cho thấy, chuyện chấm dứt hợp đồng làm việc với nhân viên mình chưa bao giờ là một quyết định dễ dàng với các nhà quản lý. Tuy nhiên, với một nhân viên có những biểu hiện sau, việc sa thải là điều hiển nhiên phải thực hiện.
Những nhân viên tệ trong quá trình làm việc sẽ có xu hướng phàn nàn, than vãn về nhiều việc diễn ra xung quanh. Có thể là đồng nghiệp, môi trường làm việc, khối lượng công việc đảm nhận và trong mắt họ, không có gì là hoàn hảo. Và nếu để kéo dài, họ có thể là những tạo ra những ảnh hưởng tiêu cực đến với sự phát triển của tổ chức/doanh nghiệp.
Cụ thể họ có những biểu hiện hành vi như sau:
1. Thường xuyên tìm kiếm nhiều điều để khiếu nại, phàn nàn về những sai lầm của đồng nghiệp.
2. “Tạo sóng” bằng cách lan truyền những tin đồn tạo ra sự thị phi
3. Nói xấu sau lưng đồng nghiệp.
Không những thế, những nhân viên này đôi khi còn đòi hỏi quá nhiều điều về các nhu cầu khác nhau. Có thể họ sẽ đòi hỏi về mức lương trong khi bản thân mình không tự đánh giá được khả năng của mình hoặc đòi hỏi những nhu cầu mà họ xem là cấp thiết như: các thiết bị hỗ trợ, chính sách phúc lợi xã hội,..
2. Thiếu tinh thần trách nhiệm
Không một công ty nào mong muốn nhân viên của mình thiếu trách nhiệm với công việc cả. Và để tránh làm ảnh hưởng đến tinh thần làm việc của mọi người và ảnh hưởng lớn đến chiến lược xây dựng và sự phát triển chung của công ty thì những đối tượng nhân viên có các biểu hiện sau đây cần được xem xét “thanh lọc” sớm:
Hay đổ lỗi cho hoàn cảnh khi chưa hoàn thành tốt nhiệm vụ được giao, đỗ lỗi cho người khác
Thực hiện và giải quyết công việc hời hợt, không tập trung
Luôn viện cớ bào chữa cho những hạn chế, sai phạm do bản thân gây ra
Không hề có sự biểu hiện nào của sự cố gắng
Chiếm dụng quỹ thời gian để làm việc riêng
3. Thiếu tập trung và thái độ
Ngoài năng lực chuyên môn, thái độ sống tích cực thì nhiệt huyết và sự đam mê trong công việc rất quan trọng.
Cụ thể khi một dự án mới được triển khai, họ thường tỏ ra không mấy hứng thậm chí uể oải khi tiếp nhận thông tin. Ngược lại, họ lại tỏ thái độ thiếu hợp tác và họ thuộc kiểu người dễ nản chí khi gặp một chút khó khăn. Chính vì vậy mà nếu tiếp diễn lâu dài họ sẽ truyền đi năng lượng xấu cho các nhân viên khác và ảnh hưởng xấu đến bầu không khí làm việc chung của mọi người.
Sự thiếu nhiệt huyết đôi khi còn được thể hiện thông qua sự lười biếng hoặc thậm chí nhân viên đó nghỉ việc quá nhiều. Một nhân viên tự ý nghỉ việc không lý do chính đáng, thiếu nhiệt huyết trong công việc thì khó có thể hoàn thành tốt nhiệm vụ được giao.
4. Không có tinh thần làm việc nhóm
Việc tập trung vào công việc của mình là tốt, đó cho thấy bạn thật sự có trách nhiệm với phần việc của mình đồng thời cũng là một cách hiệu quả để rèn luyện khả năng tư duy độc lập. Tuy vậy, để phát triển sự nghiệp lâu dài, bạn không phải làm việc độc lập một mình mà cần sự hợp tác nhóm, nên việc giúp đỡ, trao đổi với ai đó là điều cần thiết.
Đặc biệt hơn không riêng gì giới nhân sự, nếu muốn phát triển và thăng tiến trong sự nghiệp thì việc nhân viên phải cọ xát và trải nghiệm nhiều vai trò, vị trí để nắm bắt tốt suy nghĩ, mong muốn của họ là điều thật sự cần thiết. Và làm việc nhóm chính là cơ hội để nhân viên thử sức học hỏi những điều này.
Nếu cứ chỉ chăm chăm làm việc của mình mà không quan tâm đến thành quả chung mang tính đồng đội, không hiểu giá trị của sự cộng tác thì bạn sẽ mãi chậm chân tại chỗ, mãi vẫn là một ngôi sao không bao giờ sáng.
5. Thiếu sự chủ động và sự sáng tạo
Môi trường làm việc năng động và không ngừng cập nhật những xu hướng mới. Vì thế, việc nhân viên cần phải chủ động và rèn luyện tính sáng tạo trong công việc là một điều cần thiết.
Sự chủ động có thể hiểu là sự linh hoạt trong suy nghĩ dẫn đến biểu hiện cụ thể qua hành động. Ví dụ như bạn bày tỏ những quan điểm, sáng kiến mới về vấn đề, mạnh dạn đóng góp những ý kiến, đánh giá, đề xuất của cá nhân trong các cuộc họp của tổ chức,…. Ngoài ra, việc tự trau dồi thêm kiến thức bổ trợ từ các khóa học chuyên sâu cũng là cách để phát triển năng lực của mình. Tương tự, để có thể tiếp tục theo đuổi công việc, bạn cần có sự sáng tạo để có những lối tư duy mới, tránh những đường hướng cũ. Cá nhân mọi tổ chức doanh nghiệp đều mong muốn nhân viên của họ có tính chủ động và sáng tạo trong công việc.
Đôi khi bạn có thể chưa sáng tạo nhưng sự chủ động có thể thay thế và ngược lại đồng thời, bạn phải có sự thích ứng tốt với công việc, luôn tìm tòi, học hỏi và tự phát triển bản thân theo lộ trình riêng. Hãy thể hiện cho người quản lý thấy sự nỗ lực của bạn như thế nào, sự thay đổi tích cực của bạn ra sao thông qua các thành quả thay vì chỉ mãi thụ động và chậm chân tại chỗ.
Có rất nhiều biểu hiện cho thấy đó là một nhân viên không phù hợp. Tuy nhiên, các nhà quản lý cần sáng suốt trong việc đưa ra những chiến lược để giải quyết kịp thời trước những thái độ của nhân viên. Một chiến lược hợp lý và thể hiện được ủy quyền của nhà quản lý sẽ là bài học sâu sắc cho mỗi cá nhân nhân viên nhìn nhận lại sự thiếu sót của mình, giúp họ hoàn thiện hơn trên hành trình nghề nghiệp.
Mong muốn của dev mọi nhà đôi khi đơn giản chỉ là một trang hosting đủ tính năng, quan trọng là miễn phí để test thôi. Sao không bỏ túi ngay top 13 hosting web, có đủ các chức năng và còn không tốn đồng nào trong list dưới đây? Lưu về ngay để lúc nào cần chỉ cần mở lên dùng thôi nhé.
Infinity Free
Có nhiều lý do khiến Infinity Free đứng đầu bảng Free Web Hosting như là băng thông không giới hạn, tốc độ tải cực nhanh bao gồm lượng uptime của hosting này đạt đến 99%. Ngoài ra yếu tố quan trọng nhất là Disk Space không giới hạn và không hề có ads. Những ứng dụng phổ biến của Infinity Free bao gồm WordPress, Joomla, Drupal, MyBB, PrestaShop, PhpBB. Bạn còn có thể host 10 tài khoản email miễn phí và 400 cơ sở dữ liệu MySQL với không gian không giới hạn.
FREEHOSTIA
Tương tự với Infinity Free nhưng Freehost có những giới hạn và đặc tính riêng. Freehostia cho phép web hosting cloud miễn phí. Người dùng có thể host 5 domains mỗi tài khoản với 250MB mỗi Disk Space (dung lượng lưu trữ) và 6GB băng thông hàng tháng.
000webhost
000webhost là trang web hosting miễn phí với Cpanel, hoàn toàn free với PHP, MySQL, cPanel và không có ad. Ngoài ra 000webhost đảm bảo lượng Uptime 99.9%, 1Gb Disk Space và 10Gb băng thông.
BYET
Byet cho phép dịch vụ hosting web miễn phí không ads bao gồm PHP, MySQL, FTP, Vistapanel. Bạn có thể tham khảm domain “yoursite.byethost.com” và 7 lựa chọn khác trang này đưa ra. Mục tiêu hàng đầu của BYET là dẫn đầu các trang server về Uptime, họ cho phép PHP 5.4 đến 7.0. Free FTP, MySQL. Ngoài ra người dùng có thể xây dựng tính năng build SEO để cải thiện điểm tối ưu hóa công cụ tìm kiếm (SEO).
Googiehost
Cũng như Byet, Googiehost cho phép host web free với Cpanel, nhiều tính năng với những công nghệ mới nhất. Googiehost cung cấp storage lên đến 1000 MB SSD với băng thông không giới hạn bao gồm Uplink 100MBPS. Họ cung cấp những tài khoản email doanh nghiệp miễn phí không giới hạn, người dùng có thể tạo Subdomain thoải mái.
Freehosting.io
Freehosting.io cung cấp dịch vụ shared hosting hoàn toàn free cùng những tính năng bảo mật tốt nhất và dịch vụ hỗ trợ 24/7, với hơn 50+ địa điểm server trên toàn thế giới. Hiện nay đang có khoảng hơn 70 nghìn website đang chạy trên nền tảng Freehosting.io mà không có Downtime.
Với lượng Disk Space và băng thông vô hạn, người dùng có thể sử dụng bao nhiêu tùy thích, ngoài ra họ còn có thêm tính năng Drag and Drop (kéo thả) đi kèm với rất nhiều template. Với 3 bước sau bạn có thể dựng một trang web miễn phí:
Đăng ký: tạo tài khoản và bắt đầu tiến trình.
Xác thực email: xác nhận email đăng ký bằng cách click vào đường dẫn trong Inbox.
Tạo website: bạn đã hoàn tất mọi thủ tục để có website cho riêng mình.
UltimateFreeHost
Như tên gọi, UltimateFreeHost cung cấp Disk Space, băng thông vô hạn và không giới hạn tài khoản email. Người dùng có thể tạo cơ sở dữ liệu MySQL vô hạn & Cpanel Access để quản lý tốt hơn. Ngoài ra UltimateFreeHost cung cấp Free Domain, Subdomain hoàn toàn free, không giới hạn. Bạn cũng không cần viết code để tạo website vì UltimateFreeHost có Zyro website builder, một tính năng phát triển miễn phí. Ngoài ra còn có embedded traffic booster để thu hút traffic trên website.
Webfreehosting
WebFreeHosting cung cấp shared hosting miễn phí với tốc độ server khá nhanh. Trang miễn phí Disk Space 1GB và 5GB băng thông. Người dùng có thể chuyển file lên đến 2MB và đảm bảo Uptime 99.9%. Để host, WebFreeHosting cho phép 1 domain và 3 subdomain. Ngoài ra họ cũng cung cấp Cpanel nâng cao và Web Based File Manager. Đối với Email thì có thể host 1 địa chỉ với Filter, SPAM protection, virus protection, ….
BIZ.NF
Biz.nf cung cấp web hosting vừa nhanh và miễn phí từ năm 2008, 1GB Disk SPace và trao đổi dữ liệu 5GB mỗi tháng hoàn toàn miễn phí. Domain sẽ có cú pháp “.co.nf”
Build web trên Biz.nf không hiện ads và chạy 100% trên năng lượng tái tạo. Với 1 Free Hosting Plan người dùng có thể host 4 website (1 domain chính và 3 subdomain).
50WEBS
50webs.com cung cấp website hosting miễn phí đáng tin cậy mà không “dính” banner quảng cáo nào, gồm 500MB Disk Space và 5GB data băng thông hàng tháng. Bạn có thể host 10 domain mỗi tài khoản, và tạo đến 100 tài khoản email khác nhau. 50Webs khá phù hợp cho các beginner đấy.
Freehosting.com
Những tính năng mà Freehosting mang lại sẽ không tìm thấy ở các công ty web khác, khi người dùng có thể tạo bất kỳ loại website nào hoàn toàn free, và được cung cấp đến 10GB Disk Space và băng thông vô hạn. Nền tảng hosting của họ tích hợp với Linux, PHP, APache, MYSQL, …
Trên Freehosting bạn có thể host 1 website và 0 subdomain, tạo được 1 tài khoản email và 1 MySQL database. Việc tạo website cũng không quá khó khăn với Website Builder với hơn 170 template có sẵn. Ngoài ra họ cung cấp thêm các database và tính năng khác nhau như:
MySQL database server
InnoDB storage engine
phpMyAdmin
Unlimited MySQL queries
Unlimited query time
Apache / PHP 7
.htaccess support
All Major Apache modules
All common PHP extensions
Complete PHP functions enabled
PHP Safe mode switched off
60 seconds PHP execution time
200 MB Max upload file size
256 MB Max PHP memory limit
Ngoài ra bạn có thể mua thêm những tính năng khác ngoài những gì trang cung cấp miễn phí.
Free Hosting Eu
Tương tự như Biz.nf, Freehostingeu cung cấp 200MB Disk Space và 4GB data transfer mỗi tháng, ngoài ra còn có 2 website builder hoàn toàn miễn phí. Bạn có thể host 1 domain và 5 subdomains.
Awardspace
AwardSpace được biết đến khá rộng rãi và free cho hầu hết các cách dùng, có thể host đến 4 website một tài khoản miễn phí và được đảm bảo mạng uptime lên đến 99.9%.
Nhúng Google Maps vào web site bình thường thì quá sức đơn giản, để sử dụng với React Js thì hơi vụng công một chút.
Để sử dụng Google Maps API, ta chỉ cần load đoạn js từ googleapis, chèn thêm một cái div với id là map chằng hạn.
<!DOCTYPE html>
<html>
<head>
<title>Basic Google Map on a web page</title>
</head>
<body>
<div id="map"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&"></script>
</body>
</html>
Đoạn script của google sẽ được load sau khi có static DOM, cái <div id='map' /> lúc đó đã tồn tại và có thể được sử dụng thoải mái bởi google maps api.
Tức là nếu làm như cách bình thường ở trên thì cái <div id='map' /> chưa hề tồn tại trên xã hội.
Load bất đồng bộ (Asynchronous Loading)
Cả hai đoạn script React và Google maps đều phải tốn thời gian để load, chúng ta phải đảm bảo Google Map chỉ được tạo ra sau khi React app đã khởi tạo và render DOM xong. Thoạt nhìn thì dùng asyn google map sẽ là một giải pháp.
Chúng ta thêm asyn và defer để load đoạn googleapis này sau cùng, đồng thời thêm hàm callback sau khi load xong. Nếu initMap là một global function thì ta có thể gọi nó bên trong React Component
function initMap() {
map = new google.maps.Map(document.getElementById('map'), { ... });
}
Buồn thay! Không chạy đâu các bạn ạ. Ngay cả khi Google Maps chỉ được load sau khi React được load, không có nghĩa là toàn bộ cây DOM đã được mount và render khi thực thi hàm callback.
Ok, chúng ta cần giải pháp tốt hơn. Về cơ bản
chúng ta muốn load đoạn script của google ngay khi component có sử dụng đến google api được mounted
componentDidMount {
// trỏ global function window.initMap này vào hàm initMap của component để thằng google có thể gọi trong hàm callback
window.initMap = this.initMap;
// chèn ngay đoạn js của googleapis cho anh xài ngay.
loadJS('https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap')
}
initMap = () => {
map = new google.maps.Map(this.refs.map.getDOMNode(), { /* các options khác*/});
}
render {
return (
<div>
<div ref="map" style="height: '500px', width: '500px'"><⁄div>
<⁄div>
);
}
// hàm này để chèn thêm <script /> sau khi gọi
function loadJS(src) {
var ref = window.document.getElementsByTagName("script")[0];
var script = window.document.createElement("script");
script.src = src;
script.async = true;
ref.parentNode.insertBefore(script, ref);
}
Để ý là ta thêm ref='map' để trỏ tới đúng cái div sử dụng để đưa vào cho Google Map constructor bằng hàm this.refs.map.getDOMNode() ngay khi DOM đã render.
Vậy là xong. Google Map đã có thể hoạt động trơn tru với React Component, đúng hơn là với Virtual DOM.
Giải quyết issue với fixed header và scroll đến một element bằng hashtag
Khi sử dụng hashtag # cho attribute href, trình duyệt sẽ scroll tới element có id tương ứng section-two. Đây là một tính năng từ thời trình duyệt mới ra đời.
<a href="#section-two">Section Two</a>
Nhưng một khi chúng ta thêm một element với position: fixed, như header, vị trí scroll đến sẽ ko còn đúng nữa, nó vẫn scroll tới element đó, nhưng giờ nó có thể bị che bởi element đang set fixed.
Có rất nhiều cách để giải quyết vấn đề này trước đây, như thêm vào một đoạn padding vào element, hoặc dùng một đoạn javascript để handle, có tất cả 5 cách để giải quyết con issue này.
Giờ đây chúng ta có cách hoàn toàn mới chỉ với css
Sử dụng 2 thuộc tính mới là scroll-padding và scroll-margin
body {
scroll-padding-top: 70px;
/* giá trị chiều cao của header */
}
Hiện tại cái này chỉ chạy tốt trên trình duyệt dùng Chromiu
Có nhiều người luôn thắc mắc làm gì với nghề này để có mức thu nhập cao hơn và có bước tiến thân cao hơn trong nghề. Người thì lựa chọn cày ngày cày đêm, chạy từ dự án này sang dự án khác; người thì “đi tìm đường cứu thân”, sang một đất nước khác để có cơ hội cao hơn. Nhưng rồi lại gặp khó khăn lớn về ngôn ngữ, đặc biệt là tiếng Anh. Tự lúc nào nỗi sợ học tốt tiếng Anh lập trình đã làm rào cản khiến lập trình viên không dám mơ lớn, ngôn ngữ máy tính mình còn học được mà huống chi ngôn ngữ loài người nhỉ :)))
TÌNH TRẠNG CHUNG
Bạn sẽ rất ngưỡng mộ khi bắt gặp ai đó xì xồ xì xào nói tiếng Anh với người nước ngoài và luôn tự nhủ mình cũng sẽ nói được nếu mình chăm luyện tiếng Anh. Và rồi tức tốc bạn về nhà ngay, lên kế hoạch cụ thể cho bản thân, google search thần tốc các mẹo học tiếng Anh, ghi ghi chép chép, note dán đầy phòng. Chưa kể thấy người ta chia sẻ tài liệu nào hay thì liền download về đến nỗi chật cả máy, và còn rất nhiều ti tỉ cách khác để bạn tự học được tiếng Anh. Nhưng rồi một ngày đẹp trời, chú lười đến rủ rê bạn đi chơi vài hôm, xem phim, cà phê trà sữa với bạn bè, lâu dần bạn lại bỏ xó xấp tài liệu kẹt trong máy và tờ note dính bụi trên tường. Và rồi vòng lặp cứ thế lại diễn ra.
Bạn đừng quá lo, không chỉ có mình bạn mà đó là tình trạng chung của mọi người luôn rồi, kể cả mình – người đang gõ từng dòng chữ bài viết này. Mình may mắn đã thức tỉnh sớm và chia sẻ đến mọi người một số cách tự học tiếng Anh, nếu bạn đang đọc bài viết này có nghĩa bạn cũng đang may mắn lắm đấy *cười*
Tiếng Anh là công cụ tốt nhất hiện nay để giao tiếp với mọi người. Nhiều người học tiếng Anh cảm thấy lo lắng, do dự về việc tự học. Sự thật là, internet không chỉ là nguồn tốt nhất để bạn học tiếng Anh, mà còn là cách dễ nhất để tự học bất cứ khi nào và bất cứ đâu bạn muốn.
Tốt nhất là bạn nên học theo cách riêng của bản thân mình mà không cần phải làm theo lời khuyên của ai khác, hãy bớt phụ thuộc vào ai đó. Trong phim “The Karate Kids”, ông Parker đã nói với cậu bé rằng: “Võ thuật nằm trong chính những hành động hằng ngày của chúng ta”. Tiếng Anh cũng vậy ! Bạn thích nghe nhạc, bạn thích xem phim, bạn thích đọc blog, bạn thích nghe radio hoặc bất cứ gì bạn muốn, mọi thứ như vậy đều giúp bạn học tốt tiếng Anh. Bạn hãy để việc tự học tiếng Anh là điều làm bạn cảm thấy thoải mái, chứ không phải là gánh nặng (hồi nhỏ đã rất ám ảnh việc học để ba mẹ tự hào, để ba mẹ vui rồi, bây giờ lớn bạn không cần phải bắt ép bản thân như vậy nữa).
Để có thể tự thân vận động được bạn hãy cho bản thân một lý do thật sự lớn để học tiếng Anh.
Bước 1: TÌM MỘT LÝ DO DUY NHẤT KHIẾN BẠN PHẢI HỌC TIẾNG ANH
Khi đọc đến đây bạn sẽ nghĩ ra cho mình được rất nhiều lý do nhỉ? Nào là, vì mình muốn được đi nước ngoài này, muốn được tỏ ra bảnh tỏn khi ra phố nói tiếng Anh như gió, vì nhỏ ghệ giỏi tiếng Anh nên mình phải đu theo, ty tỷ lý do. Nhưng bạn hãy tìm một lý do duy nhất trong hàng tá lý do đó, đó phải là lý do quan trọng nhất.
Tại sao lại là quan trọng nhất, vì nếu lý do đó không quan trọng thì bạn sẽ chẳng có động lực nào để học tốt tiếng Anh (nếu bạn có lỡ sa ngã lười biếng). Lý do quan trọng nhất giống như là kim chỉ nam để bạn hướng theo, cũng giống như là cái neo để giữ bạn lại ý.
Vậy làm sao để xác định được lý do quan trọng nhất? Cũng đơn giản thôi, đặt lý do và mục tiêu cuộc sống, nếu song song thì bỏ qua, còn nếu cắt nhau thì đó là lý do quan trọng nhất.
Sau khi xác định được “cái neo”, muốn thuyền đi xa phải có thuyền trưởng chứ.. (từ đây tôi mạn phép ví việc học tốt tiếng Anh như con thuyền nhé !) ý tôi ở đây là bản kế hoạch chi tiết cụ thể để bạn dễ dàng vẽ ra lộ trình học tiếng Anh ấy mà.
Bước 2: LẬP BẢN KẾ HOẠCH CHI TIẾT CỤ THỂ NHỮNG GÌ BẠN MUỐN LÀM BẰNG TIẾNG ANH
Việc bạn lập kế hoạch này hãy dựa trên mục tiêu cuộc sống và lý do quan trọng phía trên. Những mục tiêu trong bản kế hoạch này nên nặng hơn trình độ hiện tại của bạn, vì nếu như bạn lập những mục tiêu rất dễ hoàn thành thì bạn rất khó để cải thiện tiếng Anh. Từng mục tiêu trong bản kế hoạch càng chi tiết càng tốt, não chúng ta vốn đã lười suy nghĩ nên bạn liệt kê càng cụ thể thì bản thân sẽ càng có trách nhiệm hơn, và quan trọng là hãy ghi bằng tiếng Anh cho bản kế hoạch này nhé.
Ví dụ 1 : bạn nên lập kế hoạch như sau:
Within 8 months, I want to be able to read and understand any article in the programming document. (Tôi muốn đọc và hiểu được bất kì bài viết nào của tài liệu lập trình trong vòng 8 tháng tới)
Within 6 months, I want to score at least 6.0 on the IELTS English exam so I can apply and be accepted to an exchange program (Trong vòng 6 tháng, tôi muốn đạt ít nhất 6.0 trong các bài kiểm tra IELTS, để tôi có thể đăng ký tham gia chương trình trao đổi quốc tế)
Within 3 months, I want to be able to talk with English speakers in social situations about everyday topics such as sports, music, films, travel and food. (Trong vòng 3 tháng, tôi muốn nói chuyện với người bản xứ về các chủ để hằng ngày trong xã hội, như thể thao, âm nhạc, phim ảnh, du lịch và thực phẩm)
Bạn có thể sắp xếp thời gian theo chiều ngược lại, miễn sao bạn nhìn vào thấy hợp lý. Mỗi người có cách sống và nguyên tắc riêng mà.
Ví dụ 2: bạn không nên lập kế hoạch như sau:
I want to speak English fluently (Tôi muốn nói tiếng Anh lưu loát)
I want to go to university in another country (Tôi muốn học đại học ở nước ngoài)
Get a girlfriend/boyfriend who speaks English (Tôi muốn có bạn gái/bạn trai nói tiếng Anh tốt)
Kế hoạch quá chung chung, rất dễ gây nhàm chán, không có sự ràng buộc nào cho bạn và bạn cũng sẽ không có lý do nào giúp níu kéo bạn trong việc học tốt tiếng Anh.
Nếu bạn có giới hạn thời gian, thì bạn có thể đánh giá sự tiến bộ của bạn trong quá trình học và tìm hiểu xem bạn có cần thay đổi thói quen để đáp ứng mục tiêu của mình không. Mỗi mục tiêu tốt đều có thời hạn rất rõ ràng.
Neo có rồi, thuyền trưởng có rồi, bạn cần phải có thuyền thì mới khởi hành ra khơi được.
Bước 3: TÌM TÀI NGUYÊN HỌC TIẾNG ANH
Bước này rất quan trọng, là chìa khóa giúp bạn học tiếng Anh nhanh chóng. Nếu như trình tiếng Anh của bạn chỉ ở mức cơ bản hoặc trung cấp, thì đừng nên cố gắng đọc những bài viết trên trang The Verge (bật mí là nó sẽ làm mất động lực ngay vì nó khá khó so với trình độ hiện tại của bạn, toàn thuật ngữ chuyên ngành mà thôi). Thay vào đó, bạn có thể nghe những câu chuyện tin tức tiếng Anh rõ ràng, dễ hiểu trên DZone, NETTUTS, Web Designer Wall, và một số trang web khác dành cho việc học tiếng Anh lập trình
Hãy chắc chắn rằng các nguồn tài nguyên học tiếng Anh này không quá dễ, vì nếu như bạn học những thứ dưới level hiện tại sẽ dễ khiến bạn nản và (có thể) sinh ra chứng tự mãn, nên hãy chọn nguồn học phù hợp với bản thân nhưng không quá khó. Nếu bạn là một người được nói tiếng Anh, việc đọc sách truyện thiếu nhi hoặc Wikipedia bằng các article tiếng Anh đơn giản sẽ khiến bạn cảm thấy tự tin hơn, và còn làm phong phú vốn từ, cấu trúc nữa. Bạn thực sự có học tiếng Anh không nếu như chỉ thấy những từ đã biết.
Bạn hãy lựa chọn những bài viết mà bạn lướt qua có thể hiểu ý tác giả muốn nói nhưng cũng đủ khó để bạn phải tra cứu nhiều từ nếu bạn muốn hiểu chi tiết tường tận. Hãy cứ tìm kiếm, hãy cứ dại khờ :))) cho đến khi tìm được nguồn tài liệu phù hợp với trình độ của bạn.
Có một lưu ý nhỏ trong này đó là hãy tìm nguồn tài liệu match với mục tiêu của bạn
Xem phim, show truyền hình
Chắc chắn rằng mọi thứ bạn tìm kiếm đều gần với mục tiêu của bản thân. Nếu mục tiêu của bạn là nói chuyện, giao tiếp tiếng Anh như người bản địa, thì bạn nên xem phim hoặc các show truyền hình (nhưng phải bằng tiếng Anh nha :D). Lúc đầu chắc hẳn sẽ gặp nhiều khó khăn, không sao đừng quá lo, bạn có thể bật phụ đề lên để vừa nghe được và cũng vừa biết được cấu trúc câu, thành ngữ và cụm từ đặc biệt (idioms and phrases) trong tiếng Anh. Khi bạn đã quen thuộc hơn và hiểu những gì diễn viên nói thì hãy xóa phụ đề và xem lại bộ phim một lần nữa để kiểm tra khả năng hiểu tiếng Anh của bạn. Đừng chán khi phải xem lại nhiều lần, hãy chọn bộ phim mà bạn cảm thấy hứng thú, tò mò về nó, mỗi khi bạn xem lại biết đâu được bạn lại học được bài học nào đó.
Bản thân mình thì thích xem các thể loại hack não (càng khó hiểu càng tốt), bạn nào như mình thì có thể xem Inception, hoặc The Prestige (nếu có xem xong rồi thì cho mình biết cảm nhận như nào nha, với mình thì thấy đã lắm :D). Hoặc thể loại tình cảm, mình gợi ý phim Me before you; Love, Roise;…. bla bla, bạn cứ lên google search nhiều lắm.
Ngoài ra, có một cách khác để bạn hiểu tường tận bộ phim hơn. Tưởng tượng ra sao nếu một ngày cầm trên tay kịch bản của các bộ phim bom tấn, như Avengers; Parasite, The Internet Movie Script Database (IMSDb) có một danh sách các kịch bản bộ phim mà bạn tha hồ chọn, đơn giản chỉ cần tìm kiếm bất kỳ bộ phim nào đó và đọc cùng lúc khi bạn xem phim, một trải nghiệm thú vị mới lạ ha :))
Xem video Youtube
Ngoài xem phim ra thì có ty tỷ thứ trên Youtube, nhưng hãy search keyword bằng tiếng Anh thì mới ra nhiều nguồn được nhé! Bạn cũng có thể xem các cuộc phỏng vấn và đánh giá trên youtube, sẽ giúp bạn làm quen với tiếng Anh đàm thoại và cách bạn giao tiếp với người khác như thế nào.
Tôi gợi ý nho nhỏ, nếu bạn mệt mỏi với việc xem, học mọi thứ bằng tiếng Anh thì bạn nên seach một vài video tiếng Việt nhưng đúng với công việc hiện tại của bạn (như kênh youtube TopDev TV chẳng hạn), vừa thư giãn vừa update kiến thức
Chán xem phim thì âm nhạc là lựa chọn giúp bạn vừa thư giãn vừa học tiếng Anh hiệu quả. Thực tập với các bài hát trending nổi tiếng thì tốt hơn vì bạn luôn nghe chúng ở bất cứ không gian nào, trong xe hơi, trong tiệm tạp hóa, hay trung tâm thương mại (vì chúng không phải là nhạc đặc thù nên phù hợp với mọi hoàn cảnh). Bạn nên tránh nghe rock và rap vì lời bài hát thường mù mờ, tiết tấu nhanh, khó nghe
Kiểm tra ngữ pháp tiếng Anh bằng các câu đố trực tuyến
Khi bạn tự học, một vấn đề xảy ra là bạn có thể bỏ lỡ những lỗi và sai sót mà bạn mắc phải. Một cách dễ dàng để tự kiểm tra là làm các câu đố tiếng Anh trực tuyến. Những câu đố này sẽ kiểm tra ngữ pháp, xây dựng câu dễ dàng hơn.
Chat, tám chuyện với người nước ngoài
Trò chuyện với bạn bè trực tuyến là một cách thú vị để tự học tiếng Anh, nó khác với việc nói chuyện với giáo viên, hoặc học trên lớp, hoặc thậm chí sử dụng tiếng Anh tại nơi làm việc vì nó thoải mái, và ngôn từ dễ sử dụng. Trò chuyện là một cách tuyệt vời để học tiếng Anh vì bạn có thể thực hành những gì bạn đã học theo cách giản dị, không căng thẳng. Thông qua trò chuyện trên bàn phím, bạn có thể kiểm tra các lỗi ngữ pháp trước khi nhấn nút Enter. Ngoài ra, việc bạn bè của bạn nói tiếng Anh với bạn là động lực thúc đẩy hơn cho bạn. Bạn không chỉ có thể chứng minh với họ rằng tiếng Anh của bạn ngày càng tốt hơn, mà bạn còn cảm thấy thỏa mãn hơn khi biết rằng bạn có thể nói tiếng Anh thoải mái với bạn bè bất cứ lúc nào.
Đọc e-book, báo, tạp chí online
Đọc cũng quan trọng như nghe khi học tiếng Anh. Đọc và nghe vừa làm sắc nét tâm trí vừa rèn luyện bạn suy nghĩ bằng tiếng Anh.
Những người nói tiếng Anh không phải là người bản ngữ luôn phải dịch tiếng Anh trong tâm trí, điều này gây ra sự chậm trễ trong phản ứng. Tuy nhiên, nếu tâm trí được đào tạo để suy nghĩ bằng tiếng Anh điều này giúp dễ dàng trong việc hiểu và nói ngôn ngữ. Bạn càng đọc nhiều, bạn càng tiếp xúc nhiều hơn với cấu trúc câu tiếng Anh, từ vựng mới có nghĩa là bạn có rất nhiều câu để lựa chọn khi bạn bắt đầu nói tiếng Anh.
Internet là một kho tàng sách điện tử, bài báo và tạp chí tiếng Anh. Tìm một tài nguyên với một chủ đề mà bạn thực sự quan tâm. Mà không chỉ Internet, Google là một kho tàng không đáy nữa, “dân ta phải biết sử ta, nếu mà không biết thì tra google”, bạn muốn gì cứ lên google là có tất, chỉ có điều bạn có kỹ năng search google hay không thôi :)))
Nó không phải là một bài báo được xuất bản trực tuyến, bạn chỉ cần bắt đầu với những điều cơ bản diễn ra xung quanh, có thể hiểu như là một nhật ký hằng ngày (daily diaries) vậy ý. Viết tác phẩm của riêng bạn kết hợp tất cả việc học của bạn với nhau với tất cả những gì bạn biết về ngữ pháp tiếng Anh, từ vựng và hiểu biết tổng thể.
Sau khi viết, hãy tự kiểm tra lại xem có lỗi nào không. Để làm điều này, tốt nhất là đưa những gì bạn vừa viết vào một tệp để bạn có thể sử dụng các chương trình kiểm tra ngữ pháp để xác định vị trí lỗi.
Có nguồn học xong xuôi hết rồi thì bước cuối cùng này cũng là bước quan trọng lắm đấy.
Bước 4: THỰC HÀNH MỖI NGÀY
Vì sao lại thực hành mỗi ngày, vì những lý do sau đây:
Tạo động lực: Nếu bạn làm điều gì đó mỗi ngày, nó sẽ trở thành thói quen. Một khi bạn tạo thói quen, bạn sẽ có động lực để tiếp tục thói quen đó.
Tiết kiệm thời gian: Khi bạn chỉ học một hoặc hai lần một tuần, bạn sẽ quên rất nhiều điều mới bạn đã học trong buổi học trước. Vì vậy, bạn phải lãng phí rất nhiều thời gian có giá trị của mình để xem xét những thứ bạn đã học. Nếu bạn học mỗi ngày, tài liệu mà bạn đã học ngày hôm trước sẽ tươi mới trong tâm trí bạn, điều đó có nghĩa là bạn sẽ dành ít thời gian hơn để xem xét.
Lời nhắn nhủ: ĐỪNG BỎ CUỘC
Tôi biết bạn có thể học tiếng Anh hiệu quả, thậm chí là học tốt hơn cả tôi (tôi đã già rồi !). Làm sao tôi biết ư? Bởi vì hàng triệu và hàng triệu người trên khắp thế giới đã chứng minh rằng điều đó xảy ra được. Bạn càng luyện tập, càng mắc lỗi, càng nói, bạn càng nhanh chóng thông thạo tiếng Anh. Vậy tại sao không bắt đầu ngay hôm nay?
Chúc bạn thành công trên con đường học tốt tiếng Anh này !
Làm sao để sử dụng previousElementSibling để biết được position của phần tử đó của mảng, ngoài ra còn dùng bằng jquery để code (không chuyên sâu lắm);
Khi code previousElementSibling này mục đích chính của nó là phục vụ cho code slide và các sự kiên hover mà nhiều phần tử hoạt động, theo mình nó vẫn là quan trọng với 1 số html devolop
Khi code cái này chúng ta cần biết được cái gì là phần tử đang hoạt động, để tìm ra cái thằng đứng sau ngay nó
Những kinh nghiêm thú vị hơn là khi ta code mấy phần tử này ,chúng ta nên để nó là:
opacity : 0;
visibility: hidden;
Cho tất cả biến mất đi khi đó để nó hoạt động, bạn muốn cái phần tử mẹ nào hoạt động thì cho một cái class gì gì đó và vào css set cho nó là:
opacity : 1;
visibility: visible;
Nó có thể giảm tối thiểu việc hiệu ứng slide, vậy là xong cái css việc còn lại là chỉ cần set Jquery (or JavaScript) sao cho theo ý định của mình.
Nếu ai muốn dùng kiểu button để điều chỉnh các slide thì mình sẽ đưa ra ngay đây.
Vẫn tiếp tục với cái souce code đau não lúc nãy thì nó sẽ có 3 cái btn tượng trưng cho 3 cái phần tử trong slide.
Nó như thế này:
Thường khi dùng btn của slide ta thường đặt tên class giống nhau cho dễ xử lý. Để xử lý cái này ta cần biết cái vị trí btn trong cái arr mà khách hàng click vào là bao nhiêu ; bằng cách như thế này: (JavaScript and Jquery)
var btn = document.getElementsByClassName("btns-vt2");
for(var i =0 ; i < btn.length ;i++){
btn[i].onclick=function name(params) {
var is=0;
var this_slide=this;
for( is = 0 ; this_slide=this_slide.previousElementSibling;is++){
//cái này chính là cái thuật toán tính vị trí đấy
}
for( us = 0 ; us < $(".one_team").length;us++){
// vòng này thì nó lại khác trước khi mà click vào thì phải
xóa all các phần tử trong đó
$(".one_team").eq(us).removeClass("run");
}
$(".one_team").eq(is).addClass("run");
}
}
Và nếu theo Jquery thì mình làm theo thuật toán của mình là như sau (cái này hơi dài đây là một souce code khác nên các bạn cố hình dung nhé!!)
$(".one_people").hover(function name (params) {
var stt=0;
var te= $(this);
for(var is=0; is<$(".one_people").length;is++){
if($(".one_people").eq(is).html()==te.html()){
stt=is;
}
}
$(".imgs_vt2").eq(stt).addClass("gout");
$(".text_vt2").eq(stt).addClass("over");
$(".imgs_vt2").eq(stt).removeClass("ungout");
$(".text_vt2").eq(stt).removeClass("unover");
Cái này là một ví dụ cho cái hover mà nhiều phần tử chuyển động như mình nói trên ấy sau đó bạn thích add gì thì add, theo mình để các hiệu ứng đẹp hơn thì cần thuần thạo cái animation ;
Một toán tử phình phường có thể làm chúng ta điêu đứng
Như mọi thứ ngôn ngữ lập trình, ngôn ngữ toán học, Javascript dùng dấu + để thực hiện cộng giá trị. Tuy nhiên, vì là Javascript, anh có quyền không đi theo quy chuẩn chung, anh còn được dùng cho việc nối chuỗi
Một câu hỏi nhỏ dành cho bạn: Bạn có thường hay than vãn, tâm sự về tất tần tật những chuyện buồn vui trên công ty với các hội anh em/bạn bè của mình không? Khỏi nói cũng biết, tất nhiên là có rồi, bản thân TopDev cũng nghe nhiều phản hồi thú vị xoay quanh môi trường nhân sự đấy!
Niềm vui có, nỗi buồn có, khen chê đều có. Tuy nhiên, những gì TopDev ghi nhận được là những người mới bắt đầu đi làm hoặc đi làm chưa lâu, họ có xu hướng chê công ty của mình nhiều hơn là đánh giá cao tiềm năng của công ty:
Công ty dùng công nghệ cũ xì khiến việc vận hành không hiệu quả. Công ty gì phúc lợi kém quá, lại hay kì kèo.
Đồng nghiệp thì ba gai đủ chuyện. Sếp thì thiếu quan tâm thậm chí không hề hiểu nhân viên.
Công việc dồn dập và tình trạng nước đến chân mới nhảy liên tục diễn ra.
Đôi khi công việc quá nhàn hạ, không rõ định hướng và bản thân nhân viên không phát triển được.
Nói chung là có vô vàn thứ để chê. Và TopDev đang thuật lại những suy nghĩ của một nhóm người đang trong giai đoạn tiếp cận môi trường mới. Thật ra, việc bạn là ai và làm gì, làm ở môi trường nào cũng đều có những ý nghĩa riêng cả. Liệu các bạn có thay đổi suy nghĩ của mình về các công ty không? Cùng TopDev xem hết bài viết nhé!
Tốt nghiệp một ngôi trường Đại học danh tiếng cùng tấm bằng cử nhân, bạn bắt đầu đi làm tại một công ty cũng có chút tiếng tăm. Rồi chuyện gì xảy ra tiếp theo. Bạn than phiền: Công ty gì lương thấp quá vậy, công việc thì thiếu sáng tạo mà suốt ngày cứ đòi hỏi nhân viên này nọ.
Trải nghiệm đầu về chuyến hành trình chinh phục công việc mơ ước kết thúc khi bạn quyết định rời khỏi công ty. Rồi kế đến, bạn lại “nhập gia tùy tục” tại một công ty với quy mô lớn hơn. Giai đoạn đầu là những chuỗi ngày êm đềm đúng nghĩa. Tuy nhiên sau đó, bạn chợt nhận ra, bản thân mình lại tiếp tục chê công ty:
1. Công ty gì lớn mà lương thưởng không có.Task thì nhiều – Deadline thì dí nhân viên mà lương OverTime tương ứng con số 0 tròn trĩnh
2. CEO đúng là có tố chất nhưng ngược với lãnh đạo thì lúc nào cũng lãnh đạm với nhân viên
3. Lương thì thấp, làm lâu mà không được tăng lương nhiều
Tiếp tục vòng quay trải nghiệm, bạn lại “bay” sang một công ty khác. Ở đây lương cao hơn, trả đúng hạn, quá tốt rồi nhưng không, bạn lại than phiền chuyện khác:
Đồng nghiệp nhiều gì mà hơn thua, coi thường người khác, thiếu thân thiện
Công ty gì cứ liên tục thay đổi yêu cầu, thích chỉ định và không lắng nghe tiếng nói của nhân viên
CEO phởn phơ và nhàn rỗi “đi dạo” vòng quanh giám sát nhân viên, ai mà tập trung làm việc được
Các bạn có nhận ra điều gì không? Việc các bạn chê trách hay than vãn về công ty của mình bắt nguồn từ những “viễn cảnh tươi đẹp” mà các bạn đã vẽ ra trước khi bắt đầu trải nghiệm cuộc sống của một nhân viên. Hãy nhớ rằng, công ty cũng giống như một xã hội thu nhỏ. Nơi đó bạn sẽ tiếp xúc nhiều người, nhiều cái mới hơn. Việc quan trọng nhất của bạn lúc này là học cách thích nghi với môi trường làm việc. Đồng thời, bạn hãy mang trong mình những suy nghĩ tích cực hơn, loại bỏ những định kiến, cảm xúc tiêu cực về công ty. Điều này giúp bạn tìm ra được ý nghĩa thật sự trong vấn đề trải nghiệm công việc.
Hãy khai thác những khía cạnh tích cực và chấp nhận một điều: Công ty nào cũng có vấn đề cả!
Việc bạn điều chỉnh suy nghĩ sẽ tạo ra những thay đổi lớn. Hãy thử nhìn vào những mặt tốt của công ty xem, biết đâu bạn sẽ biết thêm nhiều điều thú vị.
Ngồi ngẫm nghĩ lại, bạn lại nhận ra công ty mình cũng có điểm tốt đấy chứ:
Cũng có đồng nghiệp vui tính, lại thông tin, giỏi chuyên môn IT và giúp đỡ mình nhiều
Công việc nhiều nhưng mình biết cách cân bằng, nắm được những phần core quan trọng. Môi trường cũng khá năng động giúp mình nhanh lên trình hơn
Mình được chọn tham dự mấy khóa học đào tạo chuyên môn, tận mắt thấy những quy trình công nghệ hiện đại và còn được gặp gỡ nhiều nhân vật nổi tiếng là các chuyên gia hàng đầu trong lĩnh vực nhân sự IT nữa
Một điều bạn nên biết là bất kỳ một công ty nào cũng có vấn đề cả. Điều quan trọng là bạn có tinh tế nhận ra được và chấp nhận nó hay không. Những vấn đề đó có thể xuất phát từ nhiều chiều và trở thành đặc tính chung của mọi quy mô tổ chức/doanh nghiệp.
Như đã nói trước đó, vì là giai đoạn trải nghiệm công việc, bạn hãy học cách thích ứng sao cho phù hợp với môi trường. Bất kỳ ai cũng đều có những định hướng cụ thể để thăng tiến trong sự nghiệp và bạn cũng không ngoại lệ. Hãy tập trung phần mình và cố gắng tạo ra những giá trị. Về chuyện các vấn đề tồn đọng, nếu là một nhân viên có bản lĩnh thì việc giải quyết chúng chỉ còn là thách thức về thời gian đối với bạn mà thời.
Hãy biến thách thức thành cơ hội
Thay vì suy nghĩ về những điều tiêu cực, bạn hãy biến nó thành cơ hội để bạn thể hiện năng lực của mình:
Nếu quy trình không rõ ràng? Đừng lo, hãy chủ động kêu gọi và ngồi lại với team để thảo luận, đóng góp các ý kiến nhằm tạo ra một quy trình phù hợp hơn
Nhân sự thiếu kỹ năng cả về chuyên môn lẫn kỹ năng mềm? Bạn đừng chê nữa, hãy mở lòng giao tiếp với họ. Bạn có thể tìm hiểu những mong muốn của họ để rồi trình bày lại với nhà quản lý/lãnh đạo nhân sự. Biết đâu các đồng nghiệp đang chờ một người biết chủ động và không ngại thể hiện mình như bạn đấy
Nhân thấy hệ thống tổ chức chưa thật sự thích hợp? Chỉ đơn giản là bạn chia sẻ với các manager, leader, cùng họ phân tích và đề xuất những phương án mới, có tính khả thi hơn
Đấy! Khó khăn nào rồi cũng có cách giải quyết thôi, phải không nào! Thách thức được tạo ra để bạn thử sức và trải nghiệm mình. Cũng có thể nói thách thức chính là cơ hội. Vì thế, bạn nên tận dụng những thách thức để tạo ra những giá trị riêng cho bản thân mình. Việc chấp nhận các thách thức, thay đổi suy nghĩ tích cực hơn và học cách thích nghi linh hoạt với môi trường sẽ giúp bạn có những trải nghiệm tuyệt vời trong công việc của mình.
Lời kết:
Điều mấu chốt bạn cần nhớ là đừng áp đặt quá nhiều suy nghĩ của bạn về môi trường làm việc của công ty. Và cũng đừng so sánh công ty này với công ty khác. Mỗi công ty đều khác nhau và tất nhiên chúng đều có những vấn đề riêng khó thay đổi. Hãy thích nghi và giảm thiểu những xúc cảm tiêu cực để mỗi ngày làm việc đều có những niềm vui. Chung quy lại, mọi thứ đều do chính bạn, hãy nhìn nhận đúng đắn và hy vọng bạn sẽ lựa chọn cho mình một công ty phù hợp để đồng hành phát triển lâu dài.
Rất nhiều thư viện Javascript như Angular, React, Vue sử dụng Reactivity, hiểu được reactivity là gì và cách nó chạy sẽ giúp nâng cao kỹ năng lập trình
var vm = new Vue({
el: '#app',
data: {
price: 5.00,
quantity: 2
},
computed: {
totalPriceWithTax() {
return this.price * this.quantity * 1.03
}
}
})
Ở đây khi chúng ta thay đổi giá trị của price, thằng Vue nó sẽ làm 3 thứ
Cập nhập lại giá trị price
Tính lại giá trị total
Gọi lại hàm totalPriceWithTax và cập nhập lại giá trị
Thấy hết sức bình thường, nhưng đó KHÔNG PHẢI LÀ CÁCH CHẠY BÌNH THƯỜNG CỦA JAVASCRIPT
Ví dụ với javascript bình thường
let price = 5
let quantity = 2
let total = price * quantity // kết quả sẽ là 10
price = 20 // gán lại giá trị của price
console.log(`total is ${total}`)
Bạn hãy đoán xem kết quả log ra là mấy? Sẽ là 10 chứ không phải 40 đâu.
Vấn đề là chúng ta cần phải lưu cái cách tính price * quantity này lại ở đâu đó, để chúng ta re-run cách tính này khi gọi lại total, nó sẽ không nên là biến số mà là thành hàm, thì khi đó nếu giá trị price hoặc quantity thay đổi chúng ta sẽ có kết quả total thay đổi theo.
Chúng ta cần một nơi để lưu phần code tính toán kiểu như vậy lại ở đâu đó, để khi price hoặc quantity thay đổi, chúng ta sẽ chạy lại tất cả những gì đã lưu
let price = 5;
let quantity = 2;
let total = 0;
let target = () => { total = price * quantity }
record(); // lưu lại đâu đó để re-run sau này
target(); //
Hàm record chúng ta sẽ implement nó như sau
let storage = []; // đưa toàn bộ các hàm muốn re-run vào mảng này
function record() {
storage.push(target);
}
// hàm để chạy lại tất cả những thứ đã lưu trong store
function replay() {
storage.forEach(run => run());
}
Giải pháp tổng quát hơn
Nếu đã nắm được ý tưởng chính để giải quyết bài toán ban đầu, giờ chúng ta sẽ hiện thực hóa nó bẳng observer pattern, tạo một class để quản lý những chuyện đó
class Dep {
constructor() {
// thay vì là starage, thiên hạ đã thống nhất lấy cái tên subscribers
this.subscribers = [];
}
depend() {
if (target && !this.subscribers.includes(target)) {
// chỉ thêm vào nếu chưa có hoặc không trùng
thiss.subscribers.push(target);
}
}
notify() {
// run tất cả target, tên gọi khác là observer
this.subscribers.forEach(sub => sub());
}
}
Code lại ví dụ trên sử dụng class mới tạo này
const dep = new Dep();
let price = 5;
let quantity = 2;
let total = 0;
let target = () => { total = price * quantity }
dep.depend();
target();
console.log(total); // 10
price = 20;
console.log(total); // 10
dep.notify();
console.log(total); // 40
Chúng ta vẫn còn có thể nâng cấp đoạn code trên, thay vì
let target = () => { total = price * quantity }
dep.depend();
target();
… chúng ta đóng gói nó vào một watcher, sau đó chỉ cần gọi
watcher(() => {
total = price * quantity
})
Implement cái function watcher này như bên dưới
function watcher(myFunc) {
target = myFunc; // active target, target ở đây là global variable
dep.depend(); // đưa target vào dependency
target(); // gọi hàm target
target = null; // reset
}
Tách Dep cho mỗi biến
Chúng ta sẽ muốn mỗi một biến có một Dep riêng, trước tiên ta đưa price và quantity thành property của data
let data = {price: 5, quantity: 2}
Chúng ta sẽ có các Dep khác nhau cho price và quantity
watcher phụ thuộc cả 2 biến
watcher(() => {
total = data.price * data.quantity;
})
watcher chỉ phụ thuộc biến price
watcher(() => {
salePrice = data.price * 0.9;
})
Chúng ta muốn khi giá trị price bị thay đổi, hàm dep.notify của price store sẽ được gọi
>> total
10
>> price = 20 // lúc này thằng notify của price sẽ được gọi liên luôn
>> total
40
Đọc thêm tài liệu về Object.defineProperty nếu chưa biết. Áp dụng nó trong ví dụ này
let data = {price: 5, quantity: 2}
let internalValue = data.price; // giá trị khởi tạo
Object.defineProperty(data, 'price', { // chỉ cho thằng Price Property
get() {
console.log('Em bị access');
return internalValue;
},
set(newVal) {
console.log('Em bị thay đổi');
internalvalue = newVal;
}
})
data.price // call get()
data.price = 20 // call set()
total = data.price * data.quantity;
data.price = 20;
Với cách này, chúng ta có thể chạy kèm một hàm nào đó khi giá trị price được get hoặc set. Với idea là như thế chúng ta tổng quát quá lên cho nhiều biến
let data = {price: 5, quantity: 2}
Object.keys(data).forEach(key => {
let intervalvalue = data[key];
Object.defineProperty(data, key, { // chỉ cho thằng Price Property
get() {
console.log('Em bị access');
return internalValue;
},
set(newVal) {
console.log('Em bị thay đổi');
internalvalue = newVal;
}
})
})
total = data.price * data.quantity;
data.price = 20;
Tổng hợp các ý tưởng chính
total = data.price * data.quantity
Khi một đoạn code như vậy được chạy, nó sẽ get giá trị của price, chúng ta muốn thẳng price khi bị thay đổi hoặc gọi, nó sẽ re-run một function
Ở Get: nhớ dùm cái function này, bọn tao sẽ nhờ mày chạy lại
Ở Set: chạy cái function mày đã giữ hộ ấy, thay đổi giá trị luôn nhé
Và đây là toàn bộ code
let data = {price: 5, quantity: 2};
let target = null;
// Dep không thay đổi gì so với ở trên
class Dep {
constructor() {
// thay vì là starage, thiên hạ đã thống nhất lấy cái tên subscribers
this.subscribers = [];
}
depend() {
if (target && !this.subscribers.includes(target)) {
// chỉ thêm vào nếu chưa có hoặc không trùng
thiss.subscribers.push(target);
}
}
notify() {
// run tất cả target, tên gọi khác là observer
this.subscribers.forEach(sub => sub());
}
}
// chạy qua từng data của property
Object.keys(data).forEach(key => {
let intervalvalue = data[key];
// mỗi em một Dep
const dep = new Dep();
Object.defineProperty(data, key, { // chỉ cho thằng Price Property
get() {
dep.depend(); // lưu hộ tao cái
return internalValue;
},
set(newVal) {
internalvalue = newVal;
dep.notify();// re-run đi em
}
})
})
// watcher sẽ không còn gọi dep.depend nữa
function watcher(myFunc) {
target = myFunc;
target();
target = null;
}
watcher(() => {
data.total = data.price * data.quantity;
})
Bài viết dành cho những người nghiện tốc độ, nghiện cách viết ES6, cùng điểm qua 3 lỗi thường gặp dẫn đến ảnh hửởng performance trong Javascript.
1. loop qua một array
Chúng ta thử xem thời gian tiêu tốn cho việc loop qua 10k item trong array
for: ~10 microseconds
while: ~11 microseconds
forEach: ~77 microseconds
for-of: ~110 microseconds
reduce: ~113 microseconds
Nếu muốn tính tổng của một array thì sử dụng reduce là rõ ràng, tuy nhiên cái giá phải trả quá lớn. Vòng lặp mới nhất từ ES6 for-of cũng về áp chót. Như vậy cứ xài vòng for kinh điển, tuy cũ mà nhanh gấp 10 lần cái for-of
Khi thế giới đang tồn thờ tư tưởng immutable function ( không sửa cái input khi cho ra output ), việc duplicate một input array là chuyện thường ngày ở huyện.
Chúng ta hãy xem kết quả tất cả các cách chúng ta có thể dùng để duplicate một array
[].concat(arr): ~366 microseconds
arr.slice(): ~367 microseconds
arr.map(x => x): ~469 microseconds
[...arr]: ~512 microseconds
Array.from(arr): ~1,436 microseconds
Như vậy 2 phương thức cũ như dưa mắm concat và slice vẫn dành chiến thắng, kiểu spread operation mới ES6 vẫn top cuối.
…cái thứ 2, rất quan trọng, là stack, nó sẽ cho ta history các phương thức và file đã gọi qua.
Error: please improve your code
at Object.<anonymous> (/Users/gisderdube/Documents/_projects/hacking.nosync/error-handling/src/general.js:1:79)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
Nếu chúng ta không tự xử lý các trường hợp có lỗi, nó sẽ chết ngay chổ đó, để tránh tình huống này, tìm hiểu một số cách bắt lỗi
Học lập trình cho Fullstack Developer – Theo thống kê mỗi anh em lập trình viên trung bình dành 15-25 phút vi vu trên Youtube. Để không lãng phí 30 phút mỗi ngày thời gian fix bug và kiếm gấu, anh em nên save lại ngay list tổng hợp các kênh học lập trình ngon-bổ-hoàn toàn miễn phí dưới đây.
Chia sẻ kiến thức, kinh nghiệm về ngành lập trình, cuộc sống của lập trình viên. Có rất nhiều tutorial hay ho và gần gũi, thậm chí những người hoàn toàn không biết gì về code cũng có thể học lập trình.
CODEAHOLICGUY
Hoàng Nguyên – chủ blog codeaholicguy rầm rộ trong giới dev. Đây là kênh Vlog chia sẻ về kiến thức và cuộc sống lập trình viên truyền động lực cho những anh em muốn phát triển con đường coder.
KTEAM
Chanel hướng dẫn lập trình từ cơ bản đến nâng cao đa dạng ngôn ngữ lập trình C, C++, SQL server,… dành cho người không vững lập trình. Một kênh hoàn toàn miễn phí anh em newbie không thể bỏ qua.
ZENDVN – HỌC LẬP TRÌNH ONLINE
ZendVN thực chất là một kênh học lập trình trực tuyến, và channel Youtube này chia sẻ miễn phí các video tự học trên rất nhiều ngôn ngữ lập trình: NodeJS, Angular, VueJS, Python, PHP, HTML CSS, Javascript, ReatJS,…
Không chỉ chia sẻ về những kiến thức lập trình, TopDev TV Channel còn có nhiều nội dung liên quan đến các kỹ năng mềm dành cho lập trình viên ở đủ mọi trình độ. Một kênh youtube giúp các bạn có thể được học hỏi kinh nghiệm từ các chuyên gia hàng đầu tại Việt Nam.
Khó có một kênh Youtube miễn phí với chất lượng video được đầu tư như vậy. Anh em có thể tham khảo nguồn tự học về php, zend framework, laravel framework, lập trình android, … Ngoài ra kênh còn chia sẻ kiến thức sử dụng github cũng như một số bài tập để luyện tập sau khi kết thúc khoá học.
Với câu slogan cực chất: “Học lập trình dạy cho ta cách suy nghĩ”, không chỉ là một channel gồm video tutorial kiến thức về C, C++ và cấu trúc dữ liệu mà đây còn là nơi chia sẻ những kĩ năng nghề nghiệp bổ ích cho các anh em lập trình.
Đây là kênh gồm video chia sẻ kiến thức: C, C++ chi tiết từ cơ bản đến nâng cao đòi hỏi người xem phải nghiền ngẫm và thực hành mới thành công được. Tôn chỉ của channel: “Có tư duy mới thành công.”
Nếu bạn đang muốn học về HTML, CSS, WordPress từ cơ bản thì hãy tham khảo ngay channel của Thạch Phạm. Kênh gồm các video hướng dẫn từ khái niệm đến thực hành việc sử dụng WordPress, thủ thuật WordPress và đánh giá các plugin WordPress, review hosting.
Những ngày gần đây, giới Nhân sự đang phải đối mặt với nhiều nguy cơ do diễn biến của dịch bệnh Covid-19 ngày càng phức tạp. Thách thức lớn nhất đối với các phòng nhân sự lúc này chính là phải có nhiệm vụ đưa ra các giải pháp khả thi nhằm cân bằng các mối lo ngại về an toàn lực lượng lao động với việc duy trì hoạt động doanh nghiệp như bình thường. Vì thế, họ cần phải hành động nhanh chóng để ứng phó mọi tình huống trước khi một cuộc khủng hoảng về nhân sự có thể diễn ra.
Bài viết sau đây sẽ giải đáp 5 câu hỏi để bạn có sự chuẩn bị tốt nhất về cách tiếp cận hiện trạng của vấn đề nhân sự đồng thời giúp thiết lập và điều chỉnh kế hoạch “tác chiến” trong đại dịch này.
1. Lựa chọn mô hình giải pháp Nhân sự: 50% hay 100%?
Covid-19 tạo ra rào cản lớn đối với các doanh nghiệp vì các triệu chứng mà chúng gây ra. Phải mất từ 2 đến 14 ngày sau khi tiếp xúc với người nhiễm bệnh, các triệu chứng mới quá phát, mở ra cơ hội lây lan trên diện rộng của doanh nghiệp. Mặt khác, thời gian phục hồi trung bình của những người bị nhiễm chủng virus mới này là khoảng 2 tuần hoặc có thể lâu hơn tùy vào thể trạng.
Thực tế đó cho thấy, các doanh nghiệp cần lựa chọn và áp dụng mô hình giải pháp nhân sự phù hợp nhất. Thực hiện giải pháp 50% số lượng nhân viên làm việc tại công ty trong một thời gian. Hãy bắt đầu xác định các chức năng nhân sự quan trọng, những công việc có tính trọng tâm để giảm thiểu sự gián đoạn trong quy trình phát triển chung.
Khi nhận thấy tình hình dịch bệnh chưa vẫn chưa được kiểm soát và ngày càng gia tăng thì việc các doanh nghiệp nên làm đó là ưu tiên về tính an toàn cho người lao động. Hãy áp dụng giải pháp “Work from home” – cho phép các nhân viên triển khai và theo dõi các hoạt động nhân sự tại nhà hoặc làm việc từ xa. Đây là cách thức hữu hiệu nhất không chỉ trong công tác phòng- chống dịch bệnh mà còn đảm bảo được tiến độ công việc.
2. Làm thế nào để cân đối: Sức khỏe và hạnh phúc của nhân viên?
Đây được xem là một vấn đề “lớn”. Việc chưa nắm bắt những thông một cách chính xác có thể khiến các nhân viên lo lắng và hoảng loạn, làm ảnh hưởng đến sức khỏe tinh thần và hiệu suất công việc.
Vì thế, việc đưa ra chính sách làm việc từ xa phù hợp với người lao động là điều cần thiết. Hãy đặt vấn đề sức khỏe và hạnh phúc của nhân viên lên hàng đầu bằng cách cung cấp thông tin về các bước cần thực hiện:
Nắm bắt những thông tin cơ bản về Covid-19.
Đặt khăn và chất khử trùng tay có chứa ít nhất 60% cồn xung quanh nơi làm việc kết hợp rửa tay đúng cách..
Thông báo cho nhân viên về những biện pháp phòng ngừa dịch bệnh một cách cụ thể.
Cập nhật các chính sách PTO (chính sách nghỉ phép nhưng vẫn được hưởng lương): Chính sách này giúp hỗ trợ người lao động bị bệnh và kiểm soát, thúc đẩy sự phân bổ công tác quản trị các đầu công việc sao cho hiệu quả.
3. Nếu bệnh tật dẫn đến làm việc từ xa, nhân viên có được đào tạo chéo và đảm nhiệm nhiều công việc không?
Đây cũng là một trong những vấn đề khiến doanh nghiệp đau đầu. Tuy nhiên, việc đào tạo chéo vẫn có thể diễn ra với điều kiện cá nhân thay thế có những hiểu biết cơ bản về công việc của vị trí đã vắng mặt.
Chẳng hạn như, front-end developer có thể hỗ trợ các nhu cầu back-end để duy trì trang web của bạn không vì họ sở hữu chung một background (kiến thức nền) Điều quan trọng là cần xác định được các chức năng chuyên môn nhân sự quan trọng trước khi cân nhắc việc có đào tạo chéo để hỗ trợ họ trong công việc hay không.
Một giải pháp khác có thể khắc phục tình trạng này đó là nhờ vào lực lượng lao động dự phòng (tức nguồn lực đang được quản lý và theo dõi bởi bộ phận nhân sự sau quá trình tuyển dụng). Họ là nguồn lực phù hợp nhất vào thời điểm này vì có thể nắm bắt, học hỏi và nâng cao kỹ năng nhanh chóng.
4. Những phần mềm/công cụ kỹ thuật nào cần thiết cần thiết cho lực lượng lao động tại nhà?
Theo một cuộc khảo sát từ Gartner, 54% các nhà lãnh đạo nhân sự chia sẻ rằng công nghệ và cơ sở hạ tầng kỹ thuật kém là rào cản lớn nhất trong việc tạo ra tính hiệu quả khi thực hiện công việc từ xa. Tùy thuộc vào từng tính chất công việc, lực lượng lao động tại nhà của các doanh nghiệp có nhiều sự lựa chọn trong việc sử dụng các phần mềm hỗ trợ.
Ngoài các thiết bị thiết yếu cần có như: điện thoại, máy tính, tai nghe thì TopDev gợi ý một số phần mềm/công cụ kỹ thuật nổi trội như sau:
Phần mềm gọi hội nghị Skype: Hỗ trợ xây dựng một không gian dành cho những cuộc họp khẩn cấp, thuyết trình quan trọng hoặc các thảo luận có liên quan
5. Thủ tục “cấp tốc” trong công tác nhân sự
Sự mơ hồ là kẻ thù trong bất kỳ tình huống khẩn cấp nào, đó là lý do tại sao bạn nên tập hợp một danh sách các hướng dẫn từng bước cụ phòng ngừa việc nhân viên của bạn không may mắc phải Covid-19 hoặc có tiếp xúc với nguồn dịch bệnh.
Các hướng dẫn bao gồm:
Liên hệ với người quản lý nhân sự để thông báo về kế hoạch di trú của bạn trọng thời gian gần đây.
Ghi nhận những tư vấn, lời khuyên của nhà cung cấp bảo hiểm y tế của công ty bạn.
Tự kiểm dịch hoặc có kế hoạch phòng dịch tại nhà theo quy trình chung của chính phủ để theo dõi tình trạng sức khỏe của bản thân.
Như đã đề cập, không có một khẳng định khi nào đại dịch coronavirus sẽ kết thúc. Các doanh nghiệp cần được thông báo khi tình hình phát triển và sẵn sàng.
Hãy nhớ rằng một kế hoạch phòng chống đại dịch hiệu quả nên ưu tiên an toàn cho các nhân viên và giảm thiểu sự gián đoạn của quy trình phát triển của tổ chức/doanh nghiệp. Tất cả chúng ta – những nhà quản trị nhân sự và các nhân viên phải luôn sẵn sàng giải quyết những khó khăn mà ngành Nhân sự sắp phải đối mặt.
Trong bài trước chúng ta đã cùng tìm hiểu các thuật toán của kĩ thuật Rate Limiting – chống DDOS và hạn chế việc bị spam khiến sập hệ thống. Còn lần này, ta sẽ phân tích kỹ hơn cách cách các hệ thống lớn sử dụng Rate Limiting. Từ đó có bài học để bảo vệ hệ thống của chúng ta nhé!
Facebook, Google, LinkedIn đã ứng dụng Rate Limiting vào API như thế nào?
Để có thể hiểu được những điều mình sắp kể ra thì các bạn chưa biết về Rate Limiting thì đọc lại phần 1 nha (Để dễ theo dõi hơn ý mà <3):
Leaky Bucket
Token Bucket
Fixed Window
Sliding Window
Với những công ty có hệ thống website lớn như Google, Facebook đều cung cấp API cho các bên thứ 3 sử dụng. Tuy nhiên, họ đều giới hạn lại để chống kẻ xấu spam và dùng quá nhiều tài nguyên của hệ thống.
Youtube API: Mỗi application chỉ được cấp 10000 unit/ngày. Mỗi lần gọi API sẽ tốn 1 unit nhất định, API tìm kiếm thì tầm 50 unit, API upload thì tầm 1000 unit. Cách này chắc là dựa theo thuật toán Token Bucket.
Github API: Cho phép mỗi người dùng gọi 5000 request/giờ. Nếu chưa đăng nhập thì chỉ được 60 request/giờ. Như vậy ta có thể thấy họ áp dụng Sliding Window hoặc Fixed Window.
Facebook API: Facebook thì rất thoải mái trong việc cấp API: Lấy thông tin cá nhân, quản lý page, chạy quảng cáo… Phần lớn API dùng Platform Rate Limit, các API liên quan tới Marketing và Instagram sẽ có khoảng giới hạn riêng.
Rate Limit của Facebook không có một con số cố định như các bên ở trên mà nó khá thú vị, chúng phụ thuộc vào số lượng user trong app của bạn. App càng nhiều user thì có thể gọi API càng nhiều lần, nghe có lý phết!
Nhưng dân mình khá là ĐỈNH CAO nên nhiều khi họ tìm được các API ẩn, hoặc chạy tự động để làm nhiều trò mà API không cho phép.
Do đó, những website lớn như Facebook, Google đôi khi họ còn phải áp dụng cả AI/ML, dựa theo hành vi người dùng để xác định xem là người hay là MÁY.
Đặt Rate Limit vào hệ thống
Về cơ bản, áp dụng Rate Limiting vào hệ thống là một chuyện … cũng không quá phức tạp, nhất là với các hệ thống nhỏ.
Đa phần các web framework (Spring, ExpressJS, Ruby on Rails, …) đều có thư viện hỗ trợ. Chỉ cần add vào, chỉnh vài dòng code là xong.
Theo mình thấy, thường người ta sẽ setup Rate Limiting ở tầm Load Balancer hoặc Web Server. Lý do là vì web app của bạn chỉ nên tập trung vào business logic, những thứ như SSL Termination, Rate Limiting để Web Server quản lý sẽ tốt hơn, dễ thay đổi mà không cần sửa code.
Tuy nhiên, khó khăn nằm ở chỗ tinh chỉnh các tham số sao cho phù hợp. Chặn lỏng lẻo quá thì vô tác dụng, chặn quá tay thì user sẽ thấy bị chậm, khó chịu, không gọi được API.
Sau đây là 1 số kinh nghiệm của mình khi dùng Rate Limit:
Public API là những API có thể gọi mà không cần token: Đăng nhập, Gửi tin nhắn, quên mật khẩu, search… API càng public hoặc càng quan trọng thì rate limit càng thấp. Lý do là những API này rất dễ bị lợi dụng để spam, làm quá tải hệ thống.
Cân bằng giữa việc tăng Rate Limit và trải nghiệm người dùng. Nên cho phép tăng limit nếu người dùng đã đăng nhập, có nhiều quyền, trả phí v…v
Khi người dùng gọi API quá limit thì làm gì?
Throttle: nginx có khái niệm burst khá hay, những request vượt limit sẽ được đưa vào 1 queue, xử lý từ từ. Người dùng chỉ thấy bị chậm nhưng không bị lỗi. Kĩ thuật này gọi là throttle
Return Error: Server trả về HTTP Code 429 – Too Many Requests để phía client biết mà xử lý
Shadow Ban: Có thể bạn sẽ gặp bọn chơi xấu, gọi API liên tục đến khi gặp lỗi 429 thì chúng tạo account mới để gọi. Lúc này ta có thể dùng Shadow Ban, vẫn trả về HTTP 200 nhưng … không làm gì hết, để đánh lừa bọn đó :))
Điều quan trọng nhất là bạn phải dựa vào business và requirement của hệ thống để ra quyết định nhé! Ví dụ web ngân hàng thì đăng nhập sai 3 lần là khoá và cảnh báo liền; còn web xem phim giáo dục giới tính thì đăng nhập nhầm 5-10 lần cũng chẳng chết ai đâu.
Túm lại
Như các bạn thấy, Rate Limiting là một kĩ thuật/thuật toán đơn giản, hay ho nhưng lại ít khi nào được nhắc đến trong chương trình học hay các tài liệu trên mạng. Nhưng chúng lại rất hữu dụng, bảo vệ chúng ta khỏi bị DDOS, chống spam, đảm bảo người dùng có thể tận hưởng việc gọi API một cách trơn tru. Nếu bạn thấy bài này có ích thì share nha, còn nếu có gì mình sai sót thì anh em comment ở dưới để mình tìm hiểu lại nhé. Cảm ơn các bạn đã đọc.
Ngoài ra còn nhiều bài khác liên quan đến tối ưu hóa website:
Ngoài input type number, còn những giá trị gì bạn nên cân nhắc sử dụng
Có thể bạn sẽ nghĩ ngay đến <input type='number' /> khi muốn cho user nhập số. Tuy nhiên đời không như là mơ, nó có kha khá vấn đề, đôi khi có những giá trị nhìn thì như số, nhưng không phải (như credit card), hoặc một dạng chuỗi số.
Bài viết này chúng ta sẽ tìm hiểu về cái cà-ri – currying function này, nó chạy ra sao, hữu dụng thế nào.
Bạn sẽ gặp kiểu lập trình truyền vào function như một argument (callback) cho một function khác không chỉ trong Javascript mà còn có thể thấy ở Haskell, Clojure, Erlang và Scala
Việc sử dụng function như một argument đẻ ra thêm một số khái niệm khác: Pure function*, **Currying, Higher-Order Function
Thay vì truyền vào cho function 1 lúc nhiều argument, chúng ta lại chuyển kiểu viết đó thành 1 function chỉ nhận 1 argument, nhưng bên trong đó chúng ta lòng các function con bên trong, và return về function con này.
Ví dụ cho dễ hiểu hé. Đây là kiểu viết truyền nhiều argument ai cũng biết.
function multiply(a, b, c) {
return a * b * c;
}
multiply(1,2,3); // 6
Đây là phiên bản cà-ry của function multiply ở trên, kết quả cuối cùng cũng ko thay đổi.
function multiply(a) {
return (b) => {
return (c) => {
return a * b * c
}
}
}
log(multiply(1)(2)(3)) // 6
Bạn có thể chửi viết chi mà phức con mẹ nó tạp vậy, callback hell. Nhưng lợi ích của nó là giúp chúng ta gọi được hàm multiply theo kiểu multiply(1)(2)(3) thay vì `multiply(1,2,3). Vẫn chưa thấy lợi ích? Hy vọng viết thế này bạn sẽ thấy được công năng của nó
const mul1 = multiply(1);
const mul2 = mul1(2);
const result = mul2(3);
// result : 6
Tận dụng scope mà mul2 có thể truy xuất đến kết quả của mul1. Dù đã được gọi nhưng kết quả của multiply sẽ ko chết liền mà vẫn tồn tại cho đến khi chạy đến lần gọi sau cùng.
Bạn cũng có thể viết Currying function theo kiểu sau
function volume(a) {
return (b, c) => {
return a * b * c
}
}
volume(70)(90,30);
volume(70)(390,320);
volume(70)(940,340);
Currying có hữu dụng không?
Thí dụ bạn có một hàm để tính giá trị discount, giảm ngay 10% cho khách hàng thân thiết.
function discount(price, discount) {
return price * discount
}
// Giảm ngay 50 đồng khi khách hàng đã tiêu 500 đồng.
const price = discount(500,0.10); // $50
// $500 - $50 = $450
Khách hàng tiêu tiền điên cuồng, chúng ta gọi hàm này say mê
Giải thích hàm này nha, hàm curry này nhận vào argument đầu tiên là một function, các argument tiếp theo sẽ là giá trị số. Sử dụng với hàm multiply ban đầu
function multiply(a, b, c) {
return a * b * c;
}
// phiên bản currying
const multiplyCurrying = curry(multiply,2);
multiplyCurrying(4);
multiplyCurrying(6);
Trong bài này chúng ta sẽ sử dụng React.useState, React.useEffect, React.useReducer để fetch dữ liệu từ API, đồng thời cũng viết một custom hook để có thể sử dụng ở bất kỳ đâu
Chúng ta có một component, dữ liệu của component này sẽ được lấy từ API
Bên trong React.useEffect chúng ta sẽ thực hiện việc fetch data từ API, sau khi nhận được dữ liệu gán giá trị nhận được cho giá trị của state data
Nếu dừng ở đây, khi chạy bạn sẽ thấy một vòng lặp vô tận của việc gọi fetch data. Effect sẽ chạy không chỉ ở lúc component mount mà còn ở các lần update tiếp theo. Bởi vì chúng ta gán giá trị state trên mỗi lần fetch, component lại được update và effect lại được gọi lại để chạy. Chúng ta chỉ muốn fetch data khi component mount lần đầu tiên. Đó là lý do chúng ta phải thêm một mảng rỗng vào tham số thứ hai của effect, như vậy các lần update tiếp theo nó sẽ không được gọi.
Tham số thứ 2 truyền vào cho effect này là danh sách những giá trị nào mà hook phụ thuộc, tức nếu các giá trị này thay đổi thì effect được gọi lại. Bỏ array trống sẽ không còn chuyện chạy ở lần update.
Trong đoạn code trên vẫn còn một chỗ phải chỉnh sửa, chúng ta sử dụng async/await, theo như định nghĩa, tất cả những hàm nào là async sẽ được ngầm hiểu là trả về một Promise. Tuy nhiên, cũng theo như định nghĩa effect hook không được trả về gì cả, hoặc một function để clean up (xem lại bài nói về Hook Effect, có giải thích 2 loại Effect Hook).
Nên bạn mà copy đoạn trên mà chạy thì sẽ nhận thông báo bên dưới console. Không thể sử dụng async function bên trong React.useEffect, chúng ta sửa lại
Để fetch dữ liệu bằng React.useEffect có thể tóm gọn như ở trên. Chúng ta sẽ tiếp tục xem cách handle error, loading indicator, gọi fetch từ form và làm thế nào tái sử dụng hook để fetch
Gọi hook thủ công/bằng code
Chúng ta đã xong phần fetch dữ liệu một lần lúc component mount. Nhưng làm thế nào để fetch dữ liệu khi có sự kiện từ user, ví dụ ô search, khi user nhập lấy danh sách kết quả tìm kiếm. Ví dụ bên dưới mặc định sẽ hiển thị kết quả cho từ khóa redux, nếu user nhập vào một giá trị khác, chúng ta cần làm sao để chạy useEffect một lần nữa
Tuy nhiên, nếu chỉ như vậy, hàm fetchData sẽ không được gọi khi user input một giá trị mới vào ô tìm kiếm. Vì chúng ta đã truyền vào một mảng rỗng vào cho giá trị depend của effect, nên nó chỉ chạy lần đầu mount
Có một vấn đề khác, user cứ nhập một ký tự, câu fetchData lại được gọi, gọi liên tục như vậy không hay, thêm vào một nút để user click vào mới thực hiện search thì sao
Nhưng nếu sửa như vậy, trường hợp component được mount lần đầu, nó sẽ không có hiển thị kết quả cho từ khóa redux nữa. Nếu dùng thềm một useEffect khác cho trường hợp chạy lúc đầu sẽ gây nhầm lẫn, không rõ ràng, thay vào đó nếu chúng ta xem search state là nguyên cái url sẽ đơn giản hơn
Một nhu cầu khác cũng hay gặp là trong lúc fetch data từ API, chúng ta cần biết trạng thái loading tới đâu rồi, chúng ta sẽ bổ sung thêm state isLoading
Nãy giờ chúng ta chỉ fetch data với bằng input và button. Khi có nhiều element hơn, chúng ta sẽ đưa nó vào form để có thể trigger form submit bằng cách nhấn Enter
Tìm việc làm React lương cao cho SV mới ra trường tại đây
Custom hook để Fetch data
Để tái sử dụng được các đoạn code liên quan đến việc fetch data, chúng ta sẽ đưa nó ra thành một custom hook, các giá trị liên quan trực tiếp đến việc fetch data, cụ thể là loading, error chúng ta cũng đưa vào trong custom hook
Với cái custom hook để fetch data như ở trên, chúng ta thấy có 2 state isLoading, isError quan hệ khá mật thiết với nhau, có thể hợp nhất 2 đứa nó lại bằng React.useReducer
React.useReducer sẽ nhận vào một hàm reducer (công dụng tương tự như hàm reducer của redux ấy) và các giá trị khởi tạo của state, trong trường hợp của chúng ta là isLoading và isError. Việc này chẳng qua là gom tất cả state liên quan vào một object cho nó tinh tế thôi, thay vì từng state riêng biệt như sử dụng useState
Mình đã bảo rồi, nó sẽ giống như cái reducer trong redux thôi, chúng ta dispatch một object gồm type và payload, căn cứ vào payload mà chúng ta xử lý, cập nhập state
Cuối cùng chúng ta cập nhập lại giá trị trả về của custom hook nữa
Với việc return một function ở cuối của React.useEffect, tên gọi các bạn React đặt là clean up function, nằm trong kiểu effect cần clean up – nói thật mình phát mệt với việc các bạn trong team React cứ thích chế thêm liên tục như vậy.
Không đơn thuần chỉ là một cái vỗ nhẹ từ phía sau, hầu hết các nhân viên đều mong muốn nhận được sự quan tâm nhiều hơn của sếp để duy trì động lực làm việc. Đó là lý do tại sao nhiều nhà tuyển dụng lựa chọn việc thực hiện các chương trình khuyến khích để tạo sự gắn kết, thúc đẩy nhân viên làm việc chăm chỉ hơn.
Thế nào là tạo động lực cho nhân viên?
Cung cấp phần thưởng như thẻ quà tặng, thêm thời gian nghỉ và ăn trưa miễn phí không chỉ là một điều có giá trị dành cho nhân viên của bạn; điều này cũng tốt cho các doanh nghiệp về lâu dài.
Một nghiên cứu năm 2018 của Genesis Associates – một công ty tuyển dụng có trụ sở tại Anh với các ngành kỹ thuật, bán hàng và phân ngành sáng tạo – khảo sát cho thấy 85% công nhân viên cảm thấy có động lực hơn để làm tốt nhất công việc khi nhận được sự khích lệ. Ngoài ra, 73% thể hiện sự hài lòng với những đánh giá là “tốt” hoặc “rất tốt” thông qua bầu không khí trong môi trường được tạo động lực. Các chương trình thưởng cho nhân viên cũng làm gia tăng lợi nhuận trung bình của một công ty lên tới 80.000 bảng Anh (khoảng 104.000 đô la) mỗi tuần, nghiên cứu cho thấy.
Việc tạo động lực có thể thúc đẩy bạn, cung cấp những phần thưởng cho nhân viên của bạn, đồng thời khuyến khích họ làm việc năng suất hơn. Mọi người ai cũng đều thích được đánh giá cao về những nỗ lực và việc khuyến khích là cách để cho nhân viên thấy rằng phần thưởng sẽ thật sự xứng đáng với những người làm việc hiệu quả.
Những ví dụ nào về việc tạo động lực cho nhân viên?
Vậy, những sự khuyến khích nào thực sự thúc đẩy nhân viên làm việc chăm chỉ nhất? Không phải bàn cãi, phần thưởng về tiền tệ đã giành được vị trí hàng đầu; theo khảo sát, 40% người lựa chọn tiền là động lực thúc đẩy họ nhất, 29% chọn một kỳ nghỉ miễn phí và 23% mong muốn có thêm thời gian nghỉ trong công việc. Số phần trăm còn lại gồm những phần thưởng như các bữa ăn, đồ uống và tùy chọn để kết thúc sớm một ngày làm việc.
Mặc dù sự khuyến khích dựa trên hiệu suất cá nhân của nhân viên có thể mang lại những phần thưởng có giá trị hơn, cuộc khảo sát của Genesis cho thấy rằng 71% người lao động lại ưa thích sự khuyến khích dựa trên nỗ lực của nhóm. Patrick Bell, giám đốc điều hành của Genesis Associates, cho biết điều này có khả năng vì nhân viên làm việc nhằm hướng đến mục tiêu nhóm và sẽ có nhiều người giúp duy trì và phát triển động lực cao hơn trong thời gian khuyến khích.
Tại sao nhà tuyển dụng nên tạo động lực cho nhân viên?
Nhân viên muốn được công nhận và khen thưởng cho những cống hiến của họ.
“Làm việc dựa trên sự khích lệ của nhóm, có tính trách nhiệm với tập thể; bạn không muốn để các thành viên khác trong nhóm thất vọng”, Bell nói với Business News Daily. “Do vậy, mọi người cố gắng nhiều hơn và thường đạt được kết quả tốt hơn. Sự phân chia về lợi ích một cách phù hợp là một tiêu chí rất quan trọng. Nếu quá nhiều, mọi người có thể che giấu trách nhiệm của mình; quá ít, bạn có thể mất đi lợi ích của động lực cao hơn.”
Nếu lo ngại về ngân sách của việc cung cấp phần thưởng, bạn không nhất thiết phải cung cấp các ưu đãi tiền tệ, Bell nói. Chẳng hạn, Genesis linh hoạt sử dụng các lợi ích khác, chẳng hạn như hoàn thiện công việc sớm hơn trong một ngày, kéo dài thời gian nghỉ trưa, trao tặng cúp hay đơn giản là một bức tranh trên tường kèm tên của nhân viên để tuyên dương cho sự phấn đấu của họ.
Bell cũng lưu ý rằng, đối với nhiều nhân viên, sự công nhận thường quan trọng hơn số tiền mặt hoặc giải thưởng. Một số người yêu thích sự công nhận trong khi những người khác có thể ngại vì điều đó. Như vậy, điều quan trọng là phải xem xét những gì sẽ thực sự phù hợp cho nhân viên của bạn. “Chúng tôi có những giải thưởng hàng tháng để tạo động lực cho thực tập sinh tốt nhất, nhà tuyển dụng tốt nhất và đội ngũ ấn tượng của tháng”, Bell nói.
Một lựa chọn khác cho việc tạo ra sự khuyến khích chính là sự thăng tiến, tức là cung cấp cho nhân viên một chức danh mới. Đây được xem là động lực lớn vì nó chính là minh chứng cho sự tin tưởng về tinh thần trách nhiệm đồng thời ghi nhận những nỗ lực của một cá nhân trong công việc.
Từng bước xây dựng plan tạo động lực cho nhân viên?
Việc tạo động lực không khó nếu bạn tiếp cận nó một cách chính xác. Một cách thức tốt để bắt đầu là hỏi nhân viên của bạn về những mong muốn nào họ có thể thích.
Bạn cũng nên đặt ra những tiêu chuẩn và tính khả thi về hiệu quả cho mỗi phương án. Sau đây là những cách thức giúp bạn dễ dàng hơn trong việc tạo lực:
Tạo môi trường làm việc thân thiện và giao tiếp tích cực
Nhân viên của bạn dành một lượng lớn thời gian của cuộc sống của họ để làm việc trong văn phòng.
Vì vậy, hãy cố gắng làm cho mọi trường làm việc nhân sự trở nên vui vẻ và hấp dẫn nhất. Bạn có thể khiến bầu không khí trở nên thú vị hơn với những câu chào hỏi thăm, kể những câu chuyện vui hay có những trò chơi mang tính kết nối.
Giao tiếp tích cực được xem là chìa khóa quan trọng để bạn có thể nắm bắt tốt những mong muốn của nhân viên, thấu hiểu họ để đưa ra những giải pháp tạo động lực tốt nhất. Hãy dành ra một khoảng thời gian ngắn mỗi ngày để chia sẻ, trao đổi với nhân viên; thảo luận để nhận thấy mối quan tâm và những vấn đề nào họ đang gặp phải. Mọi người giao tiếp tại nơi làm việc và đó có lẽ là điều dễ dàng nhất bạn có thể làm với nhân viên của mình.
Công nhận thành tích, khen thưởng và đưa ra sự khuyến khích về động lực
Mọi người đều muốn được công nhận cho những gì họ đã làm; bất kể đó là cho một công việc hoặc thành tích cá nhân. Việc được thừa nhận năng lực từ người quản lý sẽ có ý nghĩa rất lớn đối với nhân viên.
Một số nhân viên có thể thích sự khuyến khích về hiện kim; trong những trường hợp này, cách tốt nhất là ghi chú những ưu đãi đó vào ngân sách hoặc lập quỹ cho họ. Bạn cũng có thể tạo ra một số biện pháp để theo dõi hiệu suất làm việc của nhân viên. Tuy vậy, không phải lúc nào phần thưởng tiền tệ cũng quan trọng vì đôi khi, một cái ôm, một cái bắt tay, một ánh nhìn hay một nụ cười đều là sự động viên, sự ghi nhận đặc biệt đối với những cố gắng của nhân viên trong công việc.
Đưa ra sự khuyến khích là cách tạo động lực tuyệt vời nhất không những giúp nhân viên yêu công việc của mình, tự hoàn thiện mình trong kỹ năng, tác phong làm việc chuyên nghiệp, mà còn phát triển hóa mô hình hoạt động lâu dài của công ty.
Tạo mục tiêu phát triển cho nhân viên
Các nhà quản lý nhân sự nên đảm bảo rằng công ty có tầm nhìn và kế hoạch phát triển cho chính tổ chức/doanh nghiệp và mỗi nhân viên. Nhân viên họ cần một người lãnh đạo có thể đánh giá, nhận xét và định hướng phát triển lâu dài cho họ. Do đó, nhà quản lý nhân sự cần thiết lập những lộ trình nghề nghiệp vì đó là cơ sở giúp nhân viên có thể theo dõi, tự nhìn nhận khả năng và phát huy tối đa những nỗ lực của bản thân.
Ngoài ra, việc tạo mục tiêu phát triển còn là cơ hội giúp nhân viên bộc lộ sức sáng tạo để thực hiện các công việc. Họ biết được mình sẽ phải làm gì, mình sẽ trở thành ai từ đó có động lực mà phấn đấu. Đồng thời, điều này cũng tạo ra sự cam kết đồng hành trong hành trình tạo ra các giá trị cho một tổ chức/doanh nghiệp.
Lập trình game là một trong những lĩnh vực còn khá non trẻ tại Việt Nam. Nhưng không vì vậy mà thiếu đi nhiều công ty game làm nên tên tuổi của mình tại Việt Nam cũng như quốc tế, Có thể kể đến nhiều cái tên như Athena (chuyên sản xuất dòng game giải đố), Amanotes (game âm nhạc), TopeBox (game phổ thông), DivMob (game chiến đấu thời gian thực) hay WolfFun (game đấu trường trực tuyến)… đều được giới chuyên gia trong lĩnh vực game đánh giá là những công ty vẫn đang kiếm doanh thu khủng từ thị trường nước ngoài.
Trong chuyên mục “Chuyên gia nói” tuần này, hãy cùng TopDev trò chuyện cùng anh Nguyễn Đình Khánh – CEO và Founder của WOLFFUN Game. Có thể nói đây là lần đầu tiên trong lịch sử có công ty phát triển game độc lập và có quy mô nhỏ tại Việt Nam đã được Google mời và vinh danh giữa hàng loạt các nhà sáng lập Game khác tại sự kiện G star Busan năm 2018. Trước khi đến với thành công của WOLFFUN, ít ai biết anh Khánh đã từng khởi nghiệp 3 lần và đều không thành công. Đâu là nguyên do và bài học anh Khánh rút ra từ những lần khởi nghiệp trước đây là gì?
Chào anh Khánh, trước tiên anh hãy chia sẻ cơ duyên giữa anh và mảng game, có phải do thích chơi game mà theo đuổi ngành này?
Có thể nói đây là một cái duyên. Cũng như những startup khác, VN mình nổi tiếng về ecommerce, app. Hồi xưa tôi cũng đã khởi nghiệp ở những công ty như vậy rồi. Cũng ecommerce, outsourcing, app, tôi cũng theo hết. Tôi đến với Game cũng vì có một người nhân viên trong công ty của tôi nghỉ. Tôi nói chuyện với bạn kỹ thuật đó thì bạn ấy nói là “em đi làm game, bởi vì em thích làm game”. Từ lúc đó, tôi mới chú ý và bắt đầu tìm hiểu về mảng này làm ra sao, có khó hay không. Thì một đặc tính của game là có thể tạo cái nguồn tiền nhanh, nghĩa là khi em ra game, em có thể thu tiền nhanh hơn ứng dụng web hoặc app. Thì đó là lý do tôi bắt đầu nghiên cứu và làm game thử.
Nếu em nói ví dụ từ việc mua skin thì nguồn tiền sẽ hơi chậm. Việc làm một game như Liên quân thì tốn khoảng 3 năm cho đến 5 năm tùy vào team. Nhưng đối với game giống như của Nguyễn Hà Đông – Flappy Bird em chỉ tốn khoảng 1 đến 2 tuần để làm, sau đó em bỏ lên store.
Một điểm thứ 2 nữa là tại thời điểm 2014, App Store bắt đầu marketing mạnh, thì đó là một trong những platform giúp cho mình tiếp cận với thế giới rất là nhanh chóng. Nghĩa là mình có thể bán hàng xuyên lục địa. Ví dụ như khi mình làm web thì việc mà mình phát triển một trang web hấp dẫn người khác vô web mình coi khó khăn hơn rất nhiều so với việc bỏ một game lên store thì công việc mang game đi khắp thế giới là công việc của Google. Điều này giúp các developer tiết kiệm được công sức để marketing rất là nhiều.
Tất nhiên bây giờ thì không phải vậy, có rất nhiều yếu tố mà nhà phát triển game phải để tâm đến.
Xu hướng sắp tới của ngành Game là gì? Theo anh một nhà làm game có còn được gọi là “nhà sáng tạo game” nữa không khi mãi chạy theo xu hướng và ép buộc bản thân không làm theo thế mạnh của mình?
Về xu hướng chơi game, bản thân nó từ trước đến nay có rất nhiều thể loại, rất nhiều kiểu. Tuy nhiên thế giới hiện nay là Thế giới kết nối. Việc mạng hay các thiết bị đã tốt hơn rất nhiều so với khi xưa. Thậm chí, Google còn có một số platform mà em không cần máy mạnh em vẫn có thể chơi được game rất mạnh, bởi vì nó xử lý trên cloud và chỉ trả về kết quả thôi. Và tôi nghĩ cách chơi game cũng sẽ thay đổi. Bởi vì mạng quá mạnh nên những game online sẽ xuất hiện nhiều hơn. Thì em biết là game online thì nó thiếu meta, có nghĩa là nội dung được sinh ra bởi người dùng sẽ gây hấp dẫn và hay hơn những game mình đã sắp đặt sẵn như game offline. Theo tôi, xu hướng chơi game online sẽ càng bùng nổ hơn nữa, nhất là thể loại esport. Bởi vì mình chơi online thì mình phải cạnh tranh với nhau, nhưng cạnh tranh mà không công bằng thì mình không vui, cho nên mình phải cạnh tranh công bằng. Thì đó gọi là esport.
Về vế thứ 2, thì thực ra cụm từ Nhà sáng tạo game cũng có một ý nghĩa tương đối, với tôi. Ví dụ như khi em làm một cái bàn tròn và người khác làm nó hình vuông thì em có gọi đó là sáng tạo hay không? Có thể đối với một số người, đó là sáng tạo nhưng đối với một số khác thì đó cũng chỉ là cái bàn thôi, thì đâu có gì sáng tạo, đúng không?
Trong việc sản xuất một phần mềm hay một game, chỉ cần khác nhau một vài mechanic (cơ chế) thì nó đã là một cái game hoàn toàn khác rồi. Tuy có thể em copy hình người ta lại, nhưng có thể là em sẽ không làm giống người ta được. Trong ngành tụi tôi có một quy định là như thế nào gọi là copy/clone. Đó là khi em làm lại một game hoàn toàn giống, xác suất, số lượng mechanic giống nhau khoảng 90% – 100%. Ví dụ một game làm 2 giây thì nhảy, 1 giây thì rớt xuống hố và mình cũng 2 giây nhảy, 1 giây rớt xuống thì đó gọi là clone. Clone tính cả khi làm giống y nhau về âm thanh, đồ họa,… thì ngoài những game clone như vậy ra thì tôi thấy đa số có thể gọi là sáng tạo.
Theo anh, đâu là điều thú vị giữa Game Developer – Lập trình game so với những lập trình viên khác khác?
Điểm khác giữa một game dev với một dev bình thường đó là em tạo ra một sản phẩm thấy nó nhúc nhích được. Rõ ràng khi mình làm game, ngay lập tức nhân vật sẽ chuyển động, có gameplay lên rồi nhìn nó thấy thú vị hơn rất nhiều. Còn app thì vẫn lên nhưng nó không động bằng trong game. Thì đó là cái khác biệt có bản làm cho những người làm game như tôi thấy cái công việc nó thú vị.
Cái thứ 2 nữa là, trong thế giới game là thế giới sáng tạo gần như không giới hạn. Em có thể nghĩ ra nhân vật nó như vậy, gameplay nó như vậy hoặc là những thứ rất kì cục em vẫn có thể đưa vô game được. Còn đối với app hay web developer khác thì khó thể làm được những chuyện này. Nó giới hạn hơn.
Và game thì nó cũng giống như điện ảnh vậy đó, em làm một cái game tương tự giống như nó mang cái nhiều rất nhiều yếu tố ở trong đó để tạo một cái game. Cho nên lần này tạo game, nó khác với lần sau tạo game nên gây sự hứng thú. Người của mình nó sẽ thấy chán nếu như mình làm cái gì đó lặp đi lặp lại. Nhưng trong sản xuất game thì cái game thứ 2 nó sẽ gần như là nó khác cái game thứ nhất. Kể cả là em đi làm lại cái game đầu tiên. Cho nên tôi nghĩ nó là một cái điểm mà giúp cho game developer cảm thấy motivate hơn, hứng thú hơn trong công việc.
*Tố chất gì cần phải có để đảm nhiệm được nhiều công việc như anh (CEO, Founder, Game developer)
Thì tôi bốc ra từng cái title nha. Ví dụ em làm CEO, giống như mọi người, thì tôi nghĩ giống như các CEO khác, là cũng phải tìm cách cho công ty hoạt động, tìm cách công ty chạy, cách phát triển kinh doanh, chiến lược đi, lãnh đạo mọi thứ,… thì nó giống như những CEO khác. Tuy nhiên đối với những công ty như tụi tôi thì tôi đảm nhiệm một vai trò sản xuất nữa, là game design hoặc là project owner khác, trong đó công việc của tôi cũng giống như những project owner khác thì tôi nghĩ cái tố chất cần ở đây là cái đam mê công việc là chính. Khi có đam mê thì em sẽ tìm mọi cách để em làm cho kiến thức của em nhiều hơn, làm cho em quen việc hơn, còn nếu em không có đam mê thì em làm giống như bị sai khiến vậy, nó sẽ không hiệu quả. Thì đó là cái tố chất đầu tiên mà tôi nghĩ là nên cần.
Còn để làm CEO hay Founder thì nó cần có những cái tố chất nhất định như về leadership em phải biết được, em phải trao quyền tốt,.. nói chung rất nhiều thứ khác.
Được biết trước khi thành công với WOLFFUN, anh đã va vấp ở 3 lần khởi nghiệp trước. Anh có thể chia sẻ thêm về câu chuyện khởi nghiệp của mình?
Kinh nghiệm của tôi thì tôi nghĩ cũng sẽ giống như một số anh em đã va vấp khác. Thì tôi nghĩ thất bại là cái hay nhất, vì khi em thất bại em sẽ nghiệm ra một bài học thật là đau. Mà cái bài học đó dù em đọc trên sách có thể em hiểu, nhưng nó sẽ không đau được như khi em startup thất bại, nên là cứ làm thôi. Tôi nghĩ đó là cái thứ mà quan trọng nhất trong startup, đó là làm liều đi. Đó là cái quan trọng nhất.
Cái thứ 2 đó là khi mỗi cái startup nó thất bại thì phải xem vì sao nó thất bại để lần sau mình tránh. Nếu mà cứ thất bại xong rồi mình làm tiếp rồi cứ thất bại y chang như vậy thì nó không ổn. Nhưng tôi nghĩ con người của mình nó hay lắm, nó lên. Không có ai mà thất bại rồi nó làm y chang như vậy đâu. Tôi nghĩ là sau bao lần thất bại mình lên được, cái thất bại là điều quan trọng thứ 2.
Cái thứ 3 là sau những lần thất bại thì tôi nghiệm ra rằng là để mà hạn chế cái thất bại thì cái team của mình là cái thứ quan trọng thứ 3 mà để xây dựng một cái business bền vững hơn. Tại vì khi mà em có nhiều người tốt đi chung với em thì họ sẽ cản em bớt những cái tính liều lĩnh chẳng hạn hoặc những cái quyết định mà nó hơi mang tính cá nhân, nó hơi bất đồng, nó hơi không chính xác hoặc là kiểu kiểu như vậy.
Qua mỗi cái startup thất bại, tôi học mỗi bài học khác nhau. Bài học đầu tiên là do tôi chọn co-founder không đúng, cho nên sau này a chọn co-founder cẩn thận hơn. Bởi vì lúc mới khởi nghiệp thì tôi khởi nghiệp với sếp, nhưng mà 2 người lại không hợp nhau và cách biệt nhau về nhiều thứ cho nên chưa hòa hợp. Cái công ty thứ 2 lại chết về thiếu hiểu biết về ngành, đó là E-commerce. Khi tôi tham gia một ngành thì có 2 kiểu người mà tôi nghĩ rằng tôi là kiểu người thứ 2. Kiểu người thứ nhất là phải suy nghĩ đắn đo rất nhiều thứ rồi mới bắt tay vào làm, thường kiểu người như vậy sẽ rất sợ, sẽ nghĩ những tình huống xảy ra và họ tránh được.
Nó cũng có những điểm tốt. Còn kiểu người thứ 2 là kiểu người không suy nghĩ gì hết, cứ nhào vô làm. Cách đây khoảng 10 năm trước, tôi là ông thứ 2, tức là không suy nghĩ gì hết, cứ nhào vô làm thì mới biết là ở trong này nó không có như vậy, nó cần phải đòi hỏi là cái nguồn lực như vậy như vậy, bởi vì e-commerce thì em biết rồi, nó không có easy như người khác nhìn vào. Dù mình có biết trước tương lai người ta có thể mua hàng online rất là nhiều nhưng khi mà vô làm thực tế thì nó hoàn toàn khác. Bài học thứ 3 mà tôi rút ra được của cái startup tiếp theo thứ 3 đó là ảo tưởng.
Hồi xưa tôi cũng tốn 1 năm để làm một cái ứng dụng – cũng là một mxh nhưng khác biệt ở việc mix giữa google và facebook. Thì tôi ảo tưởng là cái ý tưởng của tôi nó hay như vậy, ai cũng nói cái ý tưởng đó khá là hay thì khi mà tôi launch cái ứng dụng đó ra thì sẽ có rất nhiều người dùng cái ứng dụng đó mà tôi không cần phải marketing gì hết. Thực tế sau khi tôi ra thì có rất ít người dùng, dẫn đến là tôi hết tiền, tôi fail. Thì đó là cái chuyện tôi không chuẩn bị kỹ càng kiến thức về marketing, về kinh doanh và cái chiến lược để ra mắt cái ứng dụng, sản phẩm nó ok, thì đó là bài tập thứ 3.
Thì sau này, sau nhiều lần ngu, lỡ dại giống như vậy thì tôi bớt dại hơn.
Anh hãy chia sẻ những project sắp tới mà WOLFFUN đang ấp ủ
Sau 3 lần khởi nghiệp thất bại, tôi cảm thấy là mình làm nhiều thứ, nhiều mảng. Trong 3 lần đó thì tôi còn đi làm thêm ở công ty Nhật. Thì tôi cảm thấy cái kết quả dường như không tốt. Cho nên tôi nghiệm ra một điều là phải tập trung. Cho nên công ty của tôi cũng hoạt động theo nguyên lý tập trung là nếu tôi làm tôi chỉ làm một cái project thôi, duy nhất và làm cho nó tốt nhất có thể.
Hiện tại, bọn tôi chỉ tập trung làm một cái game mini mobile Heroes Strike. Tương lai tụi tôi sẽ research, tìm kiếm một số cơ hội mới trong mảng game online nhưng tương lai ở đây chắc khoảng 5 – 10 năm. Bởi vì vòng đời một game mà tụi tôi nhắm đến nó tới 5 năm đến 10 năm. Và cái game Heroes Strike sau khi mà tụi tôi launch ra tụi tôi còn rất là nhiều việc trong vòng 5 năm tới để làm.
Nếu được thay đổi 1 điều thì điều hối tiếc mà anh muốn thay đổi nhất là gì khi khởi nghiệp?
Thường trong mọi việc tôi có một câu là “tiên trách kỷ, hậu trách nhân”, có nghĩa đầu tiên mình phải trách mình trước. Mọi cái biến cố xảy ra trong cuộc đời của mình là do mình, cách làm của mình không ổn. Nếu được thay đổi thì tôi sẽ thay đổi chính bản thân của tôi. Tôi sẽ đọc nhiều hơn và suy nghĩ nhiều hơn trước khi tôi làm một cái việc gì đó. Nhưng mà cái việc đó nó chưa chắc là sẽ tạo nên cái con người là những gì giống như ngày hôm nay của tôi, giống như bây giờ. Có thể lúc đó tôi trở thành con người rất là sợ sệt, không dám làm và thậm chí là không startup luôn. Lúc đó sẽ nghĩ: startup nhiều quá, nhiều rủi ro quá, lại vừa tốn tiền, vừa mệt thôi mình đi làm công. Đấy, thì có thể không giống như bây giờ.
Tiêu chí chọn “bạn đồng hành” của anh và WOLFFUN là gì?
Chính xác là sau này cái cách làm việc với một người đối với tôi nó cũng thay đổi rất nhiều. Hồi xưa tôi quan trọng một người về kỹ năng của họ, nhưng sau này là tôi quan trọng cái tâm của họ trong lúc làm việc, suy nghĩ của họ trong lúc làm việc nó như thế nào. Tất nhiên kỹ năng là cái chắc chắn phải có nhưng nó sẽ là yếu tố thứ 2.
Những bạn là Co-founder trong team của tôi đa số là tôi sẽ chọn và tuyển ra những người có đồng hành, có mong muốn, có cái vision, định hướng giống như tôi. Giống như tụi tôi tập leo núi, thì tôi sẽ đi cùng những người muốn chinh phục đỉnh cao, muốn chinh phục cái núi đó chứ tôi không đi với những người mà chỉ đi để xem thử coi có gì vui hay không, kiểu vậy. Lúc phỏng vấn tôi đặt ra rất nhiều câu hỏi để sàng lọc những người đó. Thì theo tôi cái tâm là thứ mà tôi quan trọng nhất.
Cái quan trọng tiếp theo tôi nghĩ đó là cái nỗ lực. Bởi thường làm game là mình đi sau thế giới. Mà mình đi sau mà mình đi với tốc độ giống như họ thì mình sẽ luôn luôn chậm hơn họ. Cho nên là mình bắt buộc phải đi nhanh hơn họ. Nhanh mà mình mới tập đi mà mình đi nhanh thì bắt buộc là mình phải tập và ngày nào cũng tập, tập nhiều hơn so với bình thường. Thì chăm chỉ là cái yếu tố tiếp theo.
Anh hãy chia sẻ các thói quen để duy trì và nâng cao kiến thức của mình
Tôi nghĩ tùy người mà họ chọn cái thói quen của mình để tốt nhất với họ. Đối với tôi thì thường tôi quan niệm là nếu mà em muốn khỏe đầu óc em phải khỏe cơ thể đã. Thể thao là việc phải làm hằng ngày. Thứ hai nữa là em tránh xa những mối quan hệ độc hại. Kể cả là trên Facebook đi chăng nữa. Thì tôi chỉ follow những người mà tôi nghĩ là tôi sẽ học được từ người đó.
Thì khi mà tôi mở Facebook thì tôi học được một cái kiến thức của cái tôi đó chứ k phải mỗi lần tôi mở Facebook thì tôi sẽ thấy một món ăn hay một bạn nào đó post hình đi du lịch. Thứ ba nữa là thường một tháng tôi sẽ dành 3 ngày và 4 ngày liên tục chỉ để đọc sách thôi. Và theo tôi quan trọng hơn nữa để rèn luyện cái não của mình là em có thể chơi một số thứ như âm nhạc, học ngoại ngữ chẳng hạn thì nó sẽ làm cho đầu óc của mình linh hoạt hơn, có nhiều lựa chọn hơn, nhiều mối quan hệ hơn khi mà nhìn một cái gì đó cái góc nhìn của mình nó cũng đa dạng hơn
Lời khuyên cho những bạn theo đuổi ngành game
Trong ngành game có rất nhiều vị trí. Tôi sẽ nói từng vị trí như sau. Ví dụ như em là developer thì em cũng học trong trường đại học bình thường thôi. Thì tất cả những kiến thức tôi học trong trường đại học nó dùng cho game nó đều hữu dụng cả. Tạo một cái game cũng giống như tạo một website hoặc một cái app về mặt công nghệ. Và trong game cũng có dùng AI, dùng data analytics, big data,… thì nó có rất nhiều cơ hội cho những bạn lập trình viên chuyên về data, chuyên về code, chuyên về hệ thống hoặc cao hơn ví dụ như là system architect, system design,… hoặc kể cả sau khi em tốt nghiệp ra em cũng làm bình thường, sẽ lên cái vị trí mà tôi nghĩ nó không quá khác biệt so với những ngành khác.
Tuy nhiên trong game có nhiều lựa chọn hơn cho một developer. Em có thể chuyển sang làm game designer nếu em cảm thấy việc code nó khá là nhàm chán. Thì trong một cái team game ngoài vị trí dev giống như mọi app hoặc web khác thì em có front-end, back-end, rồi làm về operations thì đó là vị trí dev. Thứ 2 nữa đối với artist, trong game thì có artist 2D, artist 3D rồi animation, về effect – những cái gọi là hiệu ứng, rồi sound design thì mình có những loại artist như vậy. Thì tùy vào cái mong muốn, em giỏi cái gì, em giỏi tưởng tượng em có thể phát triển kỹ năng để làm 2D artist.
Nếu em không giỏi tưởng tượng, em giỏi về khối, em giỏi vận khối và em thích 3D thì em có thể làm 3D artist hoặc em muốn làm chuyển động, làm nhân vật chuyển động thì em làm animation. Trong đó thì em có một số vai trò như làm cái sound (fx) là cái sound trong game. Thì cái đó thì tụi tôi thuê outsource nước ngoài tại do đa số người Việt phát âm tiếng tôi không chuẩn cho nên phải thuê người nước ngoài làm việc đó; hoặc làm effect. Thì đó là vị trí thứ 2.
Vị trí thứ 3 là game design – là cái thứ khó nhất trong game. Nó ảnh hưởng tới sự sống còn của một cái game. Game design ở Việt Nam thì không có thường dạy cho nên đa số các bạn vừa chơi game rồi tự học, có thể lên mạng học rồi tự làm, sai rồi sửa. Thì game design bình thường em phải mất khoảng 5 năm để làm được một cái game là ok và đó là vị trí khó nhất. Tại game design em phải học rất là nhiều về tâm lý, về marketing về dự án về cách phát triển phần mềm thậm chí em cũng phải biết sơ sơ code để em có thể nói chuyện được với code, em biết sơ về animation,… mọi thứ ở trong game. Thì đó là cái vị trí mà tôi cho là nó là khó nhất.
Các doanh nghiệp vẫn gặp khó khăn trong việc tuyển dụng các lập trình viên phù hợp, đặc biệt trong ngành Gaming thì theo anh đâu là vấn đề?
Chuyện “nhân tài như lá mùa thu” tôi nghĩ không chỉ ở Việt Nam mà còn ở những nước khác. Riêng ngành Game còn có đặc thù là lập trình viên phải yêu thích và muốn làm trong ngành Game nữa, đây là lọc thêm một bước filter nữa cho nên càng khó hơn. Theo tôi, thứ cản trở nhiều nhất là tư duy của thị trường Việt về Game không tốt, vì trẻ em hay lạm dụng Game và phụ huynh không thích chuyện này.
Nếu mình không kiểm soát tốt mà chơi game từ ngày này qua tháng nọ, thậm chí có người đi cướp tiền để chơi game thì sẽ tạo hiệu ứng xã hội không tốt cho game. Từ đó chỉ cần nói đến game là người ta sợ, mà không thấy được lợi ích của game, dẫn đến giới hạn những kỹ sư tiếp cận đến ngành game. Đối với artist/3D thì không như vậy. Ban đầu họ thích vẽ nên có thể vẽ trong phim, trong game và cả những chỗ khác. Cho nên cái việc chuyển qua game không khó bằng developer.
Anh nghĩ là thị hiếu chơi game của người già trẻ lớn bé khác nhau như thế nào?
Thật ra tôi cũng không nắm số liệu về chủ đề này, tôi chỉ đọc báo cáo từ những nguồn như Google, hay những trang chuyên về thống kê về game. Thì vấn đề khá khó nói vì còn tùy thuộc vào văn hóa, ví dụ ở Mỹ, văn hóa chơi game của người nhỏ, người lớn và người già khác nhau, thể loại game họ chơi cũng muôn hình vạn trạng. Theo thống kê thường người trẻ trung học chiếm số lượng đông đảo nhất, và tỷ lệ cao là game đối kháng như Fortnight, PUBG,… Sau đó là đến đối tượng trung niên (sau khi ra trường), thời gian chơi game ít lại thì họ có xu hướng chọn game giúp họ giải trí ngắn hạn, nhất là những game mobile.
Tiếp đến là những người thành công, cách chơi game cũng khác. Họ có thể mua một cái game chất lượng cao, hay mua rất nhiều vật dụng chơi game. Khi chơi game họ cảm thấy vui với việc mua hay còn gọi là “pay to win”. Sau đó là những người lớn tuổi, thường chọn những game giúp đầu óc tỉnh táo, như game xếp hình hay về giải đố, trang trí nhà cửa. Mình có thể thấy những game này khá chán vì làm đi làm lại 1 công việc nhưng đối với người lớn tuổi lại thích. Còn lớn hơn nữa thì bất kỳ game nào, miễn sao mang lại cho người chơi cảm giác vui vẻ ở tuổi già. Đó là những gì tôi tìm hiểu về các đối tượng chơi game, và đây chỉ là thống kê ở game mobile.
Các bước ASO (App Store optimization) cơ bản trên appstore cho game như thế nào?
Lúc trước tôi cũng làm SEO thì tôi thấy SEO và ASO khá tương đồng. Ví dụ khi em đi mua hàng, giả sử giá cả không phải là vấn đề thì tiệm nào được trang trí đẹp và bắt mắt, khách hàng sẽ vào tiệm đó. Icon là thứ đầu tiên mà user click vào. Icon phải làm sao đúng với thị hiếu, nhất là tập người dùng mình hướng tới (ví dụ người già, người trẻ, trẻ con đều khác nhau), mình phải biết đối tượng chơi game của mình thuộc lứa tuổi nào để thiết kế icon cho phù hợp, đặc biệt là phải A/B Testing. Tuy nhiên mỗi nước sẽ khác nhau, ví dụ như Mỹ, Hàn Quốc thích kiểu khác, mình có thể tạo ra nhiều icon. Sau khi vô được game app rồi, giống như em vào một cái tiệm thì cách bài trí trong tiệm sẽ hấp dẫn em. Cách bài trí tôi hay gọi là screenshot trong ứng dụng, nói về game của em là ứng dụng gì, càng rõ càng tốt, phải dự đoán user mong muốn điều gì ở một cái game.
Tùy vào mức độ hiểu user như thế nào mà mình đưa những đặc điểm này lên screenshot càng ngắn gọn, dễ hiểu và đẹp sẽ càng hấp dẫn user. Việt Nam thường thích kiểu hình, nhân vật bay bổng, người Nhật thì thích vừa chèn ảnh, emo icon, chèn hình, người Mỹ thì đơn giản, tập trung, rõ ràng. Tùy thị hiếu mà mình thiết kế bộ screenshot cho từng nước. Ngoài ra localized cũng rất quan trọng, không phải tất cả user đều biết tiếng Anh, một số nước mình phải localized ngôn ngữ của họ luôn. Sau khi localized, mình cũng phải A/B Testing như icon, mình tạo rất nhiều bộ và chọn bộ nào tốt nhất.
Sau đó tới phần video, ở một số quốc gia có internet mạnh, người dùng sẽ xem video để xem game này, ứng dụng này nói về cái gì, chơi như thế nào. Một số bạn Marketing hay làm lố hơn, điều này vô tình làm sai tệp khách hàng. Họ tưởng tượng game thế này nhưng khi vào game nó lại khác thì người dùng sẽ xóa game đó.
Về cách phân phối, tạo traffic, mua traffic, user acquisition, retention, gamification, balancing trong game, anh nghĩ như thế nào?
Đây là câu hỏi rất rộng mà không thể trả lời hết trong một buổi talk nên tôi sẽ tập trung một số điểm. Mua user như thế nào? Bây giờ cách làm game không giống ngày xưa. Cách đây 10 năm một cái game bỏ lên App Store thì sẽ có user ngay, vì họ không có nhiều lựa chọn. Thị trường mobile lúc này cũng đi lên, nên marketing khá dễ dàng. Bây giờ ai cũng biết đây là nguồn lợi nhuận cao nên rất nhiều developer nhảy vào, cùng với các hãng lớn. Game bắt đầu nhiều lên, hiện giờ trên App Store và Google đã trên vài triệu game. Sự cạnh tranh rất lớn, lúc này người dùng có nhiều lựa chọn. Chất lượng là thứ quan trọng nhất. làm cho user ở lại lâu hơn và chơi nhiều hơn. Đây là khó khăn nhưng đồng thời là thách thức với ngành game hiện giờ.
Về traffic, đa số mọi người phải chạy số vì traffic không còn organic nữa, như là Google, Facebook, TikTok. Cách khác là sau khi có một game mới, mình promote trên một game khác sẵn có. Đặc biệt với những game đối kháng mình có KOL (blogger, người nổi tiếng hay streamer) cũng là nguồn marketing. Nhưng nguồn này không phải game nào cũng làm được. Với game mobile họ có thể stream những trận đánh của họ cũng là cách marketing mới, hiệu quả và phổ biến.
Vấn đề bản quyền và chi phí mua của các nguồn tài nguyên sử dụng trong game sẽ như thế nào?
Đối với các bạn indie hay các bạn mới làm game cần lưu ý, về hình ảnh google kiểm tra tự động bằng thuật toán. Nếu vi phạm họ sẽ ban ngay khi vừa up lên, nên phải cẩn thận. Lúc mới khởi nghiệp mà không có artist, mình có thể thuê freelancer hoặc chấp nhận game xấu hơn, điều này không sao miễn sao game hay. Chứ nếu đã vi phạm thì rất khó làm lại vì bị xóa mất account. Về âm thanh thì dễ hơn, tuy nhiên với bản nhạc ai cũng biết thì Google cũng có thuật toán có thể dò ra được. Tôi nghĩ mình nên “cây nhà lá vườn”, nó có thể dở hơn một chút nhưng nó vẫn an toàn hơn.
Sau khi đã có doanh thu các bạn có thể thuê freelancer để làm, có điều kiện hơn nữa thì thuê người vào team làm luôn.
Nhắc đến indie thì anh có giải pháp hay lời khuyên nào dành cho các Studio nhỏ để phát triển ngành game tại Việt Nam hay ngành Dev Game nói chung được không?
Với góc nhìn của mình, tôi nghĩ các bạn startup ngành game nếu xem đó là thú vui thì làm sao cũng được, còn nếu xem nó là business như tôi, thì bạn phải có chiến lược rõ ràng, và phải biết chiến lược mình đi như thế nào để khỏi gặp nhiều chướng ngại. Thứ hai các bạn nên kết nối với nhau để học từ nhau để giảm thiểu rủi ro khi mình đi một mình. Tôi thấy cộng đồng developer Việt Nam không mạnh như ở Ấn Độ hay là Mỹ.
Tôi cũng có tạo những group để mọi người trao đổi nhưng tôi thấy những bạn thành công lại không hay share các kinh nghiệm của mình. Nên tôi nghĩ để ngành game thành công thì nhiều người phải share bài học của họ. Có thể bài học đó còn sai nhưng những người khác có thể học hỏi thêm điều gì đó, hoặc những bạn chưa có kinh nghiệm thì có thể tìm và nói chuyện để học hỏi được nhiều hơn. Đặc biệt ngành game rất rộng, không phải một bài học có thể fix được hết, nên mình phải tìm đúng người làm thể loại giống mình thì họ mới có thể giúp mình được. Ví dụ như em định làm game Match-3 thì nên tìm người Match-3 như candy crush, chứ không phải là tôi vì tôi không có kinh nghiệm làm game Match-3.
Xin cảm ơn anh Khánh đã chia sẻ hết sức chi tiết về ngành Game cùng cơ hội và những thách thức. Hy vọng WOLFFUN sẽ sớm đạt được mục tiêu mà anh và cộng sự đặt ra. Ngoài ra, các bạn độc giả đừng quên đón đọc Chuyên giá nói vào kỳ tiếp theo để trò chuyện và học hỏi kinh nghiệm từ các “cao thủ” trong ngành nhé!
Xem thêm các vị trí tuyển dụng từ WOLFFUN Game tại đây
Nói đến HTTP, nó là dạng kết nối stateless, nghĩa là khi đóng một ứng dụng web, lần truy cập sau mọi thứ bị reset lại như ban đầu.
localStorage đơn giản là nó giúp dev chúng ta lưu lại một vài thông tin ở phía trình duyệt của user, để lần sau truy cập ta có thể truy xuất các thông tin này.
Cookie không đủ xài
Cookie là một dạng file text lưu trên máy tính của user, link đến từng domain. Một vài giới hạn của cookie
Tất cả request đến domain, đều sẽ nhét cái cookie này vào trên header
Tối đa có 4KB dung lượng
Sử dụng local Storage trên trình duyệt hỗ trợ HTML5
Cú pháp để set, get, delete giá trị của localStorage
// set
localStorage.setItem(‘tentui’,’luubinhan’);
// get
Var tentui = localStorage.setItem(‘tentui’);
// -> luubinhan
// delete
localStorage.removeItem(‘tentui’);
Làm việc trên object
Vì khi lưu chúng ta chỉ có thể đưa string vào trong localStorage, để đưa một object
Var user = {
Name: ‘an’,
Age: ‘18+’,
Gender: ‘superman’
}
localStorage.setItem(‘user’, JSON.stringify(user));
Console.log(JSON.parse(localStorage.getItem(‘user’));
Thông tin lưu xuống localStorage
Để cache những dữ liệu lớn, tốn thời gian để load.
Lưu lại trạng thái của giao diện user đã custom, có thể lưu cả một đoạn HTML xuống localStorage