Home Blog Page 157

Kết hợp công nghệ vào Logistic thế nào là tối ưu?

Được mệnh danh là “Uber xe tải”, với mục tiêu “số hóa” ngành Logistic – công nghiệp vận tải đường bộ, Logivan là một nền tảng kết nối giữa các chủ xe và chủ hàng một cách nhanh chóng và đúng thời điểm, đồng thời giải quyết bài toán xe rỗng chiều về, từ đó giảm chi phí cho logistics đi nhiều lần. Bài toán mà Logivan cần giải chính là: Làm thế nào để xe về mà không rỗng thùng?

Trong chuyên mục Chuyên gia nói lần này, cùng tìm hiểu cách nhà Logivan áp dụng công nghệ vào Logistic và những thử thách của họ với phần chia sẻ từ CTO của họ, anh Lê Văn Giáp.

Về khách mời Lê Văn Giáp:

  • Hiện tại anh đang đảm nhận vị trí giám đốc công nghệ của Logivan – một công ty về công nghệ vận tải ở Việt Nam.
  • Xuất thân là dân thuần tech – thuần công nghệ và có khoảng 15 năm làm việc trong ngành software development.
  • Đã từng startup 1 vài công ty công nghệ trong khoảng năm 2012 – 2015.
  • 5 – 7 năm gần đây nhất anh bắt đầu công việc về software cụ thể là Fullstack Dev và Solution Active Tech.

Anh có thể chia sẻ một chút về công việc hằng ngày với vai trò là 1 CTO được không?

Thật ra nhiều người cứ nghĩ CTO là vị trí ở trên cao, chỉ việc ngồi chỉ tay 5 ngón cho mọi người làm thôi nhưng mà thực tế thì không phải như vậy, CTO cũng phải đảm nhiệm rất nhiều việc, họp với các managers, trưởng bộ phận của các dự án và dịch vụ, suy nghĩ tìm ra các giải pháp công nghệ để tối ưu các sản phẩm, dịch vụ ở hiện tại và trong tương lai. Hơn nữa xuất thân là dân công nghệ và trong môi trường startup, Giáp luôn muốn mình sẵn sàng xắn tay vào cùng các bạn Dev như một coder có nhiều kinh nghiệm để giải quyết các bài toán khó.

Đối với anh, 1 CTO cần sử dụng thời gian của mình như thế nào cho hiệu quả?

Thật ra đối với CTO ở tập đoàn lớn thì có thể họ sẽ có một timeline và các thời gian biểu hơi khác, còn đối với CTO của một startup thì Giáp nghĩ là mình nên sẵn sàng để join vào bất cứ trường hợp nào thật sự cần đến mình. Tất nhiên một là mình chủ động join vào, hai là mình lắng nghe để biết khi nào các team, các dự án, sản phẩm khi nào cần đến mình thì mình sẵn sàng luôn.

Thật ra để nói công việc nào mình nên xắn tay vào và công việc nào không nên thì rất khó, vì công việc của một startup sẽ thay đổi liên tục, sản phẩm cũng phải tùy chỉnh để thích ứng với thị trường, phải làm sao để thử nhanh, làm nhanh nhất, phải thử nhiều cái sai để tìm ra cái đúng mà đi. Startup không có nhiều điều kiện về nguồn lực, về con người nên mọi công việc sẽ phụ thuộc vào tình hình thực tế. Về cơ bản thì Giáp không muốn áp đặt các quan điểm của mình mà luôn sẵn sàng tham gia vào những phần định hướng, thiết lập ý tưởng, đi với team khi bắt đầu giai đoạn design sản phẩm, áp dụng công nghệ. Sau đó mình sẽ dùng các công cụ quản lý để làm việc nhưng hoàn toàn flexible chứ mình không cưỡng ép mọi người, không quá sát sao, quá chi tiết, tuy nhiên cũng phụ thuộc vào từng tình huống. Mình nghĩ đó chính là cách một CTO trong startup còn nhiều thay đổi và không ổn định.

Theo anh đâu là kỹ năng & tố chất cần thiết của 1 CTO của công ty về công nghệ?

Thật ra những kỹ năng mặc định mà một CTO cần có đó là hiểu biết sâu sắc về technical, vì CTO là người phụ trách về công nghệ của công ty. CTO khác với Technical manager, đã lên C – level thì cần có mindset về business, mình cần tư duy của một doanh nhân, bên cạnh đó đã là CTO của startup thì cần có strong power, sự máu lửa để sẵn sàng đối mặt với những challenge, vì startup luôn có rất nhiều challenge, luôn luôn thay đổi và không ổn định, thậm chí là challenge đến từ các đối thủ cạnh tranh. Giáp nghĩ đấy là những yếu tố cần của một CTO có thể giúp công ty lớn mạnh về mặt công nghệ và có những sản phẩm khác.

Ứng tuyển ngay việc làm Technical Manager hấp dẫn

Về Logistic và sự kết hợp giữa Tech x Logistic

Đâu là những cơ hội và thách thức mà anh thấy trong ngành logistic Việt Nam?

Logistic là một ngành rất thú vị, nó là mạch máu, huyết mạch kinh tế của bất cứ quốc gia nào, một khi logistic bị trục trặc nào đó hoặc ngừng hoạt động thì nó ảnh hưởng ngay đến nền kinh tế.

Logis là gì? Đó là vận chuyển hàng hóa, mà nó ngưng thì chúng ta sẽ bị ảnh hưởng cả về mặt tiêu dùng, nhập khẩu, xuất khẩu,… Thị trường logistic ở Việt Nam có tổng volume khoảng 40 tỷ đô, trong đó phần dành cho tracking – vận tải bằng xe tải chiếm khoảng 27 tỷ đô, vô cùng lớn và tiềm năng. Hiện tại đây cũng chính là mảng mà Logivan focus vào khai thác, áp dụng công nghệ vào để tối ưu vận chuyển bằng tracking.

Ngoài ra thì cũng có một thách thức nữa, cái gì mà mọi người nhìn thấy được như Uber, Grab,… các công ty nước ngoài tham gia vào thị trường logistic của chúng ta khá lâu rồi, thách thức đặt ra là làm sao một công ty công nghệ có thể sử dụng công nghệ để giải quyết các vấn đề truyền thống. Bình thường khi chưa có công nghệ áp dụng vào thì các công ty vận tải đều sử dụng rất manual để vận hành hệ thống vận tải. Nhiệm vụ của Logivan nói riêng và các doanh nghiệp vận tải nói chung đều muốn xây dựng các giải pháp bằng công nghệ giúp tự động hóa, tối ưu quy trình sản xuất, đánh giá tất cả các khâu trong quy trình logistic để nâng cao hiệu suất, giúp cho các doanh nghiệp có được lợi nhuận tốt nhất.

Vậy anh có thể chia sẻ solution làm sao để xe về mà không có thùng rỗng?

Thật ra trước đây đã có những công ty tài xế, doanh nghiệp tài xế, có những công ty vận tải, doanh nghiệp vận tải, doanh nghiệp nhỏ, xí nghiệp vận tải, thậm chí là các tài xế hoạt động độc lập theo cách rất truyền thống, như là gọi điện, truyền miệng để booking shipment, chuyển từ điểm A đến điểm B thôi, nội thành hay liên tỉnh gì đó. Ít khi người ta biết được chiều về thì lấy hàng đâu ra để về, mà làm sao tính toán được để nó khớp thời gian ví dụ mình đi hết một ngày thì lúc về làm sao để có hàng, không ai biết được tài xế đi từ điểm A đến điểm B và về khi nào cả.

Nên solution mà Logivan đưa ra là xây dựng một hệ thống. Một tài xế hoặc 1 doanh nghiệp tham gia vào thì tất cả các activities của họ sẽ được hiển thị trên hệ thống. Lúc đó thì mình hoàn toàn có thể biết được là khi nào họ đi từ điểm A đến điểm B và các đối tác, khách hàng của mình người ta cũng biết được là thời điểm nào có thể chuyển hàng quay ngược lại. Vì biết trước được tất cả mọi thứ nên họ có thể bắt nhịp được order đó hoàn toàn bằng công nghệ. Và chúng tôi cũng có sử dụng các hệ thống AI để optimize giá cả để có thể phù hợp nhất với nhu cầu.

Các bạn lập trình viên khi join vào team của LOGIVAN thì sẽ gặp những khó khăn gì và học được những gì?

Ngành nghề nào cũng đều thú vị cả nhưng logistic có một điểm rất đặc biệt là khi release một giải pháp xong nó sẽ trực tiếp ảnh hưởng đến khách hàng ngay lập tức, vì ngày nào cũng có hàng trăm nghìn shipment, nên chỉ cần mình update version là nó ảnh hưởng luôn đến tài xế do họ sử dụng những giải pháp, ứng dụng của mình. Đó là điều thú vị mà rất nhiều các bạn trẻ khi join vào Logivan sẽ thực hiện các mission đó.

Tại Logivan, mission được đề cao nhất đó là sẽ không chuyến xe tải nào phải chạy thùng rỗng về và tất cả các bạn tham gia đều rất thích thú với vấn đề đó. Sau khi tham gia vào team rồi còn có rất nhiều các bài toán khác nữa, sử dụng AI, sử dụng big data, xây dựng các app trên mobile app, trên web. Còn về việc sẽ học được những gì thì ở bất kỳ lĩnh vực nào, chỉ cần bạn tham gia vào thì sẽ học được những thứ cần thiết.

Đối với lĩnh vực logistic, các bạn cần phải có được những cảm xúc và tư duy nó hơi đặc biệt một chút do nó ảnh hưởng đến khách hàng ngay lập tức và nhìn thấy kết quả ngay. Đặc biệt là nó cần tư duy nhiều hơn, ví dụ như một bạn làm quản lý hay dev mới vào Logivan sẽ được đi một chuyến để trực tiếp trải nghiệm cùng các tài xế để cảm nhận được chuyến vận chuyển đó thực tế nó như thế nào. Khi hiểu được điều đó thì mình sẽ hiểu được cung – cầu, hiểu được vấn đề thì mình làm sản phẩm mới sát được vấn đề, mới giải quyết được bài toán.

Ngoài ra, còn điều gì thu hút ứng viên join vào team mình?

Công ty nào cũng muốn tạo điều kiện tốt nhất cho các nhân viên của mình, ở Logivan cũng vậy. Với Logivan thì việc đầu tiên thu hút nhân tài chính là mission để giải quyết bài toán logistic. Còn khi đã vào rồi thì sẽ có các điều kiện như sau: Thứ nhất là môi trường rất năng động, trẻ trung và rất nhiệt huyết, vì thường thì các bạn đã chọn cái ngành rất đặc biệt này đều rất yêu thích, vì thích nên mới vào, cho nên các bạn làm việc rất nhiệt huyết luôn, làm không kể thời gian.

Thứ 2 nữa là có những bài toán khó để làm, nhất là với các bạn dev vào mà không thấy có bài tập khó sẽ cảm thấy nhàm chán nhưng mà anh make sure luôn là logistic sẽ có rất nhiều bài toán khó để làm. Và các phúc lợi khác cũng rất cạnh tranh, đặc biệt là có một CTO điển trai, vui tính và rất nhiệt huyết, máu lửa với những kinh nghiệm của mình.

Theo anh dự đoán thì trong vòng 5 năm tới, ngành nghề nào sẽ chiếm ưu thế?

Thật ra trong lĩnh vực công nghệ thông tin thì những ngành hiện tại đã nổi lên rồi và trong 5 năm tới thì mình nghĩ AI và Internet of Things là 2 cái chiếm ưu thế lớn nhất, thị trường có nhu cầu cao nhất về nguồn nhân lực. Sau đó là đến những thứ như fintech cũng nằm trong top 3 những ngành nghề mà các bạn trẻ nên để ý.

Thậm chí ngay cả những bạn CTO muốn định hướng lại nghề nghiệp của mình cũng có thể để ý tương lai của 3 ngành này, nên có sự chuẩn bị ngay từ bây giờ. Mình cảm thấy mình thích cái gì, thiếu cái gì để tập trung trau dồi, học hỏi những kỹ năng cần thiết để có cơ hội làm việc, nếu không thì càng về sau sự cạnh tranh của nguồn nhân lực sẽ càng lớn.

Anh nghĩ như thế nào về việc một số startups công nghệ khẳng định ứng dụng AI, IoT trong sản phẩm của mình?

Không chỉ startup mà mình nghĩ công ty nào cũng muốn áp dụng những công nghệ hiện đại vào trong quản lý để tối ưu vận hành, riêng với startup công nghệ thì mình có lời khuyên chân thành như thế này: Nếu như startup đang ở giai đoạn thắt chặt về chi phí, chưa có nguồn lực dồi dào mà chỉ tập trung vào sản phẩm thì mình nghĩ chưa cần theo đuổi những công nghệ quá tốn kém về mặt chi phí, AI, IoT, Cloud… tất cả đều tốn kém.

Nhưng trong 3 cái này thì mình thấy Cloud cũng không phải quá tốn kém nên có thể xem xét áp dụng được, những sponsor từ các công ty công nghệ lớn như Google, họ có thể tài trợ cho mình những gói miễn phí để hỗ trợ setup thì mình nên cố gắng tận dụng cái đó. Vì khi mình tự tin áp dụng AI hay Cloud vào quy trình quản lý nếu áp dụng hiệu quả thì chắc chắn sẽ giúp chúng ta vận hành thông minh hơn, tự động hơn thì sẽ giảm chi phí về mặt con người, tăng thời gian vận hành.

Khi mình có nguồn vốn đầu tư rồi thì cứ mạnh dạn đầu tư vào AI, IoT và cả Cloud luôn. AI giúp chúng ta sử dụng trí tuệ nhân tạo để quản lý, vận hành và phát triển sản phẩm được thông minh hơn. IoT thì nó liên quan về hardware, giải pháp giúp mọi thứ vận hành ổn định hơn. Đơn giản như bài toán xây dựng hệ thống chấm công tự động bằng nhận diện gương mặt, nếu các startup áp dụng được sẽ giúp tối giản quy trình chấm công hiện tại. Nó đem lại sự hứng thú cho nhân viên vì dù sao thì chúng ra cũng là một công ty công nghệ. Cloud hiện tại được sử dụng để đảm bảo các dữ liệu của mình được bảo vệ và không tốn nhiều nguồn lực về mặt con người.

Anh có thể chia sẻ những thử thách mà LOGIVAN đang gặp phải khi bắt đầu sử dụng AI cho sản phẩm không?

Bất cứ công ty nào cũng vậy khi bắt đầu đưa AI vào thì khó khăn nhất là data, làm sao đủ để đưa ra những dự toán đúng nhất. Khó khăn nhất của Logivan chính là cần nhiều dữ liệu vận hành và củng cố những data quan trọng của khách hàng, viết những thuật toán chuyên nghiệp nhất, làm việc với những dữ liệu ít hơn so với mong muốn một cách tương đối. Hiện tại các dữ liệu của Logivan khá nhiều, khá đa dạng, mô hình AI của Logivan cũng khá là ổn.

Lời khuyên đến từ chuyên gia Logistic

Anh có lời khuyên nào dành cho các bạn kỹ sư trong việc định hướng nghề nghiệp sau này không?

Nhất là các bạn vừa mới ra trường và các bạn ra trường được 1, 2 năm, Giáp cảm thấy các bạn bị vướng vấn đề về định hướng nên nhân tiện đây Giáp cũng chia sẻ luôn là các bạn đừng quá quan trọng nó. Khi chúng ta còn trẻ, cứ thoải mái mà lựa chọn chứ đừng quá cân nhắc là à cái này nó có thật sự hay không, banking có hay hay không, financial thật sự có ổn không hay là logistic thì nó có gì thú vị không? Khi chúng ta cứ mãi băn khoăn suy nghĩ thì cơ hội nghề nghiệp nó đã rơi vào tay người khác rồi nên hãy quyết định thật nhanh và đừng có đắn đo để chúng ta trải nghiệm.

Sau 1 năm, 3 năm khi các bạn đã trải nghiệm đủ rồi thì sẽ có các mindset khác, cách nhìn khác đến lúc đấy các bạn sẽ chọn đúng cái mà mình thích. Ví dụ có bạn sau 3, 4 năm cảm thấy mình chỉ thích mỗi logistic thôi thì các bạn join vào, các bạn khác thì thích làm về financial, fintech,… mỗi người sẽ có một lựa chọn khác nhau. Cho nên là khi còn trẻ mình cứ thoải mái đi, có cơ hội thì cứ join vào để trải nghiệm.

Đối với các doanh nghiệp, startups Việt thì anh có lời khuyên nào không?

Đối với startup thì việc định hướng cho sản phẩm rất quan trọng nhưng cũng đừng quá quan trọng nó lên. Trong vòng 2 – 3 năm đầu hầu hết các startup đều loay hoay với việc buildup sản phẩm, thậm chí chúng ta phải làm đi làm lại, sai rất nhiều thì cũng đừng ngần ngại việc đó, mình cử thử đi, cứ làm đi, làm 10 lần thì sẽ có một lần mình cảm thấy nó đúng nhất, ổn nhất, fix với tưởng tượng nhất thì mình focus vào.

Mình thấy có nhiều startup cứ cố bảo vệ quan điểm ngay từ đầu là chúng ta chỉ làm đúng với sản phẩm mà mình đề ra từ đầu thôi và không chịu thay đổi, thậm chí là bảo thủ trong việc thay đổi. Như vậy thì rõ ràng chúng ta sẽ bị đào thải vì bạn cứ giữ khăng khăng một cái ý tưởng ban đầu, sợ không dám thay đổi và cứ bảo thủ với quan điểm của mình thì chắc chắn sẽ bị đào thải vì sản phẩm nó không fix với môi trường đó.

Và đối với startup công nghệ có một điều rất quan trọng và rõ ràng là chúng ta phải tập trung vào công nghệ, có nhiều startup xuất thân là công nghệ nhưng khi quay cuồng với bài toán về business, về doanh thu, về lợi nhuận thì các bạn bỏ quên mất công nghệ là cốt lõi giúp các bạn tạo ra được sản phẩm tốt, tạo ra dịch vụ tốt giúp đem về lợi nhuận cho công ty.

Thêm nữa là startup thì nên có tầm nhìn, tất nhiên là nó không quá xa vì mình biết bản thân startup là không ổn định. Nhưng mình phải có tầm nhìn xa một chút để định hướng về mặt sản phẩm, thị trường. Hơn nữa định hướng đó sẽ cho bạn một kế hoạch rõ ràng hơn, các bạn sẽ cần nhân sự như thế nào, cần tổ chức về con người làm sao, phát triển theo mô hình nào, sẽ có những công cụ giải pháp gì. Các startup luôn bảo là mình cứ làm một cách thoải mái, tự do đi, đến đâu thì đến mà quên mất là mình có những công cụ rất đắc lực có sẵn, thậm chí là miễn phí, như các bạn có thể dùng các công cụ quản lý về công việc, rồi chúng ta có thể áp dụng các opensource về AI, sử dụng AI chúng ta có thể tối ưu bài toán business của mình lên, tối ưu về mặt quản trị, các tool về management, sử dụng các mô hình phát triển sản phẩm đang rất phổ biến.

Một vấn đề cuối cùng là quản lý tài chính, cần phải biết là giai đoạn nào mình cần tuyển bao nhiêu người, nên cân nhắc điều đó để startup có thể đi dài dài một chút, có thể đạt được thành công.

Cá nhân anh thường trau dồi kỹ năng và kiến thức từ những nguồn nào?

Muốn đi xa hơn trong lĩnh vực công nghệ thì phải liên tục học hỏi, học từ môi trường làm việc, học từ môi trường internet và từ sự chủ động học tập của bản thân, đọc sách về công nghệ, về business. Bây giờ đã là thế giới phẳng, chúng ta có thể search Google, Youtube có rất nhiều thứ để mình học, quan trọng là chúng ta có thích và chủ động làm điều đó hay không, chúng ta dành thời gian bao nhiêu một ngày để làm điều đó. Riêng bản thân Giáp ngày nào cũng liên tục học tập, có thể xem 1, 2 clip trên Youtube về ngôn ngữ lập trình, solution rất hay, hay những clip giới thiệu về các clip mới nhất của Google, Facebook, Microsoft mình cũng nên tham khảo. Ngoài ra có một keypoint đó là practice, đọc nhiều, nghe nhiều cũng không bằng dành thời gian để làm dự án, bài tập. Khi tự làm thì mình sẽ tìm ra được những phương pháp tốt nhất để trau dồi và giải quyết các dự án khó sau này.

Xin cảm ơn những chia sẻ rất bổ ích từ anh Lê Văn Giáp. Hy vọng với những công nghệ từ các doanh nghiệp, ngành Logistic của Việt Nam sẽ ngày càng tối ưu về cả chất lượng và chi phí. Đón chờ những số tiếp theo tại TopDev TV để học hỏi những kinh nghiệm từ các chuyên gia trong ngành.

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

 

Yaml cho web developer

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

Dạo gần đây, nếu bạn là Front End developer chắc sẽ gặp nhiều đến file có đuôi .yml ( ví dụ như .gitlab-ci.yml). Nếu bạn chưa biết kiểu file này, thì bài này mình sẽ giới thiệu túm lược để bạn làm quen.

File này được dùng khá nhiều cho việc thiết đặt và cấu hình. Mà nhiều nhất là dùng cho các thiết đặt CI/CD. Ngày xưa, khi chưa có Yaml, sau khi quá mệt mỏi với việc mỗi người mỗi ý trong việc viết file cấu hình, nổ ra cái ý tưởng hồi năm 2001

Giờ sao chúng ta không tạo ra một file cấu hình giống như chỉ dẫn nấu ăn, chữ thôi, cực kỳ dễ hiểu?

  • Yaml cũng là một dạng superset của người anh em JSON.
  • Superset là một ngôn ngữ chứa tất cả feature của một ngôn ngữ, rồi mở rộng thêm một số thứ nữa

Ví dụ như TypeScript là superset của Javascript

{
  "compilerOptions": {
    "module": "system",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "outFile": "../../built/local/tsc.js",
    "sourceMap": false,
    "types": ["node", "lodash", "express"]
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

File JSON không quá khó đọc, tuy nhiên lại vướng một vài hạn chế:

  1. Không dùng biến được
  2. Không dùng biến môi trường được
  3. Không thể override value

YAML sẽ giúp ta làm được những điều chưa làm được ở json

compilerOptions:
  module: system
  noImplicitAny: true
  removeComments: true
  preserveConstEnums: true
  outFile: '../../built/local/tsc.js'
  sourceMap: false
  types:
    - node
    - lodash
    - express
include:
  - src/**/*
exclude:
  - node_modules
  - '**/*.spec.ts'

lưu ý đây chỉ là ví dụ, bạn không thể viết tsconfig bằng YAML, buồn thay

Một số nguyên tắc-cú pháp cần nắm

Thục đầu dòng

Thục đầu dòng rất quan trọng, bạn chỉ được dùng dấu khoảng trắng, không cho phép dùng tab

Viết comment

# I'm a comment
person: # I'm also a comment
  age: 20

Dạng danh sách

Có 2 cách biết, như đã nói là superset của json, nên chúng ta có cách thứ nhất i như json

people: ['Anne', 'John', 'Max']

Khuyến khích cách này hơn

people:
  - Anne
  - John
  - Max

Khai báo giá trị string

Trong JSON bạn chỉ một cách viết giá trị dạng String là đưa nó vào dấu ngoặc kép "", Yaml thì linh động hơn

company: Google # Single words, no quotes
full_name: John Foo Bar Doe # Full sentence, no quotes
name: 'John' # Using single quotes
surname: "Christian Meyer" # Using double quotes

Trong trường hợp bạn có chưa các ký tự đặc biệt, thì nên đưa vào dấu nháy kép.

Số

year: 2019 # Integer
nodeVersion: 10.8 # Float

Con trỏ

Khái niệm con trỏ xem như bạn đã biết nhé, mình không giải thích, cái này các bạn đi học chắc các thầy dạy kỹ lắm rồi.

Ví dụ như bạn đang viết một số config cho môi trường production và staging, tức nhiên là một config là giống nhau thôi, nên chúng ta chỉ cần trỏ nó qua một chỗ

Đây là không trỏ qua mà copy/paste huyền thoại

{
  "production": {
    "node_version": "13.0.0",
    "os": "ubuntu",
    "package_manager": "yarn",
    "run": ["yarn install", "NODE_ENV=${ENVIRONMENT} yarn build"],
    "env": {
      "ENVIRONMENT": "production"
    }
  },
  "staging": {
    "node_version": "13.0.0",
    "os": "ubuntu",
    "package_manager": "yarn",
    "run": ["yarn install", "NODE_ENV=${ENVIRONMENT} yarn build"],
    "env": {
      "ENVIRONMENT": "staging"
    }
  }
}

Để dùng con trỏ, chúng ta tạo trước một cái neo để sau này trỏ vào cái neo này

base-config: &base # tên cái neo
  node_version: 13.0.0
  os: ubuntu
  package_manager: yarn
  run:
    - yarn install
    - NODE_ENV=${ENVIRONMENT} yarn build

Sau đó thực hiện việc trỏ

base-config: &base
  node_version: 13.0.0
  os: ubuntu
  package_manager: yarn
  run:
    - yarn install
    - NODE_ENV=${ENVIRONMENT} yarn build

production:
  # dùng các thiết đặt ở neo tên là base
  <<: *base
  env:
    - ENVIRONMENT: production

staging:
  # dùng các thiết đặt ở neo tên là base
  <<: *base
  env:
    - ENVIRONMENT: staging
  67 tools, libraries và resources giúp Web developer "dễ thở" hơn
  Con đường mình đang đi để trở thành Fullstack Web Developer

Môi trường Shell/Bash

Như đã nói lúc đầu, file .yml rất được ưu dùng đề làm config, đặc biệt là config môi trường CI/CD.

Môi trường CI/CD thường là Linux, và chúng ta cũng có thể truy cập đến các biến môi trường của Linux.

Ví dụ như Github CI, chúng ta có thể chỉ định biến môi trường global nào chúng ta muốn truy cập

variables:
  NODE_IMAGE: node:10

stages:
  - build

test:
  image: $NODE_IMAGE
  stage: build

Cú pháp $ không phải của yaml mà là của shell/bash. Những gì Github CI sẽ làm là đưa toàn bộ những biến bạn đặt trong variables và tạo ra biến trong shell

Một vài hệ thống khác cũng inject các giá trị khác như commit ref, branch name, build time, secret key được đặt bên ngoài file config

variables:
  NODE_IMAGE: node:10

stages:
  - build

test:
  image: $NODE_IMAGE
  stage: build
  artifacts:
    name: $CI_COMMIT_REF_NAME

Ví dụ ở trên, chúng ta sử dụng biến môi trường $CI_COMMIT_REF_NAME của GitLab CI.

Hy vọng các bạn đã hiểu chút đỉnh về YAML và cảm thấy đọc file yaml không quá khó chịu nữa.

Tài liệu tham khảo

https://yaml.org/ https://www.json2yaml.com/ https://learnxinyminutes.com/docs/yaml/

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

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

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

AI: Chìa khóa của những điều con người đang hằng mơ đến

Vào năm 2010, AI chỉ xuất hiện trên các bộ phim khoa học viễn tưởng như một sáng tạo siêu việt của loài người, song thật không thể tin được 1 thập kỷ sau đó, trí tuệ nhân tạo đã được hiện thực hóa và được áp dụng rộng khắp, được tích hợp vào các phương tiện nhằm tối ưu hóa và phục vụ nhu cầu của con người trong cuộc sống.
AI
 
Hiểu được sức mạnh của AI, chúng ta có thể đón đầu những xu hướng công nghệ trong tâm thế sẵn sàng cũng như chủ động vươn mình ra khỏi các khuôn khổ lạc hậu, lỗi thời. Vì lẽ đó, lần đầu tiên tại TPHCM, với tổng giá trị giải thưởng lên tới 400 triệu đồng, một hội thi về trí tuệ nhân tạo:

#AISOCHA2020 – HỘI THI “GIẢI PHÁP ỨNG DỤNG TRÍ TUỆ NHÂN TẠO TRÊN ĐỊA BÀN TP. HỒ CHÍ MINH NĂM 2020” được tổ chức với quy mô toàn quốc nhằm tạo ra không chỉ một sân chơi, đấu trường kiến thức mà còn là một bệ đỡ cho các ý tưởng đột phá được mạnh mẽ bước lên “vũ đài công nghệ” và tỏa sáng

mong muốn đưa hơi thở công nghệ mới đến từng ngóc ngách, đến từng cá nhân trên địa bàn TPHCM nói riêng và toàn quốc nói chung, thu hút các chuyên gia đầu ngành cùng bắt tay giải bài toán thiết thực xuất phát từ thực tiễn nhằm ứng dụng rộng rãi vào đời sống. Bên cạnh đó, tôn vinh các cá nhân, tập thể đã có cống hiến nổi bật trong công tác “thay da đổi thịt” một TPHCM trẻ trung – hội nhập – hiện đại.
 
3.0 đến 4.0 chỉ cách 1 đơn vị nhưng là cả một hành trình dài và chúng ta đang bước những bước đầu tiên cùng nhau trên con đường đó. “ ℎ ”
—————————————–
#AI #AISOCHA2020 #AISOCHA #SOCHA
Thời gian mở đơn: Trước ngày 24/8/2020
Link chi tiết sự kiện: https://bit.ly/3hDq6Fo
Link đăng ký dự thi: http://aichallenge.hochiminhcity.gov.vn/
Đối tượng: Không giới hạn đối tượng dự thi trên toàn quốc.

Tham khảo thêm các vị trí tuyển dụng kỹ sư AI lương cao tại Topdev.

Thêm kiểm tra type trong Javascript với VS Code

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

VS Code có một công cụ không thể tuyệt vời hơn cho các bạn viết JS một cách an toàn ko sợ sai type. Túm gọn chỉ bằng một comment thần thánh

  4 lý do để VS Code là Text Editor ưa thích của mọi lập trình viên
  8 extension cần thiết dành cho VS Code

Ví dụ, bạn muốn nghiêm cấm việc thay đổi type của một biến đã gán sẵn giá trị trước đó

var foo = 3;
foo = false;

Tất cả những gì bạn cần làm

// @ts-check
var foo = 3;
foo = false; // indicates error

VS Code sẽ thông báo cho bạn một lỗi rất dễ thương như thế này

Type false is not assignable to type Number

Một vài ví dụ sử dụng để bạn tham khảo

Kiểm tra params của hàm

function add(a, b) {
  return a + b;
}

add(1,2,3);

Code trên vẫn ko sai nhé, mặc dù chúng ta không hề khai báo param thứ 3. Thêm // @ts-check để thông báo khi vô tình truyền nhiều hơn số param cần thiết

Expected 0-2 arguments but got 3

// @ts-check
function add(a, b) {
  return a + b;
}

add(1,2,3); // complains about the `3`

Kiểm tra Object

// @ts-check
let gameObject = {
  x: 0,
  y: 0,
  width: 100,
  height: 100,
  getArea() {
    return this.width * this.height
  }
}

gameObject.z;

Cái này nó sẽ không bắt lỗi, chúng ta vẫn được quyền thêm z sau khi đã khai báo

Vậy sao? Dùng JsDoc

// @ts-check

/** @type {{x: number, y: number, width: number, height: number, getArea: Function }} */
let gameObject = {
  x: 0,
  y: 0,
  width: 100,
  height: 100,
  getArea() {
    return this.width * this.height
  }
}

gameObject.z;

Biến không bắt buộc

Chúng ta có một hàm mà giá trị param truyền vào không bắt buộc lúc nào cùng có

function doSomething(config) {
  if (config && config.shouldRun) {
    // run
  }
}

doSomething();
doSomething({ shouldRun: true })

Chỗ này chúng ta cũng cần sự hỗ trợ của JsDoc như trường hợp trên

// @ts-check

/**
 * @param {{ shouldRun: boolean }} [config] - Somebody's name.
 */
function doSomething(config) {
  if (config && config.shouldRun) {
    // run
  }
}

doSomething({ canRun: false}); // this now indicates an error
doSomething({ shouldRun: true })

Với cách thiết đặt như vậy, chúng ta sẽ nhận được cảnh báo khi truyền vào một object mà không có giá trị shouldRun

Ngoại lệ

Nếu có trường hợp ngoại lệ nào đó bạn muốn bỏ qua việc kiểm tra tính chuẩn mực của type, dùng thần chú //@ts-ignore hoặc //@ts-nocheck

//@ts-ignore
doSomething({ canRun: false});

Sau nhiều năm chinh chiến, mình ngộ ra rằng TypeScript cũng tốt, nhưng nó không dành cho tất cả mọi người, tất cả dự án. Những cái kiểm tra nhỏ nhỏ như vậy đôi khi lại mang khác biệt đủ lớn khi bạn viết code.

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

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

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

Trứng lòng đào và các vấn đề đồng hồ trong lập trình

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Sáng nay tui luộc trứng. Bỏ trứng vào nồi, bật bếp rồi bỏ ra ngoài chơi game. Liếc nhìn đồng hồ trên lò vi sóng hiển thị 07:36. Dự là sẽ canh đúng 6 phút để có trứng lòng đào hoàn hảo.

07:42, tui vào tắt bếp và bóc trứng. Lòng đỏ nhão nhẹt . Nhìn kĩ mới để ý là đồng hồ trên lò chậm hơn đồng hồ trong game console gần 2 phút .

  "Bách khoa toàn thư" ngôn ngữ lập trình Perl
  "Trên tay" SwiftUI của một lập trình viên mobile

Khi đồng hồ không đáng tin

Đồng hồ pin mà chúng ta xài mỗi ngày sử dụng một bộ dao động Quartz, hoạt động bằng cách đo tần suất dao động của một viên pha lê thạch anh được cấp điện bởi một cục pin.

Trứng lòng đào và các vấn đề đồng hồ trong lập trình

Bạn nào yêu thích tìm hiểu đồng hồ chắc sẽ biết là bộ dao động Quartz, dù cho chính xác cao hơn nhiều so với bộ dao động cơ, vẫn có sai số từ ±10-20s/tháng trong điều kiện bình thường, ngoài ra còn phụ thuộc vào nhiều yếu tố khác như là nhiệt độ.

Có nghĩa sau khi chạy được một khoảng thời gian nào đó, đồng hồ Quartz sẽ chạy lệch so với thời gian của vũ trụ . Hiện tượng này có thuật ngữ là clock drift (tạm dịch: trượt đồng hồ), clock drift có thể trượt về tương lai hoặc quá khứ tùy vào hứng của viên pha lê.

Nó đồng nghĩa với việc thời gian trên cái đồng hồ đôi khi không đáng tin cậy. Vì vậy, đồng hồ cần phải được căn chỉnh đồng bộ thường xuyên. Giống như khi đồng hồ treo trường hết pin hoặc sắp hết pin, nó sẽ không chạy chính xác nữa mà bạn “dòm” nhờ đồng hồ nhà hàng xóm để vặn lại cho đúng.

Nhưng rồi bạn sẽ đặt câu hỏi: “Tui có bao giờ chỉnh đồng hồ trên game console hay smart phone đâu mà nó vẫn chạy đúng thôi?”.

Đó là bởi vì những thiết bị đó luôn tự chỉnh lại thời gian của chính nó, thông qua một giao thức có tên gọi là NTP (Network Time Protocol).

Việc giải thích cách giao thức NTP hoạt động nằm ngoài phạm vi bài viết này, nhưng cơ bản là máy của bạn join vào một mạng lưới bao gồm rất nhiều máy tính “hàng xóm”, nơi mà lâu lâu nó ngó vào đồng hồ của chúng và tự chỉnh sửa lại cho hợp lý dựa trên một công thức phức tạp. Thời gian của mạng lưới này có nguồn từ những atomic clock có độ chính xác gần như tuyệt đối, tính bằng giây/tỉ năm. NTP đảm bảo cho độ sai lệch ở mức vài chục millisecond.

Mặc dù vậy, không có gì đảm bảo đồng hồ trên máy của bạn luôn đúng mặc dù sử dụng NTP, bởi vì không chỉ thời gian, network cũng không đáng tin cậy. Máy tính có thể bị mất kết nối tới NTP server, mất kết nối Internet, hoặc chết đi sống lại sau một thời gian dài, lúc đấy không có gì đảm bảo thời gian của bạn là reliable cả.

Bài toán “trứng lòng đào”

Ta hãy thử mô tả lại bài toán trứng lòng đào dưới con mắt của một lập trình viên.

Ở đây ta có một distributed system, với 2 service (tạm gọi là Kitchen và GameConsole) chạy trên 2 máy tính riêng biệt và có kết nối mạng với nhau. Tui sẽ mô phỏng lại bằng đoạn code Ruby dưới đây, với các lớp giao tiếp networking đã được tối giản.

Kitchen có 2 thao tác boil_eggs và turn_stove_off. Khi bắt đầu nấu trứng, Kitchen sẽ gọi GameConsole nhắc nó tắt bếp sau 6 phút.

class Kitchen
  def boil_eggs()
    turn_stove_on()
    time = Time.now() # `07:36`
    due_time = time + 3_600 # 6 minutes
    GameConsole.remind(self, due_time)
  end

  def turn_stove_off()
    @turn_off = true
  end
end

Phương thức GameConsole.remind chỉ là một vòng lặp vô hạn kiểm tra khi nào thì báo bên kia tắt bếp.

class GameConsole
  def remind(sender, due_time)
    loop do
      if due_time >= Time.now()
        sender.turn_stove_off()
        break
      end
    end
  end
end

Ở đây, ta có một vấn đề “trứng lòng đào”. Nếu thời gian của chúng lệch nhau, như đã nói, bếp sẽ được tắt trước hạn nếu đồng hồ GameConsole chạy nhanh hơn Kitchen hoặc sau hạn nếu ngược lại. Sự đúng đắn của đoạn code này phụ thuộc vào độ đồng bộ thời gian của cả 2 máy tính.

Vậy ta sẽ sửa lại bài toán trên như thế nào? Đương nhiên bạn không thể cập nhật lại đồng hồ định kì bằng cơm, càng không thể cài NTP vào lò vi sóng. Cho dù bạn cài được NTP vào lò vi sóng đi chăng nữa, bạn vẫn không thể đảm bảo đồng hồ của lò luôn luôn chính xác. Bởi vì network là không đáng tin cậy như tui đã đề cập ở trên.

Cơ mà nếu ở ngoài đời thực, ta gần như lập tức nghĩ ra cách dùng đồng hồ bấm giờ.

Hầu hết mọi hệ điều hành đều cung cấp cho ta hai loại đồng hồ để thao tác với thời gian: real-time clock CLOCK_REALTIME và monotonic clock CLOCK_MONOTONIC. Hai loại đồng hồ này được thiết kế để dùng trong những trường hợp khác nhau.

  • real-time clock – còn lại là wall clock (đồng hồ treo tường), thể hiện dự đoán gần đúng nhất của máy tính về thời điểm thực hiện tại. Đồng hồ treo tường này luôn luôn cần được đồng bộ và có thể go backward.
  • monotonic clock – thể hiện thời gian đã trôi qua tính từ một thời điểm cố định bất kì nào đó trong quá khứ. Monotonic clock luôn tăng.

Ta có thể sử dụng monotonic clock cho bài toán trên.

Lúc này thay vì gửi một giá trị tuyệt đối là timestamp đáo hạn cho GameConsoleKitchen chỉ đơn thuần gửi gắm là nó muốn được đáo hạn sau một đơn vị thời gian.

class Kitchen
  def boil_eggs()
    turn_stove_on()
    GameConsole.remind(self, 3_600) # 6 minutes
  end
end

Với GameConsole, khi nhận được tin nhắn, ta sẽ ghi lại start là monotonic time hiện tại trên máy. Sau đó tính elapsed time (thời gian trôi qua) trong mỗi vòng lặp.

class GameConsole
  def remind(sender, due_after)
    start = Process.clock_gettime(Process::CLOCK_MONOTONIC)

    loop do
      elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start

      if elapsed >= due_after
        sender.turn_stove_off()
        break
      end
    end
  end
end

Vì sao không dùng Time.now()?

Time.now() trong Ruby dùng wall-clock.

Bài viết này sẽ giúp tôi tăng lương như thế nào?

Bài viết này không giúp bạn tăng lương, nhưng tui chắc chắn đọc xong, bạn sẽ biết nấu trứng lòng đào.

Bạn cũng biết rằng bạn KHÔNG nên dùng wall clock khi muốn tính elapsed time.

Bạn cũng nhớ rằng KHÔNG có gì đảm bảo một sự kiện xảy ra sau sẽ hiển thị sau ở hệ thống (causal effect), nếu dùng timestamp từ wall clock để order.

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

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

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

Để thăng tiến, cần phải có chiến lược!

Một lộ trình thăng tiến rõ ràng cho sự nghiệp luôn được các nhân viên quan tâm. Đây là lý do quyết định đến sự đồng hành lâu dài của một nhân viên.

Tuy vậy, bạn cũng cần có chiến lược để tỏa sáng theo cách riêng của mình. Môi trường nhân sự chính là sân khấu và là nơi để bạn tạo lập những giá trị nhằm hướng đến thành công. Cùng TopDev khám phá đâu là những chiến lược thăng tiến hiệu quả nhất nhé!

Bộc lộ mong muốn thăng tiến của bản thân

Luôn nỗ lực và không ngại thể hiện 

thăng tiến

Nhiều người đánh đồng việc những khao khát về sự thăng tiến với việc tự ảo tưởng về tương lai là một. Điều này thật sự chưa chính xác. Thật ra, khó có thể trách họ nếu họ nghĩ như vậy. Đơn giản, việc bộc lộ những khao khát chỉ đơn giản là sự thể hiện, bày tỏ những mong muốn cá nhân với công việc. Và tất nhiên, điều đó phải đảm bảo tính khả thi.

Bạn sẽ khó tránh việc tiếp xúc với quá nhiều người có cái tôi quá lớn. Họ suy xét và luôn đưa ra những ý kiến bảo thủ; hãy mặc kệ mọi thứ và chấp nhận vì nó. Nhiệm vụ bạn cần làm là luôn nỗ lực, phát huy hết khả năng để cho họ thấy rằng tôi không nói suông mà những gì tôi nói đều được hiện thực hóa thông qua hành động. 

Tăng giá trị bản thân bằng sự tương tác

Những ánh mắt dèm pha hiện hữu xung quanh bạn vì họ đã sẽ xem bạn là đối thủ cạnh tranh, có thể đe dọa vị trí của họ bất cứ lúc nào. Bạn đừng quá lo lắng mà hãy mở lòng chia sẻ các thông tin. Ghi nhớ điều này vì nó cũng được xem là một tuýp nhỏ cho sự thăng tiến. Tương tác chân thật để tạo được lòng tin và thiện cảm với mọi người rất khó (tất nhiên ngoại trừ những trường hợp hai mặt, lối sống cuốn theo chiều gió).

Quan trọng nhất là hãy cởi mở, hòa đồng và cộng tác gần gũi với các thành viên nhóm của bạn. Loại bỏ những hoài nghi và làm việc, hỗ trợ nhau dựa trên tinh thần trách nhiệm, sự thấu hiểu là bí quyết giúp bạn đang tạo ra một môi trường tốt để phát huy khả năng thể hiện những khao khát về sự thăng tiến.

Chủ động để được phát triển

Giai đoạn đầu khi được giao việc và đảm bảo thực hiện thành công, bạn nên chủ động đưa ra những chia sẻ với sếp của mình. 

Tự tin chia sẻ và chờ phản hồi

Hơn thế nữa, mỗi cuộc gặp mặt và chia sẻ đều là cơ hội, bạn nên trân trọng chúng. Hãy tự tin chia sẻ và chờ phản hồi. Hãy là một nhân viên chủ động trong tư duy lẫn những phát ngôn. Bạn có thể tự nhận xét về năng lực của bản thân sau một quá trình trải nghiệm nhiệm vụ, liệt kê ra những thay đổi tích cực của bản thân đồng thời, ghi nhận lại những thiếu sót cần phải cải thiện. Tất cả đều phải chân thật nhé! Tự tin bày tỏ trong khuôn phép không có gì là xấu hổ cả. Đó là cách để bạn tự tạo ra cơ hội cho bản thân. Nếu nhận thấy mình đủ năng lực, hãy chủ động đề xuất các dự án có quy mô chuyên sâu, đa dạng hơn. 

thăng tiến

Điều này cần được thực hiện theo diễn tiến. Bạn có thể thảo luận với cấp trên/người quản lý của mình về tiến độ công việc. Thời gian có thể từ 2-3 tháng một lần. Chính những buổi trao đổi, bạn sẽ đánh giá được mức độ kỳ vọng của cấp trên dành cho mình; năng lực bản thân đang ở mức nào và những mong tiếp theo bạn muốn đạt được.

Nguyên tắc nào sẽ là “chiến lược” hiệu quả để phát triển sự thăng tiến?

Có một nguyên tắc được nhiều người ghi nhớ và lấy đó làm kim chỉ nam cho mình chính là nguyên tắc Peter, được đặt tên theo vị Tiến sĩ Laurence J. Peter.

Nguyên tắc này là một lý thuyết sâu sắc về việc quản trị năng lực. Một nhân viên sẽ được thăng chức liên tục khi được xem xét phù hợp với các tiêu chí. Tuy nhiên, sự thăng tiến ấy tiếp tục diễn ra và sẽ dừng lại khi nhân viên ấy chưa kịp đáp ứng những nhu cầu thay đổi.

“Chiến lược” quan trọng – Quản trị bản thân

Nguyên tắc này đã tạo ra động lực rất lớn cho các nhân viên. Vì nó giúp họ nhận thức được việc bản thân phải cố gắng mỗi ngày. Điều này không đồng nghĩa bạn như một con thiêu thân mãi lao đầu vào mớ công việc với deadline dày đặc. Ý nghĩa của nguyên tắc này là bạn cần phải quản trị thời gian. Hay nói một cách chuyên gia hơn là quản trị bản thân. Nguyên tắc định hướng con người hiểu và biết cách điều tiết khối lượng công việc sao cho hiệu quả.

“Bạn phải trở thành một phiên bản tốt hơn mỗi ngày”. Nó không có nghĩa là đặt ra áp lực và suy nghĩ quá nhiều về mọi thứ. Đơn giản, khi bạn thực hiện tốt công việc hằng ngày, trải nghiệm hiệu quả, theo dõi; có những đánh giá cụ thể, chi tiết; đưa ra những phản hồi tích cực, thì đó đã là tốt hơn rồi.

Hiệu quả của nguyên tắc Peter còn giúp bạn thúc đẩy sự cố gắng, tự rèn luyện bản thân. Từ đó, giúp bạn khai thác ra những tiềm năng mới. Nguyên tắc hướng bạn đến việc trở thành một nhân viên toàn năng, vượt ra khỏi những khuôn khổ cũ. Chính vì vậy mà nó ý nghĩa lớn đối với chiến lược phát triển lâu dài về sự thăng tiến. Để đảm bảo cho sự thăng tiến, bạn cần nhiều kỹ năng, kiến thức của một nhân viên. Hãy thể hiện sự cố gắng để chứng mình rằng bạn là một nhân viên cần được quan tâm và phát triển.

Lời kết:

Sự thăng tiến luôn là mong muốn của nhiều nhân viên. Đôi lúc tự hỏi: “Có thể êm đềm, cớ sao phải lăn xả trong cuộc chiến “sống còn”? Thế nhưng, thực tế hco thấy, những gì nhìn nhận về sự thăng tiến là có sơ sở. Chỉ là nó có giới hạn nhất định mà thôi. Bỏ qua thời gian, vật chất, các mối quan hệ, bạn vẫn phải có thực lực. Vì vậy, nếu biết nỗ lực và hiểu được hiện trạng thực tại, bạn hoàn toàn có thể chạm đến sự thăng tiến. Hãy phát huy những năng lực và tư duy chiến lược, bạn chắc chắn sẽ thành công.

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

Xem thêm Top vị trí tuyển dụng cntt trên TopDev

Kambria Code Challenge trở lại với Quiz 04 – Chủ đề: Reinforcement Learning

Kambria Code Challenge là chuỗi các bài thi và hackathon trực tuyến liên quan đến lĩnh vực Trí tuệ nhân tạo (AI) được thiết kế để thu hút sự tham gia của các lập trình viên khắp nơi trên thế giới. Đây là cơ hội để các bạn kiểm tra kiến thức về thuật toán AI, chứng minh các kỹ năng về lập trình của bạn, đồng thời nhận phần thưởng và phát triển cơ hội nghề nghiệp với các công ty công nghệ là đối tác của Kambria.

Quiz 04 là Quiz cuối serie Kambria Code Challenge đầu tiên. Quiz 04 tập trung vào chủ đề: “Reinforcement learning (Học Tăng Cường)” – một lĩnh vực con của học máy. Bounty sẽ bắt đầu vào lúc 14:00, thứ 7 ngày 22/08/2020. Các bạn tìm hiểu chi tiết ở link bên dưới, click vào “Join this Challenge” để tham gia!

👉Kambria Code Challenge – Standard Quiz 04 Bounty: https://bit.ly/Standard-Quiz-04-Bounty

Quiz 04 bao gồm 2 bounty với cấp độ & giải thưởng khác nhau:

Bạn chỉ có thể tham gia 1 trong 2 bounty:

  • Standard Quiz 04 Bounty: tất cả mọi người đều có thể đăng ký tham gia. Bounty này có tổng cộng 15 câu hỏi với độ khó tương đương với các Quiz trước đây của Kambria Code Challenge.
  • Special Quiz 04 Bounty: chỉ những thí sinh đã tham gia ít nhất 2 Quiz của Kambria Code Challenge mới được tham gia Special Bounty. Special Bounty có tổng cộng 20 câu hỏi với độ khó cao hơn, cùng với giải thưởng lớn hơn.

Nếu bạn đủ điều kiện để tham gia Special Quiz 04 Bounty, hãy chú ý kiểm tra email thường xuyên. Kambria sẽ gửi email để hướng dẫn bạn tham gia vòng thi đặc biệt này.

Giải thưởng của Standard Quiz 04 Bounty:

🔹Giải quán quân: $75 + 79.000 KAT

🔹1 x Giải Á quân 1: $50 + 52.000 KAT

🔹2 x Giải Á quân 2: $25 + 26.000 KAT

Giải thưởng của Special Quiz 04 Bounty:

🔹Giải quán quân: $125 + 85,000 KAT

Ngoài ra, các lập trình viên có điểm số cao nhất sẽ được giới thiệu với các đối tác của Kambria, cung cấp các cơ hội việc làm mới.

Chương Trình Tích Lũy Điểm Thưởng

Các thí sinh tham gia và hoàn thành bài thi Quiz 04 sẽ được nhận Kambria Credit. Kambria Credit là chương trình tích lũy điểm thưởng, được sử dụng để thanh toán cho các dịch vụ trên nền tảng Kambria. Tìm hiểu thêm về Kambria Credit.

KAT là token sử dụng trên nền tảng của Kambria – Blockchain ủy quyền đầu tiên trên thế giới cung cấp mã nguồn mở robot và hệ sinh thái AI.

Thông tin cuộc thi:

Thời gian: 14:00 ngày 22/08/2020.

Đăng ký dự thi tại: https://bit.ly/Standard-Quiz-04-Bounty

Thông tin về cuộc thi: https://kambria.io/blog/kambria-code-challenge-quiz-04-reinforcement-learning/

Website: App.kambria.io/bounty

Dịch vụ thị trường Thương mai Điện tử Landscape 2020

Thị trường Thương mại Điện tử 2020 trong khối Đông Nam Á, có thể nói Việt Nam chúng ta là một nước có tốc độ phát triển kinh tế khá nhanh và vượt trội so với những nước khác. Việt Nam đang trở thành một “miếng bánh ngon” được các nhãn hàng, nhà bán lẻ, nhà đầu tư nhắm đến. Để nước ta có được nền kinh tế như hiện nay thì thị trường Thương mại Điện tử cũng đã góp 1 phần sức lực không hề nhỏ trong những năm gần đây.

Để có thể biết thêm chi tiết tốc độ tăng trưởng của thị trường Thương mại Điện tử, TopDev xin gửi đến bạn đọc bảng báo cáo thị trường Thương mại Điện tử Landscape 2020 với đầy đủ các số liệu cụ thể.

Trong bài viết dưới đây, TopDev sẽ phân tích tình hình thị trường Thương mại Điện tử 2020 đã bị ảnh hưởng như thế nào trong giai đoạn dịch Covid-19.

Thị trường Thương mại Điện tử 2020

Xem thêm báo cáo về Thị trường Thương mại Điện tử Landscape 2020

Tổng quan thị trường Thương mại Điện tử

Thị trường Thương mại Điện tử ở nước ta có xu hướng tăng dần đều ở những năm 2015 đến nay, tuy nhiên để nói về sự bùng nổ thì phải nhắc đến năm 2019. Trong năm, ngành Thương mại Điện tử đã có sự tăng trưởng vượt bậc, thu về 2,7 tỷ USD trong riêng năm 2019 và đã có hơn 35,4 triệu người sử dụng.

Cũng trong năm 2019, lượng người sử dụng mạng tại Việt Nam là 59,2 triệu/tổng dân số cả nước, dự đoán trong năm 2021 con số này sẽ tăng trưởng lên thành 68 triệu người/tổng dân số.

Lượng người sử dụng điện thoại thông minh để mua sắm cũng tăng khá rõ rệt, dự đoán cho đến năm 2021 sẽ tăng thêm 5 triệu người sử dụng, tăng từ 35 triệu lên 40 triệu người.

Với số liệu khá khả quan như vậy, đó cũng là một trong những điều kiện rất tốt để các nhà đầu tư bán lẻ, kinh doanh nhỏ chuyển hướng đầu tư vào mảng kinh doanh, mở shop trên các sàn Thương mại Điện tử.

Để kể đến các sàn Thương mại Điện tử thì phải điểm mặt qua 4 ông lớn tmd đang “nắm trùm” thị trường tại Việt Nam đó là Tiki, Lazada, Shopee và Sendo.

Trong đó có Tiki và Sendo là 2 trang Thương mại Điện tử có quy mô rộng với phạm vi hoạt động bao trùm luôn cả Đông Nam Á.

Đế có thể dấn thân vào thị trường Thương mại Điện tử Việt Nam thật sự không hề dễ dàng đối với các nhà bán lẻ vì thói quen tiêu dùng của người Việt Nam rất khác so với tình hình chung.

Cụ thể là hơn 80% lượng khách mua hàng ưu tiên ship COD, có nghĩa là khách hàng chỉ thanh toán khi đã xem qua hàng và nhận hàng.

Việc này chứng minh rằng khách hàng vẫn giữ thói quen sử dụng tiền mặt và không có thói quen thanh toán online vì nhiều lý do khách quan. Ngoài ra việc khách hàng chỉ ưu tiên ship COD còn cho thấy là họ thật sự chưa đặt nhiều niềm tin vào chất lượng của các sản phẩm được mua trên mạng nói chung và sàn Thương mại Điện tử nói riêng.

Trong bài báo cáo về thị trường Landscape 2019, số liệu cho thấy các nhóm:

  •  Sản phẩm hàng điện tử có doanh thu 685 triệu USD,
  • Sản phẩm thời trang có doanh thu 661 triệu USD, 
  • Sản phẩm đồ chơi có doanh thu 478 triệu USD
  • Nhóm thực phẩm và đồ chăm sóc cá nhân có doanh thu 448 triệu USD

Từ đó ta thấy doanh thu của những nhóm hàng được nêu trên tăng trưởng khá tốt trên các sàn Thương mại Điện tử, các nhóm hàng này cần được đặc biệt chú trọng và đẩy mạnh hơn.

Thị trường Thương mại Điện tử 2020

Căn cứ vào số liệu trên, các doanh nghiệp trên sàn Thương mại Điện tử đặc biệt lưu tâm về tiềm năng phát triển kinh doanh đối với các nhóm hàng chủ yếu đã thống kê ở trên từ đó tạo ra lợi nhuận tăng trưởng cho năm 2020.

Cùng theo số liệu trong báo cáo thị trường Thương mại Điện tử 2020, đa số các giao dịch đều phát sinh trên các thiết bị điện thoại di động, khác với một vài năm về trước, đa số các giao dịch phát sinh đều từ máy tính bàn. Lý do là các thiết bị di động ngày nay đều được cải tiến các chức năng để phù hợp hơn với xu hướng nhu cầu người dùng.

Thương mại điện tử là một trong những thành tố phát triển nhanh nhất của nền kinh tế số tại Việt Nam. Thậm chí tốc độ tăng trưởng của thị trường được đo lường đạt mức 35% mỗi năm, nhanh hơn thị trường Nhật Bản 2.5 lần. Năm 2020, con số của người mua sắm Việt được dự đoán tăng 52%, nâng tổng doanh thu lên đến 10 tỷ USD. 

Một số báo cáo chỉ ra rằng lượng truy cập vào website các sàn Thương mại Điện từ như Tiki, Lazada, Sendo giảm trung bình 9% so với cùng kỳ năm ngoái. Nguyên do đến từ trong mùa dịch, các sàn giảm các hoạt động khuyến mãi hay quảng cáo, thay vào đó là những hoạt động tương tác khác nhằm tăng độ gắn kết với khách hàng. 

  Báo cáo thị trường IT 2020: Việt Nam sẽ trở thành quốc gia IT với nhiều chỉ số trong top thế giới
  Báo cáo thị trường IT quý II 2020: Ngành IT khôi phục trạng thái, Việt Nam khởi sắc “xây tổ” đón “đại bàng”

Trong 3 tháng đầu năm, thị trường bán lẻ về thời trang chứng kiến lượng truy cập giảm 38% so với quý trước đó. Tương tự, thị trường bán lẻ đồ dùng điện gia dụng cũng giảm lượng truy cập đến 17% so với tháng 1.

Tuy nhiên tới tháng 3, trạng thái cách ly xã hội đã tạo cơ hội cho các nhà bán lẻ online như Bách Hóa Xanh, với chỉ số tăng đến 49% so với quý trước, khi mà người tiêu dùng ở nhà tránh dịch nhiều hơn.

Nói chung, thị trường Thương mại Điện tử trải qua nhiều thay đổi trong giai đoạn cách ly xã hội và khi nhu cầu mua sắm của người tiêu thay đổi các thứ tự ưu tiên. Nhưng cũng từ sự biến chuyển này mới thấy sự cần thiết của các website TMĐT luôn phải nhanh nhạy, nắm bắt xu yếu thị trường.

Thách thức trong thị trường Thương mại Điện tử 2020

Tuy đây là một thị trường có sự bùng nổ rõ ràng nhất trong thời kỳ dịch bệnh Covid, tuy nhiên nó vẫn có những khó khăn, thử thách nhất định để có thể đạt được nhiều thành công hơn.

Thời gian giao hàng quá lâu. 

Chắc hẳn là các đơn hàng đều trải dài ở các khu vực trên Việt Nam, đều đó đồng nghĩa với việc bộ phận vận chuyển phải làm việc cực lực để có thể giao hàng đến tận tay người mua. Tuy nhiên, theo báo cáo hiện nay, thời gian khách hàng phải đợi để nhận được hàng kéo dài trong khoảng từ 3 – 7 ngày ở khu vực các tỉnh thành khác.

Còn trong khu vực nội thành như Hồ Chí Minh hay Hà Nội thì sẽ nhận được hàng trong thời gian 3 ngày đổ lại. Điều này gây khá nhiều bất cập trong việc chuyển đổi tỷ lệ mua hàng của khách.

Thị trường Thương mại Điện tử 2020

Có rất nhiều trường hợp khách đã để sản phẩm cần mua vào giỏ hàng và chuyển đến trang thanh toán, tuy nhiên, khi thấy thời gian giao hàng dự kiến thì lại có hành vi thoát ra và không mua nữa. 

Cũng có rất nhiều khách hàng thực hiện hành vi chọn phương thức giao hàng nhanh thay vì giao hàng tiết kiệm dù dịch vụ giao hàng nhanh có giá cao hơn, điều này cho thấy khách hàng trên các sàn Thương mại Điện tử sẵn sàng chi trả 1 khoản tiền cao hơn cho việc giao hàng với mong muốn đẩy nhanh thời gian nhận hàng.

Điều này chứng tỏ chiến lược giao hàng của các sàn Thương mại Điện tử vẫn chưa thật sự đáp ứng được nhu cầu của khách hàng làm ảnh hưởng đến doanh thu. 

Ngược lại với các sàn Thương mại Điện tử, đối với các nhà bán lẻ, cá nhân bán hàng online thì việc chuyển hàng đến tay khách hàng lại hiệu quả hơn nhiều. Cụ thể đối với những khách hàng ở chung khu vực với người bán thì thời gian nhận hàng kéo dài từ 15 – 45 phút tùy vào quãng đường. Còn đối với những khách hàng khác tỉnh thì thời gian nhận hàng sẽ từ 1-3 ngày. 

Có thể nói, do bộ máy hoạt động của các cá nhân bán hàng online khá đơn giản nên họ cũng rất linh hoạt trong việc vận chuyển hàng hóa. Chính điều này cũng đã vớt lại phần nào tình trạng không mấy khả quan trong chiến lược giao hàng của sàn Thương mại Điện tử.

Nhận thức được điểm yếu, các sàn Thương mại Điện tử đã lập ra một chiến lược kế hoạch mới nhằm nâng cao hiệu quả vận chuyển hơn. Chiến lược của Tiki là đảm bảo sẽ giao hàng đến tay người mua hàng trong 2 giờ kể từ lúc đặt hàng, 4 giờ đối với Shopee và 3 giờ đối với Sendo.

Xu hướng thu hút khách hàng mua sản phẩm trong năm 2020 ngoài chất lượng sản phẩm thì thời gian giao hàng cũng là một yếu tố quan trọng cần được các nhà bán lẻ và thị trường Thương mại Điện tử 2020 cân nhắc phát triển mạnh mẽ hơn.

Thị trường Thương mại Điện tử 2020

Thay vì chỉ tập trung vào việc tăng trưởng, tăng lợi nhuận thì trong năm 2020 thiết nghĩ thị trường Thương mại Điện tử sẽ thiết lập chiến lược giao nhận hàng tốt hơn, cải thiện trải nghiệm người dùng tốt hơn để có được sự bùng nổ lớn hơn trong năm tiếp theo.

Sàn Thương mại Điện tử trong và ngoài nước cạnh tranh với nhau

Thách thức đầu tiên đó chính là sự cạnh tranh giữa những sàn Thương mại Điện tử trong nước và những sàn Thương mại Điện tử nước ngoài nổi tiếng như amazon, taobao, ebay… Thị trường shopping online và Thương mại Điện tử trong những năm sắp tới được dự đoán là sẽ có một cuộc bùng nổ lớn xảy ra.

Cụ thể là thị trường sẽ tăng trưởng mạnh nhưng sẽ có đến 70 – 80% thị phần bị các sàn Thương mại Điện tử nước ngoài chiếm lấy, các sàn Thương mại Điện tử cộp mác Việt Nam sẽ chỉ chiếm được khoảng 20% còn lại trong các thị trường ngách.

Nguyên nhân của dự đoán này là do 2 nguyên nhân chính: 

Chi phí cho việc đầu tư vào sàn Thương mại Điện tử quá tốn kém, chính vì thế các doanh nghiệp Việt Nam chưa đủ “lực” để chiến đấu kéo dài với các sàn Thương mại Điện tử nước ngoài.

Xu hướng dùng sản phẩm nước ngoài của dân Việt Nam

Có thể nói đây là lý do chính để sàn Việt Nam khó có thể cạnh tranh lại với sàn nước ngoài. Đa số tâm lý người tiêu dùng tại Việt Nam điều có xu hướng hướng ngoại. Ví dụ, cùng 1 sản phẩm, chức năng, mức giá thậm chí là cùng cả nhãn hiệu nhưng nếu có thể người tiêu dùng vẫn ưu tiên lựa chọn mua những sản phẩm ấy từ các web nước ngoài.

Giải thích nguyên nhân này nhiều người tiêu dùng cho hay nguyên do của việc hướng ngoại này là do họ cảm thấy hàng hóa trên các sàn Thương mại Điện tử nước ngoài đa dạng hơn, nhiều sản phẩm phong phú hơn và đặc biệt là sản phẩm có chất lượng cao hẳn các sản phẩm ở Việt Nam, ít xuất hiện hàng nhái.

Từ đó ta có thể thấy, tuy nhu cầu mua sắm của người tiêu dùng rất lớn nhưng họ không vì thế mà lựa chọn cẩu thả. Người tiêu dùng ngày nay rất thông minh và ngày càng có nhiều sự lựa chọn cho họ, vậy tại sao họ phải lựa chọn một sản phẩm online, một sản phẩm Thương mại Điện tử kém chất lượng trong khi họ có thể có lựa chọn khác tốt hơn?

Có thể nói thị trường Thương mại Điện tử có mức độ cạnh tranh khá cao, các sàn Thương mại Điện tử Việt Nam muốn tồn tại trong thị trường này thì họ bắt buộc phải đầu tư tiền bạc cũng như chất xám nhiều hơn.

Các doanh nghiệp với nền tảng yếu kém, công nghệ thấp, trình độ quản trị chưa cao, nguồn vốn không dồi dào chắc chắn sẽ là ‘vận động viên’ bị loại sớm nhất trên đường đua thị trường Thương mại Điện tử này.

  Magento là gì? Thiết kế website thương mại điện tử với Magento
  Thế Giới Di Động & Điện Máy Xanh làm Thương mại điện tử – Nghe mà thấm!

An ninh mạng không được đảm bảo

Một trong những thách thức lớn của thị trường Thương mại Điện tử đó là rủi ro về an ninh mạng. Có thể nói lượng người dùng truy cập Internet cũng như mua sắm trên Interner tại Việt Nam tăng trưởng khá nhanh.

Trong khu vực Đông Nam Á Việt Nam có số người mua hàng online lên đến 70% trên tổng số người sử dụng Internet. Tuy vẫn còn khá thấp so với mặt bằng chung của các nước Đông Nam Á, nhưng đây cũng là tín hiệu tốt cho thị trường Thương mại Điện tử tại Việt Nam.

Tầm nhìn ở thị trường Thương mại Điện tử Việt Nam chỉ dừng ở mức độ phát triển và thu lợi nhuận, chưa có tầm nhìn sâu như các nước phát triển mạnh về Thương mại Điện tử như mỹ, hàn… ở đó họ chú trọng việc nghiên cứu thị trường, thị hiếu của khách hàng, đầu từ vào các hoạt động huấn luyện chăm sóc khách hàng, nâng cao nền tảng công nghệ, an ninh mạng, cơ sở hạ tầng mạng…

Đó là những vấn đề mà các sàn Thương mại Điện tử nước ta chưa thể đáp ứng được, đặc biệt là an ninh mạng. Vấn đề bảo mật thông tin cá nhân của người tiêu dùng và an ninh mạng tại Việt Nam khá yếu kém và là một vấn đề cần được ưu tiên cải thiện toàn diện để tránh gây ra thiệt hại về cả cho 2 phía là doanh nghiệp và người tiêu dùng.

Luật pháp của việc tiết lộ thông tin người dùng tại Việt Nam chưa thật sự răn đe, ngoài ra chất lượng an ninh mạng tại nước ta cũng cần được quan tâm. Chính vì những lý do này cũng là nguyên nhân góp phần giải thích tại sao Thương mại Điện tử ở nước ta lại không có niềm tin như các sàn Thương mại Điện tử ở nước ngoài.

Thị trường Thương mại Điện tử 2020

Giải pháp cho những thách thức 

Luật bảo vệ 

Dù thị trường phát triển là thế nhưng thật chất, các bộ luật dùng để bảo vệ các doanh nghiệp và người tiêu dùng trong Thương mại Điện tử chưa được hoàn thiện. Nền tảng để có thể phát triển theo hướng tích cực đó chính là bộ luật chi tiết và chỉnh chu, giúp người dùng cà cả doanh nghiệp cảm thấy an tâm khi sử dụng dịch vụ cũng như phát triển thị trường.

Chính phủ nên nghiêm túc hơn trong việc bổ sung các chính sách bảo vệ, tạo môi trường thuận lợi cho việc phát triển thị trường Thương mại Điện tử 2020.

Phát triển thanh toán điện tử

Ngoài bộ luật bảo vệ người tiêu dùng và doanh nghiệp thì chúng ta cũng nên để mắt tới việc đầu tư phát triển kỹ thuật, cơ sở hạ tầng về mô hình thanh toán điện tử, thanh toán không sử dụng tiền mặt trên các sàn Thương mại Điện tử. 

Đảm bảo an ninh 

Đảm bảo sự riêng tư, an toàn khi người tiêu dùng thực hiện giao dịch bằng mọi cách để đem đến sự an tâm cho người dùng, ngăn cản việc các trang web bị virus xâm nhập đánh cắp thông tin. Các thông tin liên quan đến việc thanh toán online nên được bảo mật tuyệt đối để tránh kẻ gian lợi dụng.

Đảm bảo chất lượng hàng hóa

Đảm bảo chất lượng hàng hóa cho người tiêu dùng để lấy được lòng tin, tăng cường hoạt động kiểm tra, đánh giá chất lượng sản phẩm tránh gian lận trong kinh doanh, sử dụng hàng thiếu chất lượng để kinh doanh…

Liên kết với Cục Thuế

Nhiều doanh nghiệp lớn được lựa chọn để thí điểm cho chiến dịch kết nối cổng thanh toán của doanh nghiệp đó trên sàn Thương mại Điện tử với chi Cục Thuế để có thể phát hành hóa đơn điện tử khi xuất hiện giao dịch mới giữa người tiêu dùng với doanh nghiệp đó.

Đầu tư vào nhân lực

Để có thể phát triển được thị trường Thương mại Điện tử 2020 thì việc đầu tư vào nguồn nhân lực là một vấn đề không thể nào phớt lờ. Nhân lực của thị trường Thương mại Điện tử khá bao quát, từ thiết kế cho đến các kỹ sư phần mềm đến chăm sóc khách hàng, giao hàng… và còn rất nhiều vị trí nhân sự khác nữa

Vào cuối năm 2017, cụ thể là ngày 8/11/2017, việc trao đổi mua bán giữa các nước đã được Bộ trưởng bộ Ngoại giao và Kinh tế của các nước APEC thông qua.

Theo báo cáo năm 2016, tổng doanh thu của các giao dịch phát sinh trên Thương mại Điện tử toàn thế giới lên đến 1.920 tỷ USD, đây là minh chứng lớn nhất của việc bùng nổ phát triển của các sàn Thương mại Điện tử.

Tổng kết

Tuy thị trường Thương mại Điện tử còn khá trẻ đối với Việt Nam, nhưng tiềm lực phát triển của thị trường này không hề nhỏ. Nhờ có sự giúp đỡ, chỉ đạo của các bộ ngành liên quan và các doanh nghiệp nên cũng đã phần nào khắc phục được yếu điểm trước mắt.

Trong tương lai chắc chắn thị trường của Thương mại Điện tử sẽ có số liệu còn vượt bậc hơn cả số liệu thị trường Thương mại Điện tử 2020.

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

  Frontend-developer đã hô biến animation trong mắt người dùng như thế nào?
  Học cách Twitter ngăn người dùng View Page Source

Xem thêm Top công việc IT tại TopDev!

Mô hình MVC trong php là gì? Hướng dẫn chi tiết

Bài viết được sự cho phép của Nhungdongcodevui

Mô hình MVC là mô hình được sử dụng rộng rãi nhất trong việc phát triển ứng dụng web, đặc biệt là trong php. Mặc dù vậy, hiện nay mình thấy rất ít những hướng dẫn thực sự chuẩn và dễ hiểu về mô hình này, do vậy mình sẽ viết một vài chia sẻ về mô hình MVC trong php thật chi tiết.

Mô hình MVC trong php là gì? Hướng dẫn chi tiết
Mô hình MVC trong php là gì? Hướng dẫn chi tiết

Khái quát lại về MVC là gì?

Mô hình MVC (viết tắt của Model View Controller) là mô hình gồm 3 lớp: Model, View, Controller:

  • Model: Lớp này chịu trách nhiệm quản lí dữ liệu: giao tiếp với cơ sở dữ liệu, chịu trách nhiệm lưu trữ hoặc truy vấn dữ liệu.
  • View: Lớp này chính là giao diện của ứng dụng, chịu trách nhiệm biểu diễn dữ liệu của ứng dụng thành các dạng nhìn thấy được.
  • Controller: Lớp này đóng vai trò quản lí và điều phối luồng hoạt động của ứng dụng. Tầng này sẽ nhận request từ client, điều phối các Model và View để có thể cho ra output thích hợp và trả kết quả về cho người dung.

Ta có thể mô tả lại hoạt động của mô hình MVC thông qua sơ đồ sau:

Fig 1 – Luồng xử lí của mô hình MVC

Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

Tổ chức chương trình MVC trong php

Đầu tiên ta cần có 1 điểm truy cập ban đầu để vào được ứng dụng, file index.php đảm nhận nhiệm vụ này.

“Cổng vào” ban đầu này sẽ đóng vai trò hiển thị hết những tính năng mà ứng dụng có, và cho người dùng truy cập vào chức năng mong muốn (controller tương ứng), ở đây để đơn giản thì ta chỉ cài đặt 1 chức năng là “quản lí học sinh”. (Ta vẫn có thể truy cập trực tiếp vào từng chức năng cụ thể ở các file controller)

Trong ví dụ tới này, mình sẽ tổ chức source code minh hoạ như mô hình sau đây:

Fig 3 – Tổ chức source code của ứng dung minh hoạ
Fig 3 – Tổ chức source code của ứng dung minh hoạ

a. Tầng Controller

– Đây là tầng điều phối của ứng dụng: nhận request từ client, phân tích request, gọi tầng Model để lấy dữ liệu và tầng View để tổ chức hiển thị dữ liệu.

– Ở đây ta nói tới chức năng quản lí học sinh, nó sẽ được điều phối bởi controller C_Student.php. Do trong chức năng có 2 chức năng con: Hiển thị danh sách học sinh, Hiển thị chi tiết học sinh; vậy nên nó sẽ phân biệt từng tính năng bằng cách kiểm tra tham số đầu vào là “stid”. Tuỳ trường hợp mà controller sẽ gọi view tương ứng.

Fig 4 – Cài đặt controller của ứng dung

b. Tầng Model và các lớp thực thể (Entity class)

– Nhiệm vụ chính của tầng này là việc thao tác với cơ sở dữ liệu để lưu trữ cũng như truy vấn dữ liệu. Các thao tác với CSDL phải được đặt hết ở trong tầng này, nó sẽ chứa các thao tác cơ bản để truy vấn CSDL như: đọc, thêm, xoá, sửa.

– Ngoài ra thì tằng này còn chứ các lớp thực thể (Entity class), nó là các lớp để mô phỏng những đối tượng trong thực tế. Trong ví dụ này, tầng Model bao gồm 2 class: Model_Student và Entity_Student. Lớp thực thể Entity_Student chính là 1 thực thể mô phỏng về 1 student trong thực tế (tên, tuổi, …), lớp Model_Student sẽ sử dụng lớp thực thể này để cấu trúc dữ liệu sẽ lấy từ Database. Lớp Model_Student đóng vai trò giao tiếp với CSDL.

Fig 5 – Entity class, mô tả các bảng trong CSDL
Fig 6 – Lớp Model phụ trách phần lien kết dữ lieu Database

c. Tầng View

– Lớp này dùng để định dạng hiển thị dữ liệu lên cho người dùng, do ta có 2 tính năng trong phần “quản lí học sinh” là: “danh sách học sinh” và “chi tiết học sinh”, nên ta sẽ có 2 view khác nhau tương ứng. Controller sẽ truyền các biến dữ liệu vào các View để chúng có thể dùng các dữ liệu này để hiển thị lên. Việc này được thực hiện bằng cách nhúng mã PHP vào trong mã HTML.

Fig 7 – View của “Danh sách học sinh”
Fig 8 – View của “Chi tiết học sinh”

Nhận xét View:

Việc nhúng mã PHP vào HTML khiến mã nguồn trở nên phức tạp và khó kiểm soát, việc này dẫn tới sự ra đời của các “template engine” sau này, các “template engine” tách biệt mã PHP ra khỏi mã HTML nên sẽ khiến code trở nên rõ ràng hơn rất nhiều. Chúng ta sẽ tìm hiểu sau.

Đối với các ứng dụng thuần AJAX, phần View có thể được triển khai bởi javascript, kéo theo việc sử dụng cấu trúc JSON.

Mô hình tuần tự sau sẽ giúp bạn hình dung luồng hoạt động của một http request trong mô hình MVC:

Fig 9 – Sơ đồ tuần tự mô tả luồng chạy của 1 xử lí trong mô hình MVC

Mô hình MVC tổng quát

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

Mô hình MVC
Mô hình MVC tổng quát
  • Người dùng tạo ra một yêu cầu thông qua đường dẫn, ví dụ /home
  • Controller nhận yêu cầu và đưa ra một mệnh lệnh để xử lý yêu cầu đó. Nếu lệnh thực thi với phần View thì cập nhật lại màn hình hiển thị, với Model thì để trình diễn logic. Giả sử yêu cầu của người dùng có yếu tố logic
  • Model thực thi phần logic lấy từ một cơ sở dữ liệu nào đó và gửi trả lại phản hồi theo hướng dẫn từ Controller
  • Controller truyền dữ liệu này ra phần view và cập nhật lại giao diện cho người dùng.
  • Mọi yêu cầu đều phải đi qua Controller trước khi chuyển hóa thành lệnh thực thi cho View hay Model.

Tổng kết

– Mô hình MVC trong php là mô hình thông dụng và tiện lợi hàng đầu trong việc phát triển ứng dụng web, trên đây trình bày cơ bản về mô hình MVC và các thức của nó hoạt động, các framework khác cũng sẽ tạo ra mô hình MVC với cấu trúc gần tương tự như trên.

– Một vài lợi điểm của MVC:

  • Tách biệt Model và View, tạo sự linh hoạt khi thay đổi ứng dụng (giao diện, xử lí, …)
  • Tầng Model và View có thể thay đổi, chỉnh sửa 1 cách độc lập. Ta có thể tạo các ứng dụng giao tiếp thông minh hơn chỉ bằng cách thay đổi View, hoặc cũng có thể thay thế Database bằng các sử dụng Web service, …

Bài viết được sự đồng ý từ Nhungdongcodevui

Xem thêm các việc làm it HOT tại TopDev!

So sánh lợi hại giữa WordPress vs Static site

Bài viết được sự cho phép của tác giả Lưu Bình An
Chúng ta cùng nhau điểm qua cái hay, cái dở của từng thằng để nghiền ngẫm xem nó phù hợp trong trường hợp nào.
  11 cách tăng tốc nhanh cho WordPress bằng file wp-conig.php
  Gatsby.js: Cách thiết lập và sử dụng React Static Site Generator

Sếp cũ hôm rồi liên lạc hỏi “em có biết công ty nào nhận làm Gatsby không, anh muốn làm một cái static site cho công ty”, cái blog này bạn đang đọc cũng được viết bằng Gatsby, một static site generator, với developer thì static site không xa lạ, nhưng để trả lời có công ty nào nhận làm static site thì mình ko biết, đa phần người ta sẽ dùng một CMS nào đó như WordPress, để đảm bảo có admin cho bạn vào quản lý. WordPress không có gì sai, mình làm wordpress khoảng hơn 3 năm, cũng tự viết theme, tự viết plugin, mình vẫn xài WordPress một số trường hợp. Tuy nhiên static site mấy năm trở lại đây được quan tâm nhiều hơn trước kia vì những lợi ích mà nó mang lại.

Static site là gì, nói nôm na là một website chỉ bao gồm html/css/javascript không có database, nó sẽ được build từ file markdown, dùng một số tool phổ biến để build như

  • Jekyll
  • Hugo
  • next.js
  • gatsby
  • gitbook
  • nuxt
  • vuepress
  • mkdocs

Static Site

Thế mạnh

Tốc độ

Tốc độ hiển thị nội dung của trang sẽ rất nhanh, nếu không muốn nói là nhanh nhất trong tất cả các “thể loại” website. User có thể chấp nhận một website giao diện ko cần pixel perfect (designer có thể không), nhưng sẽ không tha thứ cho một website load lâu hơn rùa bò. Không cần thời gian để query từ database lên, việc load dữ liệu từ host lên phía client tiết kiệm rất nhiều xử lý.

Đồn đoán là Google nó cũng rank những site có tốc độ load trang nhanh, cao hơn các trang load ì ạch Bài thử nghiệm chi tiết

Để test bạn dùng Ping Dom

Nội dung nhiều lên, vấn đề cũng ít phức tạp hơn

Khi nội dung của trang nhiều lên, thí dụ 10.000 bài viết trong wordpress, thì database nó cũng sẽ phình lên, số lượng user truy cập vượt ngoài mong đợi 10.000 user một ngày, nó sẽ phát sinh ra khá nhiều vấn đề cần xử lý. Và một trong những cách đó là chuyển một phần nội dung đó về static site! Bạn thấy sức mạnh của static site ghê chưa. Tất nhiên static site khi lớn lên nó cũng phát sinh vấn đề, tuy nhiên nó sẽ dễ xử lý và đơn giản hơn như wordpress

Bảo mật

Quá hiển nhiên là static site thì chẳng có gì phải quan tâm đến bảo mật, ko có quản lý user, không có database để mà hack đâu nhé. Những static site chỉ đơn thuần là hiển thị thông tin lên bằng file html, 99.999999% là ko bị hack, trừ khi nó cướp luôn được host và tên miền.

Chi phí duy trì rẻ

Để duy trì một static site, bạn chỉ tốn vài đô hàng tháng cho dịch vụ hosting, vài trăm k một cái tên miền. Nếu dùng wordpress hay một CMS nào đó khác đi, bạn phải trả cao hơn vì bạn dùng đến database và một host chạy php, chưa nói đến việc bạn lưu trữ đủ thứ trên đó khiến dung lượng ổ cứng lúc nào cũng ko đủ dùng. Bèo lắm cũng 120$ một năm. Nếu sử dụng GitHub pages cho static site, bạn gần như chỉ tốn tiền domain

Thế không mạnh

Không thân thiện với người dùng bình thường

Mặc dù markdown được sinh ra là để phục vụ cho đối tượng user không biết gì về lập trình, người dùng bình thường nhất có thể viết được nội dung chuẩn html ko cần chỉnh, tuy nhiên không quá nhiều người không rành công nghệ biết cách viết markdown, và mình thấy đa số họ lại thích một cái editor phức tạp như Word hơn, hoặc là copy từ word lên mà muốn giữ format lại

# Heading 1
## Heading 2
Nội dung
### Heading 3

Khách hàng sẽ thích thú có một cái trang admin, đăng nhập vào và được chủ động cập nhập theo ý thích hơn, một editor đầy đủ tính năng chỉnh màu chữ, chèn hình, xử lý hình, thay đổi font chữ to nhỏ, đổi kiểu chữ lung tung ben lên. Static site sẽ không có những thứ đó cho bạn

So sánh lợi hại giữa WordPress vs Static site

Hạn chế tính năng

Những tính năng căn bản như contact form, bình luận sẽ phải outsource cho một bên thứ 3, static site chỉ giới hạn ở mức hiển thị nội dung, tìm kiếm căn bản, lọc căn bản trong html

Cộng đồng sử dụng không nhiều

Như sếp mình, bạn là một công ty, bạn tìm một công ty làm static site sẽ khó khăn hơn, vì thẳng thắng mà nói, số tiền kiếm được của một static site nói chung rất chi là nhỏ, rất ít công ty thèm làm.

WordPress

Cũng đâu phải tự nhiên mà 33% site trên internet là wordpress, nó cũng có nhiều cái hay ho nên thiên hạ mới ào ào kéo vào xài.

Thế mạnh

Một giao diện admin để cập nhập nội dung mà mọi khách hàng đều hài lòng

Giao diện admin của wordpress thực sự ảnh hưởng rất lớn đến thế giới web, nếu ko muốn nói ai làm trang admin cũng đè wordpress ra tham khảo. Với cái giao diện admin bị chê đó bạn làm được đủ thứ Viết nội dung mới Thay đổi giao diện trang web Tùy biến tính năng Cấu hình SEO Cập nhập, phục hồi dữ liệu cũ

Hàng tá giao diện để lựa chọn

So sánh lợi hại giữa WordPress vs Static site

Kho giao diện không những nhiều mà còn dễ cài, một vài cú click là xong, nếu từng đụng vô Joomla, bạn sẽ thấy việc cài giao diện WordPress dễ dàng hơn như thế nào.

Feature cài thêm đủ đáp ứng mọi nhu cầu từ thấp đến trung bình

Plugin cũng là một thế mạnh của WordPress, cần gì cũng có, thanh toán, tích hợp paypal, forum, ecommerce, social network, tìm là thấy. Được đến ngày hôm nay cũng nhờ cộng động sử dụng WordPress rất đông đảo.

So sánh lợi hại giữa WordPress vs Static site

Nhiều công ty, dịch vụ rẻ như đi chợ cá

Google một phát về dịch vụ làm website ở Việt Nam, trong 100 công ty thì chắc đến 99 công ty làm wordpress, chưa kể đến cộng đồng freelancer. Giá cả thì cũng đủ loại, vô vàn để bạn có thể lựa chọn cho phù hợp từ 500k đến vài trăm triệu.

Thế yếu

Một cách ngắn gọn nhất, những gì là thế mạnh của static site chính là thế yếu của WordPress, load chậm, open source đồng thời với sự nổi tiếng của nó, WordPress luôn là đích ngắm của cộng đồng hacker thực tập (hacker thực thụ ko rãnh hơi đâu hack mấy trang wordpress vặt vãnh). Việc gồng gánh những website có nội dung to nặng đòi hỏi sức người, sức của khá nhiều, không hiểu những trang như tuổi trẻ, vnexpress mà làm wordpress sẽ ra làm sao

Kết luận

Thường những việc trên đời, mình làm thì mình biết, cái nào hợp với mình thì chỉ có mình mới biết được.

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

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

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

Interview React Developer thì hỏi gì?

Bài viết được sự cho phép của tác giả Lưu Bình An
Một vài câu hỏi để kiểm tra mức độ am hiểu react của một lập trình viên frontend
  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

Chuyện gì xảy ra khi gọi setState ?

Đầu tiên, object được truyền trong setState sẽ được merge với state hiện tại của component, dựa trên sự thay đổi của object này, UI được update với state mới.

Để làm được chuyện này, React sẽ dựng một cây React Element mới, so sánh sự khác nhau của cây element mới và cây element trước đó, React biết được chính xác chỉ cần update phần UI nào đã bị thay đổi.

Sự khác nhau giữa Element và Component trong React?

React Element ám chỉ những gì thấy trên màn hình.

React component là một function hoặc class có hoặc không có input và sẽ trả về một React element.

Khi nào thì sử dụng Class Component và Functional Component

Nếu component có state và các phương thức của lifecycle, sử dụng Class Component, ngược lại dùng functional component

Ref trong React dùng để làm gì

Ref để truy cập trực tiếp đến DOM sau khi render

<input type="text" ref={(input) => this.input = input} />

Key trong React là gì

Key giúp React theo dõi sự thay đổi của một item trong list. Tại sao thêm key? để tối ưu performance, giúp React tìm nhanh tới element đó khi cần.

{this.state.todoItems.map((task, uid) => {
  return
    <li key={uid}>{task}</li>
  }
)}

Sự khác nhau giữa controlled component và uncontrolled component

Controlled Componentprop hoặc state của component được gán cho giá trị DOM

<input type='text' value={this.state.username} onChange={this.updateUsername} />

Uncontrolled Component: giá trị của DOM thì do DOM quản

<input type='text' ref={(input) => this.input = input} />

Để gọi AJAX, sử dụng sự kiện nào của lifecycle?

componentDidMount

shouldComponentUpdate dùng để làm gì

shouldComponentUpdate cho phép can thiệp quá trình update UI của component và các component con của nó. Nếu return true thì update, ngược lại false

Tại sao nên sử dụng React.Children.map() thay vì props.children.map()

props.children chưa chắc lúc nào cũng là array. Ví dụ

<Parent>
    <h1>Welcome.</h1>
</Parent>

Nếu sử dụng props.children.map trong Parent sẽ bị lỗi vì props.children là một object không phải array.

<Parent>
    <h1>Welcome.</h1>
    <h2>props.children will now be an array</h2>
</Parent>

React.Children.map cho phép props.children là array hoặc object đều được.

Events được xử lý trong React như thế nào?

Các hàm xử lý event trong React sẽ được truyền vào một instance của SyntheticEventSyntheticEvent cũng giống như những native event bình thường của Browser trừ việc nó có thể làm việc trên tất cả các trình duyệt.

React không attach event vô các child node, mà sẽ lắng nghe tất cả các event sử dụng 1 event listener duy nhất, Với mục đích là để tăng performance và React không cần phải update lại event listener khi update DOM.

Sự khác nhau giữa createElement  và cloneElement

createElement là để tạo element, cloneElement copy element và đưa vào các props mới.

Argument thứ 2 của setState dùng để làm gì

callback function, function sẽ chạy sau khi component được render lại với state mới.

setState là một phương thức bất đồng bộ (asynchronous)

Đoạn code sau sai ở đâu

this.setState((prevState, props) => {
 return { streak: prevState.streak + props.count }
})

Không sai gì cả, ít người biết rằng khi setState có thể truyền vào previous state.

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

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

Xem thêm các tuyển react developer hấp dẫn tại TopDev

TensorFlow là gì? Tìm hiểu về TensoFlow từ A đến Z

Tensorflow là gì – Với sự bùng nổ của lĩnh vực Trí Tuệ Nhân Tạo – A.I. trong thập kỷ vừa qua, machine learning và deep learning rõ ràng cũng phát triển theo cùng. Và ở thời điểm hiện tại, TensorFlow chính là thư viện mã nguồn mở cho machine learning nổi tiếng nhất thế giới, được phát triển bởi các nhà nghiên cứu từ Google. Việc hỗ trợ mạnh mẽ các phép toán học để tính toán trong machine learning và deep learning đã giúp việc tiếp cận các bài toán trở nên đơn giản, nhanh chóng và tiện lợi hơn nhiều. 

Các hàm được dựng sẵn trong thư viện cho từng bài toán cho phép TensorFlow xây dựng được nhiều neural network. Nó còn cho phép bạn tính toán song song trên nhiều máy tính khác nhau, thậm chí trên nhiều CPU, GPU trong cùng 1 máy hay tạo ra các dataflow graph – đồ thị luồng dữ liệu để dựng nên các model. Nếu bạn muốn chọn con đường sự nghiệp trong lĩnh vực A.I. này, nắm rõ những điều cơ bản của TensorFlow thực sự rất quan trọng.

Được viết bằng C++ và thao tác interface bằng Python nên phần performance của TensorFlow cực kỳ tốt. Đối tượng sử dụng nó cũng đa dạng không kém: từ các nhà nghiên cứu, nhà khoa học dữ liệu và dĩ nhiên không thể thiếu các lập trình viên. 

Lịch sử ra đời TensorFlow

Vài năm trước, khi phải xử lý lượng dữ liệu khổng lồ, deep learning bắt đầu cho thấy hiệu năng vượt trội so với tất cả các thuật toán machine learning khác. Google sớm nhận ra tiềm năng này và nghĩ rằng họ nên sử dụng deep neural network để cải thiện các dịch vụ của mình, trong đó có:

– Gmail.
– Hình ảnh
– Google search engine

Thế là họ dựng 1 framework có tên là TensorFlow để các nhà nghiên cứu cũng như lập trình viên có thể làm việc cùng nhau trên model A.I. 1 khi đã được phát triển và scale hoàn chỉnh, rất nhiều người đã có thể sử dụng được nó.

Xem thêm: 

  1. Thử làm ứng dụng tô màu bằng AI 
  2. Hiểu thêm về Deep Learning thông qua 12 khóa học online miễn phí

Ra mắt lần đầu vào cuối năm 2015, phiên bản TensorFlow ổn định cuối cùng cũng xuất hiện vào năm 2017. Là mã nguồn mở dưới sự cho phép của Apache Open Source, giờ đây bạn có thể sử dụng, điều chỉnh và tái đóng góp phiên bản được điều chỉnh đó, đổi lại không cần phải trả bất cứ đồng nào cho Google. 

TensorFlow là gì?
TensorFlow trong vũ trụ Machine Learning

Kiến trúc của TensorFlow

Kiến trúc TensorFlow hoạt động được chia thành 3 phần:

– Tiền xử lý dữ liệu
– Dựng model
– Train và ước tính model

Cách TensorFlow hoạt động

TensorFlow cho phép các lập trình viên tạo ra dataflow graph, cấu trúc mô tả làm thế nào dữ liệu có thể di chuyển qua 1 biểu đồ, hay 1 sê-ri các node đang xử lý. Mỗi node trong đồ thị đại diện 1 operation toán học, và mỗi kết nối hay edge giữa các node là 1 mảng dữ liệu đa chiều, hay còn được gọi là ‘tensor’. 

TensorFlow cung cấp tất cả những điều này cho lập trình viên theo phương thức của ngôn ngữ Python. Vì Python khá dễ học và làm việc, ngoài ra còn cung cấp nhiều cách tiện lợi để ta hiểu được làm thế nào các high-level abstractions có thể kết hợp cùng nhau. Node và tensor trong TensorFlow là các đối tượng Python, và các ứng dụng TensorFlow bản thân chúng cũng là các ứng dụng Python.

Các operation toán học thực sự thì không được thi hành bằng Python. Các thư viện biến đổi có sẵn thông qua TensorFlow được viết bằng các binary C++ hiệu suất cao. Python chỉ điều hướng lưu lượng giữa các phần và cung cấp các high-level abstraction lập trình để nối chúng lại với nhau.

Các ứng dụng TensorFlow có thể chạy được trên hầu hết các đối tượng thông dụng: máy local, cluster trong các đám mây, thiết bị di động iOS và Android, CPU hay GPU. Nếu bạn dùng đám mây của riêng Google, bạn có thể chạy TensorFlow trên silicon của TensorFlow Processing Unit (TPU) tùy chỉnh từ Google để tăng tốc hiệu quả hơn nữa. Các model được tạo ra bởi TensorFlow, có thể deploy trên hầu hết các thiết bị nơi chúng được sử dụng để phục vụ các dự đoán.

TensorFlow 2.0, được ra mắt vào tháng 10 năm 2019, cải tiến framework theo nhiều cách dựa trên phản hồi của người dùng, để dễ dàng và hiệu quả hơn khi làm việc cùng nó (ví dụ: bằng cách sử dụng các Keras API liên quan đơn giản cho việc train model). Train phân tán dễ chạy hơn nhờ vào API mới và sự hỗ trợ cho TensorFlow Lite cho phép triển khai các mô hình trên khá nhiều nền tảng khác nhau. Tuy nhiên, nếu đã viết code trên các phiên bản trước đó của TensorFlow thì bạn phải viết lại, đôi lúc 1 ít, đôi lúc cũng khá đáng kể, để tận dụng tối đa các tính năng mới của TensorFlow 2.0. 

Lợi ích từ TensorFlow

Lợi ích dễ thấy nhưng quan trọng nhất mà TensorFlow cung cấp cho việc lập trình machine learning chính là abstraction. Thay vì phải đối phó với những tình huống rườm rà từ việc thực hiện triển khai các thuật toán, hay tìm ra cách hợp lý để chuyển output của 1 chức năng sang input của 1 chức năng khác, giờ đây bạn có thể tập trung vào phần logic tổng thể của 1 ứng dụng hơn. TensorFlow sẽ chăm sóc phần còn lại thay cho bạn.

Ngoài ra TensorFlow còn ung cấp các tiện ích bổ sung cho các lập trình viên cần debug cũng như giúp bạn tự suy xét các ứng dụng TensorFlow. Chế độ eager execution cho phép bạn đánh giá và sửa đổi từng operation của biểu đồ 1 cách riêng biệt và minh bạch, thay vì phải dựng toàn bộ biểu đồ dưới dạng 1 đối tượng độc lập vốn khá mơ hồ hay phải đánh giá chung tổng thể. Cuối cùng, 1 tính năng khá độc đáo của TensorFlow là TensorBoard. TensorBoard cho phép bạn quan sát 1 cách trực quan những gì TensorFlow đang làm.

TensorFlow còn có nhiều cải tiến từ sự hậu thuẫn từ các ekíp thương mại hạng A tại Google. Google không những tiếp lửa cho tiến độ nhanh chóng cho sự phát triển đằng sau dự án, mà còn tạo ra nhiều phục vụ độc đáo xung quanh TensorFlow để nó dễ dàng deploy và sử dụng: như silicon TPU mình đã nói ở trên để tăng tốc hiệu suất đám mây Google, 1 online hub cho việc chia sẻ các model được tạo với framework, sự hiện diện của in-browser và gần gũi với mobile của framework, và nhiều hơn thế nữa…

Lưu ý: Trong 1 số công việc training, vài chi tiết về việc triển khai của TensorFlow làm cho nó khó có thể quyết định được hoàn toàn kết quả training model . Đôi khi 1 model được train trên 1 hệ thống này sẽ có thay đổi 1 chút so với 1 model được train trên hệ thống khác, ngay cả khi chúng được cung cấp dữ liệu như nhau. Các nguyên nhân cho điều này cũng xê xích hay 1 số hành vi khi không được xác định khi sử dụng GPU. Điều này nói rằng, các vấn đề đó có thể giải quyết được, và đôi ngũ của TensorFlow cũng đang xem xét việc kiểm soát nhiều hơn để ảnh hưởng đến tính quyết định trong quy trình làm việc.

Giới thiệu các Component của TensorFlow

Tensor

Tên của TensorFlow được đưa ra trực tiếp là nhờ vào framework cốt lõi của nó: Tensor. Trong TensorFlow, tất cả các tính toán đều liên quan tới các tensor. 1 tensor là 1 vector hay ma trận của n-chiều không gian đại diện cho tất cả loại dữ liệu. Tất cả giá trị trong 1 tensor chứa đựng loại dữ liệu giống hệt nhau với 1 shape đã biết (hoặc đã biết 1 phần). Shape của dữ liệu chính là chiều của ma trận hay mảng.

1 tensor có thể được bắt nguồn từ dữ liệu input hay kết quả của 1 tính toán. Trong TensorFlow, tất cả các hoạt động được tiến hành bên trong 1 graph – biểu đồ. Biểu đồ là 1 tập hợp tính toán được diễn ra liên tiếp. Mỗi operation được gọi là 1 op node  (operation node) và được kết nối với nhau.

Biểu đồ phát thảo các op và kết nối giữa các node. Tuy nhiên, nó không hiển thị các giá trị. Phần edge của các node chính là tensor, 1 cách để nhập operation với dữ liệu.

Graph

TensorFlow sử dụng framework dạng biểu đồ. Biểu đồ tập hợp và mô tả tất cả các chuỗi tính toán được thực hiện trong quá trình training. Biểu đồ cũng mang rất nhiều lợi thế:

– Nó được làm ra để chạy trên nhiều CPU hay GPU, ngay cả các hệ điều hành trên thiết bị điện thoại.
– Tính di động của biểu đồ cho phép bảo toàn các tính toán để bạn sử dụng ngay hay sau đó. Biểu đồ có thể được lưu lại để thực thi trong tương lai.
– Tất cả tính toán trong biểu đồ được thực hiện bằng cách kết nối các tensor lại với nhau. 1 tensor có 1 node và 1 edge. Node mang operation toán học và sản xuất các output ở đầu cuối. Các edge giải thích mối quan hệ input/output giữa các node.

Danh sách các thuật toán nổi bật được hỗ trợ bởi TensorFlow

Tính tới thời điểm phiên bản ra mắt TensorFlow 1.10, nó đã sở hữu built-in API cho:

Linear regression: tf.estimator.LinearRegressor

Classification: tf.estimator.LinearClassifier

Deep learning classification: tf.estimator.DNNClassifier

Deep learning wipe and deep: tf.estimator.DNNLinearCombinedClassifier

Booster tree regression: tf.estimator.BoostedTreesRegressor

Boosted tree classification: tf.estimator.BoostedTreesClassifier

Ví dụ TensorFlow đơn giản

import numpy as np
import tensorflow as tf

Trong 2 line code đầu, ta đã import tensorflow là tf. Với Python, nó chỉ là 1 bài tập thông dụng khi dùng tên viết tắt cho 1 thư viện. Lợi thế là để tránh gõ đầy đủ tên của thư viện khi ta cần sử dụng nó.

Ví dụ: chúng ta có thể import tensorflow là tf, và gọi tf khi chúng ta muốn dùng 1 chức năng TensorFlow.

Ta hãy luyện tập quy trình làm việc cơ bản của TensorFlow với 1 ví dụ cơ bản sau đây:Tạo 1 đồ thị tính toán nhân 2 số lại với nhau.

Chúng ta sẽ nhân X_1 và X_2 lại với nhau. TensorFlow sẽ tạo 1 node để kết nối với operation. Trong ví dụ này, nó được gọi là multiply. Khi đồ thị được xác định, engine tính toán TensorFlow sẽ nhân X_1 và X_2 lại cùng nhau.

tensorflow là gì?
Cuối cùng, chúng ta chạy 1 session TensorFlow mà sẽ chạy đồ thị tính toán với giá trị của X_1 và X_2 và print phần kết quả của phép nhân.


Hãy xác định các input node của X_1 và X_2. Khi ta tạo 1 node trong TensorFlow, chúng ta phải chọn nó là loại node gì. Các node X1 và X2 sẽ là node placeholder – node giữ chỗ. Placeholder chỉ định 1 giá trị mới mỗi khi ta làm 1 phép tính. Ta sẽ tạo chúng như là 1 node TF chấm placeholder.

Bước 1: Xác định giá trị

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

Khi ta tạo 1 node placeholder, ta phải gửi loại dữ liệu sẽ được thêm số tại đây nên ta có thể sử dụng 1 loại dữ liệu floating-point, hãy dùng tf.float32. Chúng ta cũng cần phải cho node này 1 cái tên. Tên này sẽ xuất hiện khi ta nhìn vào phần trực quan dạng đồ thị của model. Hãy đặt tên node X_1 này bằng cách nhập 1 tham số được gọi bằng tên với 1 giá trị của X_1 và bây giờ hãy xác định X_2 theo cách tương tự.

Bước 2: Xác định phần tính toán

multiply = tf.multiply(X_1, X_2, name = "multiply")

Giờ ta có thể xác định node sẽ thực hiện operation phép nhân. Trong TensorFlow, chúng ta có thể làm điều đó bằng cách tạo 1 node tf.multiply.

Ta sẽ nhập node X_1 và X_2 tới node nhân. Nó sẽ nói với TensorFlow để liên kết những node đó trong đồ thị tính toán, nên ta đang yêu cầu nó để pull các giá trị từ x và y và nhân phần kết quả. Hãy cho node nhân cái tên multiply. Nó là toàn bộ định nghĩa cho đồ thị tính toán đơn giản này.

Bước 3: Thực thi operation

Để thực thi các operation trong đồ thị, ta phải tạo 1 session. Trong TensorFlow, nó được thực hiện bằng tf.Session(). Giờ ta có 1 session ta có thể hỏi session để chạy operation trên đồ thị tính toán của ta bằng cách gọi session. Để chạy phần tính toán, chúng ta sẽ dùng run.

Khi operation bổ sung chạy, nó sẽ thấy rằng nó cần để lấy các giá trị của node X_1 và X_2, nên chúng ta cũng cần cung cấp các trị cho X_1 và X_2. Ta có thể dùng điều đó bằng cách cung cấp 1 tham số được gọi là feed_dict. Chúng ta chuyển giá trị 1,2,3 cho X_1 và 4,5,6 cho X_2.

Chúng ta print phần kết quả với print(result). Chúng ta sẽ thấy 4,10 và 18 cho 1×4, 2×5 và 3,6.

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

multiply = tf.multiply(X_1, X_2, name = "multiply")

with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
    print(result)
[ 4. 10. 18.]

Các option tải dữ liệu vào TensorFlow

Bước đầu tiên trước khi train 1 thuật toán machine learning là load dữ liệu. Có 2 cách thông dụng để load dữ liệu:

1. Load dữ liệu vào bộ nhớ: đây là phương pháp đơn giản nhất. Bạn load tất cả dữ liệu vào bộ nhớ như 1 mảng đơn. Bạn cũng có thể viết code bằng Python. Những dòng code này không liên quan gì tới TensorFlow.

2. Pipeline dữ liệu TensorFlow. TensorFlow sở hữu built-in API và nó sẽ giúp bạn load dữ liệu, thực thi các operation và feed thuật toán machine learning 1 cách dễ dàng. Phương pháp này hoạt động tốt đặc biệt khi bạn có 1 dataset lớn. Ví dụ: các hình ảnh thu được được biết khá là khổng lồ và không thể fit vào bộ nhớ. Pipeline dữ liệu sẽ tự quản lý phần bộ nhớ.

Giải pháp sẽ là gì?

Load dữ liệu vào bộ nhớ

Nếu dataset của bạn không quá lớn, chẳng hạn như dưới 10 GB, bạn có thể dùng phương pháp đầu tiên. Dữ liệu có thể dễ dàng fit vào bộ nhớ. Bạn cũng có thể dùng 1 thư viện nổi tiếng có tên là Pandas để import các tệp CSV. 1

Load dữ liệu với TensorFlow pipeline

Phương pháp thứ 2 sẽ hoạt động tốt nhất nếu bạn có 1 dataset lớn. Ví dụ: nếu bạn có 1 dataset nặng 50 GB và máy tính của bạn chỉ có 16GB dung lượng thì rõ ràng là máy sẽ crash thôi.

Trong tình huống này, bạn cần dựng 1 TensorFlow pipeline. Đường ống sẽ load dữ liệu trong batch, hay chunk nhỏ. Mỗi batch sẽ được push tới pipeline và sẵn sàng cho việc training. Dựng 1 pipeline là 1 giải pháp tuyệt vời vì nó còn cho bạn sử dụng phép tính toán song song. Nghĩa là TensorFlow sẽ train model qua nhiều CPU. Thúc đẩy sự tính toán và cho phép training mạng lưới thần kinh mạnh mẽ hơn.

Tóm tắt:

-Nếu bạn có 1 set dữ liệu nhỏ, bạn có thể load dữ liệu trong bộ nhớ với thư viện Pandas.

-Nếu bạn có 1 set dữ liệu lớn và muốn sử dụng nhiều CPU, thì bạn sẽ thoải mái hơn khi làm việc cùng TensorFlow pipeline.

  Bookmark 5 website học lập trình Python tốt nhất

Tạo đường ống TensorFlow

Trong ví dụ trước, ta đã thêm thủ công 3 giá trị cho X_1 và X_2. Giờ chúng ta sẽ xem cách load dữ liệu tới TensorFlow.

Bước 1: Tạo dữ liệu

Đầu tiên, hãy dùng thư viện numpy để tạo ra 2 giá trị ngẫu nhiên.

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

Bước 2: Tạo placeholder

Giống như ví dụ trước, ta tạo 1 placeholder với tên là X. Ta cần phải chỉ định shape của TensorFlow 1 cách rõ ràng. Trong vài trường hợp, ta sẽ tải 1 mảng với chỉ 2 giá trị. Ta có thể viết shape như là shape=[1,2]

# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

Bước 3: Xác định phương pháp cho set dữ liệu

Tiếp theo, chúng ta cần phải xác định set dữ liệu nơi ta có thể nhập giá trị của placeholder x. Chúng ta cần dùng phương pháp tf.data.Dataset.from_tensor_slices 

dataset = tf.data.Dataset.from_tensor_slices(x)

Bước 4: Tạo đường ống

Trong bước này, ta cần phải khởi tạo pipeline nơi dữ liệu chạy qua. Ta cần tạo 1 iterator với make_initializable_iterator. Đặt tên cho nó là iterator. Rồi ta cần gọi iterator này để feed cho batch dữ liệu tiếp theo, get_next. Ta đặt tên bước này là get_next. Hãy lưu ý điều này trong ví dụ của mình, vì chỉ có duy nhất 1 batch dữ liệu với 2 giá trị.

iterator = dataset.make_initializable_iterator() 
get_next = iterator.get_next()

Bước 5: Thực thi operation

Bước cuối cũng tương tự như ví dụ trước. Ta khởi tạo 1 session và chạy operation iterator. Ta feed cái feed_dict với giá trị được tạo ra bởi numpy. 2 giá trị này sẽ nhập vào placeholder x. Rồi chúng ta chạy get_next để print kết quả.

with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input }) 
    print(sess.run(get_next)) # output [ 0.52374458  0.71968478]
[0.8835775  0.23766978]

10 tài liệu lập trình đág xem qua nhất về Tensorflow

1 – Learn TensorFlow 2.0: Implement Machine Learning and Deep Learning Models with Python

Tài liệu Tensorflow là gì Implement Machine Learning and Deep Learning Models with Python

Learn TensorFlow 2.0 là quyển sách được viết bởi 2 tác giả Pramod Singh và Avish Manure. Sách bắt đầu bằng việc giới thiệu framework TensorFlow 2.0 và những thay đổi chính từ bản phát hành trước đó. Quyển này cũng tập trụng vào phần dựng các model ‘Supervised Machine Learning’ bằng cách dùng TensorFlow.

Learn TensorFlow còn dạy cho bạn cách dựng các model bằng việc dùng ‘customer estimators’. Bạn sẽ học được cách sử dụng TensorFlow để dựng các model machine learning và deep learning. Tất cả code trong sách đều có sẵn ở dạng script thực thi trên GitHub, bạn có thể thực hành nó 1 cách dễ dàng.

2 – Advanced Deep Learning with TensorFlow 2 and Keras

Tài liệu Tensorflow là gì Advanced Deep Learning with TensorFlow 2 and Keras

Advanced Deep Learning with TensorFlow 2 and Keras là 1 quyển sách của tác giả Rowel Atienza, nó dạy cho bạn những kỹ thuật deep learning cao cấp đang sẵn có ở thời điểm hiện tại.

Nó còn dạy cho bạn về deep learning, unsupervised learning bằng cách dùng các thông tin tương quan, xác định đối tượng (SSD). Sách sẽ chỉ cho bạn cách để tạo A.I. hiệu quả với các kỹ thuật tiên tiến nhất hiện tại. Trong Advanced Deep Learning with TensorFlow 2 and Keras, bạn còn được học về GANs và làm thế nào họ có thể mở khoá các cấp độ mới của hiệu năng cho Trí tuệ Nhân Tạo.

3 – Tensorflow in 1 Day

Tài liệu Tensorflow là gì in 1 Day

Học TensorFlow chỉ trong 1 ngày? Nghe thì ảo thật đấy nhưng trong quyển sách bởi tác giả Krishna Rungta này sẽ dạy cho bạn về môn khó nhằn bằng tiếng Anh theo cách dễ hiểu nhất. Nó còn đi kèm đồ thị, tính năng tính toán tuyệt vời. Quyển sách được khá nhiều nhà khoa học dữ liệu khuyến cáo vì độ trực quan mà nó đem lại cho mạng lưới thần kinh khi sử dụng TensorBoard.

Sách bao gồm các chủ đề như Deep learning là gì?, Machine Learning vs. Deep Learning, TensorFlow là gì? cũng như các chủ đề cao cấp hơn như Jupyter Notebook, TensorFlow trên AWS và còn nhiều nữa… Hẳn đây là 1 quyển không thể thiếu cho các bạn mới bắt đầu tìm hiểu về TensorFlow.

4 – TinyML: Machine Learning with TensorFlow Lite on Arduino and Ultra-Low-Power Microcontrollers

Tài liệu Tensorflow là gì

TinyML: Machine Learning with TensorFlow Lite là quyển được viết bởi Pete Warden và Daniel Situnayke. Với cuốn tham khảo thực hành này, bạn sẽ bước vào lĩnh vực TinyML. Nó bao gồm deep learning kết hợp cùng hệ thống nhúng để tạo ra những thứ đáng kinh ngạc nhất có thể với những thiết bị tí hon.

Quyển TinyML này khá lý tưởng cho các bạn lập trình viên phần mềm lẫn lập trình viên phần cứng, nhất là những ai muốn dựng hệ thống nhúng bằng machine learning.

 

5 – Natural Language Processing with TensorFlow: Teach language to machines using Python’s deep learning library

Tài liệu Tensorflow là gì Natural Language Processing with TensorFlow- Teach language to machines using Python's deep learning library

Natural Language Processing with TensorFlow là quyển sách viết bởi Husan Ganefedara. Bạn sẽ học cách ứng dụng các model RNN hiệu năng cao, các cell short-term memory (LSTM), vào các tác vụ Natural Language Processing. Bạn còn có thể khám phá sự chuyển ngữ neural machine và triển khai thực hiện trình chuyển ngữ neural machine.

Sau khi đọc xong quyển sách này, bạn sẽ hiểu rõ hơn về công nghệ NLP và có thể ứng dụng TensorFlow vào các ứng dụng deep learning NLP, cũng như cách thi hành các tác vụ NLP cụ thể.

6 – TensorFlow Machine Learning Projects: Build 13 real-world projects with advanced numerical computations using the Python ecosystem

Tài liệu Tensorflow là gì TensorFlow Machine Learning Projects- Build 13 real-world projects with advanced numerical computations using the Python ecosystem

TensorFlow Machine Learning Projects là quyển sách bởi bộ 3 tác giả: Ankit Jain, Armando Fandango, và Amita Kapoor. Nó sẽ dạy bạn cách dựng các dự án nâng cao cũng như bạn sẽ có thể va chạm nhiều thử thách thông dụng bằng cách sử dụng các thư viện từ TensorFlow ecosystem.

Ngoài ra, TMLP còn dạy cho bạn cách dựng các dự án đa dạng bằng real-world domains, autoencoders, các hệ thống được đề xuất, reinforcement learning, v.. v.. Khi kết thúc quyển tham khảo này, bạn sẽ có được chuyên môn cần thiết để dựng các dự án machine learning.

7 – Hands-On Computer Vision with TensorFlow 2: Leverage deep learning to create powerful image processing apps with TensorFlow 2.0 and Keras

Tài liệu Tensorflow là gì - Hands-On Computer Vision with TensorFlow 2- Leverage deep learning to create powerful image processing apps with TensorFlow 2.0 and Keras

Hands-On Computer Vision with TensorFlow 2 được viết bởi tác giả Benjamin Planche và Eliot Andres. Quyển này sẽ giúp bạn phám phá về framework nguồn mở cho machine learning này của Google. Bạn sẽ hiểu được cách làm thế nào để hưởng lợi từ việc sử dụng mạng lưới thần kinh tích chập – convolutional neural networks (CNNs) cho các nhiệm vụ trực quan.

Sách bắt đầu với nền tảng của tầm nhìn máy tính và deep learning. Sách cũng dạy cho bạn làm thế nào để dựng 1 mạng lưới thần kinh từ con số 0 cũng như giúp bạn cách phân loại hình ảnh với các giải pháp hiện đại, như Inception và ResNet, và trích xuất nội dung cụ thể qua phương pháp You Only Look Once (YOLO).

Cuối cùng, bạn sẽ biết rõ về lý thuyết lẫn kỹ năng thực tế. Ngoài ra nó còn giúp bạn giải quyết các vấn đề nâng cao về tầm nhìn máy tính.

8 – Pro Deep Learning with TensorFlow: A Mathematical Approach to Advanced Artificial Intelligence in Python

Tài liệu Tensorflow là gì - Pro Deep Learning with TensorFlow- A Mathematical Approach to Advanced Artificial Intelligence in Python

Viết bởi Santanu Pattanayak, Pro Deep Learning with TensorFlow cho bạn hiểu rõ về kiến thức và trực giác toán học. Nó sẽ giúp bạn phát mình ra các cấu trúc và giải pháp deep learning mới cho riêng bạn.

Sách còn cung cấp các bài thực hành chuyên môn để bạn có thể học deep learning dù chưa biết gì. Quyển PDLwT sẽ cho phép bạn tăng tốc nhanh chóng khi dùng TensorFlow, cũng như tối ưu hóa các kiến trúc deep learning khác nhau.

Mang nhiều khái niệm thực hành đa dạng về deep learning được nhấn mạnh có liên quan trong bất kỳ ngành nào. Code trong tài liệu tham khảo còny có sẵn ở dạng scrypt và iPython notebook.

9 – Practical Deep Learning for Cloud, Mobile, and Edge: Real-World AI & Computer-Vision Projects Using Python, Keras & TensorFlow

Tài liệu Tensorflow là gì - Practical Deep Learning for Cloud, Mobile, and Edge- Real-World AI & Computer-Vision Projects Using Python, Keras & TensorFlow

Practical Deep Learning for Cloud, Mobile, and Edge là quyển sách viết bởi Anirudh Koul, Siddha Ganju, và Meher Kasam. Nếu bạn muốn dựng các ứng dụng thực hành deep learning cho đám mây, di động hay trình duyệt thì quyển này sẽ rất thích hợp cho bạn.

Sách dạy cho bạn quá trình chuyển đổi từ 1 ý tưởng trở thành 1 thứ gì đó mà mọi người có thể sử dụng. Sách còn chỉ cho bạn cách phát triển trí tuệ nhân tạo trong pham vi rộng các thiết bị, bao gồm Raspberry Pi và Google Coral. Bạn sẽ nhận được nhiều mẹo thực hành cho việc tối đa hóa độ chính xác và tốc độ các model.

10 – Deep Learning: A Practitioner’s Approach

Tài liệu Tensorflow là gì- Deep Learning- A Practitioner's Approach

Quyển không thể thiếu nếu bạn đang học tập và làm việc có liên quan tới lĩnh vực Deep Learning. Được viết bởi Josh Patterson và Adam Gibson. Cuốn hướng dẫn thực hành này không những cung cấp thông tin thiết thực nhất về deep learning mà còn giúp bạn bắt đầu xây dựng mạng lưới deep learning hiệu quả.

Bạn sẽ được học phần lý thuyết tổng quát của deep learning trước khi được giới thiệu Deeplearning4j (DL4J) nguồn mở của các tác giả, 1 thư viện để phát triển quy trình công việc trong sản xuất. Bằng cách sử dụng các ví dụ thực tế, bạn sẽ tìm hiểu các phương pháp và chiến thuật 1 cách dễ dàng.

Tổng kết về Tensorflow

Trong những năm gần đây, TensorFlow chính là thư viện deep learning nổi tiếng nhất. Người dùng TensorFlow có thể dựng bất kỳ cấu trúc deep learning nào, như CNN, RNN hay artificial neural network – mạng lưới thần kinh nhân tạo.

TensorFlow được dùng nhiều nhất bởi academic, startup và các công ty lớn. Google dùng TensorFlow trong hầu hết tất cả các sản phẩm thường nhật của họ. Bao gồm Gmail, Photo và hệ thống tìm kiếm Google.

Người dùng ưu dùng TensorFlow vì bạn có thể deploy at scale khá là dễ dàng cũng như nó có thể hoạt động trên đám mây hay bất kỳ thiết bị di động nào như iOS hay Android.

Đội ngũ Google Brain đã phát triển TensorFlow để làm khoảng cách giữa các nhà nghiên cứu và lập trình viên sản phẩm lại gần nhau hơn. Năm 2015, họ công khai TensorFlow và nó dần trở nên phổ biến. Ngày nay, TensorFlow đã thành thu viện deep learning với nhiều repo nhất trên GitHub.

Đừng bỏ lỡ những bài viết hay về Tensorflow và AI tại TopDev:

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

Sử dụng ellipsis text với flexbox

Bài viết được sự cho phép của tác giả Lưu Bình An
  Cách vận hành của Flexbox
  Hướng dẫn sử dụng css flexbox cho người mới tìm hiểu
Câu chuyển cắt chuỗi khi quá dài bằng CSS, trong tình huống sau, cái tên file của bạn quá dài, nhưng bạn không muốn cắt ở cuối chuỗi, mà cắt ở giữa để vẫn thấy được file extension

Sử dụng ellipsis text với flexbox

Chuỗi chưa cắt

mobile-phone-screenshot-long-fine-name.png

Chuỗi sau khi cắt

mobile-phone-sc...g-fine-name.png

Sử dụng ellipsis text với flexbox

Cái HTML structure dĩ nhiên là chúng ta tách cái đuôi file ra riêng, độc lập với cái tên

<div class="filename"> <span class="filename__base">this-file-has-a-really-really-really-long-filename.</span> <span class="filename__extension">pdf</span> </div>

CSS:

.filename { display: flex; min-width: 0; } .filename__base { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .filename__extension { flex-shrink: 0; }

Việc ellipsis text sẽ được thực hiện bởi kết hợp ba thuộc tính text-overflowwhite-space và overflow. Tuy nhiên chúng ta vẫn phải ước lượng được mối liên hệ giữa phần chứa file name .filename__base và element bọc bên ngoài (ở đây là .filename)

Thủ thuật quan trọng ở đây là dùng thuộc tính min-width: 0, chúng ta đặt giá trị nhỏ nhất cho phép của .filename, nó sẽ ép các thằng con bên dưới co lại nếu nó không có khai báo thuộc tính flex-shrink

Demo các bạn xem ở đây

Using Flexbox and text ellipsis together

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

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

Xem thêm các việc làm cho lập trình viên hấp dẫn tại TopDev

Phân biệt sự khác nhau giữa await-return-return await

Bài viết được sự đồng ý của tác giả Lưu Bình An

Khi viết một async function, có sự khác nhau giữa await và return và return await, các bạn nên biết để sử dụng cho đúng

Chúng ta có một async function waitAndMaybeReject

async function waitAndMaybeReject() { // wait 1 giây await new Promise((r) => setTimeout(r, 1000)); const isHeads = Boolean(Math.round(Math.random())); if (isHeads) return "Thành công zòi"; throw Error("Xui thôi!"); }

Sau 1 giây, nó sẽ trả về một Promisehên hên thì resolve cho giá trị Thành công zòi, xui xui thì cho giá trị Xui thôi!.

Giờ khi chúng ta gọi hàm waitAndMaybeReject()

async function test() { try { waitAndMaybeReject(); } catch (e) { return "Oh No!"; } }

Khi viết như vậy, chúng ta sẽ luôn nhận được kết quả fulfill với giá trị undefined, không có waiting

Bởi vì chúng ta không có await trên kết quả trả về của waitAndMaybeReject(), nói chúng là chúng ta ko có phụ thuộc gì vào việc gọi hàm waitAndMaybeReject(). Code như vậy là sai nghe các bạn.

  Flutter - Lập trình bất đồng bộ với Future, async, await
  Xin đừng return mảng kết hợp!

Rồi giờ chúng ta sẽ await trên kết quả của hàm waitAndMaybeReject()

async function test() { try { await waitAndMaybeReject(); } catch (e) { return "Oh No!"; } }

Hàm này khi thực thi nó sẽ chạy như sau, đợi 1 giây, sau đó hoặc là trả về fulfill với undefined, hoặc fulfill với ‘Oh No!’

Bởi vì chúng ta chỉ await trên waitAndMaybeReject(), việc xui xui bị reject trong waitAndMaybeReject sẽ throw ra lỗi và được túm lấy trong hàm test. Và vì không làm gì hết khi waitAndMaybeReject() khi được resolve, nên chúng ta nhận về undefined

Rồi, giờ tới trường hợp return

async function test() { try { return waitAndMaybeReject(); } catch (e) { return "Oh No!"; } }

Nó sẽ thực thi như sau, đợi một giây, sau đó hoặc là fulfill với giá trị Thành công zòi hoặc reject với giá trị Xui thôi!

Với việc return waitAndMaybeReject, chúng ta đã chuyển tiếp hết kết quả trả về của waitAndMaybeReject, đồng nghĩa với việc catch bên trong hàm test chả bao giờ chạy tới.

return await thì sao?

async function test() { try { return await waitAndMaybeReject(); } catch (e) { return "Oh No!"; } }

Nó sẽ thực thi như sau, đợi sau một giây sau đó trả về fulfill với giá trị Thành công zòi hoặc fulfill với giá trị Oh No!

Vì chúng ta await trên kết quả cả waitAndMaybeReject(), reject của hàm waitAndMaybeReject() sẽ đẩy về throw của hàm test, kết quả là Oh No!. Nếu waitAndMaybeReject được resolve, chúng ta return kết quả này, chính là Thành công zòi

Có thể viết như thế này cho dễ hình dung hơn

async function test() { try { const fulfilledValue = await waitAndMaybeReject(); return fulfilledValue; } catch (e) { return "Oh No!"; } }

Lưu ý cuối cùng: Nếu không dùng try/catch mà return await sẽ rất dư thừa

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

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

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

Giải mã sức mạnh từ BIDV – điểm đến lý tưởng để phát triển sự nghiệp

BIDV với tên đầy đủ là Ngân hàng Đầu tư và Phát triển Việt Nam (tên giao dịch quốc tế: Bank for Investment and Development of Vietnam) là ngân hàng thương mại nhà nước lớn nhất Việt Nam hiện đã và đang hợp tác kinh doanh với hơn 800 ngân hàng trên thế giới, chiếm được sự tin tưởng và tín nhiệm của nhiều đối tác trong suốt hơn nửa thế kỷ qua.

Giải mã sức mạnh từ BIDV - điểm đến lý tưởng để phát triển sự nghiệp

BIDV – Điểm tựa niềm tin

Thành lập ngày 26/4/1957, Ngân hàng TMCP Đầu tư và Phát triển Việt Nam (BIDV) tự hào là định chế tài chính lâu đời nhất trong lĩnh vực tài chính ngân hàng tại Việt Nam, có uy tín và giá trị hàng đầu Việt Nam. BIDV cung cấp đầy đủ và đa dạng sản phẩm, dịch vụ đến khách hàng cá nhân, khách hàng doanh nghiệp và định chế tài chính; bao gồm dịch vụ Tiền gửi, Thẻ, Tín dụng, Ngân hàng Điện tử, Thanh toán, Quản lý tiền tệ và các dịch vụ khác.

Trải qua hàng thập kỷ năm phát triển, BIDV đã thể hiện được vị thế của mình với những con số ấn tượng:

  • Hơn 190 chi nhánh, trên 855 điểm giao dịch trên cả nước bao phủ 63 tỉnh/ thành Việt Nam;
  • Hiện diện thương mại tại 6 quốc gia: Campuchia, Lào, CH Séc, Đài Loan, Nga, Myanmar;
  • Hơn 57825 cây ATM và hệ thống máy Pos giúp tiện lợi hóa các giao dịch cho người dùng.

Để đạt được những con số trên, toàn thể đội ngũ hơn 25.000 cán bộ, nhân viên của BIDV luôn không ngừng phấn đấu và chiến đấu dựa trên những mục tiêu kinh doanh, cũng là sứ mệnh và kim chỉ nam cho sự phát triển của BIDV:

  • Đồng hành, chia sẻ và cung cấp dịch vụ tài chính – ngân hàng hiện đại, tốt nhất cho khách hàng;
  • Cam kết mang lại giá trị tốt nhất cho các cổ đông;
  • Tạo lập môi trường làm việc chuyên nghiệp, thân thiện, cơ hội phát triển nghề nghiệp và lợi ích xứng đáng cho mọi nhân viên;
  • Trở thành ngân hàng tiên phong trong hoạt động phát triển cộng đồng.

BIDV – Giữ vững phong độ, không ngại thử thách

Thành công của BIDV là kết tinh của tinh thần đoàn kết – đồng lòng và những nỗ lực không ngừng nghỉ của tập thể cán bộ, nhân viên trong suốt 63 năm – Một BIDV Chuyên nghiệp – Thân thiện – Hiện đại ngày càng tỏa sáng trong hành trình vượt qua thử thách, thắp sáng thành công.

Sức mạnh đoàn kết và niềm tin đến từ chính đội ngũ lao động là cơ sở cốt lõi tạo nên sự tín nhiệm từ những đối tác của công ty, là chiếc chìa khóa giúp BIDV luôn lớn mạnh đến hôm nay. 

Tại BIDV, con người là tài sản quý báu nhất, là một trong những nguồn lực được ưu tiên hàng đầu trong việc “đầu tư để phát triển” thông qua những Chính sách đãi ngộ nhân viên và Chương trình đào tạo đầy hấp dẫn:

  • Các chế độ thưởng cho cán bộ trong các dịp lễ Tết, bổ sung quỹ thu nhập 6 tháng đầu năm và đầy đủ các chế độ về bảo hiểm, thăm ốm, hưu trí…..
  • Cung cấp trang thiết bị tối ưu, không gian làm việc yên tĩnh phù hợp cho cán bộ nhân viên;
  • Đảm bảo các ngày nghỉ lễ theo đúng quy định của pháp luật, không phải đi làm thứ 7, chủ nhật;
  • Được trả lương trên cơ sở trình độ, năng lực của từng cá nhân, vị trí công việc được giao đảm nhận và theo Quy chế lương của Trung tâm Công nghệ Thông tin BIDV, quy chế lương của BIDV;
  • Được chi bổ sung thu nhập theo kết quả làm việc, vị trí công việc và theo quy định của BIDV;
  • Các chương trình đào tạo nâng cao chuyên môn, nghiệp vụ, kỹ năng mềm và kỹ năng quản lý. Các chương trình đào tạo được tổ chức trong nước và tại nước ngoài như Singapore, Hàn Quốc, Úc, Mỹ, Anh, Pháp…

Giải mã sức mạnh từ BIDV - điểm đến lý tưởng để phát triển sự nghiệp

Chiêu mộ nhân tài, căng buồm ra khơi và “cập bến” thành công

BIDV được so sánh như một “con tàu lớn giương cánh buồm đỏ thắm ra khơi”. Con tàu ấy vượt qua bao biển cả không chỉ nhờ sự “lèo lái” của những người “Thuyền trưởng” tài năng và tâm huyết để có thể thành công. Điều đặc biệt giúp đoàn thuyền trở nên lớn mạnh chính là sự góp sức từ những Thủy thủ đoàn đầy nhiệt huyết và năng lượng để cùng nhau vượt mọi sóng cả, cập bến thành công.

Với mục tiêu “giương buồm” đi xa, vươn đến tầm quốc tế, BIDV đang từng bước phát triển vượt bậc với nhiều ứng dụng công nghệ hữu ích thuộc lĩnh vực Ngân hàng:

  • BIDV Online cung cấp các dịch vụ chuyển tiền, thanh toán hóa đơn nhanh chóng, thuận tiện và các dịch vụ thẻ, mua bán ngoại tệ online cùng nhiều tiện ích khác.
  • Với sản phẩm dịch vụ Internet Banking hay còn gọi là BIDV smart Banking, mọi giao dịch trên hệ thống ngân hàng và những thao tác thông qua việc tích hợp tài khoản BIDV được thực hiện dễ dàng, tạo tiện lợi cho người dùng.
  • BIDV mang đến giải pháp thanh toán thẻ hiện đại, an toàn và nhanh chóng với thiết bị đọc thẻ mPos đối với các loại thẻ Quốc tế và Nội địa bằng nhiều hình thức.
  • Sản phẩm dịch vụ BIDV iBank cho phép xử lý giao dịch theo nhiều cơ chế giúp đẩy lệnh thanh toán tới BIDV mà không cần soạn lệnh trực tiếp tại chương trình.
  • BIDV Pay+ đem đến cho người đến trải nghiệm rút tiền không dùng thẻ tại ATM BIDV và thanh toán bằng mã QR nhanh chóng, thuận tiện.
  • Triển khai phương thức xác thực Smart OTP tích hợp trên ứng dụng BIDV SmartBanking dễ dàng thao tác và bảo mật an toàn.

Để phát triển “con tàu” ngày một vững chắc và hưng thịnh hơn, BIDV đang nỗ lực tìm kiếm những nhân tài, những mảnh ghép quan trọng để cùng đồng hành trong những chuyến đi dài, cùng đương đầu với nhiều thử thách và cùng cập bến tại “Bến thành công”.

Bạn đã sẵn sàng trở thành một trong những người “Thủy thủ đoàn” tài năng của BIDV?

Cùng khám phá ngay những vị trí hấp dẫn không thể bỏ lỡ:

BIDV chào đón bạn đến với một môi trường làm việc hội tụ:

  • Những con người thông minh, năng động và sáng tạo nhất;
  • Ban lãnh đạo tài tình luôn thể hiện đúng với 2 chữ “Tâm và Tầm”.

Bạn đã tích đủ đam mê và nhiệt huyết? BIDV sẵn sàng trao cho bạn chiếc chìa khóa mở lối thành công, chỉ cần bạn dám đương đầu.

Bắt lấy cơ hội trải nghiệm “Nơi làm việc tốt nhất Việt Nam” do Anphabe bình chọn năm 2022 và khám phá thêm nhiều điều thú vị từ BIDV ngay hôm nay. 

Trở thành những “Anh hùng Axon” – mang đến sự an toàn cho cộng đồng

Bắt đầu với một garage nhỏ và mong muốn biến thế giới thành một nơi an toàn hơn, AXON được hình thành và phát triển trở thành một công ty công nghệ mở rộng, cung cấp mạng lưới thiết bị và ứng dụng đáng tin cậy nhất về an toàn công cộng.

TRỞ THÀNH NHỮNG “ANH HÙNG AXON” - MANG ĐẾN SỰ AN TOÀN CHO CỘNG ĐỒNG

An toàn cộng đồng – Sứ mệnh đặc biệt của những anh hùng AXON

Thành lập từ năm 1991 tại Scottsdale, Hoa Kỳ, AXON là tập đoàn tiên phong trong lĩnh vực sản xuất, phát triển các thiết bị thông minh cho các cơ quan thực thi pháp luật trên thế giới nhằm giúp cộng đồng có cuộc sống an toàn và tốt đẹp hơn. Vào năm 2017, AXON được thành lập tại Việt Nam đóng vai trò là trung tâm nghiên cứu và phát triển trọng điểm của tập đoàn.

Với hơn 26 năm phát triển công nghệ tiên tiến, AXON là nhà lãnh đạo toàn cầu của các công nghệ an toàn công cộng được kết nối nhằm bảo vệ cuộc sống, bảo vệ sự thật, minh bạch và trách nhiệm. Nhiệm vụ của AXON từ lúc thành lập đến nay đều hướng đến việc hạn chế sử dụng súng đạn, giảm xung đột xã hội và đảm bảo hệ thống tư pháp hình sự được công bằng và hiệu quả.

Các sản phẩm của Axon độc đáo và đa dạng, bao gồm súng bắn điện Taser, body camera, phần mềm quản lý bằng chứng kỹ thuật số (Digital Evidence Management System) dành cho cảnh sát và cơ quan hành pháp. Ngày nay, các thiết bị của AXON đã được sử dụng bởi 18.000 cơ quan tại hơn 100 quốc gia trên thế giới.

TRỞ THÀNH NHỮNG “ANH HÙNG AXON” - MANG ĐẾN SỰ AN TOÀN CHO CỘNG ĐỒNG

Thay đổi an toàn cộng đồng với công nghệ

Đam mê sử dụng công nghệ cao và mong muốn cung cấp các sản phẩm tiên tiến để cải thiện việc thực thi Pháp luật, AXON luôn nỗ lực để làm cho viên đạn trở nên lỗi thời và thay thế tất cả súng ngắn của cảnh sát bằng các thiết bị điện tử. Ngoài ra, AXON còn phát triển và sản xuất máy ảnh trong xe hơi và máy ảnh đeo trên cơ thể để bảo vệ sự thật bằng cách ghi lại cảnh đó, mã hóa và thủy ấn video và gửi tất cả dữ liệu lên kho lưu trữ trong phần mềm riêng biệt, cho phép cảnh sát, công tố viên, bảo vệ luật sư được sử dụng với mục đích chính nghĩa.

Với niềm tin về sự phát triển công nghệ AI tại Việt Nam, AXON Vietnam được thành lập, và là nơi giải quyết những thách thức lớn nhất của AI trong không gian an toàn công cộng. Với những sản phẩm công nghệ thông minh, tiên tiến, các sĩ quan, cảnh sát sẽ tiết kiệm được thời gian trong việc giải quyết từng vấn đề xảy ra, tạo hiệu quả cho mục tiêu bảo vệ an toàn công cộng. 

Đội ngũ công nghệ xuất chúng đã tạo ra những sản phẩm chất lượng, bao gồm: software engineer, cloud services, hardware engineering, mobile services và nền tảng camera platform.

Chính vì sứ mệnh đặc biệt, đội ngũ phát triển tại Axon luôn tìm kiếm những cá nhân tài năng để cùng tiếp bước, cùng bảo vệ an toàn cộng đồng của Việt Nam và khắp nơi trên thế giới.

AXON đang mở ra cơ hội với hàng loạt vị trí hấp dẫn:

Và nếu bạn có mong muốn được trở thành 1 trong những “người hùng” bảo vệ sự an toàn cho cộng đồng, đừng ngại khám phá những điều thú vị đến từ AXON. Tại nơi đây, bạn được trải nghiệm những điều tuyệt vời nhất.

TRỞ THÀNH NHỮNG “ANH HÙNG AXON” - MANG ĐẾN SỰ AN TOÀN CHO CỘNG ĐỒNG

 

Giải mã sức hút, bật mí bí kíp giữ chân nhân tài

Để thực hiện sứ mệnh bảo vệ an toàn cho người dân và tạo nên những sản phẩm tốt nhất để bảo vệ cuộc sống, điều AXON đã làm được chính là níu giữ nhân tài – những người anh hùng góp phần tạo nên những điều kì diệu. Từ việc coi trọng giá trị con người và lấy sự an toàn của con người làm tâm điểm cho sự phát triển của tập đoàn, mỗi cá nhân tại AXON luôn nhận được những điều xứng đáng nhất, bí quyết tạo nên sự gắn bó của những người hùng dũng cảm và AXON:

  • Văn hóa và môi trường làm việc 

Văn hóa cốt lõi của Axon phụ thuộc vào việc hợp tác để liên tục phát triển và cải tiến các công nghệ và sản phẩm hiện tại. Riêng tại AXON, dù mục tiêu của bạn là gì, bạn sẽ có quyền tự do thực hiện các dự án mà bạn quan tâm và nhận được sự hỗ trợ của nhóm những người có kinh nghiệm, kĩ năng, dự đoán sẽ đem đến cho bạn nhiều thách thức theo những cách mới. 

  • Không gian làm việc đầy kích thích và đặc quyền khó cưỡng

Văn phòng tại Thành phố Hồ Chí Minh của Axon được lấy ý tưởng như một con tàu vũ trụ với các tính năng hiện đại, thông minh. Với mong muốn nơi làm việc không chỉ là văn phòng thuần túy mà còn phải là một không gian sáng tạo, truyền cảm hứng và đem đến những trải nghiệm mới mẻ cho đội ngũ nhân viên, văn phòng làm việc tại AXON đã “hóa thân” trong hình dạng phi thuyền và đem đến cảm giác mỗi ngày làm việc là một chuyến du hành thú vị, đầy cảm hứng.

Không chỉ như vậy, các “anh hùng” AXON còn được hưởng các đặc quyền đáng kinh ngạc, bao gồm:

  • Mức lương cạnh tranh xứng với năng lực;
  • Ăn trưa miễn phí, tập thể dục, cho thuê điện thoại và chỗ đỗ xe;
  • Hoạt động nhóm vui chơi và đi chơi giải tỏa căng thẳng, tiếp thêm sức mạnh;
  • Giờ làm việc linh hoạt;
  • Cơ hội được đào tạo, onsite tại Hoa Kỳ và cùng các sĩ quan cảnh sát Hoa Kỳ tìm kiếm nguồn cảm hứng để tạo ra những sản phẩm hữu ích;
  • Được tham gia các sự kiện công nghệ lớn do AXON tổ chức, trau dồi thêm nhiều kiến thức bổ ích.

Những bí mật tại AXON đã khiến bạn bị cuốn hút?

Bạn có mong muốn được trở thành một phần của AXON ngay hôm nay?

AXON đã mở cơ hội, bạn ngại gì không nhanh tay chớp lấy.

Recruitment Challenge: “Em có xứng đáng với mức lương ấy không?”

Những thách thức từ nhà tuyển dụng – Recruitment Challenge luôn được đặt ra trong mọi trường hợp. Liệu bạn có thật sự nắm thế thượng phong để giải quyết tốt thách thức mà nhà tuyển dụng đặt ra? Nếu được hỏi:

 “Tại sao em nghĩ mình xứng đáng nhận mức lương ấy?”, đâu là cách một ứng viên tiềm năng về nhân sự sẽ đáp trả? 

Có thể bạn quá sốc với Recruitment Challenge, bạn đập bàn và bỏ về chăng? Không, không, cách này chỉ phù hợp khi nhà tuyển dụng đặt câu hỏi một cách thiếu tế nhị. Tuy nhiên, lại phát ngôn đầy khéo léo, không thẳng thắn, kiểu sốc đối phương nhưng chỉ bằng những ngôn từ tinh tế. Vì vậy, bạn nên dùng sự thông minh để “đối đáp” lại đòn phủ đầu của họ.

Thế cười trừ, tỏ vẻ ngại ngùng và cho qua thì sao? Cách này lại càng không. Bạn không nên thể hiện mình là người thiếu tự tin. Cuộc phỏng vấn cần sự tương tác của bạn và cả nhà tuyển dụng thì nó mới thú vị.

Vậy làm thế nào cho ngầu đây? Cùng TopDev thiết lập kế hoạch “phản công” nhà tuyển dụng nào.

Nhận thức tổng quát vấn đề là bước đi đầu tiên

Trước hết, bạn cần nhận thức rõ về vấn đề từ đó xác định trọng tâm của vấn đề từ thách thức được nhà tuyển dụng đặt ra chính là lương. Sự am hiểu chiếm 70% khả năng thành công của màn lật bài ngửa. Vì thế, hãy cố gắng nắm bắt trọng tâm một cách tốt nhất có thể.

thách thức

Vậy quỹ lương của một công việc bao gồm những gì?

Theo trải nghiệm cá nhân, nhiều ứng viên đi phỏng vấn tập trung vào hai giá trị. Đó lương net/gross và phúc lợi về bảo hiểm. Để giải quyết thành công thách thức, bạn cần nắm rõ 2 phần quan trọng: phần cứng và phần mềm.

Thứ nhất, phần cứng bao gồm lương cứng, phụ cấp ăn trưa, bảo hiểm, thưởng ngày lễ… Đây là những phần mà nếu không có gì phát sinh, bạn chắc chắn sẽ nhận được. Điều này cũng không quá tệ. Tuy nhiên, để đồng hành lâu dài, việc lựa chọn một công ty có mức lương tốt và xứng đáng với năng lực là vẫn là ưu tiên

Thứ hai, phần mềm bao gồm các giá trị về thưởng KPI, các lợi ích kèm theo,… Và đây là những phần thưởng bạn sẽ được nhận nếu đạt một điều kiện nhất định nào đó. Các yếu tố thuộc phần mềm tạo ra sự khác biệt lớn giữa công ty. Phần đông công ty đề cao giá trị của động lực nên luôn tạo ra những phần thưởng nhằm kích thích nhân viên của mình tự phát triển năng lực của bản thân thông qua những nỗ lực. Cũng chính từ đây, hàng loạt những câu chuyện về công ty tốt, công ty xấu ra đời.

Trải nghiệm công cụ tính lương gross to net chuẩn tại TopDev

Quan tâm đến những yếu tố phụ thuộc vấn đề trong  Recruitment Challenge

Mỗi khối ngành khác nhau sẽ có một mức lương nhất định. Cùng có kinh nghiệm 3 năm trong ngành nhưng người làm về IT lại sở hữu mức lương khác làm hành chính nhân sự.

  Tuyển tập “cheatsheet” bộ câu hỏi cho anh em developer trước buổi phỏng vấn

thách thức

Kỹ năng chuyên môn và kinh nghiệm làm việc rất quan trọng vì nó thể hiện trình độ của bạn. Càng có nhiều năm kinh nghiệm, bạn dễ dàng nhận được mức lương với một vị trí cao hơn và đôi khi mức lương cao hay thấp còn phụ thuộc vào tiềm năng phát triển của bạn nữa.

Không những thế, khả năng làm việc thực tế là một yếu tố bạn cần phải trau dồi vì nó thể hiện bản lĩnh của bạn trong việc giải quyết, thực hiện các vấn đề từ thực tế. Tập trau dồi năng lực để có thể tự tin deal một mức lương xứng đáng với bản thân.

So sánh năng lực với khung quy chiếu tiêu chuẩn – Xác lập mức lương mong muốn

Chắc chắn rằng, sự phụ ứng với các tiêu chuẩn giúp xác lập mức lương rất quan trọng. Nói cách khác, chính là xem xét các tiêu chuẩn về giá trị bản thân, mức độ tham vọng, khối lượng công việc và  lợi ích thực ngoài tiền bạc để bạn tự đánh giá bản thân mình xứng đáng với mức lương bao nhiêu. Recruitment Challenge không khó để thực hiện, quan trọng là bạn có tìm ra được sự xác lập hay không.

Tiếp đến là mức độ tham vọng. Tham vọng ở đây không phải theo hướng tiêu cực, chạy theo các đòi hỏi xa hoa mà đơn giản, nó là phần lương công thêm vì những dự định mà bạn tin rằng mình sẽ làm được trong tương lai gần. Phần này sẽ chiếm khoảng 8-10% giá trị lương của bản thân.

Về khối lượng công việc thực tế: Mỗi công ty đều có những đặc thù công việc riêng nên những yêu cầu có thể cũng khác biệt nhau. Công ty này cần những ứng viên có trình độ chuyên môn cao; công ty khác lại chỉ yêu cầu nhân sự đáp ứng một số tiêu chí đơn giản. 

Các lợi ích ngoài tiền bạc: bao gồm các mối quan hệ, khả năng phát triển, độ tử tế của đồng nghiệp, mức độ yêu thích với vị trí công việc,… Tương tự như khối lượng công việc, bạn không nên quá chú tâm vào tiền bạc. Nếu đi làm mà chỉ tập trung vào nó thì bạn không bao giờ tiến bộ toàn diện được. 

Lời kết

Tóm lại, để chiến thắng trong Recruitment Challenge, bạn cần “biết mình, biết ta”. Việc xác định đúng trọng tâm vấn đề, bạn đã biết mình; hiểu được tầm quan trọng của các yếu tố phụ thuộc, tức là biết ta; so sánh và cải thiện bản thân sau khi so sánh với khung quy chiếu chính là việc đánh giá thời cơ, biết tiến, biết lùi đúng mức. Tất cả chúng sẽ giúp bạn trả lời tốt câu hỏi bạn có xứng đáng với mức lương mà mình kỳ vọng.

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

Xem thêm Top Việc làm IT cho lập trình viên trên TopDev

ORM và SQLAlchemy — ‘chiếc đũa thần’ trong quản trị cơ sở dữ liệu

Tác giả: Ngoc Nguyen

Bạn là một backend developer hàng ngày phải làm việc với những cơ sở dữ liệu (database) đồ sộ, cồng kềnh? Bạn đã quá mệt mỏi với việc phải viết những câu lệnh SQL phức tạp, dài dòng mỗi lần muốn thao tác với database? Để giải quyết những khó khăn và bất tiện khi làm việc với database, khái niệm ORM đã ra đời. Trong bài viết này, hãy cùng hai Software Engineer Intern – Bill và Phi — khám phá xem ORM là gì và tìm hiểu về cách sử dụng SQLAlchemy, một ORM cho ngôn ngữ Python, để hiểu tại sao chúng lại phổ biến như vậy nhé!

Image for post

Chú ý: bởi bài viết này chỉ tập trung vào các hệ quản trị cơ sở dữ liệu quan hệ (Relational Database Management System, gọi tắt là RDBMS), ví dụ như MySQL, PostgreSQL, SQLite,… nên trong khuôn khổ bài viết, thuật ngữ ‘database’ sẽ được hiểu là các ‘relational database’.

Ngày xửa ngày xưa, …

Xưa kia, khi loài người còn chưa biết đến khái niệm ORM, mỗi khi các lập trình viên muốn tương tác với relational database (tạo, đọc, sửa, xoá dữ liệu trong bảng), họ sẽ phải viết câu lệnh SQL thuần và execute nó ở trong chương trình sử dụng connector. Tưởng tượng bạn có một bảng Person với hai cột name và age trong database và bạn muốn thêm một dòng dữ liệu (record) vào đó, bạn sẽ phải làm như sau (trong các ví dụ ở bài viết này, chúng mình sẽ sử dụng ngôn ngữ lập trình Python):

Image for post

Như bạn thấy, bạn sẽ phải viết câu lệnh SQL thuần dưới dạng một string rồi dùng connector để execute nó. Điều này đôi khi gây phiền toái, bởi những câu lệnh SQL thuần thường dài dòng, khó thay đổi, và đôi khi không tối ưu. Ngoài ra, việc cập nhật, thay đổi cơ sở dữ liệu không hề dễ dàng. Ví như mỗi lần thay đổi cấu trúc bảng, nếu không có ORM, chúng ta sẽ phải truy cập vào database server và thay đổi bằng câu lệnh SQL, dẫn tới quy trình làm việc khó khăn do phải làm việc ở hai môi trường — application code và database server. Trong khi đó, nếu sử dụng ORM, chúng ta có thể thay đổi bảng rồi thực hiện migrate ở ngay trong application code, tránh phải làm việc trong database server (điều này chúng ta sẽ tìm hiểu kĩ hơn ở phần 2 của bài viết với những ví dụ cụ thể sử dụng SQLAlchemy, một ORM hết sức phổ biến hiện nay).

Từ đó, ORM xuất hiện như một hướng tiếp cận khác để giải quyết vấn đề quản trị cơ sở dữ liệu một cách hiệu quả hơn.

  JOINS và những điều cần biết trong cơ sở dữ liệu

  Cách Import dữ liệu từ các bảng khác nhau trong MySQL Workbench

ORM

Image for post

ORM là gì?

ORM là viết tắt của cụm từ Object Relational Mapping. Hiểu một cách đơn giản, ORM là một kỹ thuật trong lập trình giúp biểu diễn các dòng dữ liệu (record) trong cơ sở dữ liệu bằng các đối tượng, vật thể (object) tương ứng trong ngôn ngữ lập trình. Nhờ đó, ta có thể tương tác, xử lí những data record tương tự như những object. ORM như một ‘cây đũa thần’ có thể hoá phép các record trong database thành những object, giúp cho sự tương tác của người dùng với data record đơn giản như với các object của ngôn ngữ lập trình.

Image for post

Nguồn: fullstackpython.com

Ví dụ như trong hình trên, dòng dữ liệu với ID bằng 1 được biểu diễn dưới dạng một Person object với 3 thuộc tính (properties) sau: first_name là John, last_name là Connor và phone_number là +16105551234.

Có những kiểu ORM nào?

Có hai mô hình thiết kế (design pattern) ORM được biết đến và sử dụng rộng rãi: Active Record và Data Mapper.

  • Active Record

Active Record là mô hình thiết kế ORM mà trong đó mỗi bảng trong cơ sở dữ liệu (table in database) được gói gọn trong một model. Do vậy, mỗi object thuộc model sẽ được gắn với một dòng (record) trong bảng. Với Active Record, ở trong model, người dùng sẽ không cần phải ghi rõ những properties của model đó hay sự liên hệ của những properties ấy đến database, mà object sẽ tự động biết được chúng bằng cách nhìn vào database schema. Ngoài ra, các ORM sử dụng Active Record thường có sẵn những CRUD (Create — Read — Update — Delete) method như save()create(),… thuận tiện cho việc tạo object.

Những ORM nổi tiếng sử dụng Active Record bao gồm Eloquent, Ruby on Rails, Django’s ORM hay Yii.

Trở lại với ví dụ về bảng Person bao gồm 3 cột first_name, last_name và phone_number như trên, khi bạn sử dụng Django’s ORM, một ORM với mô hình Active Record, việc khai báo một model sẽ diễn ra như sau:

Image for post

Với mô hình Active Record, model nhất định phải tuân theo cấu trúc bảng, ví dụ như model Person ở đây sẽ phải có 3 cột first_name, last_name và phone_number như ở trong bảng Person.

  • Data Mapper

Khác với mô hình Active Record, ở trong các ORM sử dụng mô hình thiết kế Data Mapper, thay vì kết nối trực tiếp mỗi object với một record trong database, ORM sẽ đóng vai trò như một lớp (layer) có chức năng tách biệt cũng như vận chuyển dữ liệu hai chiều (bidirectional transfers of data) giữa cơ sở dữ liệu và ứng dụng (application). Điều này nghĩa là các objects ở application sẽ không có thông tin gì về database hay những thuộc tính của các models. Các object được tạo ra sẽ không biết đến sự tồn tại của database và ngược lại.

Những ORM nổi tiếng sử dụng Mapper có thể kể đến Doctrine, Hibernate và SQLAlchemy.

Sự khác biệt lớn nhất giữa hai mô hình thiết kế trên chính là trong khi mô hình Active Record hướng tới mục đích xoá đi khoảng cách giữa application và database thì mô hình Data Mapper có vai trò giúp người sử dụng phân tách rõ ràng hơn hai bộ phận trên.

Với ví dụ về bảng Person kể trên, việc khai báo model với SQLAlchemy, một Data Mapper ORM, sẽ được thực hiện như sau:

Image for post

Như các bạn thấy, với các Data Mapper ORMs, model có thể thừa hoặc thiếu một số column so với cấu trúc bảng, ở đây là thiếu đi cột phone_number và có thêm cột address.

ORM có những ưu điểm và nhược điểm gì?

Ưu điểm

  • Ngắn gọn. ORM cho phép người dùng sử dụng ngôn ngữ lập trình mà họ muốn với cú pháp ngắn gọn và đơn giản hơn so với việc sử dụng câu lệnh SQL, qua đó giảm thiểu lượng code phải viết.
  • Tối ưu. ORM cũng cho phép người dùng tận dụng sự tối ưu của phương pháp lập trình hướng đối tượng (Object — Oriented Programming) như kế thừa dữ liệu, đóng gói, khái quát hoá thông qua việc biểu diễn các record trong database dưới dạng các object.
  • Linh hoạt. Có thể chuyển đổi linh hoạt giữa các hệ quản trị cơ sở dữ liệu khác nhau (MySQL, Sqlite3, PostgreSQL,…) cũng như không cần phải biết quá nhiều về các hệ thống này cũng như ngôn ngữ SQL.

Nhược điểm

  • Thời gian. Bởi ORM là framework, người dùng sẽ phải mất thời gian học và làm quen với cách sử dụng các framework này.
  • Sự chủ động. Khi sử dụng ORM, người dùng sẽ có ít sự chủ động và kiểm soát hơn đối với database.

Ở phần hai của bài viết, hãy cùng tìm hiểu cách sử dụng SQLAlchemy, một ORM rất phổ biến trong ngôn ngữ Python, để xem tại sao ORM có thể tiết kiệm cho bạn nhiều thời gian và công sức nhé!

SQLAlchemy

SQLAlchemy là gì?

SQLAlchemy là một bộ công cụ SQL mã nguồn mở và ORM sử dụng trong ngôn ngữ lập trình Python, giúp hỗ trợ việc quản lý và thao tác với cơ sở dữ liệu. SQLAlchemy cung cấp cho người dùng một ORM sử dụng mô hình thiết kế Data Mapper.

Được ra lò vào năm 2006, SQLAlchemy nhanh chóng khẳng định vị thế của mình trong cộng đồng lập trình viên Python, được sử dụng rất rộng rãi bên cạnh Django’s ORM. SQLAlchemy được sử dụng phổ biến ở cả những “ông lớn” trong ngành công nghệ như Yelp!, Reddit, Dropbox, …

Ví dụ về việc sử dụng SQLAlchemy

Kết nối với database

Image for post

Bạn có thể thay parameter tuỳ thuộc vào địa chỉ database của bạn, trong trường hợp này chúng ta sử dụng in-memory sqlite.

  • Khai báo mapping và tạo schema

ORM truyền thống gồm hai bước: mô tả database chúng ta phải xử lý và khai báo class mà sẽ được đối chiếu với các bảng. SQLAlchemy gộp hai bước này vào một, sử dụng Declarative Base.

Image for post

  • Query

Trước khi thực hiện các tác vụ như query hay thay đổi database, chúng ta cần kết nối với database trong một session.

Image for post

Giả sử chúng ta muốn tìm tất cả các Employee có tên là Alice, chúng ta có thấy lấy kết quả rất đơn giản bằng:

Image for post

Nếu chúng ta có quá nhiều người tên là Alice, và muốn giới hạn số lượng lấy ra và xếp theo id

Image for post

  • Thêm và update

Chúng ta có thể dễ dàng thêm và update một (hoặc nhiều) hàng trong database bằng qua thao tác với các instance của class Employee

Image for post

Giả sử chúng ta muốn thay đổi tuổi của Bob

Image for post

Và đừng quên commit sau khi hoàn thành xong thao tác bằng

Image for post

  • Rollback

SQLAlchemy cho phép chúng ta có thể rollback mỗi khi mắc sai lầm.

Giả sử chúng ta thêm nhầm một Employee

Image for post

Chúng ta có thể rollback transaction vừa rồi với câu lệnh, bạn có thể đoán được đấy:

Image for post

Lợi ích về việc sử dụng SQLAlchemy

Bên cạnh thừa hưởng các tính năng của một ORM như liệt kê bên trên, SQLAlchemy còn cung cấp cho người dùng rất nhiều chức năng nổi trội khác.

Thay đổi schema

Bạn đã bao giờ nhận ra mình cần thay đổi schema trong quá trình build chưa? Nếu như sử dụng câu lệnh thuần SQL thông thường, bạn phải tự mình cập nhật trong database server ít nhất một bảng. SQLAlchemy giúp bạn đồng bộ hoá model và schema trong khi bạn chỉ làm việc ở môi trường code. Bằng cách sử dụng add-on alembic của SQLAlchemy, bạn có thể thay đổi schema trong code rồi chạy câu lệnh sau trong terminal:

Image for post

Và kaboom, schema và model của bạn đã được đồng bộ. Quá đơn giản phải không nào?

Công cụ hữu ích trong giai đoạn test

Với bất kì một sản phẩm nào, kiểm thử (test) là giai đoạn hết sức quan trọng. Trong việc test ứng dụng có sử dụng database, người dùng cần đảm bảo mở kết nối trước khi thao tác với database, và ngắt kết nối sau khi thao tác, những điều này phải thật đảm bảo. Điều này không chỉ gây ra lặp code, mà còn gây ra nhiều rủi ro, ví như bạn quên đóng kết nối sau khi thao tác.

SQLAlchemy Core có hàm connect, dùng song song với engine giúp bạn duy trì kết nối với database. Sử dụng connection hợp lý trong việc test đảm bảo rằng trong chỉ có một kết nối trong suốt quá trình test.

Cách tổ chức mối quan hệ giữa các bảng

Một điều tuyệt vời khi làm việc với SQLAlchemy là cách tổ chức mối quan hệ giữa các bảng. Nó giúp người dùng xác định rõ ràng mối quan hệ trong code, được phản ánh cụ thể hơn qua lập trình hướng đối tượng. Các đối tượng này còn có thể liên kết, hay được bọc trong nhau.

Lazy Loading còn giúp người dùng xác định được cách mình muốn lấy đối tượng từ database. Người dùng có thể chọn thông tin từ một bảng (lazy= ‘select’), thông tin liên kết với bảng khác (lazy = ‘joined’), hoặc lấy object để có thể tiếp tục truy sau này (lazy = ‘dynamic’).

Tài liệu chi tiết, cụ thể và dễ theo

Trước khi quyết định có nên sử dụng một thư viện cho ứng dụng của mình, một số câu hỏi được đặt ra là: “Nó có dễ học không?”, “Cộng đồng người dùng có lớn không?”, “tài liệu có chi tiết không?”. Và câu trả lời cho tất cả các câu hỏi trên là có.

Tài liệu của SQLAlchemy rất chi tiết và xuyên suốt. Ngay cả khi bạn là người mới viết Python, bộ tài liệu còn có ví dụ từ giúp bạn đi từng bước một để làm quen với thư viện cho đến sử dụng những tính năng cao cấp nhất của thư viện.

Trên cộng đồng StackOverflow, có hẳn hơn 16000 câu hỏi có tag SQLAlchemy. Vì thế, bạn cũng không sợ mình sẽ gặp vấn đề chưa được giải quyết khi mới nhúng tay vào thư viện này. Còn chần chờ gì mà không đi một vòng qua tutorials của thư viện nhỉ?

SQLAlchemy ở Got It

SQLAlchemy được sử dụng rất rộng rãi ở team backend của Got It. Chẳng những thế mà trước khi một thực tập viên được phép làm việc trên mã nguồn của công ty, bạn ấy phải học một khóa học về SQLAlchemy để có thể sử dụng nhuần nhuyễn thư viện này trong công việc.

Qua bài viết này, hi vọng các bạn đã biết thêm những điều mới về ORM cũng như SQLAlchemy, qua đó có thể áp dụng vào công việc của mình!

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

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

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

Sinh viên Mobile nên trang bị những gì, vì sao nên chọn Mobile App?

Lập trình di động (Mobile developer) và lập trình web (web developer) hiện đang là 2 mảng phổ biến với nhu cầu tuyển dụng cao nhất trong lĩnh vực lập trình. Theo báo cáo từ TopDev, mức lương trung bình của Mobile Developer là $1,178, cao hơn so với Backend và Frontend Developer ($901 & $897). Thực tế thì thị trường Mobile App đang diễn ra thế nào?

Cùng TopDev trò chuyện với anh Trần Duy Thanh – giảng viên, phó trưởng bộ môn khoa Hệ thống thông tin Đại học Kinh tế – Luật để nghe câu chuyện nghề nghiệp của anh và những góc nhìn từ giảng đường đến thực tế.

Về khách mời Trần Duy Thanh:

  • Hiện tại đang là giảng viên công tác tại trường Đại học Kinh tế – Luật, Đại học Quốc gia TP. HCM.
  • Là phó trưởng bộ môn khoa Hệ thống thông tin, tham gia giảng dạy từ năm 2009 tới giờ và hiện đã công tác tại trường Kinh tế – Luật khoảng 4 năm.
  • Anh vừa giảng dạy vừa tham gia quản lý dự án cũng như tham gia một số startup, các phần mềm liên quan đến AI Machine Learning chạy trên robo, cụ thể là chuyên về lĩnh vực giáo dục.

Vì sao anh lựa chọn mảng lập trình mobile app, đặc biệt là Android?

Năm 2008 Google bắt đầu thông báo đưa ra các framework liên quan đến Android để phát triển, ngay tại thời điểm đó mình biết là thị trường thế giới cũng đang phôi thai và chắc chắn trong tương lai nó sẽ bùng nổ. Tất cả các ngành nghề đều liên quan đến lập trình cả và mỗi người chúng ta đều có một cái smartphone, đi đâu cũng dùng smartphone để làm việc. Ngoài tính năng nghe, gọi, nhắn tin trên điện thoại còn có chức năng app để tương tác phần mềm cũng như xem các báo cáo, đặc biệt là những leader dù đi công tác người ta cũng có thể dùng điện thoại để tương tác rất dễ dàng.

Từ các thống kê, nhu cầu sử dụng rất lớn nên mình thấy rằng các trường đại học nên phát triển các chương trình đào tạo liên quan đến mobile app và bản thân các lập trình viên đó nếu đã có kiến thức cũng có thể tự nghiên cứu được mobile app, hoặc nếu chỉ đang là sinh viên (chưa là kỹ sư) cũng nên cố gắng tìm những trung tâm hay trường học hoặc những “sư phụ” nào chuyên về mobile app để mình có thể học, trao đổi thêm kiến thức và có nền tảng vững chắc về mobile app sau này.

  5 tips cải tiến chất lượng phát triển Mobile App

  8 câu hỏi phỏng vấn dành cho các lập trình viên Mobile app

Anh hãy chia sẻ thêm con đường nghiên cứu, những kiến thức mà anh đã trau dồi để đến được level như hiện tại?

Năm 2001 là năm đầu tiên mình học về lập trình, lúc đó không có máy tính. Mình mới ngộ ra một điều là để muốn học cho giỏi, trước tiên chúng ta phải “cày” cho nhiều, ngoài những kiến thức cơ bản trên trường chúng ta được học, mình còn học được từ đồng nghiệp, từ bạn bè và các trang mạng cũng được.

Nhưng học là một chuyện, chúng ta phải dấn thân vào, phải “cày bừa” nó, làm thật nhiều dự án. Trong quá trình đi học, mình luôn cố gắng cày bừa rất là nhiều môn, học từ các nhóm chứ không bỏ tiền ra học thêm như bây giờ. Khi mình học nhiều, làm nhiều đồ án như vậy thì thầy cô sẽ để ý đến, cụ thể mình lọt vào mắt xanh của thầy mình, mình có kiến thức môn học để áp dụng vào dự án. Ngoài ra các thầy sẽ trực tiếp gửi mình đi thực tập ở các công ty.

Mình rất muốn đi dạy, ngày xưa nhà rất nghèo nên chỉ muốn đi dạy thôi nhưng mà không được. Mãi đến khi đi làm được 5 năm thì nhận được lời mời từ thầy của mình và mình đồng ý ngay lập tức. Trong quá trình đi dạy đó mình mới nhận ra là kiến thức khi đi làm đó cũng chưa đủ, vì nó chỉ rèn luyện mình thành kỹ sư lành nghề, mình chưa thật sự hiểu sâu hiểu rộng được, nên khi đi dạy mình đối mặt với áp lực đó là tất cả công nghệ liên quan đến chương trình đào tạo, liên quan đến xu thế công nghệ của công ty và trên thế giới mình bắt buộc phải nghiên cứu. Lúc đó mình rơi vào trạng thái thiếu kiến thức và phải nghiên cứu rất nhiều.

Năm 2005 ai cũng nhắc đến bộ XML, nhưng bây giờ XML nó lại trở nên phổ biến, sau đó lại có JSON. Đến năm 2008 thì bắt đầu làn sóng về mobile, mobile app phát triển rất mạnh như vũ bão vậy. Mình tự cảm thấy và mình nghĩ phải chọn cái môn gì khó nhất, những ngành nghề gì khó nhất để mình làm. Tại vì những cái gì đơn giản mình làm được thì người khác cũng làm được, như vậy sẽ có tính cạnh tranh cao, do đó mình chọn môn nào khó nhất, đỉnh nhất, rõ ràng là không có ai cạnh tranh với mình và khi đi làm thì các công ty sẽ chọn mình, nhờ đó mình sẽ thành công.

Sinh viên Mobile nên trang bị những gì -1

Sau đó đến những năm vừa rồi, blockchain, AI machine learning bắt đầu um sùm lên và đa phần người ta tuyển dụng về AI. Sắp tới mình nghĩ rằng nó còn liên quan đến cả robot nữa, theo mình thì có thể nghiên cứu về robot trong tương lai. Do đó phải luôn luôn lắng nghe và nắm bắt xu thế công nghệ để hướng theo đó mà phát triển, mình phải luôn luôn đi nhanh nhất. Như trong một nhóm lập trình tầm trung mình phải đứng nhất trong đám lập trình tầm trung đó, trong một nhóm chuyên gia mình phải đứng nhất trong các chuyên gia. Cái đích mình hướng tới như vậy để nó tụt xuống là vừa.

Đường đi là phải nắm bắt công nghệ của các công ty, thế giới cần cái gì để mình nghiên cứu. Dĩ nhiên là khi đi dạy trong các nhà trường đa phần sẽ lạc hậu 4 – 5 năm so với ở ngoài, vì một chương trình đào tạo 4 năm mới xong, sau 4 năm mới đánh giá được, nên phải chấp nhận trong trường thì mình sẽ lạc hậu 4 – 5 năm. Nếu mình lạc hậu vậy thì mình sẽ đi thế nào so với doanh nghiệp, làm sao để sinh viên hiểu được những kiến thức đó nên mình phải dấn thân thôi. Vai trò giảng viên thì phải đi nghiên cứu và đưa công nghệ mới vào nên mình mời rất nhiều chuyên gia công nghệ về cùng giảng dạy, tham gia thảo luận và có những talkshow.

Chương trình học tại UEL nói riêng và bậc đại học nói chung, các bạn có được lựa chọn và được giảng dạy chi tiết về lập trình mobile app không hay chỉ là những kiến thức cơ bản, nền tảng và từ đó các bạn sẽ phải tự lựa chọn hướng đi, tự trau dồi nếu muốn xây dựng được những ứng dụng có thể “thương mại hóa”?

Khoa Hệ thống thông tin của mình có 3 ngành: Hệ thống thông tin Quản lý (MIS – Management Information System), Thương mại điện tử và Kinh doanh số & Trí tuệ nhân tạo. Đặc điểm của trường mình là 50% về kinh tế và 50% về tin học. Trong quá trình giảng dạy thì chương trình sẽ dạy lập trình từ cơ bản đến nâng cao, rõ ràng là sinh viên phải được cung cấp các kiến thức như kỹ thuật lập trình, cơ bản về lập trình web, web nâng cao, xử lý cơ sở dữ liệu như mobile app, phân tích cơ sở dữ liệu AI.

Dĩ nhiên là mỗi trường sẽ có chương trình đào tạo khác nhau, có các mảng khác nhau, mình không thể so sánh các trường với nhau vì mỗi trường lại có một mục tiêu đào tạo khác nhau. Tuy mình chuyên về lập trình nhưng bản thân vẫn học về kinh tế, tức là mình vẫn có bằng đại học quản trị kinh doanh, mình vẫn có bằng về phần mềm là khoa học máy tính, nhưng trong quá trình học mình lại thích về lập trình hơn nên mình rẽ ngang đi theo lập trình.

Cũng may mắn là khi được thầy trưởng khoa mời về giảng dạy, khoa lại kết hợp 50% kinh tế và 50% lập trình thì rõ ràng đúng là thế mạnh của mình. Mình thấy rất hay vì nếu như chỉ biết về kỹ thuật không thì chỉ biết cắm cúi suốt ngày làm code, còn khi mình biết về kinh tế thì ứng dụng công nghệ thông tin vào việc kinh doanh rất là hay. Nếu như mình biết tiếng Việt không, rất giỏi tiếng Việt thì đưa quyển sách y khoa hay triết học đọc vẫn không hiểu. Trong lập trình cũng vậy, mình giỏi lập trình là một việc, chỉ giỏi mỗi lập trình mà không có kiến thức về kế toán, không có kiến thức về y học, ví dụ vậy, nếu mình nắm dự án yêu cầu viết phần mềm chuyên về kế toán, mình hoàn toàn không biết gì về kế toán thì không làm được. Do đó thời đại này đòi hỏi phải liên ngành, nếu như vừa biết kinh tế, vừa biết phần mềm sẽ rất hay. Mình có thể viết các phần mềm liên quan đến kinh tế, mình có thể vừa nói được vừa làm được. Người ta đã từng nói đa phần dân kỹ thuật làm được mà khó nói, suốt ngày chỉ ngồi coding, máy tính chính là người yêu thứ hai của lập trình viên (cười). Kết hợp 50% kinh tế và 50% lập trình sẽ rất hài hòa, mình mạnh cả hai, nhiều người nói mình học cả 2 thì sẽ yếu cái này hoặc yếu cái kia, mà quan điểm mình thì khác.

Các chương trình đào tạo trong khoa đều có đầy đủ những thứ đó. Dĩ nhiên trong 4 năm sinh viên sẽ học rất nhiều môn, có 1 – 2 năm sinh viên học các kiến thức chuyên ngành, lúc đó sẽ được học các kiến thức chuyên sâu kể cả lập trình và kinh tế. Chúng ta hay nghe người ta nói sinh viên ra trường sẽ được đào tạo lại, mình thì mình không đồng ý lắm, nghe nó nặng nề quá. Sinh viên phải “mài đũng quần” trên ghế nhà trường 4 năm thì mới thành thạo được một nghề nhưng chưa chắc đã làm được, do đó các công ty chỉ bổ sung thêm thôi chứ không thể nói là đào tạo được. Công ty sẽ giúp những vấn đề đó, giúp sinh viên thăng hoa hơn, được triển khai những ý tưởng, những kỹ năng của mình.

Anh nhận thấy đặc điểm chung của các bạn sinh viên về việc xác định hướng đi cụ thể cho sự nghiệp của mình như thế nào?

Trong trường mình thì đa phần đầu vào các sinh viên định hình là sẽ đi theo kinh tế, bằng bên trường mình cũng là cử nhân kinh tế, học 50% kinh tế, 50% kỹ thuật nhưng vẫn là cử nhân kinh tế. Xu hướng chọn vào hiện nay các sinh viên chọn cả 3 là thương mại điện tử, hầu như tất cả mọi ngành nghề chúng ta đều liên quan đến thương mại điện tử, rồi hệ thống thông tin quản lý, quản trị doanh nghiệp các loại. Trong năm nay thì khoa cũng đã phát triển Kinh doanh số và Trí tuệ nhân tạo, sắp tới sẽ tuyển sinh. Ngành này rất nặng về kỹ thuật. Kỹ thuật ở đây không phải là nhăn nhó làm thế nào để coding ra một chương trình nào đó mà là làm thế nào để ứng dụng vào. Cụ thể là phải làm thế nào để print code, học về AI xử lý như thế nào và ứng dụng ra sao API phục vụ cho người dùng. Mình có một bài toán, mình tìm những công cụ để giải quyết bài toán đó chứ không phải chỉ chăm chú tìm ra những đoạn code.

Anh có lời khuyên nào dành cho các bạn sinh viên đang muốn theo nhóm ngành này không?

Nếu khuyên là chọn ngành nào thì đó không phải là nhiệm vụ ngay từ đầu lúc tuyển sinh, nhiệm vụ lúc này có phòng truyền thông. Còn khi đã vào học và chọn chuyên ngành, mỗi lớp sẽ có cố vấn học tập, họ sẽ tư vấn cho từng trường hợp cụ thể. Mình phải biết cụ thể “nội công” của em đó như thế nào, mong muốn của em ra sao, em muốn ra trường làm cái gì, chuyên về ngành gì thì lúc đó mình mới khuyên rõ ràng được. Còn bây giờ hỏi anh lời khuyên như thế nào, chọn ra sao thì rất khó, vì theo quan điểm của anh thì như vậy nhưng năng lực và mong muốn của bạn đó khác. Tại vì năng lực là một chuyện còn muốn là một chuyện khác, họ giỏi về lập trình nhưng lại không muốn lập trình thì sao, không phải ai giỏi cái gì cũng đều thích cái đó, giỏi lập trình và muốn làm kinh tế hoàn toàn không sao cả.

Còn lời khuyên thì bây giờ anh chỉ khuyên là nếu sinh viên muốn chọn ngành nghề thì khi chọn rồi nên cố gắng theo tới cùng, điều quan trọng của con người là ý chí muốn vượt qua và đạt được. Đa phần sinh viên rất mơ mộng, học được vài môn 8, 9, 10 đã nghĩ mình giỏi, nhưng khi vào ngành chuyên về kỹ thuật học rất khó. Mới đầu học phải chấp nhận là nó khó, chứ nếu dễ thì ai cũng đã làm được, nếu mình chọn dễ thì cạnh tranh cao, mình sẽ trở thành con tốt thí, nếu làm không được họ sẽ loại mình luôn, sẵn sàng thay thế mình, như trong cây nhị phân chúng ta học là phần tử thế mạng. Nên đôi khi thấy khó mình phải mừng chứ, khó sẽ ít người theo. Đỗ đại học là mình đã trùng rồi, đặc biệt là các sinh viên Đại học Quốc gia đầu vào rất cao, trung bình từ 7, 8 điểm một môn mới đỗ được, sinh viên đã có căn bản rất tốt rồi vào chỉ định hướng là xong thôi. Do đó anh chỉ có thể khuyên là nếu các em đã lựa chọn ngành của mình rồi thì hãy yêu thích nó, có ý chí theo đuổi đến cùng.

Các em sinh viên hay nhìn qua nhìn lại rồi lo lắng “Ô người kia lương cao quá”, “Ô người đó làm này làm kia”, chúng ta phải nhìn vào quá trình người ta làm việc chứ không phải nhìn vào kết quả. Vì bố mẹ đã tốn rất nhiều tiền lo cho mình ăn học thì mình phải học cho ra trò, mục tiêu phải lấy được cái bằng loại ưu càng tốt rồi xuống dần, phải ra được trường chứ. Đừng lấy Bill Gates ra để nói không cần bằng đại học vẫn thành công, nếu như vậy thì cả thế giới đã không cần phải đi học rồi. Anh cũng khuyên thật sự là ở xã hội Việt Nam thì vẫn cần cái bằng đại học trước đã, vì lần đầu tiên đi xin việc giới thiệu em giỏi lắm nhưng em không có bằng thì không được, gặp lần đầu họ phải cần một cái gì để minh chứng chứ đúng không?

Tóm lại là cần phải cố gắng học cho tốt, trong quá trình học biết đâu thầy cô thấy vậy sẽ gửi bạn đi thực tập, bạn thực tập tốt sẽ được công ty giữ lại làm luôn, mình đỡ mất thời gian xin việc.

Vậy theo anh 1 bạn sinh viên học lập trình nên rèn bản thân đủ cứng trước khi ra trường hay nên tìm công việc thực tập từ những năm 3-4? 

Anh dạy một số trường thì trong đó có 1 trường ở Đồng Nai, có một bạn mới sinh viên năm 2 đã đi làm. May mắn là anh sếp đó rất quan tâm đến khả năng làm việc, anh cần người làm được việc. Nhưng đi làm rất xa nha, em này kiên trì đi làm, lương lúc đó chỉ có mấy trăm đô, cứ lặp đi lặp lại như vậy sau 3, 4 năm đi học, vừa ra trường là có kinh nghiệm 2, 3 năm làm việc, tiền lương cao, hiện tại bạn ấy đã mua được một căn nhà bên Gò Vấp. Cho nên anh muốn khuyên là không nhất thiết đợi cho hết 4 năm học rồi mới đi thực tập, đi làm mà bất cứ khi nào có cơ hội hãy cứ đi làm nhưng không được bỏ học nha. Mình không được lấy lí do là em bận làm quá em không có thời gian học. Nếu làm một việc thì quá đơn giản, anh phải vừa học vừa làm chứ, vừa học vừa làm tốt tôi mới định hình anh là một người bản lĩnh, biết sắp xếp công việc của bạn. Nên anh hay khuyên sinh viên em đi làm càng sớm càng tốt mà không được lơ là việc học vì học là việc tối thượng của sinh viên, còn làm thêm là tùy mỗi người chọn cho phù hợp, những người con nhà giàu sẽ có cơ hội hơn.

Anh hay nói với sinh viên là, 2 sinh viên giỏi giống nhau, tính cách giống nhau, ý chí giống nhau nhưng một người con nhà giàu, một người con nhà nghèo thì chắc chắn con nhà giàu sẽ học tốt hơn vì họ có điều kiện hơn. Vậy nếu em con nhà nghèo không có điều kiện thì thay vì mình có 4 tiếng học hãy học 8 tiếng, người ta ngủ 10 tiếng thì em ngủ 2 tiếng thôi, đi học và làm nhiều thứ vào để có kinh nghiệm. Về việc có nên để “cứng cáp” hay là không, theo anh thì đối với mỗi trường đại học, sau khi sinh viên học đến năm 3 năm 4 là bắt đầu thực tập, tức là ai cũng “cứng” rồi, còn “cứng” như thế nào là tùy vào yêu cầu công việc, mỗi công ty sẽ có đòi hỏi khác nhau.

Về nhu cầu Mobile App và nền tảng của Mobile App

Anh nhận thấy nhu cầu, cơ hội làm việc của Mobile App Dev nói chung và Android Dev nói riêng hiện như thế nào?

Hiện nay tất cả ngành nghề đều liên quan đến tin học, đặc biệt là lĩnh vực mobile app. Mobile app trước kia có 3 ông lớn là iPhone, Android và Windows, nhưng vừa rồi Windows đã “bỏ cuộc chơi” rồi. Theo như thống kê ở thị trường Việt Nam, Mobile App về Android tính đến tháng 6 chiếm khoảng 20%, iOS chiếm khoảng 18%. Độ chênh chỉ khoảng 2% thôi nên cơ hội nghề nghiệp đới với Android và iOS là ngang nhau.

Nhưng theo anh với những tin tức thì android dễ xin việc hơn, vì nó rẻ và các thông tin sử dụng nó rất là nhiều, đặc biệt là Android có thể tương tác trực tiếp phần cứng, có thể gọi điện thoại, nhắn tin,… Còn iOS cũng có thể làm được nhưng khó hơn, các công cụ, thiết bị liên quan đến android cũng rẻ tiền hơn, phần đông chúng ta dễ tiếp cận hơn, vì sinh viên tài chính ít. iOS vẫn tham gia nhưng theo anh nghĩ thì thị phần nó ít hơn một xíu, vì nó khó cả về triển khai phần cứng và giới hạn tài chính. Hầu như các trường học không dám dạy iOS, vì muốn dạy cần phải có tài khoản này tài khoản kia, ít nhất là tài khoản 99 USD/năm, mỗi năm renew một lần, rồi phải sắm máy Mac. Cho nên sử dụng android có vẻ dễ dàng hơn, đó là quan điểm cá nhân của anh thôi. Còn nếu có điều kiện để trang bị thì tốt, tài chính mạnh thì dễ nhưng tài chính eo hẹp trong khi học phí thấp thì cũng không đòi hỏi cao được.

Một sinh viên có kỹ năng thì anh nghĩ sinh viên có khả năng tự học được. Nhà trường đã dạy Android thì sinh viên phải tự mapping qua nghiên cứu iOS chứ, cái gì cũng phải dạy thì bao giờ mới trưởng thành. Các trường đại học thường dạy nền tảng, sinh viên có thể tự bươn chải ra khi có công nghệ mới. Như xây dựng từ gốc thì hầu như gặp giông bão nó không trốc gốc, còn nếu xây từ ngọn thì chỉ cần cơn bão nhẹ đã sụp đổ rồi. Do đó là cơ hội nghề nghiệp của sinh viên android và iOS là ngang nhau, tương đương.

Có vài khái niệm mới cũng đang trở nên phổ biến là Cross Platform. Nếu so sánh với Native App hay Hybrid App thì cả 3 khác nhau như thế nào?

Đó cũng là một số khái niệm khá phổ biến như Native app, Cross Platform, Hybrid App. Mỗi một nền tảng lại có ưu điểm và nhược điểm riêng của nó, tùy vào nhu cầu, khả năng tài chính và kỹ thuật của công ty, người ta sẽ áp dụng cho phù hợp.

Theo kinh nghiệm 20 năm lập trình của anh thì mới bắt đầu học thì học nền tảng quan trọng, cụ thể như một người lập trình viên muốn giỏi trước tiên phải giỏi về kỹ thuật lập trình như C++ chẳng hạn rồi đến cấu trúc dữ liệu giải thuật. Đối với ngành lập trình chỉ cần 2 môn mà giỏi thì anh cam đoan những môn khác không có nghĩa lý gì cả, tại vì có kỹ năng rồi thì những môn khác chỉ là tham chiếu qua và phát triển lên thôi.

Quay lại việc học 3 nền tảng này thì theo anh trước hết nên học về Net app, vì đó chính là cái nền tảng liên quan trực tiếp đến hệ điều hành của nó. Nó sẽ sử dụng hết toàn bộ, khai thác hết toàn bộ tài nguyên hạ tầng trên hệ điều hành đó, bản thân hệ điều hành đó nó xài luôn. Nhưng cái dở là rõ ràng khi nó phân mảnh ra rất nhiều hệ thống, nhiều loại Mobile App, vừa iOS vừa Android, nếu như muốn viết Native app muốn làm 2 app thì em phải viết 2 lần, rất tốn thời gian và chi phí.

Nếu như dùng Cross Platform hay còn gọi Motive Platform, cái quan trọng nhất của nó là tìm ra phím word phù hợp để viết 1 lần mà nó chạy tương thích với nhiều hệ điều hành khác nhau. Bản chất của nó là nó viết ra phần mềm và build ra Native app vậy thì Native app là cái gốc, từ Cross platform cụ thể như Xamarin – một trong những platform rất tốt để viết Motive platform, viết nó ra để build android và build iOS. Dĩ nhiên nó bắt mình tạo máy ảo mình mới build ra được, bản thân cái Cross platform là nó giúp chúng ta build ra nhiều native app cho phù hợp với hệ điều hành đó, cái hay của nó là viết một lần xài nhiều lần nhưng cái dở là nó không tận dụng được hết cơ sở hạ tầng trong hệ điều hành của nó và nguy hiểm nhất là khi gốc bị thay đổi thì Cross platform phải làm lại từ đầu. Đơn cử như Android, version 4 khác, 6.0 khác, 11 khác rõ ràng nếu Cross platform không đổi thì sẽ “chết” ngay, không tương thích.

Còn với Hybrid nó có nhiều khái niệm, mà nhìn chung là nó sự kết hợp của web HTML, CSS… và nhúng vào mobile app để đưa lên chợ ứng dụng. Điểm lợi của nó là cũng viết một lần nhưng dùng nhiều hệ điều hành khác nhau vì nhúng web vào bên trong app, cái dở là nó không mượt bằng Native app và cũng không thể lấy được hết toàn bộ tài nguyên của hệ điều hành đó.

Mỗi nền tảng lại có lợi hại khác nhau nên nếu như phải chọn thì sẽ tùy vào nhu cầu của mình. Nếu chỉ viết android thì viết Native app, còn nếu phải chạy vừa android vừa iOS thì dùng Cross platform.

Sinh viên Mobile nên trang bị những gì -3

Java & Kotlin hiện đang là 2 ngôn ngữ phổ biến nhất. Anh có thể so sánh giữa 2 ngôn ngữ này?

Trước kia Android đa phần dùng Java, sau này Kotlin mới ra đời và được Google mua lại và đã nhúng vào trong hệ thống để lập trình. Theo anh, một ngôn ngữ nào đã là chính thống của nền tảng đó, như Google quá mạnh thì theo anh chúng ta nên viết cả 2. Giống như một “đại ca” nào đó biết nhiều ngón võ công, biết cả của Võ Đan và Thiếu Lâm thì đều tốt, Java và Kollin cũng vậy nên viết cả hai. Nhưng nó cũng có những điểm mạnh và điểm yếu khác nhau,

Điểm mạnh của Kotlin là ra đời sau thì nó sẽ kế thừa lại những cái trước. Java hiện nay thì nó khoảng 20 năm rồi và số lượng thiết bị dùng cho Java rất nhiều, Java có thể già cỗi theo vấn đề thời gian, Kotlin thì nó mới và kế thừa những cái gì hay của Java, những cái gì dở của Java nó sẽ cải tiến. Kotlin có thể viết nhanh hơn, trình dịch nó xây dựng tốt hơn và bảo mật hơn, đặc biệt là nó tương thích với toàn bộ các framework trước đó người ta viết bằng Java, có thể chuyển đổi qua lại, cách viết của Kollin ngắn hơn.

Tuy nhiên ngôn ngữ mới nào nó cũng khó khăn, Java đã 20 năm rồi sinh viên học cách đây 10 năm cũng đã quen rồi hay là 3, 4 năm nay cũng quen rồi nên bây giờ chuyển qua Kollin cũng hơi sốc. Anh khuyên là học tốt Java trước vì Java là cái gốc, nó phổ biến rồi, hệ thống của nó đã ổn định rồi. Những hệ thống nào đã là Java rồi thì cứ làm bình thường, những hệ thống mới nếu chúng ta cảm thấy Kotllin phù hợp thì nên dùng Kotlin vì nó có nhiều ưu điểm mà cũng vì nó mới quá nên trở thành nhược điểm. Kollin mới ra đời mà tâm lý của chúng ta là chống đối lại những cái gì mới đã nhưng chúng ta nên bình tĩnh phán đoán đã, rằng cái mới này nó hay như thế nào.

Do đó mình thấy những cái hay cái dở nhưng mình phải quyết định nên chọn nó vì điểm nào. Nó hay là một chuyện nhưng có phù hợp hay không lại là một chuyện khác.

Học như thế nào là hiệu quả?

Sinh viên Mobile nên trang bị những gì -2

Anh có thể chia sẻ kinh nghiệm, làm thế nào để học và theo đuổi hiệu quả đối với việc lập trình mobile app?

Như anh đã nói “ngành gì cũng phải cày như trâu”, trước khi làm thầy hãy làm thợ trước đã, muốn làm chuyên gia thì phải làm nghiệp dư trước đã. Nói chung là học ngành nghề gì, dù làm bất cứ ngành nghề nào đều phải “cày” đã, đã yêu rồi thì phải yêu cho tới cùng, chung thủy với nó.

Có những người lại chung thủy theo kiểu, em chỉ học cái này thôi không học những cái khác nữa, em chỉ biết Android thôi, em học thật sâu, em học 20 năm về Android là em sẽ giỏi, điều đó là không đúng về quy tắc triết học. Tại sao biển nó rộng? Biển rộng là nhờ nó sâu, biển sâu là nhờ biển rộng, nghĩa là nếu em muốn kiến thức em sâu thì em học cho rộng, nếu em muốn kiến thức em rộng thì em học cho sâu vào. Có nhiều bạn cho rằng chỉ viết android thì sẽ học android cho chuyên sâu vào thế là khi viết phần mềm về chẩn đoán y khoa các bạn không biết, không biết cái gì về phần mềm y khoa thì làm sao viết, không được để xảy ra sai sót về vấn đề bệnh tật đó. Vậy rõ ràng ngoài học chuyên môn của mình, mình còn phải có những môn liên ngành, học cho rộng ra, rộng với nghĩa chuyên gia.

Do đó theo anh học ngoài những môn lập trình trong nhà trường dạy mình phải có trách nhiệm tự lắng nghe, tự đọc báo chí, xem các tin tức về công nghê, đi talkshow như TopDev mình đây có rất nhiều chương trình như Web Summit, Mobile Day chẳng hạn. Chúng ta có thể đi nghe những hội thảo đó để chúng ta nắm bắt công nghệ. Anh khuyên là sinh viên muốn học giỏi thì ngoài những môn mình học trong trường cày đi cày lại và có học nhóm, học nhóm để mình brainstorming với nhau, nói chuyện với nhau trường hợp đó nên làm thế nào, dùng công nghệ gì, trong trường hợp đó dùng kỹ thuật nào là phù hợp và cùng triển khai các dự án thì sẽ tốt hơn. Một điều chắc chắn là phải nghiên cứu công nghệ ở ngoài, nghe và nắm bắt công nghệ chứ. Vì như đã nói thì một chương trình đại học thường học 4 – 5 năm, kết thúc 4 năm mới đánh giá được, lúc đó thì công nghệ nó đã đổi rồi vì trường học thường lạc hậu 4 – 5 năm, đó là một khoảng thời gian phù hợp. Một công ty muốn phát triển một hệ thống cần cả chục năm mới hoàn thiện và ổn định mà.

Anh có thể recommend cho các bạn nguồn tài liệu bổ ích để có thể học thêm kiến thức về mobile app không?

Có rất nhiều tài liệu, tùy vào năng lực của mỗi sinh viên, nếu em giỏi tiếng Anh thì nên đọc tiếng Anh, phải đọc tiếng anh với điều kiện là có nền tảng về tiếng Anh nha. Thường thì các sinh viên ở tỉnh sẽ không có điều kiện để tiếp cận với máy tính và tiếng Anh đâu nên việc đọc rất là khó khăn, vậy thì các em có thể chọn tiếng Việt. Còn đối với người giỏi tiếng Anh thì anh khuyên là nên đọc tiếng Anh luôn để vừa giỏi được kiến thức, vừa nâng cao được tiếng Anh chuyên ngành. Đó là cơ hội vì bây giờ ngoài vấn đề chuyên môn mình phải có tiếng Anh để lương được cao hơn một ít. Bây giờ làm việc đa quốc gia, có công ty nước ngoài mình không biết nói chuyện thế nào rồi trao đổi về chuyên môn bằng tiếng Anh cũng không nói được.

Tài liệu thì trong trường đại học đều có cả, mỗi một chương trình đào tạo đều có nên anh không dám nói là chương trình này hay hơn chương trình kia, theo anh thì cứ lên Google search các tài liệu bản quyền liên quan đến tiếng Anh để chúng ta giải, nó chỉ có mấy chục USD thôi nhưng mà nhiều sinh viên không có tính xa đâu. Cứ kêu sao nó mắc vậy để hack cho rồi. Thế câu hỏi ngược lại là em viết phần mềm ra em có muốn người ta hack không, em hack người ta thì em viết phần mềm em đâu bán được, em viết tài liệu thì người ta cũng hack lại của mình thôi nên là cố gắng bỏ tiền ra mua tài liệu. Tài liệu cụ thể như thế nào thì ứng với mỗi chương trình đào tạo sẽ có, ví dụ như bên trường anh thì khoa có viết 2 cuốn giáo trình là Lập trình mobile cơ bản và nâng cao chuyên về android.

Còn đối với sinh viên kỹ thuật khác thì họ sẽ phải nghe tư vấn của các trường khác, nói chung từng trường sẽ học theo giáo trình của trường mình, vì học kiểu gì học, giỏi mấy thì cũng phải qua môn đã. Nên về giáo trình tiếng việt thì anh khuyên là cứ bám theo giáo trình của khoa đưa, còn tài liệu tham khảo thì em có thể tham khảo bất cứ chỗ nào.

Như của anh thì có 2 nguồn, từ cái giáo trình của chính nhóm anh viết hoặc từ những video anh dạy hay blog. Theo anh khảo sát thì sinh viên thích xem qua blog và video, youtube cũng vậy. Về tiếng Anh thì rất nhiều, nếu như chưa biết gì về android cả thì nên học cuốn Absolute Beginner liên quan đến Android chẳng hạn hoặc về sau nó có Professional Android khoảng mấy ngàn trang rất là nhiều, đương nhiên những cuốn đó thì phải trả tiền. Nếu là sinh viên thì em tải được vì người ta share trên các trường đại học rất là nhiều, còn khi em đi làm rồi thì cố gắng trả bằng tiền. Thực ra mình phải thay đổi tư duy đi, cái gì cũng muốn hack thì khi em viết ra phần mềm, người hack em đâu cãi lại được.

Anh có thể chia sẻ về kỉ niệm đáng nhớ nào khi làm giảng viên? Hay về một bạn sinh viên nào để lại ấn tượng với anh không

Anh đã có được 2 sinh viên bây giờ sinh viên về kỹ thuật mà nhỏ thì có 2 em cuối năm 3 là đi làm, cũng rất là vui về điều đó. Còn kỷ niệm mà anh hạnh phúc nhất thì chắc là sinh viên của anh luôn, hồi đó anh là trưởng bộ môn ở một trường Đồng Nai. Bạn này tên là Trịnh Vĩnh Phúc rất giỏi, bắt đầu từ năm 1 là môn nào anh đi dạy cũng thấy bạn học hết, làm mình nhớ mình của ngày xưa cũng như vậy, môn nào bạn cũng học mà học rất là tốt. Lúc đó có MSP (Microsoft Student Partner) họ vào và bạn này làm rất tốt, được làm kiểu như truyền bá công nghệ, đại sứ cho họ, đi dạy từ lúc sinh viên luôn. Đi dạy chỉ là miễn phí cho họ nhưng được cái là mình đưa được rất nhiều tài nguyên về trường như những phần mềm miễn phí của họ chẳng hạn, hay là các cuộc thi, giải thưởng cũng khá nhiều. Năm 2 thấy bạn giỏi thì cho đi làm luôn. Sau khi đi làm bạn đã tiết kiệm được 100 – 200 rồi và mấy năm kinh nghiệm nữa, rất là giỏi. Mình rất hạnh phúc về điều đó. Hiện tại bạn này vẫn đang làm dự án với anh, thầy trò vẫn đang làm với nhau.

Xin cảm ơn phần chia sẻ từ anh Trần Duy Thanh, hy vọng các bạn sinh viên ngành Mobile nói riêng và lập trình viên nói chung sẽ có thêm những kiến thức, lời khuyên từ chính giảng viên trường Đại học Kinh tế Luật và áp dụng vào chính hàng trang của mình. Ngoài ra, các bạn có thể tham khảo những bài giảng online của anh tại trang WordPress duythanhcse.wordpress

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

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

 

Convert giá trị String qua Number trong Javascript

Bài viết được sự cho phép của tác giả Lưu Bình An
Javascript rất lạ kỳ, convert giá trị String qua number cũng lắm nẻo dăm ba đường,nào NaN, nào radix. Bài này chúng ta cùng tìm hiểu parseFloat(), Number(), Number.isNaN(), isNaN()

Một cách ngắn gọn, chúng ta nên dùng Number(x) để convert giá trị sang dạng number, hoặc parseFloat(x) nếu muốn chuẩn mực

Để kiểm tra kết quả có convert được hay không, luôn dùng Number.isNaN()không nên dùng phương thức global isNaN().

typeof parseFloat('42'); // 'number' Number.isNaN(Number('42')); // false typeof parseFloat('fail'); // 'number' Number.isNaN(Number('fail')); // true

Sử dụng Number(x) sẽ có vài trường hợp đặc biệt, nó có thể là đúng cũng có thể là sai, tùy theo cách hiểu của chúng ta.

Number(''); // 0

Rất nhiều dev sử dụng +x để convert giá trị x sang number. Theo như khai báo của javascript, +x sẽ tương tự như Number(x)

+'42 fail'; // NaN +({ valueOf: () => '42' }); // 42 +({ toString: () => '42' }); // 42 +(null); // 0 +(' '); // 0

Cái sai của Number(x)

Number(x) và parseFloat(x) xử trí các tình huống đặc biệt rất khác nhau, parseFloat() có vẻ dễ giải hơn khi chấp nhận một số kiểu String

Number('42 fail'); // NaN parseFloat('42 fail') // 42 parseInt('42 fail') // 42 Number(' 10') // 10 parseFloat(' 10') // 10 parseInt(' 10') // 10

Đừng thấy vậy mà kết luận rằng Number(x) chuẩn mực và an toàn hơn. Thực ra, Number(x) hay lấn cấn khi string chứa khoảng trắng, null, và một số tính huống khác. Nó convert khá nhiều trường hợp sang 0.

Number(null) // 0 Number('') // 0 Number(' ') // 0 Number(false) // 0 Number({ toString: () => '' }); // 0 Number({ valueOf: () => ' ' }); // 0

Nguyên tắc làm việc của parseFloat() đơn giản và dễ đoán hơn. Cắt hết khoảng trắng, rồi kiểm tra với một regular expression được quy ước để lấy giá trị số dài nhất trong chuỗi.

// parseInt hoạt động tương tự parseFloat(null); // NaN parseFloat(''); // NaN parseFloat(' '); // NaN parseFloat(false); // NaN parseFloat({ toString: () => '' }); // NaN parseFloat({ valueOf: () => ' ' }); // NaN

Number.isNaN() và isNaN()

Javascript sẽ ko quăng lỗi nếu nó ko convert được giá trị sang number, nó trả về một giá trị đặc biệt gọi là NaN (not a number). Và vẫn chưa đủ độ huyền bí, nếu kiểm tra typeof của một giá trị là NaN chúng ta nhận được ‘number`. Nực cười quá mà.

Number('fail'); // NaN typeof Number('fail') // 'number'

Lý do cho sự có mặt của Number.isNaN() và isNaN() là vì == và === không chạy đúng trên giá trị NaN

Number('fail') == Number('fail'); // false Number('fail') === Number('fail'); // false Number('fail') == NaN; // false NaN === NaN; // false

Number.isNaN() là một hàm mới được bổ sung trong ES6, tuy nhiên ko nhận được nhiều sự quan tâm. Chúng ta nên tập sử dụng Number.isNaN() thay cho isNaN()

isNaN(Number('fail')) // true Number.isNaN(Number('fail')); // true

Một cách dễ hình dung sự khác nhau, nếu Number.isNaN() là so sánh === thì isNaN() là so sánh ==

Thằng isNaN() nó sẽ convert giá trị qua number trước, rồi mới đem đi so sánh kết quả.

isNaN(‘fail’) // true isNaN({}) // true Number.isNaN(‘fail’) // false Number.isNaN({}) // false

Nói cách khác, nếu giá trị x không phải kiểu number, thì Number.isNaN(x) sẽ là false

Cái polyfill cho Number.isNaN() đ

9 tuyệt kỹ “hack” JavaScript mà bạn nên biết

ược hiện thực đơn giản như sau

Number.isNaN = function(x) { return typeof x === 'number' && isNaN(x); }

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

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

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