Home Blog Page 158

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

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?

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

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

Trò chuyện cùng Viễn Nghiêm, CEO tại GoStream để hiểu về công nghệ Livestreaming và những tiềm năng

Công nghệ livestreaming

Livestreaming dần trở thành công nghệ phổ biến, và được nhiều marketer cân nhắc để đưa vào chiến lược của các doanh nghiệp. Theo Go-Global, đến cuối năm 2020, livestreaming dự kiến sẽ chiếm 82% tổng lưu lượng truy cập Internet.

Vậy đâu là lý do khiến livestreaming phổ biến như vậy và công nghệ đứng đằng sau một hệ thống livesteaming cũng như vai trò của developer trong việc vận hành livestreaming là gì? Hãy cùng TopDev trò chuyện cùng Viễn Nghiêm | Founder tại GoStream để hiểu hơn về chủ đề này.

Đôi nét về khách mời

  • Anh Nghiêm Tiến Viễn hiện là CEO của Công ty Cổ phần Công nghệ GoStream.
  • GoStream hiện nay đang là công ty chuyên về livestream trên các nền tảng mạng xã hội như Facebook, Youtube, Twitter.
  • Hiện nay, GoStream đang là ứng dụng top 1 ở Việt Nam trong lĩnh vực này.

Hiểu về công nghệ Livestreaming và những tiềm năng

Khi làm việc tại GoStream không, anh có khoảnh khắc đáng nhớ không?

Mình đã đi làm từ rất sớm, từ khi còn là năm nhất sinh viên. Sau khi ra trường mình đã đi làm 2 năm ở công ty cũng về streaming nhưng là streaming VoD, tức là những video đã quay sẵn như những website phim bây giờ, từ đó mình có những kinh nghiệm và kiến thức về lĩnh vực streaming.

Xem thêm Sinh viên IT cần trang bị gì khi tìm việc

Sau đó do nhu cầu công việc mình cũng phải livestream trên Facebook, Youtube, Twitter và mình cảm thấy công việc livestream cần rất nhiều công cụ khác nhau và khá là phức tạp đối với một người dùng bình thường. Và mình là một IT Developer thì mình cảm thấy cái này mình có thể fix được, cuối cùng thì mình có thể tạo ra GoStream. Trước hết là phục vụ cho công việc của mình lúc đấy, sau đó mình đã thương mại hóa và nhận thấy nhu cầu livestream trong xã hội bây giờ đang rất phổ biến và ngày càng phổ biến hơn nữa.

Theo anh, vì sao VinaCapital Ventures lại chọn GoStream?

Theo mình, VinaCapital chọn GoStream vì có 2 lí do: thứ nhất là trong lĩnh vực này và ứng dụng livestream trên mạng xã hội bọn mình đang là ứng viên sáng giá nhất và chiếm toàn bộ thị trường, hầu như là toàn bộ thị trường ở Việt Nam.

Thứ 2 là thị trường livestream đang ngày càng mở rộng ở Việt Nam, chúng ta có thể nhìn sang Trung Quốc để có thể thấy tương lai, Việt Nam cũng sẽ đi theo con đường đấy. Có thể thấy là dư địa để GoStream phát triển còn rất là nhiều.

Anh có thể chia sẻ thêm về dịch vụ và huớng đối tượng của GoStream không?

GoStream cung cấp cho các bạn một công cụ để livestream trên mạng xã hội một cách dễ dàng nhất có thể. Như bạn có thể thấy thì ngày nay, người ta livestream rất nhiều và cái video livestream hấp dẫn người xem ở lại lâu hơn so với một cái video thông thường.

Dựa vào việc đó thì người ta thường xem việc livestream như một hình thức để quảng cáo. Những người bán hàng ở Việt Nam dùng livestream rất nhiều để quảng cáo cái sản phẩm của họ tới người tiêu dùng. Thì đấy là những đối tượng mà bọn mình nhắm tới, bọn mình giúp cho những người bán hàng có thể bán được nhiều hàng hơn và từ đấy thì họ sẽ sẵn sàng trả tiền cho những dịch vụ mà GoStream cung cấp.

Ngoài ra thì cũng có một số đối tượng khác như là những người chuyên sản xuất nội dung video họ cũng có nhu cầu có thêm khán giả cho những video đó, hoặc những người chuyên sản xuất nội dung hoặc quản trị fanpage, họ muốn phát những video có tính thu hút khán giả hơn để đưa người dùng đến với fanpage của họ.

Chia sẻ về công nghệ livestreaming

Hiểu về công nghệ Livestreaming và những tiềm năng

Về khía cạnh kỹ thuật, cách mà phát trực tiếp được thực hiện trước khi công nghệ livestreaming trở nên phổ biến tại sao lại khó khăn đến như vậy?

Trước khi livestream xuất hiện, người ta thường xem trực tiếp ở trên truyền hình là chủ yếu. Truyền hình có những đặc điểm riêng, ví dụ như kỹ thuật nó rất khó khăn, chẳng hạn các bạn cần có nhiều máy quay ở những góc khác nhau, sau đó những cái máy quay đó đều nối dây cáp về một bàn trội, từ bàn trội đấy có thể phát lên truyền hình hoặc phát lên những nơi khác. Những kỹ thuật và thiết bị đấy hầu như chỉ có nhà đài với nguồn lực kinh tế tốt thì mới phát triển được cái đội ngũ như thế.

Khi livestreaming phát triển, chẳng hạn như từ youtube, đặc biệt là từ sau khi facebook ra mắt tính năng livestream thì nó thay đổi cuộc chơi hoàn toàn. Bạn chỉ cần một cái điện thoại di động các bạn cũng có thể phát được trực tiếp trên trang cá nhân của mình, và khi đấy, mỗi tài khoản cá nhân có thể coi là một kênh truyền hình riêng, việc livestream trở nên cực kỳ đơn giản nhưng nó cũng là một kênh quảng cáo cực kỳ tốt, do đó chúng ta có thể thấy đươc hiệu ứng của nó, đó là lí do mà tất cả mọi người đều livestream.

Để xây dựng một nền tảng hệ thống livestreaming thì có những khó khăn gì, về hạ tầng, kỹ thuật lẫn yếu tố con người?

Khi nói mình làm về livestream, mọi người sẽ nghĩ ngay đến việc mình làm CDN. Tức là livestream nó sẽ có 2 phần giống như những sản phẩm khác, thứ nhất là phần sản xuất và hai là phần phân phối. Phần phân phối ở Việt Nam cũng có một vài đơn vị làm và khi nói mình làm livestream thì mọi người sẽ nghĩ ngay là mình phân phối những cái video đấy đến càng nhiều người dùng càng tốt, nhưng thật ra là không phải. Bọn mình làm phần sản xuất, tức là bọn mình giúp cho những người muốn tạo ra những video livestream, còn phần phân phối thì sẽ do người khác làm. Thứ nhất là khi mình giải thích về livestream với một người khác thì nó hơi khó khăn. Mọi người chưa hình dung ra được đấy là một cái khó khăn của GoStream. Tuy nhiên, những người đã dùng và đã hiểu GoStream quay lại rất là nhiều vì những việc đấy đúng với ý của họ, đúng với cái họ mong muốn để họ bán sản phẩm của mình. Một trong những cái khó khăn của GoStream là làm cho khách hàng hiểu được vì sản phẩm của mình cũng là cái mới trên thị trường.

Bật mí quá trình phát triển livestreaming, và vai trò của developer

Anh có thể chia sẻ cách mà một hệ thống livestreaming hoạt động được không? Về Backend & Frontend thì phải xử lý những gì, có gì khác với backend & frontend thông thường?

Đối với sản phẩm của bọn mình, backendfrontend nó rất khác so với các website thông thường. Đầu tiên là frontend trước chẳng hạn, frontend bọn mình có sản phẩm GoStudio thì nó sẽ lấy webcam của người phát ngay trên trình duyệt web và không cần cài đặt bất cứ một cái phần mềm nào khác, đó là công nghệ web ATC, nó cũng dần dần khá phổ biến ở thời điểm bây giờ. Hai là cái tín hiệu đó được truyền lên server sau đó backend sẽ xử lí, họ sẽ gắn thêm những cái layer như là hình ảnh, text chạy ngang màn hình, như là một cái máy trội ở đài truyền hình thật sự, và việc đấy tiêu tốn khá là nhiều CPU của server. Đó là những khó khăn mà bọn mình gặp phải. Bọn mình phải tốn rất nhiều thời gian để (optimize) tối ưu hóa server chạy cho nó ổn định để có thể phục vụ nhiều người dùng nhất có thể.

Anh có thể chia sẻ vai trò của DevOps trong quá trình vận hành và phát triển live streaming không?

Bọn mình sử dụng rất nhiều các công cụ để deploy code lên server một cách tự động, ngay khi developer commit cái source code lên GitLab thì nó sẽ chạy những cái script tự động để deploy lên một bản staging để bọn mình có thể test trước, sau khi đã pass qua những cái test đấy thì bọn mình sẽ cho deploy tự động lên bản chạy chính thức. Bọn mình cũng áp dụng khá là nhiều các công cụ khác nhau để tự động hóa hết những việc ấy.

Tham khảo thêm các TOP việc làm cho lập trình Devops lương cao

Áp dụng những gì để tối ưu hóa livestreaming cùng những kinh nghiệm thực tế?

Theo em được biết GoStream hoạt động dựa trên hạ tầng của các trang Mạng xã hội để giảm chi phí. Anh có thể giải thích rõ hơn về cách hoạt động của mô hình này không?

Tất cả những mạng xã hội hỗ trợ livestream họ đều có những APA để mình có thể phát livestream lên đấy. Đối với Facebook và Youtube thì nó khá là dễ, tuy nhiên có một số khách hàng ở nước ngoài họ lại dùng Twitter nhiều hơn và họ muốn livestream lên twitter. Ở thời điểm đó cũng khá là khó khăn và có một số bước phải làm thủ công, bọn mình phải cố gắng để liên hệ với twitter rất nhiều lần để xin APA để nó có thể tự động hóa một cách dễ dàng hơn.

Đấy là một quá trình trao đổi rất là lâu và cuối cùng twitter cũng cho phép tụi mình sử dụng APA để có thể phát được lên tất cả các nền tảng đấy. Công cụ của bọn mình hầu như là công cụ duy nhất hiện nay cho phép phát rất nhiều nơi, nhiều nền tảng cùng lúc. Có một số phần mềm mình biết thì nhiều nhất cũng chỉ có 3 điểm phát thôi, còn bọn mình thì không giới hạn.

Không biết là khi livestream với resolution cao thì có khả thi không anh? Và thêm vấn đề FPS, Maximum sẽ dừng lại ở 30FPS hay là 60FPS ạ?

Hiện nay bọn mình có 2 sản phẩm là GoStream và GoStudio, bọn mình có 2 service là livestream thực tế (như mình với bạn ở đây, livestream ở trường quay này) ngay trên Facebook và sự kiện đó diễn ra trực tiếp, thật sự. Sản phẩm đó bọn mình đang support ở chế độ 720p và 30 frame/second. Tất nhiên là bọn mình có thể tăng lên được nhưng với những người dùng bình thường và với việc phát lên mạng xã hội, bọn mình đang để ở mức bình thường như vậy.

Đối với những khách hàng có nhu cầu cao hơn thì bọn mình có thể customize riêng. Thứ 2 là bọn mình có thể quay sẵn 1 cái video đã có sẵn rồi và phát lên những mạng xã hội đó dưới dạng video livestream, những video dạng này có thể phát được ở 1080p và 60 frames per second.

Không biết là khi livestream về các sự kiện âm nhạc, thì chất lượng âm thanh có thể đạt được như Spotify hay iTunes không?

Đúng là bọn mình có sử dụng những công nghệ nén để tối ưu hệ thống. Tuy nhiên, đối với những chương trình cụ thể, những khách hàng cụ thể, họ có những yêu cầu cao hơn về mặt hình ảnh, âm thanh thì đều có thể liên hệ, bọn mình sẽ dành riêng ra một server riêng có những cấu hình riêng biệt để nâng cao chất lượng hình ảnh và âm thanh.

Có những điểm lợi và bất lợi như thế nào so với việc xây dựng một hệ thống live streaming trên nền tảng riêng?

Có những điểm rất lợi thế của bọn mình, đó là chi phí về cơ sở hạ tầng thật sự rất thấp so với ứng dụng tự xây dựng player của họ. Bọn mình chỉ xây dựng phần sản xuất nội dung video livestream thôi, không làm phần phân phối video livestream đấy. Điều đó giúp cho bọn mình có những chi phí rất là tốt và từ đấy có thể duy trì được công ty.

Thứ 2 là khách hàng cũng cần việc đấy. Nếu bọn mình xây dựng nền tảng riêng để livestream thì khách hàng phải lên cái nền tảng đấy để phát và kêu gọi mọi người vào nền tảng đấy để xem, trong khi trên Facebook thì họ đã có sẵn những fan hâm mộ, có sẵn những khách hàng, người ta phải dời tất cả những khách hàng đấy qua một nền tảng mới để xem, thì việc đấy cũng là bất lợi cho khách hàng của bọn mình. Việc bọn mình phát lên facebook, youtube hoặc twitter nó rất phù hợp với bọn mình và cả khách hàng, đó là một điểm rất thuận lợi. Còn có những khó khăn như bọn mình buộc phải optimize hệ thống vì giả sử như mỗi người dùng họ dùng một cái phần mềm và cài đặt trên máy của họ và họ dùng cái đó để phát livestream thì máy tính của họ không cần chịu tải quá nhiều. Tuy nhiên nếu tất cả những người đó cùng chuyển lên server thì server đó buộc phải tối ưu tất cả mọi thứ để phục vụ được tốt nhất.

Theo anh thì vấn đề về độ trễ có thể được khắc phục hoàn toàn khi 5G xuất hiện không?

Thực ra độ trễ lớn nhất là từ server phát cho người xem tới máy của người xem, còn từ server của bên phát tín hiệu đi tới server nhận tín hiệu đấy sẽ rất là thấp. Khi 5G ra đời có thể hỗ trợ từ bên phát đến server bên nhận, tuy nhiên tốc độ đó bây giờ đã là tối ưu rồi, nhanh hơn 1 ít thì cũng không ảnh hưởng lắm. Tuy nhiên công nghệ để phát video livestream tới máy người dùng thì độ trễ đấy là do công nghệ. Nếu bạn muốn độ trễ thấp thì server sẽ phải thiết kế theo một kiểu khác và nó sẽ tốn chi phí hơn rất nhiều lần so với việc phát với độ trễ vừa phải khoảng từ 20 – 40 giây thì chi phí sẽ giảm đi rất là nhiều.

Do đó nên những đơn vị như Facebook hoặc Youtube họ sẽ sử dụng công nghệ thứ 2 là chấp nhận 1 cái độ trễ từ 20 – 40 giây, bù lại chi phí dành cho CDN của họ sẽ thấp hơn. Đây là công nghệ của facebook và youtube nên mình không thể nào can thiệp được vào cái độ trễ đấy.

Thực sự độ trễ đấy cũng làm cho khách hàng của mình phàn nàn rất là nhiều, khi bọn mình muốn triển khai những minigame cần độ tương tác cao ngay trên livestream cũng rất là khó nên dù sao cũng phải cố gắng “sống chung với lũ” thôi.

Sự kiện Covid-19 đã ảnh hưởng thế nào đến thị trường live streaming nói chung và Gostream nói riêng từ góc nhìn của anh – một người trong ngành?

Covid 19 tác động đến bọn mình theo 2 chiều: thứ nhất, những ngành hàng trước dịch livestream nhiều nhất như mỹ phẩm, thời trang,… trong dịch người ta lại ít hàng, ít livestream.

Còn những mặt hàng tiêu dùng thiết yếu trước dịch ít livestream thì trong dịch họ lại livestream nhiều hơn. Cụ thể đối với GoStream trong dịch bọn mình có xu hướng đi xuống, số lượng livestream ít hơn bởi vì những ngành hàng chủ đạo lại đang tạm dừng. Tuy nhiên khi vừa hết dịch là mọi thứ lại bùng lên và ngày càng có nhiều người biết đến GoStream nhiều hơn. Qua đợt dịch này thì những ngành ít livestream lại livestream nhiều hơn và sau dịch thì những ngành đã livestream nhiều lại quay trở lại, nó cũng tạo ra hiệu ứng rất tốt sau dịch.

Còn với những phần mềm khác thì mọi người có thể dễ dàng nhìn ra như Zoom chẳng hạn, một ứng dụng họp trực tuyến đã phát triển rất tốt trong đợt dịch vừa rồi. Những ứng dụng như Zoom hay livetream bọn mình cũng cùng chung một cái kho.

Anh có đánh giá ra sao về nhu cầu nhân sự cho mảng livestreaming trong thời gian tới?

Theo mình nghĩ thì mảng livestreaming nó sẽ phát triển vì thực ra thì khi mọi người nghe đến livestream thường nghĩ nó hơi khác, hơi hiếm và ít có công ty tuyển dụng. Tuy nhiên mọi người có thể nghĩ đến một số những sản phẩm khác có cùng hạ tầng với livestreaming, ví dụ như những công ty về tổng đài ảo là họ đang video call hoặc audio call, họ cũng đang truyền nội dung audio đi dưới dạng realtime trực tiếp cho nhau. Những công ty về tổng đài ảo ở Việt Nam đang phát triển, họ có rất nhiều startup về mảng đấy.

Thứ 2 là những công ty về họp trực tuyến như Zoom thì các bạn có thể thấy nó đang rất phát triển. Mình nghĩ là trong thời gian tới cũng sẽ có những công ty như thế ở Việt Nam và phát triển những sản phẩm tương tự. Do đó mình nghĩ mảng livestreaming trong thời gian tới sẽ có rất nhiều công ty tuyển dụng và nhu cầu sẽ tăng lên.

Dân IT cần trau dồi những gì để theo đuổi lĩnh vực này?

Theo anh những bạn có background chung chung là “dân IT” muốn theo đuổi mảng này thì anh có lời khuyên gì cho các bạn?

Để mà phát triển mảng livestream, các bạn sẽ cần phải trang bị một số kiến thức, ví dụ như là về truyền dẫn nội dung video hoặc audio qua internet, nén và giải nén các bộ mã nội dung video, audio.

Thực ra những vấn đề đó nếu mình đào sâu thì rất là khó, mình có thể sử dụng lại những bộ mã nguồn đã có sẵn, nó cũng phục vụ rất tốt những công việc hiện tại, thời gian để mình học những kiến thức đó cũng sẽ rút ngắn đi rất nhiều, có thể phục vụ được công việc ngay.

Mình khuyên là các bạn cứ bình tĩnh, không phải là một cái gì đó quá ghê gớm, có thể học được thực tế ngay trong công việc.

Xem thêm Các kỹ năng cần có để trở thành một Lập trình viên chuyên nghiệp

Anh có thể recommend nguồn tài liệu nào có thể giúp mình tự học được không?

Thực tế thì mình thường Google là chủ yếu. Mình thường tìm hiểu những công ty lớn trên thế giới họ đã làm như thế nào. Có rất nhiều các bài viết, các bài hướng dẫn, những bài phân tích về việc tại sao họ có thể livestream đến rất nhiều người trong cùng một thời điểm. Mình thường xuyên tìm đọc những bài như thế và chủ yếu là mình sử dụng Google thôi, không có trang cụ thể nào.

Xin cảm ơn những kiến thức rất thực tế về Livestreaming của anh Nghiêm Tiến Viễn. Chúc cho hoạt động của GoStream sẽ ngày càng phát triển và đưa công nghệ Livestreaming đến gần hơn với cộng đồng Internet Việt Nam.

Xem thêm TOP tuyển dụng lập trình IT hấp dẫn tại TopDev

KICC HCMC chính thức hợp tác cùng TopDev phát triển nguồn nhân lực IT Việt

KICC HCMC chính thức hợp tác cùng TopDev phát triển nguồn nhân lực IT Việt

Sáng ngày 29 tháng 7 tại Khách sạn Intercontinental đã diễn ra buổi ký kết biên bản ghi nhớ giữa KICC HCM và TopDev, đánh dấu hợp tác giữa nền tảng tuyển dụng IT hàng đầu tại Việt Nam và tuyển dụng nhân sự IT cao cấp cho công ty Hàn Quốc.

TopDev là cầu nối giữa các công ty công nghệ Hàn Quốc với cộng đồng lập trình viên Việt Nam

Đây là một trong những điều được đề cập trong biên bản ghi nhớ giữa Cơ quan xúc tiến công nghiệp công nghệ thông tin quốc gia Hàn (KICC) và nền tảng tuyển dụng IT TopDev.

Biên bản ký kết bao gồm các mục đích:

  • Hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các công ty Hàn Quốc.
  • Hỗ trợ khách hàng tiềm năng của nhau cùng tiếp cận thị trường địa phương, tìm kiếm đối tác, khách hàng tiềm năng và mở rộng kinh doanh tại Việt Nam.
  • Hợp tác các hoạt động khác phù hợp với hai bên.

Phát biểu về lễ ký kết, ông Lee Ju Nam – Director của KICC HCMC cho biết “Chúng tôi hy vọng rằng Dịch vụ hỗ trợ tuyển dụng online sẽ góp sức cho các công ty Hàn Quốc tuyển dụng những ứng viên lập trình viên Việt Nam chất lượng cao. Và lần ký kết này chính thức  đánh dấu cho sự khởi động hợp tác giữa KICC HCMC và TopDev, với mục đích hỗ trợ các công ty Hàn Quốc tại Việt Nam.”

KICC HCMC chính thức hợp tác cùng TopDev phát triển nguồn nhân lực IT Việt

Đại diện cũng là General Director từ TopDev, ông Park Jong Ho hy vọng “Những năm gần đây, Việt Nam là mảnh đất màu mỡ với các doanh nghiệp Hàn Quốc, chúng ta đã chứng kiến rất nhiều phi vụ đầu tư từ quốc gia này vào thị trường Việt. Qua lần hợp tác này, nguồn nhân lực trẻ từ Việt Nam cũng sẽ có nhiều sự lựa chọn hơn. Với sự hỗ trợ từ TopDev, phía các doanh nghiệp sẽ rút ngắn thời gian tìm nhân tài, mà song song với đó, lập trình viên Việt Nam cũng sẽ được trải nghiệm cơ hội nghề nghiệp tại doanh nghiệp công nghệ Hàn Quốc.”

Về KICC HCMC và NIPA:

  • Được thành lập vào ngày tháng 5 năm 2019, KICC HCMC (KICC Hồ Chí Minh) là văn phòng thứ 6 trên toàn cầu và thứ 2 tại Việt Nam. KICC là văn phòng quốc tế trực thuộc Bộ Khoa học – Công nghệ Thông tin Hàn Quốc (MSIT) và Cơ quan Xúc tiến Công nghệ Thông tin – Truyền thông (NIPA) với mục đích giúp đỡ việc kinh doanh quốc tế của những công ty về Công nghệ Thông tin (CNTT) của Hàn Quốc. KICC có 06 văn phòng ở Thung lũng Silicon (Mỹ), Tokyo (Nhật), Bắc Kinh (Trung Quốc), Singapore, Hà Nội (Việt Nam) và Hồ Chí Minh (Việt Nam).
  • NIPA là tổ chức phi lợi nhuận từ Chính phủ Hàn Quốc và là thành viên của Bộ Khoa học – Công nghệ Thông tin Hàn Quốc, chịu trách nhiệm trong việc hỗ trợ các công ty và các chuyên gia CNTT. NIPA hiện dẫn đầu trong kiến thức về cơ sở hạ tầng kinh tế xã hội và phát triển kinh tế quốc gia bằng việc xúc tiến khả năng cạnh tranh của toàn ngành công nghiệp thông qua sự tiến bộ kỹ thuật CNTT và công nghiệp.

Về nền tảng tuyển dụng IT TopDev

Với hơn 300.000 profile lập trình viên, TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam. TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam, giúp xây dựng và phát triển thương hiệu tuyển dụng – Employer Brand cho hàng trăm công ty công nghệ trong và ngoài nước. Đây còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo quý, năm về thị trường và nhân lực IT tại Việt Nam.

Tham khảo thêm các vị trí tuyển dụng IT tại HCM hấp dẫn tại đây

Kinh Nghiệm Học Coding Dành Cho Dân Trái Ngành

Kinh Nghiệm Học Coding Dành Cho Dân Trái Ngành
Tác giả: Mai Trần
Dành cho những bạn không phải dân IT nhưng vì dòng đời xô đẩy mà đâm đầu vào con đường coding.

Điểm bắt đầu

Hãy tìm lấy cho mình một động cơ, vì sao bạn muốn học coding? Tớ muốn học từ rất lâu rồi, lúc đầu chỉ cho vui, nhưng khi nhìn thấy khối kiến thức khổng lồ thì hoảng và bỏ cuộc luôn sau tutorial video đầu tiên. Tớ chỉ bắt đầu học coding nghiêm túc sau khi nhập học chương trình Thạc sĩ Data Science ở Đức, trước đó tớ học Cử nhân Kinh tế Đối Ngoại ở FTU Hà Nội và Thạc sĩ Economics & Institutions ở Uni Marburg. Lúc bắt đầu, kiến thức về coding của tớ đúng là con số Không tròn trĩnh, tới mức còn không biết gì về “data types/variable types” các kiểu. Khi đó, tớ mới chỉ tiếp xúc với phần mềm thống kê Stata và viết các câu lệnh theo kiểu mẫu có sẵn, với syntax siêu đơn giản.

Hành trình

Có động cơ rồi thì bạn phải tìm cách thu xếp thời gian và lên kế hoạch, thậm chí chiến thuật cho hành trình của mình. Mục tiêu của bạn là gì? Bạn muốn hoàn thành mục tiêu trong bao lâu? Cái thuận lợi của tớ (hay là bất lợi không biết nữa) là vì bài tập trên trường cứ chất đống lên nên phải nhảy bổ vào học ngấu nghiến để giải quyết vấn đề, không có thời gian mà trăn trở học như thế nào. Các môn học trong chương trình Data Science được dạy bởi Khoa Toán và Khoa CNTT của trường. Và điều đó có nghĩa là bọn tớ “được” ưu ái học các môn Toán với dân Thạc sĩ Toán và học các môn CNTT với dân Thạc sĩ CNTT. Với nhiều bạn thì điều đó không thành vấn đề vì vốn các bạn đã là dân Toán/IT, thậm chí đi làm dev dăm năm rồi, chỉ có một phần nhỏ là dân trái ngành như tớ, bao gồm Kinh tế, Tài chính, Tâm Lý học, Kĩ thuật điện,… Do lúc đó em bé nhà tớ mới được năm tháng, nên tớ quyết định học hết các môn Toán trước (vì vốn cấp Ba học chuyên Toán nên tớ mới bắt đầu như vậy cho dễ), rồi mới chuyển sang các môn IT.
Vì khoa Toán chủ yếu dùng R nên tớ bắt đầu viết thuật toán với R, rồi mới tới Python, Java, mấy ngôn ngữ command line của Linux như bash, awk các kiểu, rồi thêm pyspark lúc học môn Big Data Analytics. Bên cạnh lập trình, thuật toán, tớ còn được học thêm khá kĩ về phần database, cả relational với ngôn ngữ truy vấn SQL lẫn non-relational database với các ngôn ngữ truy vấn kiểu NoSQL. Dĩ nhiên là trình độ coding của tớ tới giờ vẫn còn gà lắm, nhưng so với ngày mới lò dò bước vào lớp “Java for dummies” thì tớ đã vỡ lẽ ra kha khá rồi nên thôi thì cứ viết tổng hợp kinh nghiệm lại, biết đâu có ai đó cần.

Kinh nghiệm

Ngày trước, khi còn ở Việt Nam, tớ từng hỏi một bạn đi du học Pháp rằng liệu bạn có áp dụng được kiến thức đã học vào công việc không. Bạn ấy nói một câu mà tớ nhớ mãi, đó là việc đi học không phải để học hết các kiến thức mình cần, mà là để học được “cách học”. Quả đúng như thế, nhất là khi công nghệ thay đổi không ngừng thì kiến thức nhà trường dạy rất nhanh trở nên lạc hậu. Không quan trọng việc chúng ta đã học được bao nhiêu ngôn ngữ, mà quan trọng là chúng ta phải tìm ra cách học phù hợp với mình, hiệu quả với công việc mình đang làm!
Việc học coding nhìn chung cần sự kiên nhẫn, ham học hỏi, tư duy logic, cẩn thận. Biết tiếng Anh là một lợi thế. Tớ tạm chia việc học một ngôn ngữ ra làm ba chặng như sau:

1. Khởi động:

Trình độ cơ bản thì bắt đầu với syntax chung, data types, operators, conditions, loops là ổn, có thể viết được đủ thứ để chạy chương trình được rồi. Đây là phần khung xương, hơi nhàm chán nhưng cực kì quan trọng, có thể xem như khi bạn học ngữ pháp của một ngôn ngữ mới vậy đó. Lúc này, bạn sẽ được học sâu hơn về tầm quan trọng của từng dấu chấm phẩy, lùi dòng, ngoặc đơn, ngoặc kép, viết comment như thế nào. Hồi mới học Java, tớ viết vài dòng là hỏng lên hỏng xuống, đôi lúc chỉ vì mở mà quên đóng ngoặc hoặc đóng ngoặc sai chỗ ấy (dễ xảy ra khi copy code từ đâu đó về rồi tự xào nấu lại). Lúc debug đọc log mà đến phát khóc vì chả hiểu nó nói lỗi ở đâu. R và Python thì ít khi dùng tới các dấu ngoặc hơn, nhưng phải tuân thủ lùi dòng. Đối với dân Data Science nói riêng thì hai ngôn ngữ này có đủ thư viện cho thống kê, mô hình, đồ thị các kiểu nên ít khi tớ phải tự viết packages mới, hay thậm chí là tạo class mới như khi sử dụng Java. Tớ đã học trình độ cơ bản trên những trang sau:
https://www.tutorialspoint.com: trang này có giải thích đơn giản, ngắn gọn, có nhiều ví dụ với hướng dẫn chi tiết, lại chia làm các phần nhỏ, có từ basic tới advanced nên dễ chia dễ trị. Các bài học cũng được sắp xếp theo thứ tự hợp lý. Sau đó, tùy vào nhu cầu mà bạn học lên hướng advanced cho phù hợp.
https://Coding: trang này là cứu cánh của cuộc đời tớ hồi mới học Java. Trên đó có những đề bài nhỏ với mục đích giúp chúng ta luyện tư duy lập trình. Chẳng hạn, đây là một đề bài ngắn dành cho Java mang tính khởi động.
Hồi đó, tớ thường dùng tư duy toán để giải quyết vấn đề. Thêm một ví dụ nữa, đề bài dưới đây bảo tính tổng các số liên tiếp tới n thì tớ nghĩ ngay tới việc tính n(n+1)/2 và không tài nào hiểu nổi sao lại phải dùng “for loop” làm gì. Dĩ nhiên tư duy toán của tớ không sai, nhưng sẽ không dùng cách đó để tính tổng cho một dãy số bất kì không cách đều nhau, bởi vậy, cách tư duy lập trình là dùng cách tính increment để tổng quát hóa bài toán lên. Rất buồn cười là tư duy toán cũng khiến tớ ngứa cả mắt khi nhìn “đẳng thức” increment sum = sum + num (hình dưới). Mãi tới khi giải rất nhiều đề bài trên codingbat thì tớ mới quen được với một kiểu tư duy giải quyết vấn đề mới. Nhờ thế mà tớ đã bắt đầu hình thành phản xạ trong giải quyết các bài toán nhỏ.
https://www.geeksforgeeks.org/python-programming-examples/: tớ cũng hay đọc trên trang này, nhưng chưa luyện bài tập trên đó bao giờ. Ở đây có thêm nhiều ví dụ, chương trình nhỏ để bạn luyện cách viết code cũng như tư duy. Còn nhiều trang khác gợi ý những đề bài, dự án nhỏ với cả đáp án mẫu cho chúng ta lắm, google là ra thôi.
Bên cạnh những trang trên thì tớ hay tận dụng 10-15 phút mỗi ngày để học thêm trên app điện thoại SoloLearn. Tớ học toàn bộ lý thuyết python trên bản miễn phí này, và thi thoảng vào đấu challenges cho vui, vừa để khỏi quên kiến thức.

2. Vượt chướng ngại vật và tăng tốc:

Đây chắc là lúc bạn thấy ngán, vì nhiều thứ phải học quá và nhìn lên đỉnh núi thấy cao vời vợi. Bạn thấy mình cứ quên trước quên sau, thậm chí lẫn lộn nếu như học vài ngôn ngữ một lúc và lúng túng khi gặp vấn đề mới. Không sao đâu, đây là chuyện bình thường. Cũng giống như khi học ngoại ngữ, bạn không cần biết hết mọi từ vựng để có thể sử dụng được, mà cần tới đâu thì dùng tới đấy. Đây là lúc bạn nên chọn một hướng để học lên advanced. Nếu như công việc đòi hỏi bạn làm gì thì bạn đi theo hướng đó. Như tớ chẳng hạn, phần lớn thời gian tớ viết data pipeline, data modelling với pyspark, khi cần giải quyết vấn đề gì mới trong pipelining thì tớ google và gần như lúc nào cũng tìm thấy đáp án trên các diễn đàn như https://stackoverflow.com/. tớ hay đọc cách mọi người giải quyết vấn đề trên này, theo nhiều hướng khác nhau và quay trở lại đọc thêm trong documentation cũng như các ví dụ khác để học cách sử dụng một cách linh hoạt. Lại phải nói thêm là không phải lúc nào documentation cũng dễ hiểu, bạn nhất định phải nắm chắc các khái niệm cơ bản ở bước 1 để đọc hiểu documentation của ngôn ngữ hay từng package dễ dàng hơn.
Sau này, công việc đòi hỏi tớ phải thiết kế web app, vì vậy tớ tự đọc sách thêm về html, css và javascript. Vốn html và css không phải ngôn ngữ lập trình nên nó lại đòi hỏi kiểu tư duy khác. Tớ hay đọc sách, bạn thích thì có thể coi tutorials trên youtube. Khi nắm được khái niệm mấu chốt rồi thì tớ cứ dựa vào documentation mà làm thôi.

3. Về đích:

chắc chẳng có lúc nào được gọi là về đích cả. Học ngôn ngữ nào cũng thế, học cho chắc, cho thành thạo một ngôn ngữ còn hơn là biết mỗi thứ một tí mà chẳng có tư duy giải quyết vấn đề gì cả. Hồi mới học java trên trường thì thầy dạy cả các khái niệm về object-oriented, rồi lên luôn advanced mà không để ý gì tới bọn beginner như tớ. Khi đó tớ thấy khá là chơi vơi vì đọc phần giải thích trừu tượng mấy lần vẫn chả hiểu gì. Mãi tới khi tớ lấy hết sức can đảm thú thật với thầy rẳng em chẳng hiểu gì hết thì thầy mới tổ chức thêm lớp phụ đạo Java for dummies ngoài giờ. Ấy là lần đầu tiên tớ được chứng kiến tận mắt tư duy lập trình là như thế nào. Thầy ra đề bài viết trò chơi Tic Tac Toe (giống kiểu chơi cờ ca-rô). Sau đó, thầy bắt đầu đặt các câu hỏi nhỏ để bọn tớ phát triển ý tưởng: lấy gì làm bàn cờ, làm sao biết được ai đánh dấu ở đâu, các đối thủ luân phiên chơi như thế nào, trò chơi kết thúc khi nào, và xắn tay áo lên viết từng class mẫu cho bọn tớ. Lúc đó tớ mới hiểu ra sức mạnh của object-orientation và về nhà viết một mạch hết trò chơi ấy. Đến hôm thứ ba, tớ đã có thể tự viết code cho một trò chơi khác (Connect Four) và thầy rất hào hứng bảo tớ phải gửi package đấy lên diễn đàn của lớp (nhưng chắc chả ma nào thèm xem). Đến đây, tớ chỉ muốn nói rằng, dù không có cái đích nào nhưng chúng ta tạm có thể coi như đã về đích khi ta hiểu được những khái niệm trụ cột của một ngôn ngữ, hình thành được tư duy coding, phản xạ khi đối diện với những đề bài cơ bản, và có thể tự học lên mức advanced bằng cách đọc hiểu documentation cũng như các ví dụ cụ thể. À, một lần sếp trên cơ quan gọi pizza về rồi cả nhóm bọn tớ mỗi đứa cầm một miếng bánh pizza ngồi châu đầu bên máy tính của sếp cùng debug, ấy là lúc tớ cảm thấy mình trở thành dân geek thực sự rồi đấy!
Tóm lại, tớ thấy học ngôn ngữ lập trình cũng như học ngoại ngữ ấy, phải sử dụng thì mới ngấm, mới khiến nó thành của mình được, còn cứ ngồi ngâm cứu mấy chương sách, hay bao nhiêu tutorials mà không tự viết chương trình nào, không đâm đầu vào bao nhiêu bugs rồi hí hoáy debug thì khó ngấm vào người lắm. Thôi, bạn còn chờ gì nữa mà không xắn tay áo nhảy vào luôn đi. Have fun coding!
Bài viết gốc được đăng tải tại Blog Mai knows
Có thể bạn quan tâm:

Dịch vụ thị trường thanh toán điện tử Landscape 2020

thị trường thanh toán điện tử landscape 2020

Thị trường thanh toán điện tử được giới chuyên gia đánh giá là có sự tăng trưởng khá tốt trong năm nay. Trong báo cáo thị trường thanh toán điện tử Landscape 2020 đã đưa ra rất nhiều thông số đáng tin cậy về sự tăng trưởng này. Vì sao thị trường thanh toán điện tử lại có xu hướng tăng trưởng dù dịch bệnh vẫn chưa hoàn toàn rút khỏi Việt Nam?

Tổng quan về báo cáo thị trường thanh toán điện tử 2020

Trong hơn 6 tháng đầu năm 2020, mặc dù Việt Nam cũng là một trong những nước bị ảnh hưởng bởi đại dịch thế kỷ – Covid19 thế nhưng dường như những ngành nghề liên quan đến công nghệ lại không chịu quá nhiều ảnh hưởng tiêu cực nhiều như những ngành khác. Điển hình như thị trường thanh toán điện tử vẫn luôn “tấp nập” bất chấp dịch bệnh.

Theo báo cáo thị trường thanh toán điện tử Landscape 2020, trong riêng năm 2020, các giao dịch qua Internet, điện thoại di động tăng trưởng đến 238% (số liệu được trích từ báo cáo của Cục Thương mại điện tử và Kinh tế số – Bộ Công Thương).

Trong bài báo cáo còn cho thấy mức độ phát triển mạnh mẽ của những ứng dụng thanh toán điện tử mới và lâu đời với hơn 78 tổ chức, công ty cung ứng dịch vụ thanh toán qua Internet và 45 tổ chức cung ứng dịch vụ thanh toán qua điện thoại di động (mobile payment).

thị trường thanh toán điện tử 2020

Tổng quan về Thị trường thanh toán điện tử

Thanh toán điện tử đang là xu hướng phát triển mua sắm hiện nay trên toàn thế giới và cả Việt Nam, phương thức thanh toán này được coi như là phương thức sẽ thay thế hình thức thanh toán truyền thống bằng tiền mặt như trước kia. 

Trong báo cáo chi tiết của Bộ Công Thương trong những năm trở lại đây, những người tiêu dùng có thói quen mua sắm trong các siêu thị, trung tâm thương mại có xu hướng chuyển đổi từ việc thanh toán truyền thống thành thanh toán điện tử. Ngành thương mại điện tử phát triển, đồng nghĩa với việc kéo theo sự phát triển của thanh toán điện tử vì hàng hóa, sản phẩm được mua trên các sàn điện tử 90% được thanh toán online thông qua thẻ ngân hàng.

Trong 90 triệu người Việt Nam, số người sử dụng internet chiếm 49%, số người sử dụng internet thông qua thiết bị điện thoại chiếm 34%, chính vì thế Việt Nam được xem như là 1 thị trường béo bở để phát triển thương mại điện tử cũng như thanh toán điện tử. 

Lợi ích của việc thanh toán điện tử là hoàn toàn không thể chối bỏ, chính vì thế nó mới có thể phát triển mạnh mẽ và tăng trưởng vượt bậc đến như vậy. Cụ thể doanh thu từ thị trường thanh toán điện tử 2020 đã tăng trưởng 14.2% so với cùng kỳ năm ngoái, doanh thu đạt được là 8,904 triệu USD. Lượng người dùng cũng đã tăng trưởng lên đến 36,2 triệu, tăng 12.1% so với năm ngoái.

thị trường thanh toán điện tử 2020

Bắt đầu từ thời điểm các ngân hàng triển khai kế hoạch phát hành thẻ ngân hàng, thì cho đến nay, người dùng thẻ ngân hàng thanh toán cũng đã đạt đến con số tăng trưởng khá kinh ngạc. Có thể nói, xu hướng thanh toán điện tử đã làm thay đổi thói quen tiêu dùng của người Việt Nam. Hiện nay, có các loại hình thanh toán điện tử sau:

Thanh toán bằng Thẻ ngân hàng

Đây là hình thức thanh toán điện tử đầu tiên và đặc trưng nhất trong thị trường thanh toán điện tử. Tỷ lệ thanh toán bằng hình thức này lên đến 90% trong tổng tỷ lệ thanh toán điện tử. Với phương thức thanh toán bằng thẻ này, người dùng có thể dễ dàng thanh toán bằng cách cà thẻ tại chỗ hoặc thanh toán online thông qua thẻ khi mua hàng trên các sàn TMĐT.

Thanh toán bằng Cổng thanh toán

Hình thức thanh toán này phần lớn thường xuất hiện ở các trang TMĐT, hình thức hoạt động của thanh toán này rất đơn giản, nó giúp chuyển tiền từ tài khoản người mua thành 1 đơn vị tiền ảo trên Internet nhưng không thay đổi thuộc tính và giá trị tiền. Vì thế người mua hàng vẫn có thể sử dụng tiền đó để mua sắm bình thường.

Để có thể sử dụng hình thức thanh toán này, người tiêu dùng cần phải tạo 1 account, trong đó được điền đầy đủ thông tin đã được xác thực. Điểm mạnh của hình thức thanh toán điện tử này là tính chất bảo mật cao, một số cổng thanh toán nổi tiếng hiện nay như: payoo, vnpay, vtcpay, kaokim.vn… đều có tính bảo mật cao và có lượng người dùng lớn.

thị trường thanh toán điện tử landscape2020Thanh toán bằng Ví điện tử

Đây là hình thức thanh toán khá tiện dụng và rất phổ biến trong giới trẻ ngày ngay. Ví điện tử không chỉ được sử dụng trong các trung tâm thương mại lớn, sàn giao dịch điện tử mà còn sử dụng được đối với bất gì nhà hàng, quán ăn/ nước uống, shop đồ bất kỳ nào có ký hợp đồng liên kết với ví điện tử. Điều kiện kiên quyết khi muốn sử dụng ví điện tử là bạn phải có thẻ ngân hàng có liên kết với ví điện tử.

Với hình thức thanh toán bằng ví điện tử như thế này, người tiêu dùng có thể dễ dàng thanh toán bằng cách quét mã QR của shop và nhập đúng số tiền cần thanh toán là có thể hoàn tất việc mua hàng/ sản phẩm. Những ví điện tử nổi tiếng hiện nay gồm: Momo, Smartpay, Payoo, Airpay….

Thanh toán bằng Smartphone

Đây là hình thức thanh toán bằng phương thức chuyển khoản từ tài khoản ngân hàng này qua tài khoản ngân hàng khác bằng điện thoại di động. Nói đơn giản nghĩa là bạn dùng Mobile Banking/ App của ngân hàng để chuyển khoản hoặc quẹt mã khi thanh toán.

Không phổ biến như ví điện tử, các nhà hàng thường ít liên kết thẳng với ngân hàng mà thường thông qua các loại Ví điện tử hơn. Chính vì thế, người dùng chủ yếu dùng Smartphone để thanh toán chuyển khoản là đa số.

Thị trường thanh toán điện tử lên ngôi 

thị trường thanh toán điện tử landscape 2020

Với số liệu tăng trưởng từng năm theo báo cáo thị trường thanh toán điện tử landscape 2020, thì trong tương lai không xa chắc hẳn loại hình thanh toán không tiền mặt sẽ lên ngôi. Trong 1 bài phỏng vấn, ông Vương Đình Huệ, phó thủ tướng Việt Nam cũng đã nêu lên ý kiến ủng hộ hình thức thanh toán không tiền mặt.

Ông chia sẻ “Lợi ích của thanh toán không tiền mặt đã quá rõ, giảm chi phí và đem lại nhiều tiện ích cho người dân, doanh nghiệp. Đến giờ mà người dân phải đi xa, xếp hàng chờ nộp học phí cho con thì rõ ràng là quá bất tiện”. Theo ông, việc thanh toán điện tử có thể làm nguồn tiền tiêu thụ trở nên minh bạch, chống được việc tham nhũng hay rửa tiền hoặc các vụ án về kinh tế.

Vào năm 2010, ngài Garadahew Warku đã từng đề cập và đưa ra một số đặc điểm về lợi ích của việc thanh toán điện tử như:

  • Tình độc lập
  • Tính bảo mật cao
  • Dễ sử dụng
  • Thuận tiện
  • Dễ dàng truy xuất và kiểm soát
  • Chi phí giao dịch rẻ

Ngoài ra, hình thức thức thanh toán điện tử này cũng mang đến nhiều lợi ích cho những người chủ, bán hàng Online vì giúp họ tiết kiệm chi phí thuê mặt bằng, nhân viên cửa hàng, người mua hàng và người bán hàng thậm chí còn không cần phải gặp mặt nhau nhưng vẫn có thể xuất hiện giao dịch hàng hóa.

Có thể nói, thanh toán điện tử là hình thức thanh toán khá tiện lợi và thuận tiện, người tiêu dùng/ mua sắm chỉ cần cung cấp chính xác thông tin tài khoản thanh toán ngân hàng, đia chỉ giao hàng và sản phẩm cần mua là đã có thể mua hàng một cách nhanh gọn lẹ, không làm mất quá nhiều thời gian của người mua hàng như cách truyền thống. Khó mà có thể phủ nhận 1 phần công lao làm kích thích tiêu dùng của người mua sắm nhờ thanh toán điện tử.

thị trường thanh toán điện tử landscape 2020

Với sự ủng hộ từ Chính phủ, hình thức thanh toán điện tử tại Việt Nam hiện nay đang có những chuyển đổi theo chiều hướng tích cực hơn. Trong khoảng thời gian từ 2018 đến thời điểm hiện tại, Momo là một trong những ví điện tử đứng đầu về số lượng người dùng, hợp tác với hơn 100.000 đối tác đa ngành nghề và đã có hơn 100.000 địa điểm có thể thanh toán bằng Momo.

  10 xu hướng ứng dụng di động dự đoán sẽ thống trị năm 2024
  Báo Cáo Thị Trường IT Việt Nam Năm 2021: Chuyển Mình Vào Cuộc Cạnh Tranh Tri Thức Toàn Cầu

Sự hạn chế của hình thức thanh toán điện tử

Dường như thời kỳ hoàng kim của thanh toán điện tử đã lên ngôi cũng kéo theo thị trường thẻ tín dụng Việt Nam phát triển. Tuy số liệu trong báo cáo thị trường thanh toán điện tử Landscape 2020 tăng trưởng là thế nhưng hiện nay tiền mặt vẫn là loại hình được người Việt Nam ưa chuộng nhất.

Chiếm đến 80% tỷ lệ giao dịch, điều này đồng nghĩa đến việc dù đã có sự tăng trưởng vượt bậc nhưng thị trường thanh toán điện tử cũng chỉ chiếm có 20% tỷ lệ giao dịch trên toàn Việt Nam.

Ngân hàng Nhà nước vừa đưa ra thông tin trong năm 2020 đó là hiện nay số người sử dụng thẻ ngân hàng chỉ chiếm có 30% dân số Việt Nam, 70% dân số còn lại sử dụng tiền mặt làm công cụ lưu thông mua hàng chính. Đa số 70% lượng người không sử dụng thẻ ngân hàng tập trung ở các vùng xa thành thị như thôn quê, vùng sâu hẻo lánh chưa được cập nhật kiến thức về sử dụng các sản phẩm hiện đại.

Cốt lõi của việc thanh toán bằng hình thức điện tử là bắt buộc phải có tài khoản ngân hàng, đây cũng chính là một trong những khó khăn lớn nhất trong việc phát triển phương thức thanh toán điện tử. 

Ngoài ra, còn một vấn đề nữa cũng làm ảnh hưởng không nhỏ đến tình hình phát triển thanh toán điện tử, đó là trong 30% người sử dụng thẻ còn lại chưa hẳn đã thanh toán điện tử. Họ có xu hướng sử dụng thẻ ngân hàng chỉ để đặt hàng online sau đó lại chọn phương thức thanh toán bằng tiền mặt.

Như vậy, để giải quyết được bài toán tăng trưởng thị trường thanh toán điện tử, các ngân hàng, công ty, doanh nghiệp kinh doanh ví điện tử nên cập nhật thêm nhiều ứng dụng tiện lợi hơn và đơn giản hóa cách sử dụng để có thể kích thích người tiêu dùng chuyển sang sử dụng.

Tổng kết thị trường thanh toán điện tử 2020

Với sự ủng hộ từ phía nhà nước cùng với sự tăng trưởng vượt bậc như hiện nay, thì có lẽ trong tương lai hình thức thanh toán điện tử sẽ lên ngôi làm thay đổi thói quen người tiêu dùng. Theo báo cáo của Vietnam IT Landscape 2020 cho thấy thị trường thanh toán điện tử 2020 có sự phát triển gia tăng đáng kể dù dịch bệnh vẫn còn, vì người tiêu dùng vẫn luôn có nhu cầu mua sắm.

Trong thời điểm như thế này, cơ hội phát triển thị trường thanh toán điện tử sẽ mạnh mẽ hơn bao giờ hết vì xu hướng mua sắm sẽ chuyển sang mua online và thanh toán điện tử trong mùa dịch này. Chính vì thế, các số liệu trong báo cáo Vietnam IT Landscape 2020 đã thể hiện sự tăng trưởng từ năm này sang năm khác là hoàn toàn hợp lý.

Các bạn có thể truy cập vào báo cáo Vietnam IT Landscape 2020 hoặc nhấn nút xem báo cáo dưới đây để có thể tìm hiểu thêm các thông số báo cáo không chỉ của riêng thị trường thanh toán điện tử 2020 mà còn nhiều ngành liên quan đến công nghệ khác nữa!

Nguồn tổng hợp từ TopDev

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

Xem thêm việc làm IT hấp dẫn từ TopDev!

Business Intelligence (BI) là gì? Trò chuyện cùng chuyên gia Trường Phan để hiểu hơn về vai trò của BI trong hệ thống

Business Intelligence (BI) là gì

Business Intelligence – BI là gì? Để hiểu đơn giản, BI (hay còn được gọi là trí tuệ doanh nghiệp) là một dạng công nghệ giúp doanh nghiệp hiểu biết về quá khứ, qua đó đưa ra quyết định, hành động và dự đoán tương lai. Trong đó BI bao gồm các kỹ năng, quy trình, công nghệ hay ứng dụng để hỗ trợ ra quyết định. BI là các hoạt động kết hợp giữa phân tích kinh doanh, khai thác dữ liệu, trực quan hóa dữ liệu, công cụ dữ liệu và cơ sở hạ tầng và thực tiễn để giúp tổ chức ra các quyết định-dựa trên data (data-driven decision).

Trong mục chuyên gia nói kỳ này, cùng TopDev trò chuyện với một chuyên gia về Business Intelligence – anh Phan Nguyễn Minh Trường – Technical Architect tại NashTech để hiểu hơn về cách mà nó hoạt động, cũng như những bài học kinh nghiệm rút ra trong quá trình áp dụng và triển khai.

Tuyển dụng business intelligence lương cao cho bạn

Đôi nét về khách mời Phan Nguyễn Minh Trường

  • Khởi đầu sự nghiệp với nghề web designer tại Saigon Postel
  • Chuyển hướng sang data analysis trong lĩnh vực ngân hàng
  • Trải qua các vị trí developer, anh Trường hiện là Technical Architect tại NashTech.

Phần 1: Chia sẻ về quan điểm “gắn bó với công ty hay nhảy việc tìm cơ hội mới”

Vì sao anh lựa chọn gắn bó trong thời gian khá dài tại các công ty ấy? Và quan điểm của anh về “xu hướng nhảy việc” ở người trẻ như thế nào?

Thật ra mình lười đi tìm việc mới, lười tìm công ty khác. Với lại thực ra lúc đầu mình cũng hạnh phúc với công việc hiện tại, trừ phi có một số lý do nào đó thì mình thay đổi thôi. Xu hướng hiện tại các bạn thường thay đổi công việc chắc đâu đó có một vài lý do chính, ví dụ như là họ không hợp với môi trường, hoặc là họ cần có mức sống cao hơn, có một số bạn cần phải hỗ trợ gia đình. Nhưng có một số bạn thì thấy là mình không phát triển được nữa, có đâu đó mình đọc mình thấy là nếu mình là người giỏi nhất trong công ty đó thì mình nên đi, tại vì giỏi thì mình nên đi để trau dồi và thử thách bản thân mình hơn. Cái sau cùng có một lý do hơi kỳ lạ đó là thích, một số bạn thích chuyển việc thôi, họ nghiện chuyển việc, họ làm 1, 2 năm rồi họ chuyển công việc khác.

Business Intelligence là gì

Khi mà anh làm việc ở ACB thì động lực nào khiến anh ở lâu như vậy?

Hồi xưa mình làm việc với sếp ở ACB, mình thấy hạnh phúc lắm, mình thấy rất thích phong cách của sếp quản lý tại thời điểm đó. Sếp luôn giúp đỡ mọi người và luôn nâng cấp nghề nghiệp của mình, đó là lý do chính mà mình gắn bó lâu dài với ACB

Khi nào một coder mới đủ độ “chín” để phát triển một tầm cao mới?

Mình nghĩ lý do quan trọng nhất đó là thuyết phục, làm sao để thuyết phục được người khác nói điều mình đang nói, cái đó là quan trọng nhất. Bạn coder đó cần phải có kỹ năng về quản lý người, kỹ năng về trình bày một số vấn đề để người khác hiểu được, kỹ năng thuyết phục khách hàng, thì lúc đó là thời điểm chín muồi để bạn có thể chuyển sang một title mới. Mình nghĩ là trước khi thành một leader thì mình phải biết sharing, nghĩa là mình cần chia sẻ kiến thức mình đang có, sau đó mình học lại từ các bạn khác, kể cả những bạn yếu hơn, bạn sẽ hỏi mình một số câu hỏi rất ngớ ngẩn nhưng mà mình suy nghĩ lại, mình tìm kiếm và trả lời cho bạn một cách hợp lý nhất. Từ đó mình sẽ nâng kiến thức của mình lên, nhiều khi mình làm việc với khách hàng, khách hàng cũng hỏi ngớ ngẩn như vậy, nhưng mình biết cách mình trả lời thì từ từ mình nâng cấp mình lên.

Phần 2: Chia sẻ về Business Intelligence – BI là gì?

Định nghĩa của anh thì Business Intelligence – BI là gì? BI giúp gì cho doanh nghiệp và nó sẽ giúp như thế nào (cách hoạt động)?

Business Intelligence là gì

Về mặt học thuật thì có rất nhiều định nghĩa về BI, có những định nghĩa gần đây nói rằng BI là một skill, rồi ngoài ra là application, rồi information, rồi technology, hoặc là những định nghĩa trước đó thì nói là sẽ lấy tổng hợp dữ liệu có sẵn rồi sau đó đưa ra hỗ trợ quyết định.

Nhưng mà mình nghĩ thực tế nhất, để hiểu BI là gì cũng giống như là hồ sơ giúp mình quản lý sức khỏe, nó lưu thông tin lại để mình kiểm tra sức khỏe định kỳ, rồi sau đó mình sẽ biết được sức khỏe trong tương lai mình sẽ bị bệnh gì, và sức khỏe mình sẽ yếu ở đâu và nó sẽ báo được cái đó và mình nghĩ cái đó là đơn giản nhất. Đa phần BI giúp monitor doanh nghiệp, bên cạnh đó còn hỗ trợ ra quyết định.

BI phù hợp với những doanh nghiệp thế nào và SMEs có cần phải có một hệ thống BI? Nếu không có thì họ sẽ bỏ lỡ những gì?

Tùy doanh nghiệp có kích thước, kích cỡ khác nhau thì mình có thể áp dụng BI có cồng kềnh hay không cồng kềnh hoặc là nó hoành tráng hay không hoành tráng. Đại loại là mình hình dung hồi xưa sức khỏe của một đứa trẻ sơ sinh, sinh ra cũng cần phải có hồ sơ sức khỏe rồi, khi mình lớn mình cũng cần, khi mình già mình cũng cần, nhưng nếu mình không theo dõi sức khỏe thường xuyên, đùng một phát minh bị bệnh ngã ra thì mình sẽ bị bệnh nặng hơn, lúc đó trở tay không kịp. Nếu mình theo dõi sức khỏe định kỳ, làm tốt chuyện đó thì sẽ phát triển tốt hơn và nắm được sức khỏe của doanh nghiệp.

Ý nghĩa của BI trong banking là gì?

Trong banking có rất nhiều bộ phận khác nhau, mà chính vì nhiều bộ phận tài chính khác nhau mà họ đều có khả năng tự làm tài chính báo cáo được, nó sẽ gây ra chuyện là một báo cáo lên thì mỗi bộ phận báo cáo một con số khác nhau, người quản trị ở trên nhìn vào sẽ thấy sao anh này báo cáo một số, anh kia báo cáo một số.

Quay lại câu chuyện của BI khoảng năm 2007 trở về trước, lúc mà tờ báo của Việt Nam mình ra thì có hình BI được mô tả là thầy bói sờ voi, có nghĩa là mỗi người sờ một chỗ và nói là BI như vậy thì đó là lý do chính tại sao cần phải có hệ thống dữ liệu tập trung và mình sẽ dùng BI đó báo cáo xuyên suốt, thuật ngữ hay dùng là one-cross, nghĩa là một sự thật duy nhất thôi, do có nhiều bộ phận báo cáo quá thì sếp không biết số nào là số đúng, bên nào cũng muốn lấy phần có lợi về mình cho nên không phần nào chịu thiệt

Xem thêm BI là gì? Vì sao có nhiều doanh nghiệp đầu tư vào BI?

Quá trình để đi từ raw data đến khi chúng trở thành những thông tin có giá trị để có thể ra quyết định cần qua những giai đoạn nào, “qua tay” những ai?

Để có thể làm phần phân tích dữ liệu có giá trị thì tất nhiên phải có nhiều yếu tố, nhiều con người cùng hợp sức để làm. Đầu tiên mình cần phải biết business need đó là gì, sau đó mình sẽ xác định được nguồn dữ liệu, ví dụ như nãy business need cần phải có BI hỗ trợ cùng, rồi sau đó lấy dữ liệu về thì cần có data engineer, sau khi có cái đó rồi mình mới làm giàu dữ liệu lên, mình làm sạch dữ liệu, mình visualize data lên, sau đó mình mới dùng, người mà involve vào là data analyst, sau đó thì họ báo cáo. Chìa khóa quan trọng ở đây là cái tốn thời gian nhiều nhất là quá trình xử lý dữ liệu nhưng mọi người sẽ nhìn vào chìa khóa chính là visualization thôi, đó là phần data analyst làm

Phần 3: Những lời khuyên khi áp dụng và triển khai BI

Những lưu ý gì khi một doanh nghiệp áp dụng, sử dụng hệ thống BI?

Các doanh nghiệp khi xác định hệ thống BI họ cần phải xác định là cái số lượng người dùng trước đã, rồi cái lượng báo cáo của họ, tần suất báo cáo như thế nào và đặc biệt quan trọng nhất là họ phải xác định, hồi nãy mình có mô tả về quá trình xử lý dữ liệu thì business mới là cái quan trọng nhất, họ cần phải xác định cái business trước tiên, họ cần define những loại báo cáo nào họ sẽ điền vô để quản lý, giống như chỉ số sức khỏe của mình vậy đó, mình đi khám huyết áp thì cần có chỉ số về đường huyết, về máu mình phải đi kèm theo.

Cần chuẩn bị kỹ năng gì khi theo đuổi BI?

Để làm BI thì phần về kỹ thuật nặng hơn phần business nhưng mà giá trị phần business, cho nên các bạn bên Công nghệ thông tin sẽ có lợi thế hơn về cái phần kỹ thuật nắm khá vững, mình phải tìm hiểu thêm 1 số business mình cần nữa, thì lúc đó mình làm việc trực tiếp với BI thôi mình có thể cover được chuyện đó.

Anh có thể gợi ý nguồn học tập Business cho Devs?

Mình nghĩ chắc qua Đại học Kinh tế học đi, hoặc là Đại học Kinh tế luật cũng có khóa chuyên về dữ liệu mới mở.

Case Study đáng nhớ nhất trong quá trình làm việc của anh là gì?

Lúc đó là năm 2011, lúc đó mình mới lấy vợ thôi như sếp mua công cụ Cognos BI của IBM , công cụ đó là chưa có ngân hàng nào ở Việt Nam sử dụng hết mà sếp kêu là làm trong vòng mấy tháng cuối năm thôi, mới lấy vợ không được đi đâu hết. Phải vô công ty làm từ sáng tới tối, làm sao tới 5h sáng mình dậy rồi về nhà tắm rửa quay lại công ty làm trong vòng có vài tháng thôi mà Cognos BI của IBM không có bất kỳ tài liệu nào để tham khảo, lúc đó là mình tự research, team thì chỉ có 3 người và 1 số bạn làm ITL với BI là riêng. Phần đó khiến mình nhớ nhất luôn, nhưng có giận cũng phải chấp nhận thôi.

Phần 4: Lời khuyên qua các trải nghiệm thực tế

Anh có lời khuyên nào dành cho các bạn junior mới làm về data không?

Mình cũng làm chung với các bạn senior hay các bạn làm lâu 1 chút xíu, nhưng các bạn học thiên về xu hướng hiện đại mà quên phần kiến thức căn bản, rồi các bạn học R, học Python nhưng bạn không học cơ sở dữ liệu cơ bản, bạn không học làm cách nào để tổ chức dữ liệu cho hợp lý và mình khai thác nó tối ưu ví dụ như cách mình bố trí file, cách mình bố trí những bảng biểu ra sao, mình bỏ quên cái đó luôn.

Business Intelligence là gì

Mình cứ hình dung là mình đang có nguyên 1 cái tòa nhà, các bạn muốn làm gì làm nhưng mà mình không có quy hoạch kiến trúc tòa nhà đó chỗ nào sẽ chứa dữ liệu này hay dữ liệu nào, thì cuối cùng nguyên tòa nhà đó mỗi phần bạn làm ra rất là đẹp đẽ, nhưng cuối cùng tới chừng làm tự động hóa lại không được, hoặc scalable nó rất là khó.

Về doanh nghiệp thì anh có lời khuyên nào không?

Doanh nghiệp thì mình không dám nói nhưng mình chỉ nói người dùng thôi, người dùng thường so sánh BI với Excel. Excel chính xác là công cụ làm report rất mạnh, không thể từ chối điểm đó luôn, nhưng mà sẽ liên quan tới chuyện security thì Excel rất khó để quản lý cái đó. Họ có thể đem cái file đi bất kỳ đâu cũng được, 1 số doanh nghiệp cứ dùng Excel thì về sau cái phần linked in data thì mình sẽ khó kiểm soát hơn, hoặc là nó sẽ tập trung vào 1 số người. 

Mình có 1 số người quen làm trong lĩnh vực ngân hàng và bố trí excel mà như chạy đua vũ trang vậy, họ làm 1 cái file excel rất là bự, hoặc họ sử dụng máy 16GB không được họ dùng máy 32GB rồi tới 64GB, máy laptop cá nhân, mà trong khi những cái trường hợp đó mình chỉ lưu trữ trong database là có thể hoàn toàn query được hết data đó ra, mình không cần phải bố trí 1 file excel rất bự và tốn thời gian như vậy.

Khi thiết kế Dashboard nên lựa chọn những nguồn tham khảo nào? Anh hay gặp những vấn đề gì khi thiết kế Dashboard?

Đầu tiên là về UI, khi mà thiết kế Dashboard đưa cho người sử dụng người ta lúc nào cũng nói là phải đẹp trước đã, chứ không quan tâm tới phần thông tin mình cung cấp cho họ và đặc biệt là dân kỹ thuật mình làm thiết kế luôn xấu. Tức là các bạn kỹ thuật thiết kế màu sắc bạn không quan tâm tới, ý nghĩa của chart họ cũng không quan tâm tới, thì đó chính là điểm yếu của các bạn kỹ thuật, thiếu phần nghiên cứu về các màu sắc.

Xem thêm UX là gì? UX Designer thì làm những gì?

Cái phần thứ 2 là business user có quá nhiều điều muốn nói trên một dashboard. Mình có làm tư vấn cho 1 công ty bảo hiểm, họ có rất nhiều thông tin muốn đưa lên đầy đủ nhưng mà trên cái dashboard là 1 màn hình để cho người ta nhìn nhanh thì đâu thể cung cấp đủ hết thông tin. Lúc này mình có khoảng 20 câu hỏi, mình sẽ hỏi là user nào sử dụng, tần suất sử dụng ra sao, kích thước màn hình ra sao, thông tin nào quan trọng nhất, thông tin nào đi kèm theo đó. Lúc đầu có 20 mấy thông tin, đánh số thứ tự 1-2-3-4… sau đó mình lựa chọn thông tin để đưa lên màn hình này thì chọn cái nào, và những thông tin liên quan sẽ nhảy qua 1 trang kế tiếp. Mình có nguyên cái luồng gọi là navigation để cho người ta có tư duy đi phân tích, chứ không phải nguyên cái màn hình nhìn tất cả, rất là khó. Do não người nhìn vào cái dashboard không thể nào nhớ hết được tất cả các chỉ số. Thông tin đó mình đọc và idol trong cái quyển sách của ông Stephen Few – Dashboard Design hoặc Show Me the Numbers, các bạn có thể tìm trên Amazon.

Xin cảm ơn những chia sẻ của anh Phan Nguyễn Minh Trường, hy vọng bài viết này đã cung cấp những định nghĩa BI là gì một cách đơn giản và sát với thực tế nhất. Các bạn mong chờ những chia sẻ về những thuật ngữ công nghê nào ở các số sắp tới, hãy cho TopDev biết nhé!

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

HR & IT – “Cuộc chơi” đầy hoàn hảo cho việc thu hút và giữ chân nhân tài

HR & IT

Trong ngành Nhân sự, việc thu hút và giữ chân nhân tài là quan tâm hàng đầu đối với các nhà tuyển dụng. Để tối ưu hóa mục tiêu tuyển dụng, nhiều doanh nghiệp đã phối hợp chặt chẽ giữa yếu tố về không gian và trên hết chính là sự hợp tác giữa nhân sự (HR)công nghệ (IT).

Không ai nghĩ rằng sự hợp tác ấy lại tạo ra một lực lượng mạnh mẽ như vậy. Việc kết hợp ngẫu nhiên nhưng nhìn dưới góc độ của bối cảnh thời đại, HR & IT như một thỏi nam châm xích lại gần nhau, từ đó tạo ra một đội ngũ lãnh đạo vững mạnh với những sáng kiến, hành động và các chiến lược nhân sự cụ thể nhất.

HR & IT: Mỗi yếu tố – Mỗi vai trò

Yếu tố về không gian

Trên hết, nhận thức và nắm bắt chính xác về thị trường nhân sự để có thể thiết lập một chiến lược thu hút, giữ chân và phát triển nhân tài là một điều không hề đơn giản. Đó không chỉ đơn thuần là câu chuyện về việc lên kế hoạch tuyển dụng, tạo ra các gói và lợi ích cạnh tranh từ phúc lợi,… mà còn là về các chương trình đào tạo song song, hướng dẫn và bổ trợ kiến thức giúp tạo động lực và duy trì tính ổn định về sự đồng hành của các nhân viên hiện tại.

HR & IT

Nếu nói đến một sự hợp tác hoàn hảo trong “cuộc chơi” về tuyển dụng nhân sự, ngoài HR và IT, chúng ta cần xem xét đến yếu tố không gian chi phối đến sự kết hợp đó. Yếu tố không gian được xem là phương tiện để tối ưu hóa danh mục đầu tư vào kế hoạch bất động sản của doanh nghiệp. Điều này hiểu đơn giản là việc phân bổ các trang thiết bị, cải thiện và nâng cao thiết kế không gian làm việc. Chính những điều này cũng góp phần tạo nên cái gọi là môi trường văn hóa doanh nghiệp – một yếu tố quan trọng được nhân viên cân nhắc xem xét trước khi bắt đầu lựa chọn đồng hành lâu dài.

HR – Yếu tố nền tảng tạo ra các lõi nhu cầu

Mỗi thành phần đều có những đặc trưng riêng biệt. HR cũng không ngoại lệ. Chính cái tên HR đã cho thấy một bản mô tả chi tiết về những công việc cần làm, nên làm và sẽ làm. HR là yếu tố cơ sở tạo ra các lõi giá trị cần xem xét như tiêu chí về việc xây dựng nguồn lực nhân sự tiềm năng, đào tạo và phát triển con người, thiết lập và mở rộng nguồn tuyển chọn nhân sự,… Và tất nhiên việc thu hút và giữ chân nhân tài là hai yếu tố nhỏ chịu ảnh hưởng từ việc đào tạo và phát triển con người trong ngành nhân sự.

IT – Yếu tố về công nghệ, người “cộng sự” tuyệt vời

HR & IT

Nhóm công nghệ thông tin thường tập trung vào việc làm thế nào để đảm bảo nhân viên được làm việc trong một môi trường đầy đủ các thiết bị, phần mềm từ chuyên môn cho đến hỗ trợ. Đồng thời, công nghệ chính là yếu tố dẫn dắt con người xử lý các yêu cầu bảo trì, khắc phục các sự cố và đảm bảo rằng công nghệ của công ty đang được vận hành một cách hiệu quả.

Mối quan hệ giữa các yếu tố

Sự đan xen và kết hợp

Đây là điều mà các nhà tuyển dụng nhân sự đang tiến hành thực hiện. Mặc dù mỗi bộ phận có chức năng và chuyên môn riêng, nhưng họ liên tục hỗ trợ nhau để làm thế nào tuyển dụng được một nguồn lực nhân sự hiệu quả.

Nếu yếu tố văn hóa cho phép tạo ra một không gian làm việc giúp nâng cao giá trị văn hóa công ty theo chiều hướng tích cực thì sự kết hợp giữa HR và IT chịu trách nhiệm cung cấp cái nhìn sâu sắc giúp nhân viên định hình về những gì họ cần phải làm.

Ví dụ, yếu tố không gian quyết định việc nhận viên đồng ý lựa chọn đồng hành cùng công ty. Lúc này, sự kết hợp giữa Nhân sự và IT cho phép họ nhận thấy rõ hơn điều gì mình cần làm. IT giúp hỗ trợ các đầu công việc; mỗi công cụ, những chương trình về công nghệ sẽ được phân chia tương ứng với từng loại công việc nhân sự khác nhau. Điều đó giúp họ xác định rõ công việc mà mình được giao phó.

HR & IT

Ngoài ra, khi nhân viên đánh giá về khả năng đồng hành cùng doanh nghiệp, họ cũng dựa vào khả năng kết hợp giữa các ứng dụng công nghệ vào các hoạt động nhân sự. Ví dụ như  bạn cần phải hiểu các yêu cầu về không gian để truy cập cáp hoặc Wi-Fi. Công nghệ có thể giúp bạn giải quyết vấn đề thay đổi của lực lượng lao động: Có chuyển từ máy tính để bàn sang máy tính xách tay không? Cần các thiết bị di động mới hoặc khác nhau? Đây đều là mối quan tâm của nhân viên.

Nâng cao trải nghiệm của nhân viên

Liệu bạn sẽ nghĩ rằng có bao nhiêu nhân viên thường xuyên bị thất vọng bởi những hạn chế về công nghệ tại tổ chức của mình? Dịch vụ bị ngừng hoạt động dẫn đến tình trạng làm chậm hoặc trì hoãn hoàn toàn công việc; phần mềm hoạt động bị lỗi, phải sửa thậm chí phải cập nhất nhiều lần nhưng vẫn không hiệu quả.

Hệ quả là, ảnh hưởng đến tiến độ thực hiện, tác động xấu đến sự phát triển lâu dài của tổ chức. Vì vậy, sẽ không quá khó hiểu để nói rằng HR và IT có thể giúp nâng cao những trải nghiệm của nhân viên. Với sự hiểu biết đầy đủ về các thiết bị công nghệ mà công ty bạn cung cấp, HR có thể hỗ trợ những chương trình, khóa học đào tạo phù hợp để nhân viên có thể sử dụng công nghệ đó, giúp phát huy tối đa tiềm năng trong công việc của mình.

Lời kết

Tóm lại, cả 3 yếu tố về không gian, HR và IT đều có những ý nghĩa nhất định. Chúng là sự kết hợp hoàn hảo giữa không gian văn hóa, tính chất vật lý, xã hội nảy sinh từ yếu tố nhân sự và cả khả năng thích với kỹ thuật số. Hơn hết, cả ba đã góp phần xây dựng nên cái gọi là văn hóa của công ty, những hoạch định cụ thể về việc phát triển chiến lược nhân sự đồng thời thực hiện các mục tiêu thu hút, đào tạo và giữ chân các nhân tài.

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

Xem thêm Việc làm TOP IT Jobs trên TopDev

Cách để tạo một Switch trên iPhone bằng HTML và CSS

Cách để tạo một Switch trên iPhone bằng HTML và CSS

1. Những thành phần trong Switch được tạo bằng HTML và CSS:

Cách để tạo một Switch trên iPhone bằng HTML và CSS

Ngoài 3 thành phần đã  được chỉ ra trong ảnh thì còn một thành phần cực kỳ quan trọng nữa đó là một checkbox (đã được ẩn đi), checkbox có tác dụng xác định trạng thái của cái Switch kia.

Các thẻ trong HTML mà chúng ta cần:

  • label : Thẻ lable sẽ tương ứng với thành phần container như trên hình, được sử dụng để: Tạo một cái khung để bao bọc các thẻ thẻ còn lại, giúp cho các thẻ xác định vị trí cũng như kích thước và cuối cùng là tạo truy cập tới checkbox.
  • input: Thẻ input có kiểu là checkbox sử dụng để xác định trạng thái của switch.
  • span: Thẻ span sẽ dùng để tạo background và mask như trong hình.

2. Tiến hành code:

– Cấu trúc HTML:

<html> <label class="container"> <input type="checkbox"> <span class="background"></span> <span class="mask"></span> </label> </html>

– Code CSS cho thành phần “Container”:

.container { display: block; /* Xác định kiểu hiển thị có dạng là block */ position: relative; /* Xác định vị trí của phần tử là tuyệt đối */ width: 55px; height: 30px; margin: 50px auto; /* Phần tử cách lề trên 50px và căn giữa 2 bên */ }

Giải thích code: display: block; vì thẻ label là một thẻ có kiểu hiển thị là inline nên không thể sử dụng width, height để xét kích thước cho phần tử vì thế chúng ta cần chuyển kiểu hiển thị của nó sang block để có thể xét kích thước cho nó.

– Code CSS cho thẻ <input>:

.container > input[type = checkbox] { display: none; }

Giải thích code: container > input[type = checkbox] truy cập tới thẻ input nằm trong container có type là checkbox sau đó tắt hiển thị của cái input này (display: none;).

– Code CSS cho thành phần “Background”:

.background { display: block; position: absolute; /* Xác định vị trí của phần tử là tuyệt đối so với phần tử bao ngoài */ width: 100%; height: 100%; background-color: white; border-radius: 30px; /* Xác định độ bo cong góc của phần tử */ transition: 0.25s; /* Xác khoảng thời gian để phần tử biến đổi trạng thái */ border: 2px solid #eeeeee; /* Xác định đồ dầy viền là 2px, có kiểu nét liền và có màu #eeeeee*/ }

Giải thích code:

  • position: absolute; xác định vị trí của phần tử là tuyệt đối so với phần tử bao ngoài, nhờ đó chúng ta có thể sử dụng các thuộc tính như top, left, right, bottom để xác định vị trí của phẩn tử so với phần tử bao ngoài có position là relative (ở đây chính là phần tử container).
  • transition: 0.25s; xác định khoảng thời gian để phần tử biến đổi từ trạng thái hiện tại sang trạng thái mới là 0.25 giây.

– Code CSS cho thành phần “Mask”:

.mask { display: block; position: absolute; width: 30px; height: 30px; background-color: white; box-shadow: 1px 1px 3px silver; border-radius: 50%; /* Bo cong các góc để phần từ chuyển từ hình vuông sang hình tròn */ left: 2px; /* Cách lề trái của phần tử container 2px */ top: 2px; /* Cách lề trên của phần tử container 2px */ transition: 0.25s; cursor: pointer; /* Xác định kiểu hiển thị của con trỏ chuột khi rê con trỏ chuột vào phần tử là pointer */ }

Giải thích code: cursor: pointer; khi chúng ta rê chuột vào phần từ thì kiểu hiển thị của con trỏ chuột sẽ chuyển sang dạng bàn tay giống như khi chúng ta rê chuột vào một đường link vậy.

– Code CSS cho phần sự kiện On và Off switch:

.container > input[ type = checkbox ]:checked + .background { background-color: #4cd964; border-color: #4cd964; }

Giải thích code: Nếu như checkbox được chọn (checked) thì phần tử nằm ngay sau nó có tên class là “background” (ở đây là phần tử background) sẽ được cập nhật các thuộc tính trong ngoặc nhọn vậy nên phần tử background sẽ được cập nhật lại background-color và border-color và khi checkbox không được chọn nữa thì các giá trị của các thuộc tính của background sẽ quay lại giá trị ban đầu.

.container > input[ type = checkbox ]:checked ~ .mask { left: 27px; }

Giải thích code: Tương tự câu trên chỉ khác là câu lệnh selector sẽ thay dấu + thành dấu ~, dấu + để chọn phần tử ngay sau còn dấu ~ sẽ chọn tất cả các phần tử nằm sau checkbox có tên class là “mask”.

Trên đây là phần code, để có thể xem được kết quả các bạn có thể vào đây để xem nhé.

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

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

Xem thêm các IT Jobs Developer hấp dẫn tại TopDev

Tìm hiểu về Time Zone

Tìm hiểu về Time Zone

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

Cùng luận bàn những vấn đề liên quan đến time zone

Như Việt Nam chúng ta thì giá trị time zone chỉ có một GMT+7, với những nước to bự như Mỹ, Canada, Nga thì có phải tới vài ba cái time zone trong cùng một nước ( ko hiểu sao Trung Quốc thì chỉ có 1 giá trị Time zone, nên nhiều khu vực ở Trung Quốc mặt trời mọc lúc 10 AM)

GMT, UTC và Offset

GMT (Greenwich Mean Time) là thời gian tính theo cái đồng hồ Royal Observatory ở Greenwich, UK

UTC là một hệ thống tính toán thời gian quốc tế hơn, giá trị chuẩn xác hơn và được sử dụng rộng rãi hơn trong lập trình.

Offset

Giá trị +09:00 trong UTC+09:00 nghĩa là giờ địa phương đang trước mốc giờ chuẩn UTC 9 tiếng, khoảng khác biệt giữa giờ địa phương và giờ lấy làm mốc đó gọi là offset.

Một vài nước thích đặt tên time zone của mình theo tên riêng luôn, như Hàn Quốc thì nó là KST = UTC+09:00, giá trị time zone này cũng là giá trị của Nhật, Indo, và vài nước khác.

Giá trị offset lại ko phải căn cứ theo giờ, mà có thể chứa cả phút nữa, như Bắc Hàn thì dùng +08:30, Úc +08:45+09:30 một số vùng

Time zone !== offset

Đôi khi chúng ta hay dùng time zone và offset mang ý nghĩa tương tự nhau, như vậy thì chưa chuẩn xác. Lý do:

Summer time (DST)

Khái niệm này sẽ không gặp ở nhiều nước, đa phần các nước ở châu u sẽ dùng đến thuật ngữ “Summer time” này, nó có tên khoa học khác là Daylight Saving Time (DST) nghĩa là trong mùa hè thời gian nó sẽ đi trước một tiếng so với giờ chuẩn

Lấy một ví dụ, California USA dùng PST ( Pacific Standard Time) trong mùa đông và PDT (Pacific Daylight Time, UTC-07:00) trong mùa hè. Những khu vực sử dụng 2 time zone như vậy gọi là Pacific Time (PT)

Câu hỏi tiếp theo là như vậy căn cứ vào đâu để tính mùa hè và mùa đông bắt đầu/kết thúc. Phủ phàng là giá trị ngày DST ở các nước khác nhau là khác nhau và vào các năm khác nhau cũng khác nhau nốt. Như ở Canada và Mỹ, DST tính từ 2:00AM ngày chủ nhật đầu tiên của tháng 4 cho tới 12:00AM ngày chủ nhật cuối cùng tháng 10 cho tới năm 2006, nhưng sang năm 2007, thì nó từ 2:00AM ngày chủ nhật thứ 2 của tháng 3 đến 2:00AM ngày chủ nhật đầu tiên tháng 11

Time zone vui vui nó lại đổi

Nếu bạn thấy như vậy đã đủ phức tạp, thì bạn chưa biết gì đâu, Time zone nó còn phụ thuộc vào cả tình hình kinh tế, chính trị của một nước. Cụ thể năm 2007, tổng thống George Bush ký thỏa thuận năng lượng hồi năm 2005, làm giá trị DST này thay đổi trong năm 2007.

Vì quá rắc rối và phức tạp, Nga và Hy Lạp đã ko dùng luôn DST từ năm 2011

Trước đây Samoa sử dụng UTC-10:00, nhưng sau này nó chuyển sang UTC+14:00 để cắt giảm các thương vụ thất bại với Úc và New Zealand vì sự khác nhau về time zone. Vụ này lên báo toàn thế giới năm 2011, vì nó mất đi hẳn một ngày 30 tháng 12 để điều chỉnh time zone

Time zone trong môi trường Server-Client

Bây giờ hình dung bạn làm một cái app để lên lịch công việc, bạn lấy giá trị thời điểm user. Chọn ở phía client truyền xuống server rồi lưu lại giá trị đó, sau đó giá trị này được hiển thị lên phía client

Chuyện sẽ ra sao nếu client truy xuất từ những time zone khác nhau. Thí dụ lúc tạo lịch ở Việt Nam, nhưng sau đó nó đi công tác ở Mỹ rồi mở lên xem, giá trị lưu ở phía server phải là giá trị cố định và ko phụ thuộc time zone. Như vậy client chỉ cần làm việc là hiển thị giá trị đó đúng với time zone hiện tại.

Ngoài ra, lúc user tạo một mốc thời gian, chúng ta cũng chuyển nó qua đơn vị Unix time theo chuẩn ISO-8601 để chứa luôn thông tin offset 2017–03–10T11:30:00+09:00. Cái chúng ta làm đó thuật ngữ chuyên ngành hay dùng 2 từ để mô tả là parsing và formatting

Đối tượng Date trong javascript

Trong native javascript, chúng ta có đối tượng Date để làm việc với kiểu date, nhưng chắc không dev nào chịu xài đâu, vì nó có rất nhiều vấn đề, nên đa phần đều dùng thêm 1 thư viện bổ sung, đọc thêm bài Vì sao quần hùng kéo nhau không xài moment.js nữa

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

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

Xem thêm các tuyển dụng IT mới nhất hấp dẫn tại TopDev

 

Cách mạng 0.4 của Neovim: Floating Window

Cách mạng 0.4 của Neovim: Floating Window

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

Trước khi bắt đầu: Nếu vì lý do gì đó mà bạn quyết định không đọc bài viết này vì bạn đang xài VSCode và thấy nó đủ xịn với bạn rồi, thì hãy suy nghĩ lại, đọc bài này, và tải về phiên bản Vim mình đã build. Nó không chỉ có mọi thứ hay ho mà VSCode có, mà còn có nhiều thứ khác xịn hơn mà VSCode không hề có.

Neovim từ phiên bản 0.4 có một chức năng cực kì hay ho đó là floating windows, giúp hiển thị một buffer ở bất kì vị trí nào trên màn hình. Nên nhớ là chúng ta đang nói đến Neovim, một editor hoạt động trên terminal, nơi mà mọi thứ chỉ là text và không hề có các khái niệm về giao diện đồ họa.

Sau khi chức năng này được release thì cộng đồng Neovim đã adopt nó khá nhanh, rất nhiều plugin áp dụng nó khá hiệu quả ví dụ như coc.nvim hay denite.nvim.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về floating window thông qua việc build một chức năng giúp cho Neovim có thể mở nhanh một cửa sổ terminal emulator, nằm floating trên màn hình. Mình thường dùng chức năng này khi cần thực hiện nhanh một thao tác nào đó như tạo git branch, push hoặc pull code mà lười xài Tmux.

Tìm hiểu API của Neovim

Neovim đã có sẵn terminal emulator built in, đó là lệnh :terminal, khi chạy lệnh này, cửa sổ hiện tại sẽ được thay thế bằng một terminal buffer. Vậy, ý tưởng sẽ là: Tạo một cửa sổ mới, làm cho nó float ở giữa màn hình và chạy lệnh :terminal trong đó.

Theo như document về floating windows để tạo một floating window, chúng ta cần hai thứ: 1) một buffer và 2) gọi hàm nvim_open_win() trên buffer đó.

Để tạo mới một buffer, ta có thể dùng hàm nvim_create_buf(). Kết hợp hai hàm này với nhau như thế này:

let buf = nvim_create_buf(v:false, v:true) let opts = { \ 'relative': 'cursor', \ 'width': 10, 'height': 2, \ 'col': 0, 'row': 1, \ 'anchor': 'NW', \ 'style': 'minimal' \ } let win = nvim_open_win(buf, 0, opts)

Nói qua về đối tượng opts, đây là các thông số thiết lập cho cửa sổ sẽ được tạo, có mấy thông số cần nói tới như là:

  • relative: cho biết cửa sổ mới sẽ có tọa độ dựa trên đối tượng nào, nếu là editor thì tọa độ sẽ dựa trên toàn bộ màn hình Vim, là win thì tọa độ sẽ dựa trên split window hiện hành, là cursor thì tọa độ sẽ dựa trên vị trí con trỏ hiện tại (dùng trong trường hợp làm autocomplete chẳng hạn).
  • style: hiện chỉ nhận 1 giá trị là minimal, nếu truyền giá trị này thì các thành phần như line number, cursor line,… sẽ được ẩn đi hết.
  • Mấy thông số như widthheight chắc khỏi cần nói tới.
  • Còn col và row là để chỉ định tọa độ ban đầu của cửa sổ.

Cả hai hàm nvim_create_buf() và nvim_open_win() đều trả về id của buffer / floating window vừa tạo ra, chúng ta sẽ dùng các id này khi cần thực hiện các thao tác thiết lập khác.

First implementation

Như vậy, chúng ta đã biết cần phải sử dụng những hàm nào trong API của Neovim để có thể implement chức năng floating terminal. Cụ thể các bước cần thực hiện là:

  1. Tạo một buffer mới
  2. Tạo floating window từ buffer này
  3. Khởi động terminal emulator trên buffer vừa tạo với lệnh :terminal

Ngoài ra, chúng ta muốn cửa sổ được tạo ra phải nằm chính giữa màn hình, trong trường hợp này, Neovim có hai biến &lines và &columns cho chúng ta biết kích thước của toàn bộ màn hình Neovim là bao nhiêu, để có thể tính toán ra các giá trị widthheightrow và col thích hợp.

Cách mạng 0.4 của Neovim: Floating Window

Mặc định, sau khi khởi tạo terminal trong một buffer, thì buffer đó vẫn còn trong chế độ Normal Mode, để tiện hơn chúng ta có thể dùng lệnh startinsert, đưa buffer đó vào chế độ Insert Mode luôn.

Implement như sau (chắc không nói thì các bạn cũng biết là chúng ta đang gõ vào file init.vim):

function! OpenFloatTerm() let height = float2nr((&lines - 2) / 1.5) let row = float2nr((&lines - height) / 2) let width = float2nr(&columns / 1.5) let col = float2nr((&columns - width) / 2) let opts = { \ 'relative': 'editor', \ 'row': row, \ 'col': col, \ 'width': width, \ 'height': height, \ 'style': 'minimal' \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) terminal startinsert endfunction

Xong rồi, giờ reload Neovim và chạy thử, kết quả sẽ như hình:

:so % | call OpenFloatTerm()

Cách mạng 0.4 của Neovim: Floating Window

Trông cũng xịn phết! Nhưng mà hơi xấu một tí.

Hiện tại thì Neovim chưa hỗ trợ các thành phần như margin, padding hay border cho floating windows, nên nhìn cái cửa sổ terminal hiện lên chưa đã con mắt cho lắm.

Trong phần tiếp theo, chúng ta sẽ cùng tìm cách fix.

Second implementation: Cải tiến giao diện

Có một trick, hơi hacky một tí để giải quyết vấn đề padding đó là tạo một cửa sổ to hơn nằm bên dưới cửa sổ terminal hiện tại, trông như thế này:

Cách mạng 0.4 của Neovim: Floating Window

Lưu ý, vì Neovim là môi trường text mode, một ô trên màn hình sẽ là một hình chữ nhật đứng, có tỉ lệ gần như là 1:2, nên việc tính lại tọa độ cũng như kích thước của cửa sổ làm border cũng sẽ được thực hiện với tỉ lệ 1:2.

Tọa độ của cửa sổ border sẽ nằm về phía trên và bên trái của cửa sổ terminal, tương tự kích thước của cửa sổ border cũng sẽ dài và cao hơn cửa sổ terminal:

column border=column main−2row border=row main−1width border=width main+4height border=height main+2column border=column main−2row border=row main−1width border=width main+4height border=height main+2

Hàm OpenFloatTerm() bây giờ sẽ có 2 bước:

function! OpenFloatTerm() let height = float2nr((&lines - 2) / 1.5) let row = float2nr((&lines - height) / 2) let width = float2nr(&columns / 1.5) let col = float2nr((&columns - width) / 2) " Border Window let border_opts = { \ 'relative': 'editor', \ 'row': row - 1, \ 'col': col - 2, \ 'width': width + 4, \ 'height': height + 2, \ 'style': 'minimal' \ } let border_buf = nvim_create_buf(v:false, v:true) let border_win = nvim_open_win(border_buf, v:true, border_opts) " Main Window let opts = { \ 'relative': 'editor', \ 'row': row, \ 'col': col, \ 'width': width, \ 'height': height, \ 'style': 'minimal' \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) terminal startinsert endfunction

Giờ chạy thử xem:

Cách mạng 0.4 của Neovim: Floating WindowCách mạng 0.4 của Neovim: Floating WindowCách mạng 0.4 của Neovim: Floating Window

Trông có vẻ thuận con mắt hơn tí rồi. Nhưng mà chúng ta lại gặp bug! Khi đóng cửa sổ terminal thì cửa sổ border nó vẫn còn nằm yên không chịu biến mất.

Nguyên nhân thì rõ ràng, chúng ta chỉ tương tác với cửa sổ terminal mà không làm gì cửa sổ border hết. Để giải quyết vấn đề này, chúng ta có hàm nvim_close_win(), dùng để đóng một cửa sổ bất kì, ta có thể gọi hàm này khi cửa sổ terminal bị đóng.

Làm sao để biết khi nào cửa sổ terminal bị đóng?

Lại tra tài liệu, chúng ta sẽ thấy sự kiện TermClose được gọi khi chúng ta rời khỏi chế độ Terminal. Để bắt sự kiện này, ta dùng lệnh autocmd, như thế này:

autocmd TermClose * ++once :q | call nvim_win_close(<window-id>, v:true)

Tham số * ở đây có nghĩa là lệnh áp dụng cho mọi buffer, tham số ++once sẽ làm cho lệnh này chỉ thực thi 1 lần. Đồng thời, khi terminal bị tắt, Neovim sẽ không đóng buffer chứa terminal đó đi, mà hiện dòng chữ [Process exited 0], chúng ta phải gửi thêm lệnh :q để đóng nó.

Đây là implementation hoàn chỉnh:

function! OpenFloatTerm() let height = float2nr((&lines - 2) / 1.5) let row = float2nr((&lines - height) / 2) let width = float2nr(&columns / 1.5) let col = float2nr((&columns - width) / 2) " Border Window let border_opts = { \ 'relative': 'editor', \ 'row': row - 1, \ 'col': col - 2, \ 'width': width + 4, \ 'height': height + 2, \ 'style': 'minimal' \ } let border_buf = nvim_create_buf(v:false, v:true) let s:border_win = nvim_open_win(border_buf, v:true, border_opts) " Main Window let opts = { \ 'relative': 'editor', \ 'row': row, \ 'col': col, \ 'width': width, \ 'height': height, \ 'style': 'minimal' \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) terminal startinsert " Hook up TermClose event to close both terminal and border windows autocmd TermClose * ++once :q | call nvim_win_close(s:border_win, v:true) endfunction

Và đây là thành phẩm:


Hy vọng qua bài viết này, các bạn sẽ hiểu được phần nào chức năng Floating Windows của Neovim, cũng như những ứng dụng mà nó mang lại. Từ đầu tới giờ viết dông dài vậy thôi chứ nếu bạn chỉ xài Vim như là một user bình thường thì không cần đọc bài này đâu.

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

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

Xem thêm các IT Jobs for Developer hấp dẫn tại TopDev

Vì sao quần hùng kéo nhau không xài moment.js nữa

Vì sao quần hùng kéo nhau không xài moment.js nữa
Bài viết được sự cho phép của tác giả Lưu Bình An
Tất cả chúng ta đã từng và đang sử dụng moment.js mà ko hề dành chút thời gian để xem nó ảnh hưởng như thế nào đến performance

Trước đây khi nhắc đến thư viện xử lý ngày tháng, là trong đầu mọi developer frontend sẽ nghĩ ngay tới Moment.js, tuy nhiên dạo gần đây, đâu đâu cũng nghe cũng thấy đến các bài viết khuyên chúng ta bỏ ngay moment.js hoặc ít nhất là xài một cách cẩn trọng hơn.

Thằng Date object build sẵn của javascript thì ko đủ xài. Sớm hay muộn chúng ta cùng cần đến một thư viện thứ 3 để làm việc với ngày tháng, và lựa chọn hiển nhiên trước đây là moment.js. Một thư viện tất cả trong một, giải quyết tuốt tuồn tật các vấn đề liên quan đến ngày tháng.

Vậy tại sao bây giờ người ta chê nó?

Nó quá chậm

Trong quá trình thực hiện optimize cho dự án, tác giả bài này (ko phải mình nhé) đã phát hiện ra rằng, phần lớn những chổ tắt nghẽn là ở chỗ parsing ngày chuẩn ISO8601 từ database, cụ thể là hàm moment(ISO8601_DATE_HERE), khá là sốc với kết quả này, vì ko dùng bất cứ một định dạng đặc biệt nào, một input chuẩn ISO bình thường, nếu mà dùng moment(new Date(ISO8601_DATE_HERE)) thì nhanh hơn gấp 7 lần.

Thực hiện test và so sánh với một số thư viện khác

Vì sao quần hùng kéo nhau không xài moment.js nữa

Parsing giá trị ISO 8601

Moment.js tốn khoảng 9 giây để parse 100.000 giá trị ngày ISO8601, trong khi đó Day.js chỉ mất .5 giây, các API cung cấp khá giống nhau, tuy nhiên thằng Day.js khôn hơn, nó xác định giá trị z ở cuối string, nếu có nó sẽ gọi new Date(string). Trong khi Moment.js, Luxon và JS-Joda sử dụng một regex của từng thằng để làm.

Lưu ý không dùng Day.js hay Date-Fns nếu bạn cần hỗ trợ IE9, hy vọng là bạn không xui tới vậy, từ ES5 thì Date.parse mới làm việc tốt với ISO 8601

Parsing giá trị EPOCH

Kết quả parse EPOCH Time thì các thư viện cho kết quả tương đương, tuy nhiên nếu bạn là đứa nghiện tốc độ, khuyến nghị sử dụng Date-Fns

Format

Về vấn đề format, các thư viện lại gần như ko cung cấp hàm nào cả, đa phần tụi nó sẽ dùng regex để thực hiện. Riêng thằng JS-Joda sử dụng một hàm trong đó nó ì các kiểu để kiểm tra, rồi charAt nên nhanh hơn một chút so với những thằng dùng regex

Tính toán

Các phép toán trên ngày tháng đúng là lằn xà ngoằn, moment.js làm khá tốt hơn hẳn Day.js và Luxon, tuy nhiên vô đối vấn là JS-Joda trên vụ này.

So sánh

Kiểm tra 2 giá trị ngày có là bằng nhau tương đối phức tạp hơn so sánh 2 ngày có lớn hơn nhau, bởi vì chúng ta không thực hiện so sánh giá trị khoảng thời gian (timestamps) Mấy thư viện khác ngoài Luxon có vẻ ok, không rõ vì sao Luxon lại lấp vấp vụ này.

Nó quá nặng

Vì sao quần hùng kéo nhau không xài moment.js nữa

Moment.js dung lượng khoảng 232kB (zip lại thì cỡ 66 kB), mà theo Yoshihide Jimbo thì có thể cắt bớt chỉ còn 68 kB ( 23 kB zip) bằng cách loại bỏ locale.

JS-Joda chỉ nhẹ hơn Moment.js chút xíu, tuy nhiên do nó cũng là thư viện nặng vì phải chứa period và time zone, 2 thằng này dùng Moment.js bạn phải cài thêm dạng plugin

Mấy thằng còn lại như Luxon, Day.js, Date-Fns thì nhẹ khỏi nói, ít nhất cũng phải nhẹ hơn 22 lần so với moment.js

Nếu bạn đang dùng moment.js ở Backend thì ko sợ nhiều, chứ còn ở Frontend thì 1kb cũng có giá của nó.

Nó Mutable

Ví dụ bạn đang làm một cái app lịch hiển thị những sự kiện sắp diễn ra.

const startedAt = moment() const endedAt = startedAt.add(1, 'year') console.log(startedAt) // > 2020-02-09T13:39:07+01:00 console.log(endedAt) // > 2020-02-09T13:39:07+01:00

startedAtendedAt đều là mutable (có thể thay đổi), rõ ràng chúng ta không muốn giá trị của startedAt bị thay đổi sau khi gọi hàm add

const init = moment() const add = init.add(1, 'year') const sub = init.subtract(10, 'months') const start = init.startOf('year') const end = init.endOf('year') const utc = init.utc() const local = init.local() const offset = init.utcOffset(480)

Tất cả đống biến này đều trỏ tới cùng 1 object. Giải quyết cũng đơn giản

const startedAt = moment() const endedAt = moment(startedAt).add(1, 'year')

Khi dùng Moment.js luôn nhớ dùng cách này để tạo một instance mới

Quá khó để debug

Nếu giá trị input đẹp đẽ, sạch sẽ, mọi việc đều sẽ trót lọt (ko tính đến vụ mutation nhé). Tuy nhiên đời mà ai lại ko có lỗi lầm

Giờ chúng ta thử ví dụ, có object là. person { lastVisitedAt }

const person = { lastVisitedAt: '2017-11-11T00:00:00.000Z' } moment(person.lastVsitedAt).format() // > '2019-02-08T16:01:45+01:00'

Nếu bạn lỡ gõ nhầm tên property như vậy đi lastVsitedAt, thì moment(undefined) cũng không throw error luôn.

Giờ thử đưa mấy giá trị lạ lạ như sau vào moment()

moment().format() // > 2019-02-08T17:07:22+01:00 moment(undefined).format() // > 2019-02-08T17:07:22+01:00 moment(null).format() // > Invalid date moment({}).format() // > 2019-02-08T17:07:22+01:00 moment("").format() // > Invalid date moment([]).format() // > 2019-02-08T17:07:22+01:00 moment(NaN).format() // > Invalid date moment(0).format() // > 1970-01-01T01:00:00+01:00

Moment.js ko throw error mà chỉ trả về Invalid Date object

Khi gọi toISOString() nó lại lạ kỳ trả về null chứ ko phải chuỗi Invalid Date

moment().toISOString() // > 2019-02-08T16:14:10.835Z moment(undefined).toISOString() // > 2019-02-08T16:14:10.835Z moment(null).toISOString() // > null moment({}).toISOString() // > 2019-02-08T16:14:10.836Z moment("").toISOString() // > null moment([]).toISOString() // > 2019-02-08T16:14:10.836Z moment(NaN).toISOString() // > null moment(0).toISOString() // > 1970-01-01T00:00:00.000Z

Nói cách ngắn gọn, undefined không hợp lệ trong moment(), nhưng null thì ok. Bị lỗi ư, nó trả về một Invalid Date objectnull hoặc custom object tuỳ vào nó vui hay buồn.

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

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

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

Đồng hành và gắn bó với một công ty, bao lâu là đủ?

Những nhận định về thời gian làm việc, đồng hành và gắn bó với một tổ chức luôn là vấn đề mà nhiều nhân viên quan tâm. Đặc biệt là những “lính mới” vừa gia nhập chuyến hành trình nghề nghiệp.

Một câu hỏi lớn đặt ra là liệu bản thân mình sẽ gắn bó với công ty trong bao lâu. 1 năm, 2 năm hay nhiều hơn. Tất nhiên đó chỉ là những con số mang tính ước định. Cùng TopDev đi tìm lời giải đáp cho vấn đề này.

“Kịch bản” nào tốt nhất cho sự rời đi?

Mỗi cá nhân sẽ có những suy nghĩ riêng về các mốc thời gian tương ứng cho sự rời đi của mình. Đó có thể là chỉ là sự hình dung thời khoảng thời gian mà mỗi nhân viên có thể đồng hành và gắn bó cùng công ty. Song song đó là những phân tích, sự nhìn nhận chung mà bản thân nhân viên rút ra được để làm hài lòng “kịch bản” cho riêng mình.

đồng hành

Có lẽ 6 tháng đến 1 năm?

Đây có thể là quyết định bất ngờ, nảy ra trong chớp nhoáng hoặc khi bạn phải trải qua quá nhiều áp lực công việc chăng?

Áp lực có thể đến từ khối lượng công việc, mức phúc lợi, môi trường làm việc, các mối quan hệ công sở,..tất tần tật mọi yếu tố đó đều có thể dễ khiến nhân viên nản chí. Điều này chứng tỏ họ là một cá thể “cả thèm chóng chán”, thiếu năng lực thích nghi và vì thế họ nhảy việc liên tục. Họ thiếu nghị lực và sự cố gắng cần có, vì thế họ sẽ khó thành công.

3 – 5 năm tại một công ty thì sao?

Chúng ta sẽ có hai khía cạnh cần xem xét. Trong trường hợp nếu bạn được đảm nhận nhiều vị trí khác nhau hoặc có sự thăng tiến riêng thì khả năng đồng hành và gắn bó sẽ cao hơn. Khi đến một giai đoạn không còn đủ niềm vui trong công việc, bạn buộc phải dừng lại và tìm kiếm những điều mới mẻ, phù hợp hơn với mình.

Còn ngược lại thì sao? Bạn sẽ tự nghi ngờ về khả năng, sự phù hợp của mình với công việc và doanh nghiệp mình đang đồng hành. Hàng tá câu hỏi sẽ xoay quanh bạn: Mình chưa đủ nỗ lực sao? Có lẽ mình không còn biết làm thế nào để phát triển bản thân cả?,.. 

Cho dù bạn rời đi, đó cũng là quyết định của bạn nhưng nhớ, đừng bao giờ để bản thân mình phải đến mức thật sự tuyệt vọng vì cuộc sống này còn nhiều thứ còn khắc nghiệt hơn.

Trên 10 năm có phải là một sự gắn bó trọn vẹn nhất?

Con số 10 nó không là gì khi đặt nó trong phạm trù toàn học. Tuy vậy, khi suy xét ngoài thực tế, 10 năm là một quá trình làm việc dài, đòi hỏi ở bạn nhiều sự kiên trì, đôi lúc phải đánh đổi nhiều thứ về thời gian, công sức, các mối quan hệ để có được một chỗ đứng, vị thế như hiện tại.

đồng hành

Và tất nhiên, chúng ta sẽ đề cập đến những người với bề dày kinh nghiệm thuộc hàng top, họ đã được có cơ hội thử sức và trải nghiệm với nhiều vị trí khác nhau từ thấp đến cao. Vậy liệu họ có nên chuyển công ty trong giai đoạn này? Có hoặc không tùy thuộc vào mỗi người. 

Trên thực tế, họ là những người đã có chuyên môn vững chắc, nền tảng nghề nghiệp tốt nhưng cái họ mất đi chính là sự mạo hiểm và dấn thân – cái mà tuổi trẻ họ đã từng làm. Họ e ngại rằng khi qua một công ty khác với một thế hệ trẻ hơn, năng động hơn, tiếp cận với một lối văn hóa, môi trường làm việc khác họ sẽ khó thích nghi. Khoảng cách về tuổi tác và kinh nghiệm có thể sẽ làm họ shock và khó có thể trụ lại được. 

Đâu là câu trả lời lý tưởng cho vấn đề này?

Nếu tất cả các dấu hiệu xung quanh bạn đều chứng tỏ rằng bạn đã chọn sai công việc, thì việc lựa chọn đổi việc là điều đúng đắn và cần thiết phải diễn ra. Miễn là, khi nhảy việc có ý nghĩa thật sự với mục tiêu công việc tổng thể và dài hạn của bạn. Nếu được lựa chọn, bản thân chủ bài viết này sẽ chọn khoảng thời gian từ 1-2 năm để gắn bó và hợp tác, tất nhiên trước đó phải có 2 hoặc 3 tháng để trải nghiệm, tìm hiểu công ty thông qua quá trình thử việc.

Ngoài ra, việc nhìn nhận luôn luôn là điều cần phải lưu tâm, nếu mình nhận thấy cá nhân mình tạo được những giá trị và được tổ chức công nhận, mình sẽ tiếp tục gắn bó và lập kế hoạch hoạt động cho những năm tiếp theo. 

Để có những quyết định chính xác trong vấn đề này, bạn có thể tìm những “lối tắt” cho riêng mình. Hãy đặt ra những câu hỏi: 

  • Bạn đã bao nhiêu lần than vãn về công việc hiện tại của mình?
  • Bạn phải chấp nhận thay đổi cải thiện điều gì khi thực hiện công việc đó?
  • Công việc đó liệu có những triển vọng tốt hơn chăng?

Đây đều là những câu hỏi giả định nhưng chúng có vai trò quan trọng vì giúp bạn đánh giá được mức độ tự nhìn nhận về khả năng chịu áp lực trước các công việc, những đòi hỏi cần phải thích nghi khi quyết định bắt đầu trải nghiệm một công việc mới hoặc những lợi thế, triển vọng phát triển, thăng tiến khi bạn rời đi và gia nhập một “ngôi nhà mới”.

Lời kết

Chuyện nhảy việc đã không còn xa lạ trong môi trường làm việc hiện đại. Nhiều cơ hội luôn mở ra và chờ đón bạn nếu bạn có những quyết phù hợp. Hãy tự hỏi bản thân và đánh giá nhiều yếu tố xung quanh về sự đồng hành và gắn bó trước khi đi đến những quyết định nhảy việc.

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

Xem thêm Top Việc làm ngành cntt trên TopDev

MoMo đầu tư cho nguồn nhân lực trẻ mảng Công nghệ thông tin – Sản phẩm

Phía sau thành công của MoMo – Ví điện tử số 01 Việt Nam trên hành trình phát triển và mang đến người dùng các dịch vụ thanh toán đa tiện ích chính là dấu ấn của đội ngũ nhân lực đầy tài năng. Trong đó, nguồn nhân lực trẻ mảng công nghệ thông tin – sản phẩm được MoMo quan tâm, đầu tư phát triển như “át chủ bài” trước nhu cầu ngày càng cao của thị trường.

Chia sẻ về vai trò của nguồn nhân lực nói chung đối với sự phát triển không ngừng của MoMo những năm gần đây, bà Manisha Shah, Phó Tổng giám đốc cấp cao cho hay:

“MoMo là một tổ chức chuyển động rất nhanh. Với bốn giá trị cốt lõi gồm tinh thần đồng đội, đổi mới sáng tạo, học hỏi không ngừng và thực thi xuất sắc, chúng tôi tìm kiếm những nhân tố biết làm việc theo nhóm, mong muốn kiến tạo, có tài năng và đam mê hướng tới mục tiêu chung. Điều tiên quyết là bạn phải thoải mái với môi trường làm việc thay đổi liên tục để phát triển tại MoMo.” Bà Manisha Shah, Phó Tổng giám đốc cấp cao tại MoMo chia sẻ.

Trong bối cảnh đến năm 2025, theo dự báo của Ngân hàng Nhà nước Việt Nam, tín dụng cá nhân sẽ chiếm khoảng 24% thị trường ứng dụng công nghệ trong dịch vụ tài chính (Fintech). Theo đó, nhu cầu tài chính cá nhân ở Việt Nam được cho là sẽ tiếp tục tăng trưởng khi cách mạng 4.0 bùng nổ mạnh mẽ. Như hệ quả tất yếu, “làn sóng công nghiệp 4.0” này đã mở ra nhiều cơ hội việc làm cho các bạn trẻ tài năng đam mê lĩnh vực công nghệ thông tin và phát triển sản phẩm ở các công ty Fintech. MoMo, ở vị thế Ví điện tử số 01 Việt Nam, vì vậy luôn chú trọng phát triển nguồn nhân lực trẻ, tài năng này.

“MoMo Talents 2020 – Future in your hands” hứa hẹn là bệ phóng phát triển sự nghiệp toàn diện cho các bạn trẻ đam mê công nghệ và phát triển sản phẩm.

Để đón đầu xu hướng tuyển dụng này, những năm qua, chương trình tuyển dụng MoMo Talents được MoMo đầu tư, tổ chức thường niên theo quy mô ngày càng lớn.

Thông tin chương trình MoMo Talents 2020 thu hút nhiều sự quan tâm, tìm hiểu của các bạn sinh viên trẻ, tài năng tại các job fair.

Nhìn lại không khí háo hức chào đón sự trở lại của MoMo Talents mùa thứ 4 lần này từ các bạn sinh viên trẻ, bạn Trần Thị Lạng – Tech Trainee của MoMo Talents 2019 cho hay:

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

“Mình trưởng thành hơn nhiều cả kiến thức chuyên môn lẫn kinh nghiệm sống khi được các anh chị đi trước hướng dẫn, hỗ trợ” Bạn Trần Thị Lạng – Tech Trainee MoMo Talents 2019 chia sẻ về môi trường làm việc tại MoMo.

Trong khi đó, bạn Nguyễn Phi Hùng, Tech Trainee MoMo Talents 2019, hiện đang là Data Engineer ở MoMo, nhắn gửi đến các thí sinh MoMo Talents 2020:

“Hãy tự tin đăng ký tham gia MoMo Talents 2020 bạn nhé. Chỉ cần bạn tự tin, không ngừng học hỏi và có tinh thần trách nhiệm với công việc, dưới sự hướng dẫn hỗ trợ nhiệt tình của các anh chị trong team, chắc chắn bạn sẽ trở thành một “phiên bản” tốt hơn khi tham gia chương trình MoMo Talents đó. Hy vọng sẽ sớm được gặp các bạn tại MoMo.”

Ngày 22/07 vừa qua, MoMo Talents 2020 đã chính thức mở đăng ký tại website: http://career.momo.vn/. Với nhiều đổi mới đầy hấp dẫn, mùa giải thứ 4 của MoMo Talents hứa hẹn sẽ mang đến cho các bạn sinh viên trẻ, tài năng nhiều trải nghiệm thú vị. Cánh cửa đến MoMo – Nơi làm việc tốt nhất châu Á 2020 đã mở cửa, đừng chần chờ nữa, đăng ký ngay bạn ơi!

Một vài ghi chép về lệnh Iterator trong JavaScript

Một vài ghi chép về lệnh Iterator trong JavaScript

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

Một phút dành cho việc tra từ điển liên quan đến Iterator:

  • iterate: make repeated use of a mathematical or computational procedure, applying it each time to the result of the previous application; perform iteration – là từ chỉ một hành động lặp đi lặp lại từng lượt trong một quá trình xử lý/tính toán nào đó.
  • iteration: là từ dùng để nói đến mỗi lần iterate.
  • iterable: là từ dùng để nói đến khả năng iterate của một đối tượng nào đó.

Kể từ sau đây thì mình sẽ dùng những chữ này mà không dịch ra tiếng Việt nữa, lý do là dịch ra thì viết dài dòng, bài đã dài rồi, bớt được gì thì bớt lại chút.


Trong JavaScript, vòng lặp for...of có tác dụng iterate qua nội dung của các đối tượng iterable (iterable objects).

const text = "hello"; // String là một iterable object for (const c of text) { console.log(c); } // Output: "h" "e" "l" "l" "o"

Một đối tượng được coi là iterable nếu như nó thõa mãn iterable protocol, theo đó, nó phải được implement phương thức Iterator @@iterator, hay còn có thể ghi là Symbol.iterator, như này:

a["@@iterator"] = ... // hoặc a[Symbol.iterator] = ...

Hồi xưa các cụ phải xài "@@iterator" vì Symbol chưa được support rộng rãi, tuy nhiên đến bây giờ thì hầu như ai cũng đã hỗ trợ Symbol, tất nhiên là trừ IE ra.

Một vài ghi chép về lệnh Iterator trong JavaScript

Việc implement phương thức [Symbol.iterator] này phải trả về một object thỏa mãn iterator protocol.

const obj = ...; for (const o of obj) { } // không chạy được vì obj không iterable obj[Symbol.iterator] = () => { ... }; for (const o ob obj) { } // giờ thì đã iterable rồi

Một object thỏa mãn giao thức iterator protocol nếu nó có một hàm next(), hà này không nhận vào tham số nào, và trả về một kết quả có dạng:

next() { return { value: ..., done: false }; }

Giá trị của value sẽ là giá trị xuất hiện trong mỗi iteration. Vòng lặp sẽ tiếp tục cho đến khi kết quả trả về có done là true.

Chúng ta có thể dễ dàng tạo ra một object thỏa mãn cả hai giao thức iterable và iterator theo cách sau:

let obj = { next: function() { // ... }, [Symbol.iterator]: function() { return this; } };

Cú pháp như này thì rất ngắn gọn, trông rất ngầu, nhưng mà đọc vô sẽ khó hiểu hơn, nên ở các phần tiếp theo chúng ta sẽ không viết như này nữa, mà viết theo cách khác dễ hiểu hơn (cũng dễ reuse hơn).

Thêm tí, nếu không lặp bằng for...of, chúng ta cũng có thể lặp thủ công như với generator:

let iter; while (iter = iterator.next(), !iter.done) { // ... }

Có thể thấy, iterator là một công cụ giải quyết vấn đề khá là lợi hại, để hiểu rõ hơn, hãy cùng xem qua một vài ví dụ với nó.

Ví dụ: Tách chuỗi

Một vài ghi chép về lệnh Iterator trong JavaScript

Giả sử chúng ta muốn implement một hàm words() cho kiểu dữ liệu String trong JavaScript, theo đó, hàm này sẽ có nhiệm vụ tách chuỗi hiện tại thành một mảng chứa các từ trong chuỗi.

const text = "The quick brown fox jump over a lazy dog";

Đầu tiên, chúng ta cần phải tạo ra một iterator, đây sẽ là một class tên WordIterator, class này sẽ có constructor làm nhiệm vụ tách chuỗi hiện tại thành nhiều từ, bằng hàm String.prototype.split(). Cuối cùng, ta sẽ implement hàm next(), có nhiệm vụ từng bước trả về mỗi từ đã được tách cho đến khi không còn từ nào nữa thì kết thúc.

class WordIterator { constructor(data) { this.data = data.split(/\s/); this.index = -1; } next() { this.index++; if (this.index < this.data.length) { return { value: this.data[this.index], done: false } } return { done: true }; } }

Tiếp theo, chúng ta sẽ implement hàm words() cho kiểu String, trong hàm này, chúng ta sẽ implement phương thức [Symbol.iterator] cho chuỗi đang được xử lý.

String.prototype.words = function() { const iterable = this; iterable[Symbol.iterator] = () => new WordIterator(this); return iterable; };

Ở trên, chúng ta tạo một biến trung gian iterable và implement phương thức [Symbol.iterator] cho biến này thay vì implemen trực tiếp vào kiểu String, vì chúng ta không muốn thay đổi behavior mặc định của kiểu String.

Thế là xong, chạy thử:

for (let word of text.words()) { console.log(word); } // Output: // "The" "quick" "brown" "fox" "jump" "over" "a" "lazy" "dog"

Quá dễ, phải không nào?

Oh, và các bạn biết sao không? Trong cách implement trên, chúng ta đã bỏ qua một thực tế là, kiểu Array đã là một iterable object rồi, để rồi phức tạp hóa cái solution lên  trên thực tế, chúng ta chỉ cần implement hàm words() như này:

String.prototype.words = function() { return this.split(/\s/); }

Ví dụ: Python’s range function

OK, giờ lấy ví dụ khác nhé.

Hẳn các bạn ai cũng đã từng dùng qua Python, hay cũng từng gặp hàm range() hay xrange() của Python. Nếu như các bạn không biết nó là gì, thì nói đơn giản, hàm này tạo ra Đây chỉ là một dạng đơn giản của hàm range(), trên thực tế hàm này còn có nhiều cách sử dụng khác nữa.một dãy số trong phạm vi của hai giá trị đầu vào, ví dụ range(5, 15) sẽ tạo ra dãy số [5, 6, 7,... 14].

Một vài ghi chép về lệnh Iterator trong JavaScript

Chúng ta sẽ mô phỏng hàm này trong JavaScript bằng iterator.

Hàm range() của chúng ta sẽ nhận vào hai tham số, from và to. Với mỗi lượt iterate của hàm next(), chúng ta sẽ tăng giá trị from lên một đơn vị cho tới khinào nó đụng giá trị to.

const range = (from, to) => { return { [Symbol.iterator]: function() { return this; }, next: function() { if (from < to) { from++; return { value: from - 1, done: false }; } return { done: true }; } } };

Ở đây chúng ta cũng sử dụng cú pháp implement kiểu rút gọn như đã nói ở phần trước chứ không cần tạo class, vì ở ví dụ này cũng không phức tạp gì mấy, và mục đích của chúng ta là sử dụng hàm range() luôn nên cũng không cần quan tâm đến chuyện reuse code làm gì.

Và đây là cách sử dụng:

for (const i of range(0, 100)) { console.log(i); }

Nếu để ý kĩ cách implement trên, có thể các bạn sẽ nhận ra là, hàm range() chỉ sinh ra giá trị tiếp theo chỉ khi nào nó được gọi, chứ không phải tạo sẵn ra luôn một dãy các số từ from tới to, đó cũng chính là đặc tính “laziness” của hàm xrange() trong Python.


Ví dụ: Lazy Evaluation

Call-by-need là một đặc điểm của Lazy Evaluation (đối lập với call-by-name, đặc tính chỉ các thanh niên nhanh nhẩu, chỉ cần gọi tên là xuất kích) – một khái niệm từ functional programming, giải thích một cách đơn giản không đầy đủ, thì đây là phương pháp xử lý mà khi ta có các biểu thức nối tiếp nhau, chỉ khi nào biểu thức phía sau cần sử dụng kết quả tính toán từ biểu thức phía trước, thì biểu thức trước mới được thực thi.

Một vài ghi chép về lệnh Iterator trong JavaScript

Giả sử, ta có một hàm evenNumbers() trả về một dãy các số chẵn bắt đầu từ 0, và ta muốn lấy ra n giá trị đầu tiên trong dãy số đó.

const list = evenNumbers();
console.log(list.slice(0, n));

Nếu evenNumbers() là một hàm call-by-name, thì ngay từ sau câu khai báo list, hàm này sẽ được thực thi ngay, và vì evenNumbers() là một hàm không có điểm dừng, chương trình trên sẽ không bao giờ chạy được đến dòng lệnh thứ 2, và nó sẽ treo.

Nếu evenNumbers() là một hàm call-by-need, thì nó sẽ chưa được gọi chừng nào giá trị trả về của nó vẫn chưa cần thiết được sử dụng, và trong trường hợp này, nó chỉ được sử dụng sau khi chúng ta kết thúc câu lệnh slice(), lúc chúng ta in kết quả ra màn hình. Và mặc cho logic của hàm evenNumbers() chạy không có điểm dừng, vì nó là lazy, nên nó chỉ trả về một lượng dữ liệu vừa đủ dùng, trong trường hợp này là n giá trị mà thôi.

Với iterator, ta có thể mô phỏng lại hoạt động của hàm evenNumbers() call-by-need trong JavaScript kiểu như sau, tất nhiên là không hoàn toàn đúng theo mô tả ở trên:

const evenNumbers = () => { let index = 0; return { [Symbol.iterator]: function() { return this; }, next: function() { index+=2; return { value: index, done: false }; }, take: function(n) { let values = []; for (let i = 0; i < n; i++) { values.push(this.next().value); } return values; } } }; console.log(evenNumbers().take(5));

Có thể thấy, ta có thể viết theo cách mà người bình thường không ai điên gì mà làm, đó là code logic của hàm next() không cần có điểm dừng.

Để nói kĩ hơn về Lazy Evaluation, sẽ có một bài viết khác vào một ngày nào đó.


Mặc dù khá là hữu ích, nhưng iterator hiện nay vẫn còn một nhược điểm đó là không thể thực hiện các thao tác bất đồng bộ (asynchronous) được, ví dụ, bạn muốn thực hiện HTTP request trong mỗi iteration, hoặc bạn muốn implement một iterator làm nhiệm vụ đọc một file và trả về từng byte hoặc từng line của file đó. Giải pháp thay thế thì hiện đã có proposal, đó là Async Iteration, và nó đã ở stage 4.

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

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

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

Nắm vững 5 khái niệm sau, xem như master React

nam-vung-5-khai-niem-sau-xem-nhu-master-react
Bài viết được sự cho phép của tác giả Lưu Bình An
Xạo vậy thôi chứ làm gì mà trở thành master React ngay lập tức được, lý lẽ bình thường muốn master bất cứ thứ gì cũng cần mồ hôi và nước mắt. Hiểu được 5 khái niệm được cho là căn cơ nhất này sẽ giúp bạn dễ sa lầy hơn.
  1. Component
  2. JSX
  3. Props & State
  4. Component API
  5. Component Type

Khái niệm #1: React component hoạt động ra sau

Để master React, điều đầu tiên cần nằm lòng là tất cả những gì React xây dựng điều xoay quanh component. Thế thì component là gì. Ví dụ tuyệt vời nhất là select HTML element, select có thể xem như một component được định nghĩa sẵn với kiểu hiển thị riêng của nó (màu xám, có label, nút tam giác nằm ở góc phải) và tự nó xử lý tác vụ đóng mở mấy cái option

Nắm vững 5 khái niệm sau, xem như master React

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

Nắm vững 5 khái niệm sau, xem như master React

Đó là những gì React giúp chúng ta làm, xây dựng một đối tượng không chỉ output ra một HTML templete thông thường,  chúng ta sẽ viết ra những function để control những event trên cái template đó

Để tạo ra một React component căn bản nhất

class MyComponent extends React.component {
 render(){
  return Hello World!;
 }
}

Khái niệm #2: JSX chạy thế nào

Có thể thấy là với cách tạo ra một component như React thì javascript và HTML sống chung một nhà. Vũ khí bí mật của React để làm được chuyện “what-the-heck” đó là JSX language.

Ngày xưa, đi học được dạy phải tách biệt HTML ra một file và JS ra một file, thời gian sau này anh em làm frontend thấy làm gom như vậy làm thấy nhanh hơn, mà cũng không quá evil như mấy ông thầy dạy

class MyComponent extends React.component {
 render(){
returnToday is: {new Data()};
 }
}

Để ý cái cách ta chèn code javascript ở trong HTML bằng cách đưa nào vào bên trong dấu {}, đó là cách viết JSX

Tuyển dụng lập trình viên React lương cao

Khái niệm #3: Props và State

Bạn chắc chắn biết đến attribute href cho thẻ a , chưa biết? về lại w3com học nhé. Với một component của React những attribute như vậy được gọi là props . Props là cách mà các component tương tác lẫn nhau

class ParentComponent extends React.Component{
 render(){
  return <ChildComponent message="Hello World" />;
 }
}
class ChildComponent extends React.Component{
 render(){
  return And then I said, "{this.props.message}";
 }
}

Dữ liệu trong component có thể truyền từ cha xuống con và không có ngược lại

Đôi khi dữ liệu sẽ không phải được truyền từ cha xuống con, mà nó chỉ là một dữ liệu tạm thời nào đó, ví dụ như giá trị input của user chẳng hạn, lúc đó nó được gọi là state

Cho dễ hình dung, nếu xem cái bảng nam châm là một component thì props là nút gạt xóa, state là những gì viết trên bảng

Nắm vững 5 khái niệm sau, xem như master React

Bên trong một component, state được quản lý bằng hàm setState thường được viết lòng trong một hàm xử lý sự kiện

class MyComponent extends React.Component {
 handleClick = (e) => {
  this.setState ({clicked: true});
 }
 render(){
  return <a href="#" onClick={this.handleClick}> Click Me</a>;
 }
}

Khái niệm #4: Component API

Những hàm như render và setState là một phần của component API, ngoài ra nó còn một số hàm hữu ích khác nữa như constructor để khởi tạo state và kích hoạt các phương thức, một số hàm trigger trước khi component được load, sau khi load, sau khi unmounting. vâng vâng.

Thật ra việc master được React phần nhiều là master được việc lập trình và khái niệm để kiến trúc ra một component hơn là một loạt các API được hỗ trợ sẵn, vậy nên phần này kết thúc ở đây.

Khái niệm #5: Component Type

Mấy ví dụ trên, định nghĩa một component được khai báo dạng class

class MyComponent extends React.Component{
}

Giờ thì hãy quên cách viết này đi! Bây giờ ai cũng viết một component ở dạng function component

Một functional component là một function nhận một props object như tham số truyền vào và trả về một đống HTML lằn xà ngoằn. Y hệt như cách viết template kinh điển, khác biệt cơ bản là ở chổ mình có thể xài JavaScript bất cứ chổ nào khi cần

const myComponent = props => {
    return Hello {props.name}, Today is {new Date()};
}

Viết cách này có một hậu quả là mình không thể access được phương thức của component, trên thực tế việc này không ảnh hưởng gì làm vì phần lớn trường hợp ta không dùng tới.

Và như vậy component này sẽ không có phương thức setState , không có state luôn, người ta còn gọi là stateless functional component.

Cách viết này rất là gọn gàng, phù hợp cho những trường component đơn giản, nên áp dụng khi có thể.

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

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

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

5 câu hỏi javascript và cách đánh bại chúng

5-cau-hoi-javascript-va-cach-danh-bai-chung
Bài viết được sự cho phép của tác giả Lưu Bình An
Mỗi công ty mỗi kiểu phỏng vấn, điều hay bị phàn nàn trong các buổi phỏng vấn là phần lớn nó không liên quan tới những công việc hằng ngày mà vị trí đó đòi hỏi. Cùng TopDev điểm qua 5 câu hỏi JavaScript hay gặp trong buổi phỏng vấn lập trình viên.
Có những lúc thấy các vấn đề liên quan trực tiếp tới frontend như các sự kiện của DOM, tương thích trên các trình duyệt khác nhau, phương pháp làm layout lại không được hỏi. Những người đứng vị trí tuyển dụng sẽ nhìn nhận như thế này

Chúng tôi thích thuê những người thông minh, chứ không thích người biết rõ về một kỹ thuật nào đó, nhưng lại thiếu sáng tạo, thiếu logic và thiếu biện chứng.

Dù là quan điểm nào đi nữa, nhưng phỏng vấn thì coding challenge vẫn là một phần quan trọng trong phỏng vấn.

Tuyển dụng Javascript lương cao cho bạn

Xác định chuỗi đối xứng (palindrome)

Câu hỏi Javascript 1:

Chuỗi đối xứng là chuỗi khi đảo ký tự từ trái qua phải và từ phải qua trái không thay đổi, như chữ “racecar”, “anna”, “tenet”. (Film tenet không biết khi nào mới chiếu, nghe đâu hoãn dài hơi vì covid)

Yêu cầu, cho bạn một chuỗi, xác định nó phải là đối xứng không

isPalindrome('racecar') === true
isPalindrome('table') === false

Đáp án

const palindrome = str => {
  // chuyển qua lowercase trước
  str = str.toLowerCase()
  // chuyển thành array, reverse rồi so sánh
  return str === str.split('').reverse().join('')
}

FizzBuzz

Câu hỏi Javascript 2:

Yêu cầu: viết một function đáp ứng những chuyện sau

  • log ra các số từ 1 đến n, n là một parameter truyền vào
  • log ra chữ fizz nếu là bội số của 3
  • log ra buzz nếu là bội số của 5
  • log ra fizzbuzz nếu là bội số của cả 3 và 5
fizzBuzz(5)
// 1
// 2
// fizz
// 4
// buzz

Để giải quyết bài toán này, chúng ta cần nhớ đến cách dùng % để biết được số dư của phép chia, trả về 0 là chia hết, ngược lại thì không chia hết

12 % 5 // 2 -> 12 không phải bội số của 5
12 % 3 // 0 -> 12 là bộ số của 3

Đáp án

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // kiểm tra xem có là bội số của cả 3 và 5
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // có phải là bội số của 3
      else if(i % 3 === 0) {
      console.log('fizz')
    } // có phải là bội số của 5
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

Đảo chữ

Yêu cầu: viết một function, params truyền vào 2 chuỗi, trả về true nếu 2 chuỗi này là dạng đảo của nhau và false cho trường hợp ngược lại.

2 chuỗi gọi là đảo nhau nếu số ký tự hoàn toàn giống nhau (không kể hoa thường), chỉ khác thứ tự.

anagram('finder', 'Friend')  --> true
anagram('hello', 'bye') --> false

Đây là một cách làm

// hàm helper để build một object làm nơi lưu trữ
const buildCharObject = str => {
  const charObj = {}
  for(let char of str.replace(/[^\w]/g).toLowerCase()) {
    // nếu object đã chứa giá trị đang loop qua
    // tăng giá trị nó lên 1,
    // ngược lại, thêm mới ký tự này vào object với giá trị = 1
    charObj[char] = charObj[char] + 1 || 1
  }
  return charObj
}

// hàm chính
const anagram = (strA, strB) => {
  // lưu giá trị của strA vào object
  const aCharObject = buildCharObject(strA)
  // lưu giá trị strB vào object
  const bCharObject = buildCharObject(strB)

  // so sánh độ dài giữa 2 object
  if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false
  }
  // đã chắc chắn về length giống nhau
  // kiểm tra tiếp số lượng các ký tự có giống nhau
  for(let char in aCharObject) {
    if(aCharObject[char] !== bCharObject[char]) {
      return false
    }
  }

  return true
}

Đếm số nguyên âm

Câu hỏi Javascript 3:

Nguyên âm: anh-ôm-em-ú-ì, aoeui.

Viết một function nhận vào string, trả về số lượng nguyên âm có trong string

findVowels('hello') // --> 2
findVowels('why') // --> 0

Đáp án

const findVowels = str => {
	let count = 0
	const vowels = ['a', 'o', 'e', 'u', 'i']
	for (var char = str.length - 1; i >= 0; i--) {
		if (vowels.includes(char.toLowerCase())) {
			count++
		}
	}
	return count
}

Có thể dùng regular expression

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

Fibonacci

Câu hỏi Javascript 4:

Cái này kinh điển. Mọi dân lập trình đều đụng tới dãy số fibonacci, thật thiếu sót nếu không đề cập ở đây.

Fibonacci là dãy số, mà số bên phải = tổng 2 số đứng bên trái. Như thế này: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

Yêu cầu: một function nhận params là n, trả về giá trị n trong dãy fibonacci

fibonacci(3)  // --> 2

Đáp án

const fibonacci = num => {
	const result = [0, 1]

	for (let i = 2; i <= num; i++) {
		const prevNum1 = result[i - 1]
		const prevNum2 = result[i - 2]
		result.push(prevNum1 + prevNum2)
	}

	return result[num]
}

hoặc dùng đệ quy

const fibonacci = num => {
	// nếu là 1 hoặc 0
	if (num < 2) {
		return num
	}
	// từ 2 trở lên
	return fibonacci(num-1) + fibonacci(num-2)
}

Chúc các bạn phỏng vấn vui vẻ!

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

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

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

Từ lập trình viên Junior, cùng mình trở thành 1 lập trình viên mid-level nhé

lập trình viên

Có được 1 công việc lập trình đầu tiên luôn là mục tiêu hàng đầu của rất nhiều các bạn lập trình viên trẻ mới hành nghề, nhưng mình lại phát hiện ra rằng khá ít các lập trình viên muốn tiến bước xa hơn trên con đường sự nghiệp của họ.

Vì cũng vướng vào trường hợp tương tự, nên là mình đã lập nên hẳn 1 kế hoạch để định hướng sự nghiệp lập trình viên của mình. Trải qua 5 tháng ròng rã, mình đã tích lũy được mọi thứ cần thiết để có thể nhận được tới 3 lời đề nghị công việc tại vị trí lập trình viên mà phần lương bổng của nó còn gấp đôi lương hiện tại của mình. Thật sự đạt được điều này là không hề dễ dàng gì, nhưng rõ ràng là mình rất xứng đáng để nhận được nó.

Chắc hẳn các bạn cũng đang rất tò mò, và mình xin chia sẻ cách để biến nó thành hiện thực, từng bước một để bạn có thể làm theo.

Nhưng trước tiên vì đây là 1 bài viết khá chuyên sâu nên mình sẽ tóm tắt sơ lược các lời khuyên của mình.

Lộ trình sự nghiệp cho các lập trình viên Junior chỉ trong 7 bước:

1. Quyết định mục tiêu của bạn. Hãy tự hỏi kiểu công việc lập trình viên nào mà bạn muốn và khi nào thì bạn muốn công việc đó? Bạn có thể học được nhiều thứ trong 6 tháng học tập bán thời gian nếu bạn thực sự bỏ công cho nó.

2. Hãy tìm từ 10 tới 20 mô tả công việc hiện tại cho các công việc lập trình viên mà cuối cùng bạn muốn nhận. Tạo 1 danh sách về tất cả những yêu cầu và bao nhiêu lần mà mỗi thứ đưa ra.

3. Tìm từ 3 tới 5 kỹ năng chính thường được yêu cầu bởi các công việc đó, nhất là những cái mà bạn hiện chưa có.

4. Sử dụng các khóa học để tăng tốc độ việc bạn học 1 kỹ năng mới nhanh như thế nào. Các khóa có thể là 1 ý tưởng tuyệt vời vì chúng sẽ giúp bạn tiết kiệm thời gian và công sức.

5. Áp dụng vào công việc trước khi bạn đã học mọi thứ. Phỏng vấn tốt cũng là 1 kỹ năng bạn nên luyện tập.

6. Xây dựng các dự án với những gì bạn đã học được, đó cũng là cách tốt nhất để đảm bảo kỹ năng của bạn cứng rắn hơn.

7. Hãy nhận công việc mà bạn đã nỗ lực để có được. 

  Junior Developer là gì? Điều kiện đạt chuẩn và yêu cầu công việc của Junior Developer
  Mẫu CV Junior Developer cực thu hút cho dân IT

Mục tiêu

Mình đã lên kế hoạch để du lịch vòng quanh Đông Nam Á khoản 3 – 6 tháng, và biết rằng mình muốn có 1 công việc tốt hơn khi mình trở về nhà. Công việc lập trình viên JavaScript với vai trò Junior của mình đã cho mình thấy được 3 thứ:

  • Mình yêu code, không chỉ là 1 sở thích mà còn như 1 công việc. 
  • Mình thích thú với các việc về lập trình back-end. Nó dựa trên nền tảng logic hơn vốn làm mình thực sự thích.
  • Mình không thích Angular cho lắm.

Với sự hiểu biết này, mình đặt mục tiêu cho nơi mà mình muốn đến khi mình kết thúc hành trình, và những gì mình cần để học để đạt được việc đó. 

Mục tiêu của mình là trở thành 1 lập trình viên Mid-level full stack.

Sự điều chỉnh

Để trở thành 1 lập trình viên Mid-level full stack mà mình muốn, và để tìm ra mình còn thiếu gì để cải thiện, mình đã nhìn qua hàng tá công việc mà cuối cùng mình thực sự sẽ muốn nhận.

Đầu tiên, mình thấy những gì công việc yêu cầu ở 1 ứng viên và những gì nhà tuyển dụng lập trình viên mong muốn. Mình đã lập 1 danh sách của tất cả các kĩ năng và rồi sắp xếp chúng theo thứ tự bằng cách xem chúng xuất hiện bao nhiêu lần trong những mô tả công việc lập trình viên.

Với danh sách này mình đã xem qua các kỹ năng có thứ hạng cao nhất mà mình chưa có. Bạn không cần phải có khả năng làm tất cả mọi thứ trong danh sách để có thể nhận được những không việc này. Trung bình người trúng tuyển chỉ có khoản 70 – 80% những gì trong danh sách yêu cầu cho 1 vai trò nhất định. Hầu hết mọi lúc, những thứ thực sự là ‘yếu tố thành bại’ chỉ nằm ở 1 vài điểm quan trọng. Chúng ta đang nhắm để nhận được cấp độ đó và rồi bất kỳ kỹ năng nào khác cũng chỉ là ‘bonus’.

Qua nghiên cứu này, mình đã lập 1 danh sách các thứ mà hầu hết các công việc mà mình đang tìm kiếm yêu cầu:

  • Hiểu biết sâu về JavaScript.
  • Ít nhất 1 framework front-end (thường là React hay Angular).
  • Khả năng để tạo 1 REST API.
  • Kiến thức về 1 hoặc nhiều hơn về database.

Quá trình này có thể thực sự được dùng cho bất ai trong bất kỳ con đường sự nghiệp nào. Nhưng nó sẽ thực sự hiệu quả với việc lập trình, vì họ thường dùng 1 danh sách cụ thể về các kỹ năng mà 1 vai trò cần có.

Xây dựng kế hoạch

Với thông tin này, mình biết rằng mình cần phải cố gắng ở 1 vài điểm mấu chốt:

1. Tôi cần phải hoàn thành quyển ‘You Don’t Know JS’. Sê-ri sách này thực sự giúp mình hiểu rõ phần căn bản của JavaScript, nên mình suy đoán rằng sẽ rất tuyệt cho việc học thêm các thứ nâng cao hơn.

2. Mình cần phải trở nên thực sự giỏi 1 framework front-end. Mình đã xem thử Angular, Vue, và React và quyết định sẽ chọn React. Trước đây mình đã thử 1 chút về React và mình thích nó, mình không thực sự kết Angular cho lắm, và Vue thì lại ít khi được yêu cầu trong nhiều quảng cáo tìm việc.

3. Cho dù mình chỉ có thể tạo 1 API express từ scratch, mình không thực sự tự tin cho lắm và chỉ có thể làm phần cơ bản. Mình cần phải tự update bản thân sớm thôi, đặc biệt nếu mình đã muốn có được công việc back-end mà mình đã ưu tiên.

4. Mình có thể vừa kề bên phần cơ sở dữ liệu quan hệ – relational database (postgreSQL) hay học 1 DB mới. Mình đã quyết định rằng mình sẽ chọn học món MongoDB vì nó đã nổi tiếng rồi và mình cũng thêm NoSQL database vào CV của mình.

Mình không chắc là bao lâu mình sẽ khởi hành với những chuyến đi, nên tự quyết định luôn để lên kế hoạch cho việc học như vầy:

  1. Học React (và Redux) trong khi mò mẫm tiếp quyển You ‘t Know JavaScript.
  2. Tự nâng trình việc lập trình API và học MongoDB.
  3. Làm 1 cái gì đó với những kỹ năng mà mình đã có.
  4. Học thêm những thứ khác nữa chứ.

Mình đã thực hiện điều này cho 1 lý do tốt. Nếu mình kết thúc chuyến đi sau 3 tháng và đã hoàn tất mục #1 nhưng vẫn chưa thực hiện được nửa đường tới mục 2#, thì mình sẽ rất có khả năng xin được 1 công việc lập trình viên ở mức mid-level vì chúng chỉ bị giới hạn bởi hầu hết các công việc front-end.

lập trình viên

Học React và Redux, và (lại) đọc You Don’t Know JS

Tôi đã thử làm 1 chút về React trước đây rồi, bằng cách coi mấy video Youtube hay mấy bài hướng dẫn thông thường trên web, nhưng lần này mình muốn để đảm bảo rằng mình đã học nó theo đúng cách. Thế là nó làm mình mua luôn khóa huấn luyện ‘React JS và Redux: Mastering Web App từ Udemy.

Khóa này thực sự rất công phu, với 1 chút kinh nghiệm mà mình đã có với React cũng giúp mình khá nhiều, nhưng về Redux thì mình mù tịt. Xong khóa học, mình cảm thấy đã xây dựng được 1 website khá phức tạp và cũng tự tin cả về phần syntax, phần format của React và phần kiểm soát dữ liệu của Renux nữa.

Mình tốn tới 2 tuần cho khóa này, vì chỉ dành khoản 1-2 giờ và 1-2 tuần 1 lần cho nó. Mình đang tận hưởng kỳ nghỉ ở châu Á nên đây cũng không hẳn là ưu tiên của mình.

Cũng như việc dành thời gian cho khóa học khi mình dùng laptop, mình đọc theo cách riêng qua vài cuốn mới ra gần đây trong seri You Don’t Know JS. Mình lưu cả phiên bản Github online trên điện thoại và đọc nó luôn khi mình nghỉ giải lao.

Có được vài kinh nghiệm đời thực, mình hiểu ra rất nhiều hơn lần gần đây mình cố đọc những quyển này. 1 số cuốn như Promises rất khó hiểu khi bạn chưa bao giờ đụng vào chúng.

Xem ngay các vị trí HOT tuyển dụng React, tuyển lập trình Redux tại TopDev

Nâng trình về express và học MongoDB

Giờ đây mình khá thoải mái khi tạo các thứ về front-end, đã đến lúc tập trung lại phần kỹ năng back-end của minh.

1 lần nữa mình quyết định hốt thêm 1 khóa Udemy nữa. Mình nhận ra bởi vì chúng đi cùng nhau như 1 gói hoàn tất, các thứ vận hành mượt hơn và kết nối 1 cả quá trình học. Dĩ nhiên bạn có thể học tất cả những thứ giống nhau miễn phí trên Youtube hay các bài hướng dẫn online khác, nhưng chúng chưa bao giờ có vẻ liền lạc như 1 chủ đề bao quát.

Câu hỏi tiếp theo là nên chọn khóa nào. Có 1 số cái miễn phí và cả tốn phí, khóa dài và khóa ngắn.

Mình quyết định đầu tư bản thân và mua hẳn hoi 1 khóa (10$ tuy nhỏ nhưng mà kèo này thơm phết) và mình đã quản để thu hẹp xuống còn 3 khóa thôi. Dao động thời lượng từ 7 tiếng tới 25,5 tiếng.

Mình bị khóa 7 tiếng mê hoặc hoàn toàn, và mình cũng hoàn thành nó trong khoản 1 – 2 tuần trong khi vẫn tận hưởng được kỳ nghỉ. Khóa 25 tiếng rõ là sẽ cần nhiều thời gian hơn, nhưng có vẻ nó bao gồm nhiều chủ đề trong đó. Tới thời điểm này trong chuyến đi, mình quyết định vẫn sẽ đi du lịch tiếp miễn là số dư trong ngân hàng mình vẫn ở mức ổn định, và thế là mình chiến tiếp khóa 25 giờ luôn.

Tham khảo ngay các vị trí tuyển dụng MongoBD lương cao

Node với React: Lập trình web Full-stack

Mình thực sự đã làm 1 review đầy đủ về khóa này, và nó khá là tuyệt.

Mình đã xong khóa React và Redux trước đây, và các thứ React cũng lặp đi lặp lại. Nên là bạn không hao tốn thời giờ đâu, bạn có thể skip bớt video phần bạn đã biết rồi hay x2 tốc độ mà xem, và phần ‘skim watch’ cho nó frest hay để kiểm tra bất kỳ lời khuyên hữu dụng nào.

Các thứ về back-end là phần xịn nhất về khóa này. Nó bao hàm lượng chủ để rất đa dạng bao gồm: oAuth, xử lý email, chi trả, API, xử lý chính (?), MongoDB, mongoose, và deploy nâng cao.

Lý do khóa này dài vậy là do nó có nhiều chủ đề quá mà còn chi tiết đến tuyệt vời nữa. Cũng có lợi và có hại, nhưng mình đã xem xong gần hết video với tốc độ x1.5 và dừng ở nơi cần.

Khóa này lâu hơn khóa đầu, nhưng mình đã có thể kết thúc nó trong vòng 1 tháng rưỡi.

1 trong những thứ làm mình chật vật nhất chính là phần DevOps, cách để triển deploy và host ứng dụng theo 1 cách đáng tin. Nếu mình làm điều này bây giờ mình chắc chắn sẽ chọn Serverless vì nó gỡ bỏ kha khá rào cản cho phần lập trình back-end.

Mình bắt đầu viết

Ở 1 vài thời điểm, trong khi đang ở Trung Quốc, mình quyết định viết 1 chủ đề về độ khó khăn khi phải làm lập trình ở Trung Quốc. Nó được chấp nhận như bài công khai trên freeCodeCamp, và giờ đã có 7,1k lượt xem và 1300 cái vỗ tay. Mình khá kinh ngac rằng mọi người đọc thứ mình viết và còn thích nó.

Mình quyết định rằng mình đã cố viết nhiều bài hơn về những gì mình đang làm và những thứ hay ho xoay quanh công việc lập trình viên mà mình tìm ra. Nó còn cho mình 1 nơi trò chuyện khá tuyệt cho việc phỏng vấn sau này.

Mình tiếp tục viết và đã mở ra được các cơ hội đáng kinh ngạc. Mình đã được highlight như 1 Top Contributor trên Freecodecamp, còn có lời đề nghị cho công việc freelance, và ngay cả 1 contract viết sách.

Viết 1 blog cũng là cách hay để nhập quá trình của bạn và cho phép bạn đã cải thiện như thế nào.

lập trình viên

  Tại sao junior dev nên review commits của các senior?
  Junior Developer là gì? Điều kiện đạt chuẩn và yêu cầu công việc của Junior Developer

Làm 1 cái gì đó với những kỹ năng mình đã học được.

Giờ mình đã có tất cả tool cần thiết, mình muốn tạo 1 cái gì đó với chúng. Mình đã đi chơi được 3 tháng rưỡi và dự kiến rằng mình sẽ có thể tiếp tục chuyến đi thêm 1 – 3 tháng nữa. 

Điều này có nghĩa rằng mình có thể cần phải suy nghĩ về công việc sớm nếu mình muốn bắt đầu càng nhanh càng tốt khi mình trở về.

Để ứng tuyển cho vị trí lập trình viên, mình cần phải update CV và portfolio của mình. Điều này cho mình 1 cơ hội tuyệt hảo để dùng những gì mình đã học để dựng 1 portfolio bằng Node và React.

Đây chính xác là điều mình làm, như đã nói trước đây, mình không phải là dân thiết kế, nhưng cũng đủ xài. Mình còn dùng 1 API WordPress để host các bài blog trên trang.

Mình biết là phần thiết kế hơi tởm, nên mình đã post nó trong phần subreddit  review thiết kế web. Mình đã có khá nhiều lời khuyên hay, hầu hết các thứ xoay quanh việc dành thêm vài tháng tiếp theo để nghiên cứu và học phần căn bản thiết kế web. Điều này không hẳn là thứ mình đang tìm nhưng bù lại cũng có nhiều lời khuyên xịn lắm.

1 chút lời khuyên mình nhận được là tận dụng các thiết kế framework có sẵn. Điều này dẫn đến kết quả 1 website mới hoàn toàn, không cần dùng tới kỹ năng lập trình viên nào mình đã sử dụng trước kia, nhưng nó trông bớt lòe loẹt hơn. Nếu mình làm nó lại, mình sẽ chắc chắn thử và theo 1 cái gì đó như là Material UI.

Ứng tuyển cho công việc

Nơi tiếp theo tôi ghé thăm là 1 vùng núi xa xôi hẻo lánh tại Lào. Ở thời điểm này mình biết là mình có 2 tuần ở đây, rồi thêm 4 tuần nữa tại Trung Quốc lần nữa trước khi về nhà. Đã đến lúc kiếm việc thôi!

Nếu bạn không có deadline căng não như mình thì cũng nên thử. Nó thực sự giúp tăng động lực bạn để hoàn thành dự án hay để tìm việc (chả ai thích tìm bảng công việc cả).

Nếu bạn không muốn set 1 deadline thì hãy set 1 điểm trong kiến thức học của bạn khi bạn bắt đầu đi tìm việc.

Tốt nhất là sau khi bạn đã học mọi thứ thì nên là như vầy! Học cách phỏng vấn cho vị trí lập trình viên cũng là 1 kỹ năng và bạn nên có thêm kinh nghiệm với nó càng nhiều, càng thường xuyên càng tốt. Bắt đầu xin việc mà bạn ít quan tâm để thực hành suốt quá trình.

Tìm việc lập trình junior lương cao trên TopDev

Quá trình

Qua khóa học suốt 1 tháng rưỡi tiếp theo sau khi đã nộp đơn cho hơn 50 công việc chỉ liên quan đến lập trình viên, mình cũng nhận được email và nhiều cuộc trò chuyện Linkedin với khoản 25 người, và đã nắm trong tay được 5 cuộc phỏng vấn công việc cho tuần tôi trở về.

Hầu hết các tương tác của mình là qua email, nhưng nếu ai đó muốn gọi trực tiếp thì mình đã cố hết khả năng để phù hợp với nó (Mình còn 8 giờ phía trước)

Mình nghĩ rằng có 1 cuộc trò chuyện thực sự là cách tuyệt vời để cải thiện mối quan hệ giữa bạn và người khác, tăng cơ hội họ mời bạn tới buổi phỏng vấn hay giới thiệu 1 công việc cho bạn.

Nếu bạn không thấy thoải mái việc gọi điện hay Skype với mọi người thì hãy đu theo email, nhưng mình nghĩ bạn sẽ phải bỏ lỡ nhiều cải thiện các cơ hội đấy.

Dựng nhiều thứ hơn

1 trong những cuộc phỏng vấn cho vị trí lập trình viên đã yêu cầu mình làm nguyên mẫu những gì sẽ làm cho 1 công ty với 1 trang web tệ hại và dịch vụ khách hàng tối thiểu. Điều này thật tuyệt khi nó thúc đẩy mình để học về phần tạo mẫu.

Mình đã viết 1 seri các bài viết về cách nguyên mẫu mình làm và tạo ra 1 website. Bạn có thể xem website ở đây và đọc các bài viết do mình viết về lập trình viên ở đây.

Nó còn cho mình cơ hội để lấy những gì mình đã học suốt 4 tháng qua, luyện tập nó và dựng 1 cái gì đó mà phô diễn những gì mình có thể làm.

Cái cuối cùng mình làm trên dự án này là tạo ra 1 chat bot cho việc return các order.

Mình đã phải tìm hiểu về cách hoạt động của các chat bot và tốn 1 tuần để có được 1 phiên bản hoạt động tốt. Đây là 1 yếu tố lớn trong việc mình nhận 1 công việc và nó dẫn tới nhiều cơ hội khác nữa.

Học 1 hoặc 2 kỹ năng nhẹ khác mà bạn có thể thể hiện cũng có thể có tác dụng tốt. Chỉ cần đảm bảo rằng sau khi bạn đã sắp xếp các kỹ năng cốt lõi của mình.

lập trình viên

Phỏng vấn

Giờ đây mình đã có danh sách 5 cuộc phỏng vấn, mình phải chuyển hóa chúng thành lời đề nghị cho công việc.

Chuẩn bị

Mình đã viết các bài về chuẩn bị cho buổi phỏng vấn JavaScript và thành thục tiến trình phỏng vấn. Mình đảm bảo là đã tick mọi ô rồi.

Mình biết tất cả các điểm mình muốn nhấn mạnh, cách để trả lời các câu hỏi về điểm yếu của mình và những gì mỗi công ty đã làm.

Các buổi phỏng vấn

Mình đã luôn khá là giỏi trong các cuộc phỏng vấn mặc dù bình thường mình hơi hướng nội 1 chút. Mình đã phải dạy bản thân hành động hướng ngoại nhiều hơn và tham gia với những người phỏng vấn mình.

Nếu bạn thấy bản thân hành động nhút nhát và dè dặt trong các cuộc phỏng vấn, mình khuyên bạn nên thực hành điều này như bất kỳ kỹ năng nào khác. Tìm một nguồn tài nguyên tốt (charisma on command là một kênh Youtube tuyệt vời) và sau đó lặp lại những gì bạn học được. Bắt đầu với bạn bè và gia đình cho bạn các cuộc phỏng vấn giả nhưng sau đó thử và tìm những người mà bạn không quen thuộc và có thể giống với nhà phát triển thực sự hơn.

Mình đã có các bài kiểm tra công nghệ tại 3/4 các cuộc phỏng vấn (hai phần còn lại đã thực hiện online) và sự chuẩn bị của mình đã được đền đáp. Cũng có vài lúc lúng túng, nhưng mình đã tự nói với bản thân và hoàn thành tốt mọi nhiệm vụ của một lập trình viên cần có.

Việc bạn đi phỏng vấn cũng là một cơ hội để tìm hiểu thêm về công ty và khi làm việc ở đó sẽ ra sao. Một công ty có thể sẽ tuyệt vời trên giấy tờ nhưng thực sự lại không giống sự cường điệu đó hoặc có thể theo cách nào khác. Chọn đúng công ty là một quyết định lớn vì vậy hãy chắc chắn rằng bạn hãy yêu cầu tất cả thông tin bạn cần cho vị trí lập trình viên này.

Lời đề nghị và đàm phán

Từ ba cuộc phỏng vấn đầu tiên của tôi, tôi đã có hai lời đề nghị. Sau cuộc phỏng vấn thứ tư, tôi biết rằng họ là công ty cho tôi, vì vậy hãy cho họ biết rằng tôi sẽ xem xét lời đề nghị từ họ. Nếu bạn đã từng ở trong một tình huống tương tự, hãy cố gắng không dẫn dắt họ nếu bạn biết bạn sẽ không chấp nhận lời đề nghị từ họ.

Bây giờ tôi đã có đề nghị từ hai công ty rất muốn thuê tôi. Đó là thời gian để đàm phán. Tôi không bao giờ tuyệt vời trong việc đàm phán hoặc yêu cầu nhiều hơn, nhưng tôi đã đọc một vài bài báo và đã đi cho nó.

“Bạn có thể tự nghĩ rằng: “à , mình không muốn đặt các kỳ vọng cao quá, và các lời đề nghị cũng khá rộng rãi rồi, nên mình cứ nhận nó thôi”
Không. Hãy đàm phán.

“Hoặc là: “mình không muốn bắt đầu với các  bước sai lầm và có vẻ tham lam với các ông chủ tương lai.”

Không. Cứ đàm phán đi.

“Nhưng công ty này cũng nhỏ và…”

Không. Im miệng và đàm phán thôi.

Từ 10 quy tắc đàm phán 1 lời đời nghị công việc. Mình xin giới thiệu là bạn nên xem qua nó nếu bạn đang đi tìm việc.

Mình rõ ràng đã không làm điều này hoàn hảo (hay thực ra không hài lòng lắm), nhưng mình đã làm 1 số thứ để tăng cường cho đôi bàn tay này. Mình đã có 2 lời đề nghị khá là công bằng, nhưng mình cũng ưu tiên cho 1 công ty. Mình đã tự viết 1 script nhỏ và (sau vài bài tập hít thở để giúp mình bĩnh tĩnh lại) mình đã gọi cho vị giám đốc của công ty mình kết nhất. 

“Chào Dave, mình đang gọi tới anh để cập nhật về việc mình đang ở đâu. Cảm ơn đã cho mình 1 lời đời nghị, mình rất vui khi được xem như 1 mảnh ghép tuyệt vời đến công ty.
Mình đã có lời đề nghị khác cũng khá hấp dẫn và sẽ quyết định vào cuối tuần này, mình sẽ cho anh biết ngay 12h trưa thứ hai.

Có 1 thứ thực sự sẽ làm lời đề nghị này được tốt hơn nữa. Mình sẽ tái định cư ở bất cứ nơi nào mình nhận được việc, và vài sự hỗ trợ với chi phí cho việc này sẽ rất tuyệt.”

Câu chuyện không kết thúc y như thế, nhưng nó cũng khá hữu ích. Mình đã cám ơn họ vì lời đề nghị, nói cho họ biết deadline để mình đưa ra 1 quyết định, và hỏi về việc cải thiện lời đề nghị mà không phải yêu cầu mức lương cao hơn.

Tóm tắt

Mình đã tìm ra được những gì mình cần để có được công việc mình muốn. Mình dùng điều này để tạo 1 kế hoặc và rồi sử dụng các khóa học online để tăng tốc quá trình học tập.

Mình đã nộp đơn 1 đống việc và nhận lại được 5 buổi phỏng vấn. Việc chuẩn bị cho những buổi phỏng vấn kết thúc với 4 lời đề nghị, và 2 cái thực sự làm mình muốn chọn 1 trong 2. Mình đã thương thuyết lời đề nghị từ 2 công ty mình thích nhất và cuối cùng cũng nhận được công việc lập trình viên tuyệt vời tại 1 công ty tuyệt vời khác.

Nếu chủ đề này cũng truyền cảm hứng cho bạn để tiến tới bước tiếp theo để trở thành 1 lập trình viên full-stack rồi bạn sẽ cần biết các kĩ năng mà cần. May thay, mình đã có 1 bài hướng dẫn miễn phí về các kỹ năng và công cụ bạn sẽ cần để trở thành 1 lập trình viên full-stack.

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

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Muốn trở thành một web developer nên bắt đầu từ đâu?

Muốn trở thành một web developer nên bắt đầu từ đâu?

Bài viết được sự cho phép của tác giả Tino Phạm

Thế giới lập trình là rộng lớn với rất nhiều lĩnh vực và cơ hội mang lại cho bạn sự trải nghiệm, cũng như con đường đi mà bạn sẽ chọn lựa cho sự nghiệp, đam mê của mình.

Bạn là một người mới và đang mong muốn trở thành một web developer. Và thời điểm này bạn vẫn chưa thể xác định sẽ bắt đầu từ đâu khi đi trên con đường này.

Với kinh nghiệm của bản thân, mình sẽ chia sẽ để giúp bạn có định hướng và cái nhìn tổng quan hơn trước khi bước chân vào con đường trở thành web developer.

Muốn trở thành một web developer nên bắt đầu từ đâu?

Trong lĩnh vực lập trình ứng dụng web, chúng ta có lập trình cho Front-end và lập trình cho Back-end. Bắt đầu từ hướng lập trình Front-end là dễ dàng hơn cho bạn. Vì sao ư?

Để trở thành một Front-end developer bạn chỉ cần học một số công nghệ chính bên dưới:

  1. HTML5
  2. CSS3
  3. JavaScript
  4. Học một trong các Framework sau: Angular/ React/ Vue. Vì những Framework này giúp bạn xây dựng front-end cho ứng dụng nhanh hơn, dễ dàng mở rộng và thay đổi UI, đồng thời giữ cho code front-end có tổ chức hơn.

Trong khi để trở thành một Back-end developer bạn cần phải nắm được những công nghệ sau:

  1. Ngôn ngữ lập trình cho Back-end. Bạn sẽ phải chọn dùng một trong các ngôn ngữ: C#, Java, PHP, Python, etc.
  2. Bạn phải học một Framework tương ứng cho ngôn ngữ mà bạn đã lựa chọn. Ví dụ: bạn chọn dùng C# thì bạn phải học thêm về .NET Framework, .NET Core, etc. Bạn chọn dùng Java thì phải biết Framework: Hiberate hoặc Spring, etc. Bạn chọn dùng PHP thì phải biết thêm: Laravel hoặc Zend hoặc CodeIgniter, etc. Bạn chọn Python thì phải biết về Django framework, ect.
  3. Database (cơ sở dữ liệu): một Back-end developer cần phải biết thêm các loại databases để lưu trữ dữ liệu cho ứng dụng của mình như: SQL Server, Mongo DB, Elastic Search, PostgreSQL, Redis, Couch DB, etc.
  4. Hosting: bạn cần biết một số dịch vụ để deploy ứng dụng của mình như: Google Cloud Platform, AWS (Amazon Web Services), Microsoft Azure, etc.
  5. Các công cụ quản lý server: bạn cần có kiến thức về các công nghệ và dịch vụ như: Docker, Kubernetes, New Relic, Nginx, Varnish, etc.

Qua các thông tin ở trên, bạn dễ dàng nhận ra rằng để trở thành một Back-end developer bạn phải hiểu biết nhiều công nghệ hơn Front-end developer. Hơn nữa, Back-end developer còn phải có kiến thức về Architectural Styles, Architectural Patterns, Design Patterns để có thể đi tiếp con đường trở thành một Senior Developer hay xa hơn là trở thành một Software Architect.

Nhìn chung thì để trở thành một Back-end developer đòi hỏi bạn phải có nhiều nổ lực và kiên trì hơn. Vì vậy trở thành một Front-end developer tương đối dễ và nhanh hơn Back-end developer.

OK, con đường là do bạn lựa chọn. Hãy tìm hiểu và đi lựa chọn công việc mà bạn đam mê và chào mừng bạn đến với hội anh em “coder”.

  Tổng hợp tất tần tật những công cụ cần thiết cho web developer
  Những Plugin sublime text cần thiết cho web Developers

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

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

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