Home Blog Page 179

React Native là gì? Kiến thức tổng quan về React Native

react-native-hay-android-dung-de-lap-trinh-app

Cách đây 2 năm, tôi chỉ tập trung vào lập trình Android native. Nhưng đến năm ngoái, khi công ty yêu cầu tôi học lập trình iOS, tôi đã khá phấn khích lúc đầu, nhưng sự phấn kích đó nhanh chóng phai nhạt dần, năng suất làm việc của tôi cũng suy giảm đi. Tôi nhận ra, mình phải học lại từ đầu tất cả mọi thứ như framework, các công cụ, IDE…

Và vì tôi rất thích đến các buổi meetup nên tôi cũng bắt đầu tham dự các buổi meetups của cả Android và iOS. Tôi cần phải cập nhật với những tính năng mới nhất trên cả 2 platforms, nên rất tốn thời gian và khó chịu khi khả năng học của tôi không nhanh. Vì vậy, tôi đã rất hứng thú khi React Native dành cho iOS ra đời.

React Native là một giải pháp giải pháp tối ưu để phát triển ứng dụng trên cả hai nền tảng iOS và Android được nhiều người lựa chọn hiện nay. Vậy React Native là gì? Hãy cùng tìm hiểu trong bài viết này.

React Native là gì?

React Native là một framework phát triển ứng dụng di động đa nền tảng (cross-platform) được phát triển bởi Meta (tên trước kia là Facebook). React Native cho phép bạn xây dựng ứng dụng di động cho cả nền tảng iOS và Android bằng việc sử dụng JavaScript.

REACT NATIVE – Learn once, write anywhere. Chỉ cần viết một lần là có thể build ứng dụng cho cả iOS lẫn Android.

Việc này giúp chúng ta có thể tiết kiệm được thời gian, công sức, tiền bạc. Giúp tốc độ ra sản phẩm cũng như cập nhật ứng dụng nhanh chóng mặt.

Đọc thêm: 9 ứng dụng tuyệt vời được viết bằng React Native

React Native vs. Hybrid app

Hybrid App là sự kết hợp giữa ứng dụng Web và ứng dụng mobile. Hybrid app được xây dựng dựa trên HTML + CSS + JS và được đóng gói load bên trong một ứng dụng mobile thông qua một native container gọi là Webview. Hybrid có thể truy cập vào hầu hết các chức năng thuộc phần cứng của điện thoại di động bao gồm máy ảnh, danh bạ, cảm biến gia tốc, âm thanh…

Nhược điểm của Hybrid App đó chính là vấn đề hiệu năng (tốc độ chậm, giao diện không thân thiện…) sẽ bị ảnh hưởng đáng kể cũng như không tương tác được hết những tài nguyên của điện thoại thông mình.

Trái ngược lại, React Native biên dịch mã JavaScript sang mã native (ngôn ngữ lập trình gốc) cho iOS và Android, cho phép ứng dụng có hiệu suất gần như ứng dụng native thực sự.

React Native là gì

Những ưu điểm của React Native

React Native cùng với Flutter đang là xu hướng lập trình di động hiện nay bởi tính đa nền tảng cũng như tiết kiệm thời gian triển khai dự án. Sau đây là những lợi ích mà nó đem lại cho việc triển khai dự án và bạn có thể trả lời cho câu hỏi có nên dùng React Native không?

1. Thời gian học ngắn hơn

Một lý do lập trình mobile app rất khó và tốn thời gian là vì thực tế bạn cần tìm hiểu 2 hệ sinh thái hoàn toàn khác biệt. Nếu bạn muốn lập trình app iOS, bạn phải học Swift hoặc Objective-C và Cocoa Pods.

Nếu muốn lập trình app Android, bạn cần học Java hoặc Kotlin và Android SDK. Tôi từng viết code với 3 ngôn ngữ là Swift, Objective C, Java và không thực sự hứng thú với việc tranh luận ngôn ngữ nào tốt hơn.

Tuy nhiên, điều tôi có thể nói là chúng khác nhau và việc học từng ngôn ngữ đó sẽ tốn khá nhiều thời gian. Điều tương tự cũng xảy ra với các frameworks: Cocoa Touch và Android SDK.

Tất nhiên, mỗi frameworks luôn có 1 gói các công cụ như công cụ testing, các libs, packages… và việc các dev phải cập nhật các tính năng mới nhất của mỗi hệ sinh thái là điều không thể bàn cãi.

Mặc khác, nếu bạn chọn lập trình trên React Native, phần lớn thời gian bạn sẽ chỉ cần học 1 bộ công cụ. Có rất nhiều thứ để bạn làm quen như: JavaScript, Node, React Native… nhưng chỉ có 1 công cụ duy nhất để học.

2. Khả năng tái sử dụng code

Khả năng sử dụng lại code đóng vai trò quan trọng trong lập trình phần mềm, nên mỗi khi bạn có thể sử dụng lại code thì React Native là công cụ tốt.

React Native không phải chỉ viết 1 lần mà nó chạy ở mọi nơi. Bất cứ khi nào bạn lập trình 1 app, bạn cần phải xây dựng UI trông native và phù hợp với hệ điều hành bạn hướng tới. Vì lý do này, 1 số UI code cần được viết theo đúng các chỉ dẫn và chuẩn mực tốt nhất của platform đó.

Tuy nhiên, sẽ luôn có vài UI code thông dụng có thể được chia sẻ chung với nhau cùng tất cả logic. Tính năng “có thể chia sẻ code” có rất nhiều lợi điểm như: tận dụng nguồn nhân lực tốt hơn, duy trì ít code hơn, ít bugs hơn, các tính năng trong cả 2 platforms cũng tương tự nhau…

Ưu điểm của React Native

3. Học 1 lần, viết ở mọi nơi

Khi team của Facebook tạo React Native, mục tiêu của họ là giúp các dev học 1 lần nhưng sử dụng được mọi platform. Bởi vì tất cả code của Android và iOS sử dụng cùng bộ công cụ, nên ý tưởng có một team dev làm app cho cả hai platform là thực hiện được – một điều ít khi xảy ra khi có rất ít dev lập trình cả hai platform iOS và Android.

Thậm chí, tôi còn cho rằng team đang lập trình web app sử dụng React.js sẽ không phải cực khổ nữa khi học lập trình React Native và bắt đầu làm mobile app.

4. Cộng đồng lớn

React Native đang trở lên rất phổ biến, nhiều developer đang đóng góp để làm React Native tốt hơn. Đặc biệt là nó được tạo ra và hỗ trợ bởi tập đoàn Facebook.

React Native Github repro là một nguồn mở và có hàng nghìn cộng tác viên hoạt động rất năng nổ.

Cộng đồng rất lớn và đang phát triển mạnh mẽ. Nhiều vấn đề đã và đang được giải quyết và bạn sẽ không cần phải tốn thời gian để nghiên cứu lại trong suốt quá trình học và làm việc với React Native.

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

5. Hot Reloading

Thói quen thông thường của dev khi code là test các thay đổi mỗi lần code được viết. Để thực hiện được, app cần phải được đóng gói lại và cài đặt hoặc trong 1 simulator hoặc một thiết bị thật sự.

Với React Native, phần lớn thời gian, bạn không cần phải tổng hợp lại app mỗi lần có thay đổi. Bạn chỉ cần làm mới app trong simulator, emulator hoặc thiết bị. Thậm chí còn có một tính năng là Live Reload để tự động refresh app mỗi lần phát hiện 1 thay đổi trong code.

6. Nguồn mở

React Native vẫn còn là công nghệ đang được sử dụng nhiều. Tuy vẫn còn nhiều lỗi, nhưng nhìn chung, các lập trình viên vẫn có thể sử dụng React Native vào giai đoạn production ở hầu hết các mobile app.

Ngoài ra vẫn còn vài tính năng có sẵn trong các lập trình native, chưa sử dụng được với React Native nhưng đây không phải là vấn đề lớn. Từ kinh nghiệm của bản thân, đây chỉ là chuyện đơn giản khi bạn đã quen thuộc với lập trình native.

Thêm nữa, khi React Native đã là nguồn mở, với cộng đồng lớn các lập trình viên đã hỗ trợ thực hiện nhiều tính năng hơn, fix bugs… Phần lớn thời gian, nếu bạn đang cố gắng lập trình 1 thứ gì đó đã quen thuộc trong mobile apps thì nhiều khả năng là nó đã được lập trình rồi.

Như bạn thấy, tôi thực sự rất lạc quan về React Native. Tôi vẫn nhớ lập trình Android và iOS native nhưng đồng thời rất hứng thú khi sử dụng React Native thời gian qua. Tôi nghĩ React Native sẽ là game – changer – kẻ thay đổi cục chơi trong lập trình mobile và khó lòng đợi được cho đến lúc nó trở thành platform không thể bỏ qua để lập trình mobile!

>> Bài viết liên quan: Flutter vs React Native – ai ngon hơn?

Những nhược điểm

React Native là một giải pháp tuyệt vời cho phát triển ứng dụng trên điện thoại di động, tuy nhiên đến thời điểm hiện tại, vẫn còn tồn tại một số khuyết điểm:

  1. Vẫn còn thiếu các component quan trọng nhưng dần dần cũng đang có thêm nhiều cập nhật mới kể từ bài viết này mà tôi chưa được biết.
  2. Không build được ứng dụng iOS trên Window và Linux: do yêu cầu từ Apple, mọi ứng dụng iOS cần được sử dụng nhiều native libs, cert…từ Xcode.
  3. React Native không thể build được ứng dụng “quá phức tạp” nếu bạn không biết Swift/Objecive-C, Java – tính phức tạp ở đây là ứng dụng của bạn cần phải chỉnh sửa các component. Để viết được 1 ứng dụng native bằng javascript thì “luôn luôn” có sẵn các component đã được viết từ Swift/Objective-C (iOS) và Java (Android) để bạn sử dụng. Trường hợp bạn muốn chỉnh sửa 1 component nào đó: thay đổi thành phần hoặc thêm API thì bạn phải tự viết bằng chính ngôn ngữ tương ứng của iOS hoặc Android. Nhờ cộng đồng lớn nên cũng có nhiều lập trình viên khác đã viết nhiều component cần thiết cho hầu hết ứng dụng (đây cũng là lý do vì sao Facebook biến React Native thành mã nguồn mở).
  4. Không dùng để viết game có tính đồ họa và cách chơi phức tạp.
  5. Dùng ES2015/ES6 nên đây là cấu trúc mới cho Javascript từ 2015, vì khá là mới nên những cấu trúc của nó có thể bạn chưa quen, dẫn tới việc khó khăn trong việc tiếp cận.

Cơ hội việc làm của React Native Developer

React Native là một framework phát triển ứng dụng di động đa nền tảng được sử dụng bởi một số công ty và doanh nghiệp lớn nhất thế giới, bao gồm Facebook, Instagram, Airbnb và Uber. Điều này dẫn đến một nhu cầu lớn về các nhà phát triển React Native có tay nghề cao.

Cơ hội việc làm của React Native Developer

Theo báo cáo thị trường IT Việt Nam 2023 do TopDev phát hành, lập trình viên React Native 3 – 4 năm kinh nghiệm có mức lương lên đến $1.512. Mức lương này có thể cao hơn tùy thuộc vào trình độ kinh nghiệm và kỹ năng của nhà phát triển.

React Native cũng là một công nghệ có nhu cầu cao trên toàn thế giới. Theo một nghiên cứu gần đây của Stack Overflow, React Native là một trong những framework phát triển ứng dụng di động phổ biến nhất. Điều này có nghĩa là các React Native developer có nhiều cơ hội việc làm ở cả trong và ngoài nước.

>> Xem thêm: Lộ trình học React Native chi tiết từ A-Z

Tóm lại React Native là một framework phát triển ứng dụng di động đa nền tảng hiệu quả và linh hoạt. Với những ưu điểm vượt trội, React Native đang trở thành một lựa chọn hàng đầu cho các nhà phát triển ứng dụng di động.

Trên đây là bài viết về React Native, hy vọng bài viết của TopDev đã cung cấp cho bạn những thông tin hữu ích. Nếu bạn quan tâm đến React Native, hãy bắt đầu học ngay hôm nay để nắm bắt cơ hội nghề nghiệp hấp dẫn trong lĩnh vực công nghệ thông tin.

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

Xem thêm việc làm IT tại TopDev!

bodyParser() trong Express.js

bodyParser() trong Express.js

Khi lần đầu học Express, tôi đã có file app.js được viết cho tôi và tôi chỉ phải thêm một vài routes như sau để nó họat động.

app.get(\'/\', function(req, res) {
  // get posts
  res.json(posts)
});

Nhưng sau đó, tôi đã thử setup một project Nodejs với Express từ đầu và đã cố tạo routes giống như sau

app.post(\'/\', function(req, res) {
  Post.create(req.body)
});

nhưng nó đã không làm việc. Và errors thông báo nói về req.body không tồn tại. Tôi thực sự không hiểu lý do tại sao nó không hoạt động mặc dù tôi đã làm tất cả theo đúng trình tự.

Điều tiếp theo tôi đã làm là cố gắng kiểm tra req object. Tôi đã cố gắng để tìm thấy data trong req object. Nhưng req object quá lớn và khó hiểu và tôi không thể thực sự tìm thấy những data mà tôi đang tìm kiếm.

Cuối cùng, tôi đã tìm đến bodyParser(), và tôi đã được biết

Bạn cần phải sử dụng bodyParser() nếu bạn muốn data form có sẵn trong req.body

Nhưng tôi vẫn không thực sự hiểu tại nó hoạt động như thế nào.

app.use()

Trước tiên để sử dụng bodyParser() bạn cần sử dụng đoạn code như sau:

app.use(bodyParser.json());

Để hiểu cách thức hoạt động trên, bạn phải hiểu cách middleware hoạt động trong Express. Cụ thể, khi app.use() được sử dụng với đối số làm một function:

app.use(function(req, res) {
  // make somethings
});
  • Function sẽ đựợc thực hiện với mọi request
  • Function này sẽ hoạt động như một middleware.

Đối lập với khi app.use() được gọi với đối số là một string

app.use(\'/test\', cb);

Nó sẽ chỉ match với request bắt đầu với /test

bodyParser.json() trả về một function và khi function đó được dùng làm đối số cho app.use, nó hoạt động giống như bất kỳ middleware khác.

var cb = bodyParser.json();
app.use(cb);

Data form trong req object

Thông tin được gửi qua internet qua các gói tin. Trong Nodejs, request object được đọc theo stream và response được ghi bởi stream.

req.on(\'data\', function(chunk) {
  // here\'s the chunk
});

Mỗi lần một đoạn của dữ liệu đến, bạn có thể sử dụng nó. Ví dụ một chuỗi như sau

abcdefghijklmnopqrstuvwxyz

cũng có thể là 5 đoạn

abcde
fghij
klmno
pqrst
uvwxyz

và bạn có khả năng truy cập mỗi đoạn dữ liệu.

Như vậy dữ liệu POST sẽ không có sẵn trên đối tượng req. Nếu bạn muốn truy cập dữ liệu POST, bạn phải lấy nó từ stream

app.use(function( req, res, next ) {
  var data = \'\';
  req.on(\'data\', function( chunk ) {
    data += chunk;
  });
  req.on(\'end\', function() {
    req.rawBody = data;
    console.log( \'on end: \', data )
    if (data && data.indexOf(\'{\') > -1 ) {
      req.body = JSON.parse(data);
    }
    next();
  });
});

bodyParser

bodyParser trả về một function hoạt động như một middleware. Chức năng lắng nghe trên req.on (\'data\') và xây dựng req.body từ các đoạn dữ liệu mà nó nhận được.

Nhưng có một số lưu ý. Về cơ bản, có nhiều cách khác nhau để định dạng dữ liệu bạn POST đến server:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • application/xml
  • maybe some others

Nói tóm lại, bodyParser phải phân tích dữ liệu một cách khác nhau tùy thuộc vào loại của nó. bodyParser hỗ trợ các function khác nhau để làm điều này.

// for parsing application/json
app.use(bodyParser.json()); 

// for parsing application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true })); 

// for parsing multipart/form-data
app.use(multer());

Với việc sử dụng bodyParser bạn có thể lấy được data form từ req.body

Tác giả: Bui Xuan Hien

 

“Code dễ đọc” là như thế nào?

code-de-doc-la-nhu-the-nao

Tác giả: Janeen Neri

Viết code kiểu gì cho dễ đọc?

Đối với lập trình viên, việc đọc code (readable code là gì) là việc cực kỳ quan trọng. Chúng ta thường có rất nhiều quy tắc cũng như các luật lệ bất thành văn cho việc sử dụng tên variable có nghĩa. Khi một function trở nên lớn hơn thì chia nó thành các function nhỏ hơn. Sử dụng các design pattern tiêu chuẩn. Nhưng dù cho tất cả mọi thứ có tuân thủ đúng theo những quy tắc trên thì chúng vẫn là một mớ hỗn độn.

Chúng ta có thể giải quyết vấn đề này bằng cách đặt thêm nhiều quy tắc hơn: Nếu tên variable quá dài thì hãy tái cấu trúc logic cơ bản lại. Khi một class tích lũy quá nhiều method hỗ trợ thì có lẽ nên cần hai class. Đừng sử dụng các design pattern trong những context không phù hợp.

Những hướng dẫn như vậy không có đúng hay sai và bạn phải tự đưa ra quyết định cái nào là tốt nhất, vì vậy chúng đòi hỏi các developer phải viết cách chọn lọc. Hay nói một cách khác, các developer phải biết viết code dễ đọc.

Đây là một bài toán khó. Và để giải quyết bài toán này chúng ta cần xây dựng một bức tranh rộng hơn về khả năng đọc.

Vậy “dễ đọc” để làm gì?

Trong thực tế, việc code có dễ đọc hay không thường tương tự như “Tôi thích đọc nó”. Đây không phải là một điều tự nhận ra được. Bên cạnh tính chủ quan thì tính dễ đọc còn bị ảnh hưởng bởi kinh nghiệm trước đây của chúng ta về việc đọc.

Code khó đọc giống như một cuốn tiểu thuyết khó hiểu vậy: Đầy những comment tường thuật dài; các file thì đầy chữ và phải đọc theo thứ tự tuần tự; thiếu sử dụng lại từ. Chúng ta cố gắng khiến code dễ đọc, nhưng thường nhắm sai độc giả mục tiêu.

Có một sự khác biệt giữa tính dễ đọc và code dễ đọc.

“Code tạo ra giao diện. Nhưng chính nó cũng là một giao diện.”

Có phải code đẹp thì dễ đọc hơn không? Đẹp là một phần phụ của việc dễ đọc, nhưng nó không khiến code dễ đọc. Bên cạnh đó, mỗi người đều có quan niệm riêng về “cái đẹp”. Thế nên sớm muộn gì định nghĩa của việc dễ đọc cũng sẽ tăng dần lên thành một đống tab, space, dấu ngoặc nhọn, camelCase và nhiều format khác.

Có phải code dễ đọc khi nó có ít bug hơn không? Có “ít bug hơn” đương nhiên tốt nhưng cơ cấu ở đây là gì? Cảm giác tuyệt vời mà ai đó có được khi họ nhìn thấy code dễ đọc? Đọc code không thể triệu tập bug bất kể học có đọc đi đọc lại bao nhiều lần đi chăng nữa.

Có phải code dễ đọc khi nó dễ chỉnh sửa hơn không? Đây có vẻ như là lý do tốt nhất trong tất cả những lý do trên. Khi các requirement thay đổi, các tính năng được thêm vào, bug xuất hiện thì cuối cùng cũng sẽ cần một người để sửa code đó. Để chỉnh sửa mà không gây ra sự cố gì, họ cần phải hiểu họ đang chỉnh cái gì và cách chỉnh sửa của họ sẽ thay đổi hành vi như thế nào. Điều này khiến chúng ta nhận ra một điều mới: Code dễ đọc nên được chỉnh sửa một cách dễ dàng và an toàn.

Điều gì làm cho code dễ sửa hơn?

Lúc này, chúng ta phải nhìn lại các quy tắc một lần nữa: “Code dễ chỉnh sửa hơn khi tên variable có ý nghĩa”. Nhưng chúng ta đã thay thế “dễ đọc” thành “dễ sửa”. Chúng ta đang tìm một insight mới chứ không phải một đống ghi nhớ theo quy tắc cũ.

Hãy bắt đầu bằng cách đặt thực tế là chúng ta đang nói về code sang một bên. Lập trình đã xuất hiện từ vài thập kỷ trước nhưng chỉ là dấu chấm nhỏ trong lịch sử loài người. Nếu chúng ta tự giới hạn bản thân trong dấu chấm đó, chúng ta sẽ giới hạn ý tưởng của mình.

Thay vào đó, hãy nhìn về khả năng dễ đọc thông qua lăng kính của thiết kế giao diện. Cuộc sống của chúng ta chứa đầy các giao diện, digital và nhiều thứ khác. Một món đồ chơi luôn có thêm tính năng cuộn lại hoặc kêu chút chít. Một cánh cửa luôn có giao diện để người dùng mở, đóng và khóa nó. Một cuốn sách sắp xếp dữ liệu theo các trang để dễ lật hơn thay vì cuộn lên xuống. Bạn có thể tìm hiểu thêm về những giao diện như vậy thông qua các khóa học design hoặc hỏi design team trong công ty. Chúng ta đều đang sử dụng những giao diện tốt ngay cả khi không biết điều gì làm cho chúng tốt như vậy.

Code tạo ra giao diện. Nhưng bản thân code, cùng với IDE của nó, cũng là một giao diện. Giao diện người dùng mà chúng ta đang tìm hiểu nhắm tới một nhóm đối tượng rất nhỏ: teammate của chúng ta. Từ phần này trở đi, chúng ta sẽ thay thế “teammate” thành “user” và đề cập tới UI design.

Với thay đổi này, hãy xem xét một số user flow mẫu như sau:

  • User muốn thêm một tính năng mới. Để làm được điều này, họ phải tìm đúng vị trí và thêm tính năng mà không tạo ra thêm bug.
  • User muốn fix bug. Họ cần tìm thấy nguồn bug và sửa bug để nó dừng hoạt động mà không tạo ra những bug khác.
  • User muốn xác định một trường hợp cụ thể diễn ra theo cách nào. Họ muốn tìm code đúng rồi từ đó dò theo tính logic để mô phỏng những gì sẽ xảy ra.

Và còn nhiều flow khác nữa. Đa số các flow đều theo một mô hình tương tự nhau. Chúng ta sẽ xem qua các ví dụ cụ thể, nhưng lưu ý rằng, hãy nhớ các quy tắc chung thay vì danh sách các quy tắc như cũ.

__________________________

Chúng ta có thể giả định rằng user của chúng ta không thể đi thẳng tới dòng code đúng. Điều này đúng cho cả những hobby project; chúng ta rất dễ quên vị trí của feature dù cho chính chúng ta là người viết nó. Vì vậy, code nên dễ tìm kiếm.

Nếu chúng ta muốn nâng cao khả năng tìm kiếm thì chúng ta sẽ cần công cụ SEO. Và tên variable có nghĩa có tác dụng rất lớn ở đây. Nếu user không thể tìm thấy feature bằng cách chuyển lên callstack từ một điểm đã biết, họ có thể bắt đầu gõ keyword vào khung tìm kiếm. Khi user của chúng ta tìm code, họ chỉ cần một điểm nhập duy nhất và làm việc từ đó. Chúng ta cần đáp ứng nhu cầu của user tốt nhất có thể. Nếu có quá nhiều keyword, họ sẽ cảm thấy không hài lòng.

“Nếu user thấy rằng “mức logic này chính xác” ngay lập tức thì họ có thể quên tất cả các lớp trừu tượng trước đó và cảm thấy thoải mái và sẵn sàng hơn để thực hiện các lớp tiếp theo.”

User cũng có thể tìm kiếm thông qua autocompletion. Họ biết họ cần call function nào hay muốn sử dụng enum case nào, vì vậy họ sẽ bắt đầu nhập và chọn autocomplete phù hợp. Nếu một function chỉ được sử dụng trong các trường hợp cụ thể hoặc xuất hiện cảnh báo yêu cầu đọc cẩn thận, chúng ta có thể cần một tên dài hơn. Khi user đọc danh sách autocomplete, họ có xu hướng tránh những tùy chọn trông có vẻ phức tạp trừ khi họ biết họ đang làm gì.  

Tương tự, những tên ngắn và chung chung thường được xem là tùy chọn mặc định và phù hợp với user bình thường. Hãy chắc rằng họ không làm bất cứ điều gì kì lạ. Chúng ta không nên đặt các setter vào những getter-trông-đơn-giản, cũng giống như một UI cho khách hàng không nên hiển thị nút “View” mà làm thay đổi data của họ.

Và user muốn tìm thông tin một cách nhanh chóng. Trong hầu hết các trường hợp, compile tốn khá nhiều thời gian và run có thể yêu cầu visit rất nhiều các trường hợp khác nhau một cách thủ công. Nếu có thể, user sẽ thích đọc hành vi code hơn là ném vào các breakpoint và chạy code.

Để bỏ qua việc chạy code, họ cần thỏa mãn hai điều kiện sau:

  • Họ hiểu code đang làm gì.
  • Họ biết chắc code đang làm những gì được đưa ra.

Sự trừu tượng giúp thỏa mãn điều kiện đầu tiên. User nên lột lớp trừu tượng cho đến khi đạt được mức độ chi tiết mong muốn. Hãy suy nghĩ theo các dòng của UI phân cấp. Chúng ta cho phép người dùng thực hiện các điều hướng rộng trước, sau đó là điều hướng chính xác hơn khi họ muốn đọc logic chi tiết hơn.

Đọc một file hoặc method tuần tự mất linear time. Ngay khi user click lên xuống thông qua các callstack, họ sẽ chuyển sang thực hiện tree search. Đưa ra một hệ thống phân cấp cân bằng chỉ làm mất logarithmic time. Trong UI luôn có một danh sách nhưng hãy xem xét một cách cẩn thận liệu một context đơn có cần chứa nhiều hơn một vài method call không.

Đối với điều kiện thứ hai, user khác nhau sẽ có chiến lược khác nhau. Trong các tình huống rủi ro thấp, chúng ta có thể chỉ cần các comment hoặc tên method. Đối với các tình huống rủi ro và phức tạp hơn, hoặc khi user thấy khó chịu bởi các comment cũ, họ có thể bỏ qua chúng luôn. Đôi khi, ngay cả tên method và variable cũng tạo ra sự khó hiểu. Khi điều này xảy ra, user phải đọc code nhiều hơn và xây dựng một mô hình logic lớn hơn. Để giải quyết điều này thì ta cần những context nhỏ và dễ hiểu. Nếu user thấy rằng “mức logic này chính xác” ngay lập tức thì họ có thể quên tất cả các lớp trừu tượng trước đó và cảm thấy thoải mái và sẵn sàng hơn để thực hiện các lớp tiếp theo.

Khi user ở mode này, các token riêng lẻ bắt đầu trở nên quan trọng hơn. Một bool flag element.visible = true / false rất dễ phân tích trong sự cô lập, nhưng nó đòi hỏi phải kết hợp

hai token khác nhau. Nếu thay vào đó, flag là element.visibility = .visible / .hidden, các context liên quan đến flag có thể được lướt qua, mà không cần phải đọc tên của variable để tìm hiểu về khả năng hiển thị. Chúng ta có thể thấy những sự cải tiến về design trong customer-facing UIs. Trong vài thập kỷ qua, các nút xác nhận đã phát triển từ OK / Cancel sang các option cụ thể hơn như Save / Discard hoặc Save / Keep editing. User có thể tìm xem những gì đang diễn ra bằng cách nhìn vào các option thay vì phải đọc toàn bộ context.

Các unit test cũng có thể giúp chúng ta vượt qua tình trạng proof-of-behavior. Chúng hành động như những comment đáng tin cậy hơn vì chúng ít bị tổn thương. Điều này vẫn liên quan đến việc build. Tuy nhiên, bất kỳ team nào có pipeline CI tốt cũng đã run test, vì vậy user có thể bỏ qua bước này cho code hiện có.

Về lý thuyết, sự an toàn đến từ sự hiểu biết. Khi user của chúng ta hiểu hành vi hiện tại của code, họ sẽ có thể chỉnh sửa nó một cách an toàn. Trong thực tế, các kỹ sư cũng là con người thôi. Bộ não của chúng ta cũng giống như bất kỳ ai khác. Chúng ta hiểu càng ít thì các hành động mà chúng ta thực hiện càng an toàn hơn.

Code dễ đọc sẽ giảm tải phần lớn việc kiểm tra lỗi cho máy. Các debug assert là một cách để làm điều này, mặc dù chúng đòi hỏi building và running. Tệ hơn là chúng có thể không bắt các trường hợp như user quên path đó. Các unit test có thể thực hiện các trường hợp lãng quên như vậy tốt hơn, nhưng một khi user đã thực hiện các thay đổi, họ cần có thời gian để run.

“Tóm lại, code dễ đọc cũng phải dùng được. Và nếu được thì nó cũng nên đẹp đẹp chút”

Để có turnaround time nhanh nhất, chúng ta sử dụng các compiler error. Chúng hiếm khi yêu cầu full build và thậm chí có thể xuất hiện trong real time. Vậy chúng ta có thể tận dụng lợi thế của chúng như thế nào? Nhìn rộng ra là chúng ta muốn tìm kiếm các tình huống khi compiler trở nên nghiêm ngặt hơn. Ví dụ như đa số các compiler không quan tâm nếu câu lệnh “if” có đầy đủ không nhưng sẽ kiểm tra câu lệnh “switch” cho bất kỳ case thiếu sót nào một cách cẩn thận. Nếu user cố gắng thêm hoặc chỉnh sửa một case, thì tất cả các điều kiện trước đó nên là các exhaustive switch để an toàn hơn. Vào thời điểm họ thay đổi các case, compiler sẽ gắn cờ tất cả các điều kiện cần được kiểm tra lại.

Một vấn đề liên quan tới tính dễ đọc của code là dùng những hàm đơn giản trong các lệnh điều kiện. Đặc biệt là khi một ứng dụng được viết theo ngôn ngữ JSON, sẽ rất dễ mắc phải lỗi viết quá nhiều câu điều kiện if xung quanh với các tham chiếu là toán tử dạng chuỗi string hoặc dạng số nguyên. Điều này không chỉ làm cho việc gõ code dễ sai, mà còn làm cho user không biết được giá trị nào khả thi. Có một sự khác biệt rất lớn giữa việc phải kiểm tra tính khả thi của từng string với việc chỉ cần kiểm tra 2 phần 3 của chúng. Kể cả khi các hàm đơn giản được chuyển thành constant, user cũng là người sẽ tự gán các giá trị khác một cách tùy ý. Nếu chúng ta sử dụng custom objects hoặc enums, compiler sẽ chặn những giá trị không thỏa và đưa ra một danh sách những giá trị thỏa điều kiện khác.

Tương tự như vậy, chúng ta nên tập trung chỉ dùng một enum hơn là nhiều boolean flags nếu một vài kết hợp của flags không thỏa điều kiện. Ví dụ, tưởng tượng như một bài nhạc đang chờ tải về hoặc đang chơi. Nếu chúng ta đại diện 2 bool flags là (loaded, playing), compiler sẽ cho phép những giá trị không thỏa (loaded: false, playing: true). Tuy nhiên, nếu dùng enum, .buffering/.loaded/.playing, các trạng thái không thỏa sẽ không xảy ra. “Vô hiệu hóa các kết hợp không thỏa trong phần cài đặt” nên là một tính năng cơ bản trong việc thiết kế customer-facing UI. Nhưng khi chúng ta đã viết những dòng code bên trong một app, chúng ta thường quên mất đặt mình vào trường hợp này.

Sau khóa học về user flow này, chúng ta đã đạt được những nguyên tắc đã đề cập lúc ban đầu. Nhưng giờ thì ta sẽ có một quy trình cho việc tạo ra và tùy chỉnh chúng. Chúng ta cần tự hỏi rằng:
• Những dòng code này có thể dễ cho user tìm thấy không? Liệu nó có thể làm lộn xộn và hiện ra những kết quả tìm kiếm không liên quan?
• Một khi tìm thấy dòng code, user có thể xác định được behavior hiện tại của dòng code không?
• Liệu user có thể dựa vào xác minh máy tính để chỉnh sửa và sử dụng lại code này một cách an toàn?

Tóm lại, code dễ đọc cũng phải dùng được. Và nếu được thì nó cũng nên đẹp đẹp chút.

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

20 trường hợp sử dụng lệnh Docker cho developer

Công nghệ sẽ phát huy một cách tốt nhất nếu bạn biết cách tận dụng nó, và điều này cũng tương tự với Docker.

Những trường hợp về các command cụ thể kèm theo lời giải thích và các bản demo sẽ có trong bài viết này. Hãy cùng mọi người trong team tham khảo khi áp dụng Docker trong thực tế nhé!

docker build

docker build --rm -t docker-examples:latest .

Trường hợp sử dụng: Bạn không có docker-compose file mà chỉ có dockerfile. Nếu bạn muốn chạy service của mình, tuy nhiên bạn phải build nó trước đã.

Chi tiết: Build một file ảnh từ một dockerfile.

--rm: được sử dụng để xóa một container trung gian sau khi đã build thành công. Sau khi build mà không có option đó trong danh sách container của bạn, cái này sẽ xuất hiện:

-t : gắn thẻ hình ảnh được build. Nếu không cái này, chúng ta sẽ rất khó biết có gì chứa trong đó nếu chỉ nhìn lướt qua

Phím tắt với VS Code

docker build --rm -t --no-cache docker-examples:latest .

Trường hợp sử dụng: Bạn không chỉ rõ một gói phiên bản phụ thuộc và muốn cập nhật lên phiên bản mới nhất, nhưng bạn không thay đổi dockerfile và Docker liên tục sử dụng các layer được lưu trong bộ nhớ cache.

Chi tiết: Buộc Docker build lại hình ảnh từ đầu.

  Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains

docker run

docker run -d -p 4000:3000 docker-examples:latest

Trường hợp sử dụng: Bạn đã build hình ảnh Docker và muốn chạy nó. Ứng dụng bên trong container sử dụng 3000 port, nhưng bạn muốn sử dụng 4000 port trên máy cục bộ của mình.

Chi tiết:

-d : chạy container trong background và trong ID container.

-p : xuất cổng container tới cổng máy cục bộ

host_port: docker_port.

Phím tắt với VS Code

docker run docker-examples:latest

Trường hợp sử dụng: Dùng để chạy docker và kiểm soát launch process trong terminal của mình. Ấn Ctrl + C để thoát khỏi container

docker run -t -i docker-examples:latest node

Trường hợp sử dụng: Dùng để chạy một command, tool hay một instance mới của container ( Ví dụ như nếu bạn muốn truy cập vào bảng điều khiển node.js và thực thi một cái gì đó). Xem thêm các docker exec cho các container đã khởi chạy.

docker stop

docker stop container_name

Trường hợp sử dụng: Dùng để dừng một launched containery.

Chi tiết: Bạn có thể tìm thấy tên container bằng cách sử dụng command “docker ps -a”

Phím tắt với VS Code

docker stop $(docker ps -a -q)

Ví dụ: Dừng tất cả các container

docker ps

docker ps -a

Trường hợp sử dụng: Bạn muốn tìm tên của container cần được dừng. Bạn cũng có thể sử dụng cái này để xem trạng thái và các cổng tiếp xúc của container.

Phím tắt với VS Code

docker logs

docker logs -f container_name

Trường hợp sử dụng: docker logs sẽ cho bạn  biết lý do tại sao service của bạn bị sập khi đang chạy. Hoặc khi bạn muốn xem các log cho một service trên cơ sở liên tục.

Chi tiết: Theo dõi các log của container cụ thể; cái này cũng được dùng để chạy và dừng container.

-f bật theo sau log output

Phím tắt với VS Code

docker kill

docker kill $(docker ps -q)

Trường hợp sử dụng: Bạn muốn xem mọi thứ về Docker khi có vấn đề xảy ra

Chi tiết: Xóa tất cả các container đang chạy.

docker rm

docker rm $(docker ps -a -q)

Trường hợp sử dụng: Bạn muốn dọn dẹp một danh sách container lộn xộn

Chi tiết: Xóa tất cả các container đã dừng

docker system

docker system prune

Trường hợp sử dụng: Bạn muốn loại bỏ những thứ không sử dụng nữa.

Chi tiết: Loại bỏ tất cả các container, netwwork, hình ảnh, tùy chọn và volume không còn sử dụng nữa

Phím tắt với VS Code

docker rmi

docker rmi $(docker images -q)

Trường hợp sử dụng: Bạn cần thêm dung lượng trên đĩa

Chi tiết: Xóa tất cả hình ảnh

docker exec

docker exec -it container_name /bin/sh

Trường hợp sử dụng: Khi container báo lỗi connection timeout của “get” request trong quá trình execution của example.com. Lúc đấy, bạn có thể kết nối với container và chạy curl / ping.

Chi tiết: Chạy một command / tool cụ thể bên trong container và tự cho phép bạn sử dụng nó bên trong container. Việc này rất hữu ích cho việc debug và để biết cái gì xảy ra trong Docker container

docker-compose up

docker-compose up

Trường hợp sử dụng: Bạn có một docker-compose file với một số service, bạn muốn build rồi chạy tất cả để xem output như thế nào.

docker-compose up -d

Trường hợp sử dụng: Bạn muốn build và chạy tất cả các service nền và sau đó xem trạng thái của chúng.

Phím tắt với VS Code

docker-compose up -d example-service-1

Trường hợp sử dụng: Bạn muốn chạy một service cụ thể (tên như trong docker-compose file) để tất cả các port và volume được sử dụng trong docker compose file trong service đó

docker-compose down

docker-compose down

Trường hợp sử dụng: Bạn cần dừng tất cả các service được khai báo trong docker-compose file. Lệnh này dừng các container và loại bỏ từng network, volume và hình ảnh của container được tạo bởi ip. Và nó cũng rất hữu ích khi bạn muốn bắt đầu từ một sheet clean.

docker-compose run

docker-compose run example_app rails db:migrate

Trường hợp sử dụng: Bạn cần chạy một task cụ thể (ví dụ như di chuyển, kiểm tra) mà service của bạn cung cấp. Bạn có thể thực hiện tương tự như chạy docker, nhưng cũng có thể theo tên service từ docker-compose run. Hãy nhớ rằng khi bạn sử dụng các cổng “run”, các khai báo trong docker-compose sẽ không được xuất ra nếu không sử dụng –service-port.

docker-compose exec

docker-compose exec example_app node

Trường hợp sử dụng: Lệnh này tương tự với docker exec khi bạn muốn truy cập vào bên trong container đã khởi chạy và thực thi một cái gì đó. Điểm khác biệt giữa hai cái là bạn có thể truy cập bằng tên service. Lệnh này rất hữu ích cho việc gỡ lỗi, kiểm tra mạng và kiểm tra xem tất cả dữ liệu có tồn tại bên trong bộ chứa Docker không.

docker-compose logs

docker-compose logs -f container_name

Trường hợp sử dụng: Service của bạn bị sập khi đang khởi chạy và bạn muốn biết lý do tại sao.

Chi tiết: Xem các log của container cụ thể, kể cả những cái đang chạy và bị dừng lại. Thay vì sử dụng lệnh docker logs thì hãy sử dụng tên service thay cho tên container.

-f bật theo sau log output.

docker-compose stop

docker-compose stop example_app

Trường hợp sử dụng: Bạn muốn dừng container theo tên service hoặc tên container.

docker-compose restart

docker-compose restart example_app

Trường hợp sử dụng: Bạn muốn khởi động lại một container với tên service hoặc tên container.

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

Xem thêm việc làm Web Developer mới nhất trên TopDev

TopDev via dev.to

Mẫu bảng mô tả công việc lập trình Python

Mẫu bảng công việc lập trình Python

Lập trình Python chịu trách nhiệm viết logic ứng dụng web phía máy chủ, phát triển các thành phần back-end, kết nối ứng dụng với các dịch vụ web của bên thứ ba khác và hỗ trợ các nhà phát triển front-end bằng cách tích hợp công việc của họ với ứng dụng Python. Hy vọng, Mẫu bảng công việc lập trình Python này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.

Về lập trình viên Python: Để thành một Python Developer giỏi, các lập trình viên cần nắm rõ cấu trúc dữ liệu và giải thuật, kỹ thuật lập trình hướng đối tượng cũng như có kiến thức hoặc kinh nghiệm về framework liên quan như Flask, Django cũng như Restful Framework của từng Framework trên… để cùng tham gia nghiên cứu, thiết kế, phát triển và tích hợp các các giải pháp và hệ thống ứng dụng phục vụ công việc quản trị, vận hành và điều hành cho sản phẩm công ty/ khách hàng.

Tham khảo việc làm python mới nhất trên TopDev

Mẫu bảng công việc lập trình Python

YÊU CẦU CÔNG VIỆC

  • Có kinh nghiệm lập trình python, sử dụng thành thạo một trong các framework như Flask, Django,…
  • Có kinh nghiệm làm việc trên hệ điều hành Linux(Ubuntu), Window…
  • Có kiến thức lập trình OOP, design pattern.
  • Có hiểu biết cơ bản về cơ sở dữ liệu và hệ thống: MySQL, MongoDB hay PostgreSQL – Biết sử dụng công cụ quản lý mã nguồn: Git, Jira, SVN…
  • Nắm vững kiến thức về HTML/CSS/Javascript – Khả năng làm việc tốt trong môi trường tốc độ cao.

MÔ TẢ CÔNG VIỆC

  • Tham gia lập trình và phát triển web/service bằng ngôn ngữ python
  • Tham gia vào quá trình phân tích và thiết kế hệ thống
  • Thu thập và xử lí các yêu cầu thiết kế và kĩ thuật;
  •  Tối ưu và nâng cấp mã nguồn để cải tiến hiệu quả, tăng độ ổn định và bảo mật
  • Tìm hiểu yêu cầu, phân tích, thiết kế, nghiên cứu công nghệ công nghệ mới, đưa ra giải pháp áp dụng vào sản phẩm dịch vụ của công ty
  • Duy trì và phát triển các website, code và cấu trúc dữ liệu có sẵn của công ty
  Top 5 câu hỏi phỏng vấn Python không thể bỏ qua
  Để học tốt Python

Tham khảo thêm những công việc lập trình hot nhất thị trường tại đây

Top 3 Laravel CMS được đánh giá cao

top-3-laravel-cms-duoc-danh-gia-cao

Hiện tại, Laravel là PHP Framework được sử dụng phổ biến nhất trên thế giới vì những ưu điểm vượt trội tận dụng các kỹ thuật Design Pattern, các công nghệ mới nhất của PHP và rất dễ dàng tiếp cận và sử dụng nó.

Điểm yếu của Laravel là không hỗ trợ các phiên bản PHP cũ vì thế các website có nền tảng PHP version thấp hơn khá là khó khi có ý định chuyển sang Laravel và phải luôn cập nhật các thông tin mới nhất về PHP để áp dụng vào Laravel.

Dựa trên nền tảng Laravel PHP Framework có rất nhiều công ty, tổ chức đã tạo ra các CMS Open source để giúp developer hoặc người dùng dễ dàng thao tác và xây dựng ra một trang web nhanh hơn build từ chính core của framework.

Xem thêm tuyển dụng Laravel lương cao lên đến 2000 USD

Sau khi tìm hiểu thì mình được biết 5 CMS được nhiều người đánh giá cao gồm:

1. October CMS

URL: https://octobercms.com/
GitHub: https://github.com/octobercms/october

Tính đến thời điểm hiện tại là một CMS dựa trên Laravel phổ biến nhất. Và nó xứng đáng với sự phổ biến vì là một trong những product hoàn chỉnh: tài liệu đầy đủ, dễ sử dụng, nhiều plugin, themes, và được chia sẻ bởi một cồng đồng rộng lớn bạn chỉ cần lấy về và sử dụng nó.

Với open source CMS khi bạn download toàn bộ source code về bạn chỉ cần cài đặt theo hướng dẫn là bạn đã có một trang web tương đối hoàn chỉnh.
Nhưng trong quá trình cài đặt thì luôn luôn có các options cho mình chọn: blank, theme hoặc ready-made

Top 3 Laravel CMS được đánh giá cao

Tôi đã chọn một theme và nó là một trong những theme mặc định. Có rất nhiều theme cho mình lựa chọn.

Top 3 Laravel CMS được đánh giá cao

Và sau đó cài đặt sẽ tiếp tục, download các files từ internet.

Top 3 Laravel CMS được đánh giá cao

Dưới đây là kết quả của quá trình cài đặt, trang chủ sẽ như hình bên dưới:

Top 3 Laravel CMS được đánh giá cao

 

Bây giờ, trang admin sẽ khá đẹp. Theme bao gồm tất cả các cấu trúc của các pages là gồm Twig templates, bạn có thể chỉnh sửa từ back-end.

Top 3 Laravel CMS được đánh giá cao

Và tất nhiên, bạn có thể chỉnh sửa code từ back-end một cách trực quan tùy theo cách bạn bố trí layout… Nó là một CMS cho các developers.
Bạn có thể xem trước click button Preview và click vào Save bạn sẽ có một trang, một layout như ý bạn. Thật tuyệt vời phải không?

Top 3 Laravel CMS được đánh giá cao

Ngoài ra, có một vài thiết lập hữu ích, đặc biệt như cấu hình nội dung mail – bạn không chỉ chọn trình điều khiển mail từ back-end (PHP Mail, Mailgun, Mandrill …) mà còn có các mẫu email đã được soạn sẵn để chỉnh sửa.

Top 3 Laravel CMS được đánh giá cao

Vậy tôi có thể nói những cái hay về “marketing” trong cấu trúc nền tảng của October CMS, đó là điều quan trọng trong core của CMS.

Tài liệu của October CMS được viết rất tốt.

Top 3 Laravel CMS được đánh giá cao

Chúng có sẵn hàng trăm plugins, bao gồm cả miễn phí và bản phải trả phí, deverlopers có thể kiếm tiền bằng cách viết các plugin or các themes.

Top 3 Laravel CMS được đánh giá cao

Khoảng hơn 50 themes chia sẻ sẵn để ta dùng, điều này hoàn toàn phụ thuộc vào sự chia sẻ của các nhà phát triển.

Top 3 Laravel CMS được đánh giá cao

Và một ấn tượng tốt đẹp khác về October CMS là bạn có thể nâng cấp bản hiện tại cho hệ thống đặc biệt nào đó khi mình cần.

Và cuối cùng, tên CMS này được đặt theo thời gian của dự án bắt bầu từ tháng Mười năm 2013. Bạn có thể xem những commit gần nhất trên Github của CMS này tại đây

Vậy nếu dự án bạn đơn thuần như kiểu cms thì bạn hãy chọn October CMS hoặc bạn có thể có vài lựa chọn khác nữa.

2. Asgard CMS

URL: https://asgardcms.com/
GitHub: project – https://github.com/AsgardCms and core platform – https://github.com/AsgardCms/Platform

Là một dự án tương đối mới, bắt đầu vào năm 2015, nhưng nó thật sự mạnh. Nhưng CMS này nhắm đến các nhà phát triển nhiều hơn, nên khi cài đặt thì thực hiện bằng dòng lệnh.

  1. Đầu tiên bạn lấy source code bằng dòng lệnh sau:
composer create-project asgardcms/platform your-project-name
  1. Cuối tuần, bạn cài đặt bằng lệnh:
php artisan asgard:install
  1. Và sau đó bạn hưởng thành quả website bạn vừa cài đặt thôi. Bạn login vào trang quả trị bằng đường dẫn /backend.

Lệnh cài đặt sẽ hỏi bạn một số câu hỏi:

Top 3 Laravel CMS được đánh giá cao

sau khi login vào trang quản trị, nó thật sự đẹp và đơn giản:

Top 3 Laravel CMS được đánh giá caođịnh trang chủ sẽ rất đơn giản, nhưng tôi đoán bạn sẽ dễ dàng mở rộng đằng sau nó.

Asgard CMS cũng được cập nhật liên tục, commit gần nhất trên GitHub mới tuần trước. Nên tôi thấy Asgard CMS là một lựa chọn đơn giản cho Laravel CMS.

3. Lavalite

URL: http://www.lavalite.org/
GitHub: https://github.com/LavaLite/cms

Cũng là dự án tập trung vào cho nhà phát triển với phiên bản Laravel 5.2 và cài đặt bằng dòng lênh:

  1. composer create-project LavaLite/cms –prefer-dist website
  2. Enter your database details in .env file on root folder.
  3. Run php artisan migrate –seed to setup your database.

Và sau khi cài đặt xong tôi có thể nói Lavalite vừa đơn giản vừa dễ sử dụng. Trang Admin sẽ nhìn như sau:Top 3 Laravel CMS được đánh giá caodiện trang chủ rất đơn giản, nhưng bạn có thể tùy chỉnh nếu bạn muốn:Top 3 Laravel CMS được đánh giá cao bây giờ chúng ta chuyển sang những sản phẩm chưa thực sự hoàn chỉnh hoặc gặp khó khăn khi sử dụng, nhưng vẫn review chúng.

Kết luận

Có rất nhiều CMS dựa trên Laravel, nhưng October CMS mạnh hơn cả. Cá nhân tôi không phải là fan của giải pháp này (bạn phải maintain CMS và liên tục update framework và cms), nhưng nếu bạn cần loại kiến trúc này – chỉ cần chọn trong cms trên.

Lưu ý: Tôi cũng đã tìm thấy một số CMS khác hoặc chỉ mới bắt đầu mà tôi không đề cập ở đây.

Tham khảo tại Review: Top 5 Laravel-based CMSs

Xem thêm các vị trí tuyển dụng lập trình nhiều ngành nghề HOT tại Topdev

Unit Test là gì? Khái niệm và vai trò

unit-test-la-gi

1. Khái niệm về Unit Test

Unit Test là gì?

Unit Test là một loại kiểm thử phần mềm trong đó các đơn vị hay thành phần riêng lẻ của phần mềm được kiểm thử. Kiểm thử đơn vị được thực hiện trong quá trình phát triển ứng dụng. Mục tiêu của Kiểm thử đơn vị là cô lập một phần code và xác minh tính chính xác của đơn vị đó.

Unit là gì?

Một Unit là một thành phần PM nhỏ nhất mà ta có thể kiểm tra được như các hàm (Function), thủ tục (Procedure), lớp (Class), hoặc các phương thức (Method).

Vì Unit được chọn để kiểm tra thường có kích thước nhỏ và chức năng hoạt động đơn giản, chúng ta không khó khăn gì trong việc tổ chức, kiểm tra, ghi nhận và phân tích kết quả kiểm tra nên việc phát hiện lỗi sẽ dễ dàng xác định nguyên nhân và khắc phục cũng tương đối dễ dàng vì chỉ khoanh vùng trong một Unit đang kiểm tra.

Mỗi UT sẽ gửi đi một thông điệp và kiểm tra câu trả lời nhận được đúng hay không, bao gồm:

  • Các kết quả trả về mong muốn
  • Các lỗi ngoại lệ mong muốn

Các đoạn mã UT hoạt động liên tục hoặc định kỳ để thăm dò và phát hiện các lỗi kỹ thuật trong suốt quá trình phát triển, do đó UT còn được gọi là kỹ thuật kiểm nghiệm tự động. UT có các đặc điểm sau:

  • Đóng vai trò như những người sử dụng đầu tiên của hệ thống.
  • Chỉ có giá trị khi chúng có thể phát hiện các vấn đề tiềm ẩn hoặc lỗi kỹ thuật.

Tham khảo thêm các vị trí tuyển dụng tester hấp dẫn tại Topdev.

Khi làm Unit test chúng ta thường thấy các khái niệm sau:

  1. Assertion: Là một phát biểu mô tả các công việc kiểm tra cần tiến hành, thí dụ: AreEqual(), IsTrue(), IsNotNull()… Mỗi một UT gồm nhiều assertion kiểm tra dữ liệu đầu ra, tính chính xác của các lỗi ngoại lệ ra và các vấn đề phức tạp khác như: – Sự tồn tại của một đối tượng – Điều kiện biên: Các giá trị có vượt ra ngoài giới hạn hay không – Thứ tự thực hiện của các luồng dữ liệu …
  2. Test Point: Là một đơn vị kiểm tra nhỏ nhất, chỉ chứa đơn giản một assertion nhằm khẳng định tính đúng đắn của một chi tiết mã nào đó. Mọi thành viên dự án đều có thể viết một test point. Test Case: Là một tập hợp các test point nhằm kiểm tra một đặc điểm chức năng cụ thể, thí dụ toàn bộ giai đoạn người dùng nhập dữ liệu cho đến khi thông tin được nhập vào cơ sở dữ liệu. Trong nhiều trường hợp kiểm tra đặc biệt và khẩn cấp có thể không cần đến test case.
  3. Test Suite: Là một tập hợp các test case định nghĩa cho từng module hoặc hệ thống con.
  4. Regression Testing (hoặc Automated Testing): Là phương pháp kiểm nghiệm tự động sử dụng một phần mềm đặc biệt. Cùng một loại dữ liệu kiểm tra giống nhau nhưng được tiến hành nhiều lần lặp lại tự động nhằm ngăn chặn các lỗi cũ phát sinh trở lại. Kết hợp Regression Testing với Unit Testing sẽ đảm bảo các đoạn mã mới vẫn đáp ứng yêu cầu thay đổi và các đoạn mã cũ sẽ không bị ảnh hưởng bởi các hoạt động bảo trì.
  5. Production Code: Phần mã chính của ứng dụng được chuyển giao cho khách hàng.
  6. Unit Testing Code: Phần mã phụ để kiểm tra mã ứng dụng chính, không được chuyển giao cho khách hàng.

2.Vòng đời Unit Test

UT có 3 trạng thái cơ bản:

  • Fail (trạng thái lỗi)
  • Ignore (tạm ngừng thực hiện)
  • Pass (trạng thái làm việc)
  • Toàn bộ UT được vận hành trong một hệ thống tách biệt. Có rất nhiều PM hỗ trợ thực thi UT với giao diện trực quan. Thông thường, trạng thái của UT được biểu hiện bằng các màu khác nhau: màu xanh (pass), màu vàng (ignore) và màu đỏ (fail)

Unit Test là gì? Khái niệm và vai trò

UT chỉ thực sự đem lại hiệu quả khi:

  • Được vận hành lặp lại nhiều lần
  • Tự động hoàn toàn
  • Độc lập với các UT khác.

3. Thiết kế Unit test

Mỗi UT đều được tiết kế theo trình tự sau:

  • Thiết lập các điều kiện cần thiết: khởi tạo các đối tượng, xác định tài nguyên cần thiết, xây dựng các dữ liệu giả…
  • Triệu gọi các phương thức cần kiểm tra.
  • Kiểm tra sự hoạt động đúng đắn của các phương thức.
  • Dọn dẹp tài nguyên sau khi kết thúc kiểm tra.

4. Ứng dụng Unit test

  • Kiểm tra mọi đơn vị nhỏ nhất là các thuộc tính, sự kiện, thủ tục và hàm.
  • Kiểm tra các trạng thái và ràng buộc của đối tượng ở các mức sâu hơn mà thông thường chúng ta không thể truy cập được.
  • Kiểm tra các quy trình (process) và mở rộng hơn là các khung làm việc(workflow – tập hợp của nhiều quy trình)

5. Lợi ích của việc áp dụng Unit test

Thời gian đầu, người ta thường do dự khi phải viết UT thay vì tập trung vào code cho các chức năng nghiệp vụ. Công việc viết Unit Test có thể mất nhiều thời gian hơn code rất nhiều nhưng lại có lợi ích sau:

  • Tạo ra môi trường lý tưởng để kiểm tra bất kỳ đoạn code nào, có khả năng thăm dò và phát hiện lỗi chính xác, duy trì sự ổn định của toàn bộ PM và giúp tiết kiệm thời gian so với công việc gỡ rối truyền thống.
  • Phát hiện các thuật toán thực thi không hiệu quả, các thủ tục chạy vượt quá giới hạn thời gian.
  • Phát hiện các vấn đề về thiết kế, xử lý hệ thống, thậm chí các mô hình thiết kế.
  • Phát hiện các lỗi nghiêm trọng có thể xảy ra trong những tình huống rất hẹp.
  • Tạo hàng rào an toàn cho các khối mã: Bất kỳ sự thay đổi nào cũng có thể tác động đến hàng rào này và thông báo những nguy hiểm tiềm tàng.

Trong môi trường làm việc Unit Test còn có tác dụng rất lớn đến năng suất làm việc:

  • Giải phóng chuyên viên QA khỏi các công việc kiểm tra phức tạp.
  • Tăng sự tự tin khi hoàn thành một công việc. Chúng ta thường có cảm giác không chắc chắn về các đoạn mã của mình như liệu các lỗi có quay lại không, hoạt động của module hiện hành có bị tác động không, hoặc liệu công việc hiệu chỉnh mã có gây hư hỏng đâu đó…
  • Là công cụ đánh giá năng lực của bạn. Số lượng các tình huống kiểm tra (test case) chuyển trạng thái “pass” sẽ thể hiện tốc độ làm việc, năng suất của bạn.

6. Cách code hiệu quả với Unit Test

Phân tích các tình huống có thể xảy ra đối với mã. Đừng bỏ qua các tình huống tồi tệ nhất có thể xảy ra, thí dụ dữ liệu nhập làm một kết nối cơ sở dữ liệu thất bại, ứng dụng bị treo vì một phép toán chia cho không, các thủ tục đưa ra lỗi ngoại lệ sai có thể phá hỏng ứng dụng một cách bí ẩn…

Mọi UT phải bắt đầu với trạng thái “fail” và chuyển trạng thái “pass” sau một số thay đổi hợp lý đối với mã chính.

Mỗi khi viết một đoạn mã quan trọng, hãy viết các UT tương ứng cho đến khi bạn không thể nghĩ thêm tình huống nào nữa.

Nhập một số lượng đủ lớn các giá trị đầu vào để phát hiện điểm yếu của mã theo nguyên tắc:

  • Nếu nhập giá trị đầu vào hợp lệ thì kết quả trả về cũng phải hợp lệ
  • Nếu nhập giá trị đầu vào không hợp lệ thì kết quả trả về phải không hợp lệ
  • Sớm nhận biết các đoạn mã không ổn định và có nguy cơ gây lỗi cao, viết UT tương ứng để khống chế.

Ứng với mỗi đối tượng nghiệp vụ (business object) hoặc đối tượng truy cập dữ liệu (data access object), nên tạo ra một lớp kiểm tra riêng vì những lỗi nghiêm trọng có thể phát sinh từ các đối tượng này.

Để ngăn chặn các lỗi có thể phát sinh trở lại thực thi tự động tất cả UT mỗi khi có một sự thay đổi quan trọng, hãy làm công việc này mỗi ngày. Các UT lỗi cho chúng ta biết thay đổi nào là nguyên nhân gây lỗi.

Để tăng hiệu quả và giảm rủi ro khi viết các UT, cần sử dụng nhiều phương thức kiểm tra khác nhau. Hãy viết càng đơn giản càng tốt.

Cuối cùng, viết UT cũng đòi hỏi sự nỗ lực, kinh nghiệm và sự sáng tạo như viết PM.

Unit Test là gì? Khái niệm và vai trò

 

Trước khi kết thúc phần này, tôi có một lời khuyên là viết UT cũng tương tự như viết mã một chương trình, điều bạn cần làm là không ngừng thực hành. Hãy nhớ UT chỉ thực sự mang lại lợi ích nếu chúng ta đặt vấn đề chất lượng phần mềm lên hàng đầu hơn là chỉ nhằm kết thúc công việc đúng thời hạn. Khi đã thành thạo với công việc viết UT, bạn có thể đọc thêm về các kỹ thuật xây dựng UT phức tạp hơn, trong số đó có mô hình đối tượng ảo sẽ được trình bày trong phần tiếp theo.

Tham khảo:

Báo cáo số liệu: Ngành CNTT “soán ngôi” đầu mùa tuyển sinh 2019

Trong mùa tuyển sinh năm 2019 có khá nhiều bất ngờ khi ngành công nghệ thông tin (CNTT) đã “soán ngôi” đầu khi vượt xa điểm chuẩn các ngành y, dược, mặc dù điểm chuẩn của các ngành đã tăng mạnh trong năm nay.  

Điểm chuẩn cao nhất cả nước thuộc về ngành CNTT – Khoa học máy tính của ĐH Bách khoa Hà Nội với 27,42 điểm. Như vậy, điểm chuẩn ngành này vượt ngành Y đa khoa (điểm chuẩn là 26,75) của Đại học Y Hà Nội; ngành Y khoa của ĐH Y dược Thái Bình (24,60 điểm); ngành Y khoa của ĐH Y dược Hải Phòng (23,20 điểm). Riêng tại ĐH Quốc gia Hà Nội, nhóm ngành CNTT của ĐH Công nghệ lấy điểm cao nhất 25,85 điểm cho khối A00 và A01. Đây được coi là mức điểm cao nhất trong các khoa, trường thành viên của ĐH Quốc gia Hà Nội. Nhiều chuyên gia cho rằng, xu hướng số hóa doanh nghiệp “làm mưa làm gió” trong những năm qua, nên số thí sinh lựa chọn ngành CNTT nhiều kéo theo điểm chuẩn tăng cao là điều không nằm ngoài dự đoán. Không chỉ có các trường đại học, hiện nay chính phủ cũng có nhiều động thái đẩy mạnh hơn trong quá trình chuyển đổi số.

Điểm chuẩn trường Đại học Bách Khoa TP.HCM, đứng đầu là ngành Khoa học Máy tính với điểm chuẩn 25.75

Điểm chuẩn trường Đại học Tự nhiên TP.HCM, số điểm cao nhất thuộc về nhóm ngành Máy tính và Công nghệ Thông tin – 25.00

Trong một phát ngôn chính thức của mình, Bộ trưởng Bộ Thông tin và Truyền thông Nguyễn Mạnh Hùng cho biết Việt Nam cần phát triển thêm 50.000 doanh nghiệp công nghệ thông tin (ICT) để đẩy nhanh chuyển đối số Việt Nam. Việt Nam sẽ tuyên bố chiến lược về chuyển đổi số quốc gia, để tiến tới một nền kinh tế số, xã hội số. Các yếu tố nền tảng sẽ được nhấn mạnh, sẽ được đầu tư trước, sẽ đi trước, sẽ phải có thứ hạng cao trên thế giới, phải nằm trong top 50 vào năm 2025 và top 30 vào năm 2030. Cũng chính vì vậy, nhu cầu tăng cao, nguồn cung và đầu ra của đào chưa đủ nên ngành CNTT ngày càng khó khăn trong việc tìm kiếm nhân lực dù mức lương đã rất cao và cạnh tranh.

“Khát” nguồn nhân lực IT

Dù các trường có sức đào tạo mạnh, mức lương thị trường cạnh tranh, doanh nghiệp trải thảm đỏ nhưng việc tuyển dụng nhân sự CNTT vẫn còn gặp nhiều khó khăn. Cụ thể, 30,802,600 đồng/tháng là mức lương trung bình mà đa phần các nhà tuyển dụng sẵn sàng trả cho một lập trình viên có kinh nghiệm, và tỷ lệ tăng lương 6 tháng đầu năm 2019 đạt 15 -18%. Với mức lương trung bình là 27.610.500 đồng/tháng, C++ đang dẫn đầu trong top 5 ngôn ngữ được trả lương cao nhất, theo sau đó là Python và Java. 

Mức lương trung bình theo ngôn ngữ lập trình và vị trí mà các lập trình viên nhận được

Trong đó, vì sự khan hiếm của thị trường nhân lực, các kỹ sư AI/ML hứa hẹn sẽ đạt mức lương khá cao, trung bình là 34.880.100 đồng/tháng. Trong khi đó, đối với các cấp quản lý, con số này không thấp hơn 35.000.000 đồng/tháng với kinh nghiệm trên 5 năm. Tuy nhiên, việc tuyển dụng những vị trí này gặp rất nhiều khó khăn do những đặc thù và yêu cầu gắt gao. Đây cũng là lý do khiến cho thị trường nhân lực IT càng hạn hẹp.

Dù lương và phúc lợi là chìa khoá quyết định giữ chân nhân tài, bức tranh IT toàn cảnh lộ rõ những khiếm khuyết về nhân lực, không chỉ riêng Việt Nam mà còn ở những khu vực lân cận. Đỉnh điểm là bài toán thiếu nhân lực ngành AI – Trí tuệ Nhân tạo tại các công ty Nhật lên đến hơn 100 triệu /tháng nhưng vẫn chưa chắc kiếm được người. Năm 2019 đánh dấu mức tăng kỷ lục trong nhu cầu tuyển dụng đến 56%. Ước tính đến năm 2021, riêng lao động trong ngành lập trình sẽ cần khoảng 400.000 nhân lực trong khi khả năng hiện tại chỉ có khoảng 200.000 lao động đáp ứng được nhu cầu công việc.

Nhu cầu tuyển dụng ngành IT năm 2019 tăng mạnh hơn bao giờ hết

Để lý giải cho việc này, Ông Nguyễn Hữu Bình, CEO TopDev cho biết “Giới công nghệ Việt Nam đang đứng trước hai làn sóng, làn sóng thứ nhất là làn sóng các quỹ đầu tư nước ngoài chú ý và tìm đến Việt Nam ngày càng nhiều hơn, sẽ có thêm nhiều startup mới ra đời để giải quyết rất nhiều vấn đề còn tồn đọng của xã hội bằng công nghệ, làn sóng thứ hai là xu hướng chuyển đổi số (digital transformation – DX) của các doanh nghiệp thuộc các ngành nghề truyền thống ứng dụng công nghệ để nâng cao cạnh tranh khiến cho ngày càng nhiều công ty có nhu cầu tuyển dụng nhân sự CNTT, vì vậy cũng dẫn đến việc gia tăng mạnh nhu cầu tuyển dụng lượng nhân sự này.”

Ông Nguyễn Hữu Bình còn cho biết thêm “Làn sóng khởi nghiệp công nghệ (tech startup), cũng như việc gia tăng thêm các dự án từ các tập đoàn lớn đã có mặt trên thị trường, cũng góp phần không nhỏ trong xu hướng gia tăng nhu cầu nhân sự CNTT như hiện nay, thị trường khan hiếm và bản thân các nhà lập trình viên đều hiểu rõ giá trị của họ nên giữ chân nhân sự thực sự làm đau đầu nhiều doanh nghiệp”.

Xem đầy đủ báo cáo tại đây:

DOWNLOAD

ASP.NET Core là gì?

asp-net-core-la-gi

ASP.NET Core là gì?

ASP.NET Core là gì? Nó là một open-source mới và framework đa nền tảng (cross-platform) cho việc xây dựng những ứng dụng hiện tại dựa trên kết nối đám mây, giống như web apps, IoT và backend cho mobile.

Ứng dụng ASP.NET Core có thể chạy trên .NET Core hoặc trên phiên bản đầy đủ của .NET Framework. Nó được thiết kế để cung cấp và tối ưu development framework cho những dụng cái mà được triển khai trên đám mây (clound) hoặc chạy on-promise.

  .NET core vs ASP.NET core: Phân biệt .NET Framework, .NET Core và Mono

Nó bao gồm các thành phần theo hướng module nhằm tối thiểu tài nguyên và chi phí phát triển, như vậy bạn giữ lại được sự mềm giẻo trong việc xây dựng giải pháp của bạn. Bạn có thể phát triển và chạy những ứng dụng ASP.NET Core đa nền tảng trên Windows, Mac và Linux.

Đồng thời nó đã trở thành một mã nguồn mở. Đây là một thay đổi rất lớn và theo mình là quan trọng nhất của ASP.NET Core. Điều mà trước đây khó có một lập trình viên nào có thể nghĩ đến. Có lẽ đó cũng là một xu thế mà các ngôn ngữ lập trình hiện nay đang hướng tới.

  Triển khai ứng dụng ASP.NET Core trên IIS

Tìm việc làm ASP.NET hấp dẫn nhất cho bạn tại Topdev

ASP.NET Core ra đời trong hoàn cảnh nào?

Bản phát hành đầu tiên của ASP.NET đã xuất hiện cách đây 15 năm trước, nó là một phần của .NET Framework. Từ đó, hàng triệu lập trình viên đã sử dụng nó để xây dựng những ứng dụng web tuyệt vời, và trên những năm đó Microsoft đã phát triển thêm nhiều tính năng mới.

ASP.NET Core có một số thay đổi kiến trúc lớn, đó là kết quả của việc học hỏi rất nhiều từ các framework module hóa khác. ASP.NET Core không còn dựa trên System.Web.dll nữa. Nó được dựa trên một tập hợp các gói, các module hay cũng được gọi là các Nuget packages.

Điều này cho phép bạn tối ưu ứng dụng của bạn để chỉ bao gồm những packages nào cần thiết. Lợi ích của nó là giúp cho ứng dụng nhỏ hơn, bảo mật chặt chẽ hơn, giảm sự phức tạp, tối ưu hiệu suất hoạt động và giảm chi phí, thời gian cho việc phát triển.

Với ASP.NET Core bạn đạt được những nền tảng cải tiến dưới đây:

  • Hợp nhất việc xây dựng web UI và web APIs
  • Tích hợp những client-side frameworks hiện đại và những luồng phát triển
  • Hệ thống cấu hình dựa trên môi trường đám mây thật sự
  • Dependency injection được xây dựng sẵn
  • HTTP request được tối ưu nhẹ hơn
  • Có thể host trên IIS hoặc self-host trong process của riêng bạn
  • Được xây dựng trên .NET Core, hỗ trợ thực sự app versioning
  • Chuyển các thực thể, thành phần, module như những NuGet packages
  • Những công cụ mới để đơn giản hóa quá trình phát triển web hiện đại
  • Xây dựng và chạy đa nền tảng (Windows, Mac và Linux)
  • Mã nguồn mở và tập trung vào cộng đồng

Xem việc làm fresher .NET lương cao tại TopDev

Xây dựng web UI và web API sửng dụng ASP.NET Core MVC

  • Bạn có thể tạo ra các ứng dụng web có thể testing theo mô hình MVC (Model-View-Controller)
  • Bạn có thể xây dựng HTTP services cái mà hỗ trợ nhiều định dạng và có đầy đủ hỗ trợ cho nội dung của dữ liệu trả về
  • Razor cung cấp một ngôn ngữ hiệu quả để tạo Views
  • Tag Helper cho phép code server side tham gia vào việc tạo và render phần tử HTML
  • Model Binding tự động ánh xạ dữ liệu từ HTTP request tới tham số của method action
  • Model Validation tự động thực hiện validate client và server

Phát triển client-side

ASP.NET Core được thiết kế để tích hợp một cách liên tục với nhiều client-side frameworks, bao gồm AngularJS, KnockoutJS và Bootstrap. Về phần này tôi sẽ giới thiệu với các bạn ở những bài viết sau

Xây dựng ứng dụng đầu tiên

Như vậy tôi đã giới thiệu một cách tổng quan các khái niệm của ASP.NET Core. Giờ là lúc chúng ta tìm hiểu cấu trúc một project ASP.NET Core MVC thông qua một ví dụ đơn giản

Cài đặt Visual Studio and .NET Core

Cài đặt Visual Studio Community 2017. Chọn phiên bản download Community. Bỏ qua bước này nếu bạn đã có Visual Studio cài đặt trong máy

Chạy bản cài đặt và chọn những workloads bên dưới:

  • ASP.NET và web development
  • .NET Core cross-platform development

ASP.NET Core là g

ASP.NET Core là g

Tạo một web app

Từ Visual Studio, chọn File > New > Project.
ASP.NET Core là g

Hoàn thành họp thoại New Project:

  • Trong phần bên trái, chọn .NET Core
  • Trong phần giữa, chọn ASP.NET Core Web Application (.NET Core)
  • Tên của project ví dụ là “MvcMovie”
  • Nhấn OK

ASP.NET Core là g

Visual Studio đã sử dụng một template mặc định cho dự án MVC bạn vừa tạo. Bạn có một ứng dụng làm việc bây giờ bằng việc điền tên dự án và một vài tùy chọn. Điều này là một dự án bắt đầu đơn giản. Nhấn F5 để chạy ứng dụng trong chế độ debug hoặc Ctrl-F5 trong chế độ non-debug.

Các bạn có thể quan sát kết quả của trang chủ. Thật đơn giản phải không ?
tuyển it

Visual studio bắt đầu với IIS Express và chạy ứng dụng của bạn. Chú ý rằng thanh địa chỉ hiển thị dạng localhost:port# và không phải kiểu như example.com.

Đó là bởi vì localhost là hostname chuẩn cho máy tính local của bạn. Khi Visual Studio tạo một dự án web, một ramdom port được sử dụng cho web server.

Trong hình trên, số cổng là 5000. Khi bạn chạy ứng dụng, bạn sẽ thấy một số cổng khác.

Việc chạy ứng dụng với Ctrl-F5(non-debug) cho phép bạn làm code thay đổi, lưu file, refresh trình duyệt và thấy ngay những thay đổi của code.

Nhiều lập trình viên thích sử dụng chế độ non-debug để nhanh chóng chạy ứng dụng và xem những thay đổi. Điều này là tương tự với ngôn ngữ thông dịch như php, python hay ruby,..

Chạy với chế độ self-host. Một điểm mới trong ASP.NET Core là các bạn có thể chạy server như một ứng dụng console thay vì host trên IIS.

Để dùng chế độ này, tại điểm bắt đầu với IIS chúng ta thay bằng bắt đầu với self-host(Tên chính là tên ứng dụng)
tuyển it

Cửa sổ console ứng dụng

tuyển dụng it

Kết luận ASP.NET Core là g?

Qua những giới thiệu về ASP.NET Core trong bài viết này, các bạn có thể thất đây thực sự là những thay đổi lớn cho những ai đã quen với ASP.NET trước kia. Giờ đây ASP.NET đã trở thành một open-source, đa nền tảng có thể chạy trên nhiều môi trường, thiết kế tối ưu cho clound, module hóa, hợp nhất ASP.NET và ASP.NET MVC làm một (chỉ còn phiên bản MVC) và rất nhiều thay đổi tuyệt vời khác.

Tôi hy vọng sẽ chia sẻ nhiều hơn đến các bạn. Chúc các bạn có những khám phá thú vị cùng ASP.NET Core

Link tham khảo:

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

Xem thêm tin tuyển dụng .NET trên TopDev

Debug là gì?

debug-la-gi

Bug là gì?

  • Bugs là ám chỉ các lỗi xảy ra trong logic, hay bất kỳ vấn đề gì gây ra việc làm cho ứng dụng không thực thi được hoặc thực thi sai.
  • Bugs luôn tiềm ẩn ở mọi nơi, và ta không thể lường trước được mọi tình huống có thể xảy ra mà chỉ có thể cố gắng làm giảm nó đến mức thấp nhất có thể tùy vào khả năng của ta tại thời điểm phát triển và bảo trì ứng dụng.

Debug là gì?

  • Debug là quá trình tìm kiếm ra lỗi hay nguyên nhân gây ra lỗi (bug ở đâu) để có hướng sửa lỗi (fix bug). Việc kiểm soát lỗi của rất nhiều các dòng code là việc không hề đơn giản với những người lập trình viên chưa có nhiều kinh nghiệm.
  • Chuyện xảy ra lỗi trong hàng nghìn dòng lệnh đó là chuyện bình thường đối với bất cứ 1 người làm lập trình nào. Chương trình có thể chạy không đúng ý người lập trình, hoặc chạy sai chức năng nó được quy định, gây cho chương trình bị đánh giá kém chất lượng. Vậy khi bị lỗi thì các lập trình viên phải debug để fix lỗi giúp cho chương trình (program) chạy tốt.

Mục đích của việc debug

  • Mục đích của Debug không chỉ là để loại bỏ lỗi (error) khỏi chương trình mà quan trọng hơn còn để giúp lập trình viên hiểu rõ hơn sự thực thi của chương trình. Một lập trình viên không có khả năng Debug hiệu quả thì cũng giống như bị mù vậy.

Các phương pháp debug

  • Debugging Tool – dùng công cụ để Debug – là phương pháp Debug đi sâu vào source code nhất. Thường thì chúng ta gọi những Debugging Tool này là Debugger. Những Debugger phần mềm thông dụng là Microsoft Visual Studio Debugger , GNU Debugger . Ngoài ra còn có những Debugger phần cứng được thiết kế kèm cho các hệ thống nhúng (Embedded System) bởi các thiết kế nhúng không phải là những thiết kế mang tính mục đích chung (General-purpose) mà thường được thiết kế trên các platform riêng biệt phục vụ các ứng ứng dụng riêng biệt nên cũng cần những Debugger đặc thù đi kèm.
  • Printlining: đơn giản là bạn thêm vào source code của bạn những dòng lệnh để in ra những thông tin mà bạn cần theo dõi trong quá trình thực thi. Chẳng hạn nếu bạn dùng Arduino IDE thì bạn sẽ không có Debugger và cách Debug phù hợp nhất là bạn dùng Serial.print().
  • Logging: tạo ra một biểu mẫu để ghi (log) lại những thông tin sau khi chương trình thực thi. Phân tích nguyên nhân lỗi dựa trên những thông tin này.
  • Ngoài ra thì còn một phương pháp mà cá nhân mình cho là rất hiệu quả đó là phương pháp – Nhờ người khác debug – là việc bạn vác đoạn code ra nhờ người có kinh nghiệm hơn debug dùm.

Mẹo viết code giúp chúng ta soát lỗi nhanh

  • Dùng comment (chú thích) sau khi viết xong 1 đoạn code về 1 phần nào đó để sau này dễ tìm và sửa.
  • Đặt tên các hàm các biến có ý nghĩa để dễ kiểm soát và tìm lỗi.
  • Hoặc có thể sử dụng Breakpoints để rà soát xem phần mềm của bạn chạy đến vị trí nào của code và đến đó có đúng không.
  • Đừng bỏ qua các Error Message nó sẽ giúp chúng ta có thể tìm ra số dòng code và sửa rất nhanh.

Debug là gì?

Jira Software – Tìm hiểu tính năng và cách sử dụng JIRA

JIRA là một công cụ phát triển phần mềm mạnh mẽ được sử dụng rộng rãi để quản lý dự án và theo dõi các vấn đề. Hiện nay, JIRA đang dần trở thành một trong những công cụ hàng đầu trong việc hỗ trợ các đội ngũ phát triển phần mềm quản lý công việc của họ. Trong bài viết sau, cùng TopDev tìm hiểu thật chi tiết về các tính năng cũng như cách sử dụng Jira.

Jira là gì?

Jira Software là ứng dụng làm việc cho phép các nhóm theo theo dõi các vấn đề (issue) cần xử lí, quản lý dự án và tự động hóa quy trình làm việc, do công ty phần mềm Atlassian của Úc phát triển.

Đây là một công cụ phổ biến trong các đội ngũ phát triển phần mềm để lập kế hoạch, theo dõi và phát hành các dự án phần mềm. JIRA cung cấp một nền tảng tập trung để quản lý các nhiệm vụ, lỗi và các loại vấn đề khác, giúp các đội ngũ tổ chức sắp xếp và ưu tiên công việc của họ.

Cùng xem video ngắn giới thiệu về Jira:

Tính năng chính của Jira

  1. Quản lý dự án linh hoạt: Jira hỗ trợ nhiều loại dự án khác nhau, từ phần mềm, kinh doanh đến các dự án phi kỹ thuật. Người dùng có thể tùy chỉnh quy trình làm việc (workflow) để phù hợp với nhu cầu cụ thể của dự án.
  2. Theo dõi vấn đề (Issue Tracking): Jira cho phép theo dõi và quản lý các vấn đề, lỗi, nhiệm vụ và các loại công việc khác nhau. Mỗi vấn đề có thể được gắn với người chịu trách nhiệm, trạng thái, mức độ ưu tiên và các thông tin liên quan khác.
  3. Báo cáo và phân tích: Jira cung cấp nhiều loại báo cáo và biểu đồ khác nhau, giúp người dùng theo dõi tiến độ, hiệu suất của nhóm và tình trạng dự án. Các báo cáo này có thể tùy chỉnh theo nhu cầu cụ thể của dự án.
  4. Bảng Kanban và Scrum: Jira hỗ trợ cả hai phương pháp Kanban và Scrum, cho phép người dùng sử dụng các bảng (boards) để quản lý công việc và theo dõi tiến độ. Người dùng có thể kéo thả các nhiệm vụ giữa các cột để cập nhật trạng thái.
  5. Tích hợp với các công cụ khác: Jira tích hợp tốt với nhiều công cụ khác như Confluence, Bitbucket, GitHub, Slack, Trello và nhiều công cụ khác, giúp tối ưu hóa quy trình làm việc và tăng cường sự cộng tác giữa các nhóm.
  6. Tùy chỉnh trường và màn hình: Người dùng có thể tùy chỉnh các trường thông tin và giao diện màn hình để phù hợp với nhu cầu cụ thể của dự án. Điều này giúp hiển thị đúng các thông tin cần thiết và tăng cường hiệu quả làm việc.
  7. Quản lý quyền truy cập: Jira cung cấp khả năng quản lý quyền truy cập chi tiết, cho phép người quản lý dự án kiểm soát ai có thể xem và chỉnh sửa thông tin trong dự án. Điều này đảm bảo an toàn và bảo mật thông tin.
  8. Tự động hóa quy trình: Jira hỗ trợ các quy tắc tự động hóa, giúp giảm bớt các công việc lặp đi lặp lại và tăng cường hiệu quả làm việc. Người dùng có thể thiết lập các quy tắc để tự động cập nhật trạng thái, gửi thông báo, hoặc tạo các nhiệm vụ mới.
  9. Quản lý sprint và backlog: Đối với các dự án Scrum, Jira cung cấp các công cụ để quản lý sprint và backlog, giúp nhóm dễ dàng lập kế hoạch, ưu tiên và theo dõi các nhiệm vụ trong từng sprint.
  10. Ứng dụng di động: Jira có ứng dụng di động cho cả iOS và Android, giúp người dùng dễ dàng theo dõi và quản lý công việc mọi lúc, mọi nơi. Điều này rất tiện lợi cho những người cần làm việc từ xa hoặc khi đang di chuyển.

Những tính năng trên giúp Jira trở thành một công cụ mạnh mẽ và linh hoạt cho việc quản lý dự án và theo dõi vấn đề, phù hợp với nhiều loại dự án và nhóm làm việc khác nhau.

Các thành phần cơ bản của Jira

  • Roles: Xác lập các role của dự án, Mục này xác nhận ai tham gia vào dự án, những người add vào role thì mới có thể tạo Resource Allocation và project team sau này. Nhiều người có thể vào 1 role.
  • Project: Chức năng này dùng để phân quyền approve worklog cho thành viên của dự án. Ai là team lead của group nào thì sẽ được approve worklog cho member của group đó. Project management được quyền approve cho toàn bộ thành viên dự án
  • Issue là thành phần cơ bản để theo dõi các công việc, lỗi, nhiệm vụ hoặc bất kỳ công việc nào cần được quản lý. Các issue có thể được phân loại thành nhiều loại khác nhau như Bug (lỗi), Task (nhiệm vụ), Story (câu chuyện), Epic (tính năng lớn), v.v.
  • Component là sản phẩm của dự án. Ở đây sẽ nhập tất cả sản phẩm của dự án lấy từ file kế hoạch doanh số. Nếu dự án làm theo Scrum thì sẽ là Product của Sprint tương ứng.
  • Workflow là chuỗi các trạng thái và chuyển đổi mà một issue có thể trải qua trong suốt vòng đời của nó. Workflows có thể được tùy chỉnh để phản ánh quy trình làm việc cụ thể của từng dự án.
  • Priority: Là mức độ ưu tiên của một defect. Có 4 mức, chọn theo datalist
  • Status: Đại diện cho các vị trí của vấn đề trong workflow
  • Resolution (Giải quyết): Kết quả cuối cùng của một issue, ví dụ: Fixed (Đã sửa), Won’t Fix (Không sửa), Duplicate (Trùng lặp).
  • Custom Fields (Trường tùy chỉnh): Jira cho phép người dùng tạo các trường tùy chỉnh để lưu trữ các thông tin đặc thù của dự án hoặc nhóm làm việc. Các trường này có thể được thêm vào các issue để cung cấp thêm thông tin cần thiết.
  • Reports and Dashboards (Báo cáo và Bảng điều khiển): Jira cung cấp nhiều loại báo cáo và bảng điều khiển để giúp theo dõi tiến độ, hiệu suất và tình trạng của dự án. Người dùng có thể tạo các báo cáo tùy chỉnh và bảng điều khiển để hiển thị các số liệu quan trọng và các thông tin cần thiết.

Các thuật ngữ thường gặp khi sử dụng Jira

Jira là phần mềm với khá nhiều thuật ngữ công nghệ:

  • Sprint: Một vòng lặp ngắn hạn (lý tưởng là 2-4 tuần) mà đội phát triển thực hiện đầy đủ các công việc cần thiết như lập kế hoạch, phân tích yêu cầu, thiết kế, triển khai để cho ra các phần nhỏ của sản phẩm.
  • Backlog: Danh sách tập hợp các user stories, bugs và tính năng cho một sản phẩm hoặc sprint.
  • Scrum: Một phương pháp Agile, nơi sản phẩm được xây dựng theo các lần lặp đi lặp lại trong một sprint.
  • Scrum of Scrums: Một kỹ thuật để mở rộng quy mô Scrum, các dự án đa đội – theo truyền thống gọi là program management.
  • Board: Công cụ dùng để hiển thị hoạt động công việc trong một quy trình làm việc cụ thể. Nó có thể thay đổi thích ứng với các phương pháp Agile khác nhau (ví dụ, một bảng Scrum sẽ hiển thị các công việc được di chuyển từ product backlog đến sprint backlog, trong khi đó một bảng Kanban thường có một quy trình làm việc ba bước: To do, In Progress, và Done).
Jira là gì
Giao diện scrum board trong Jira
  • Burndown Chart: Hiển thị số lượng ước tính và thực tế cho tổng số công việc phải hoàn thành trong một sprint.
  • Daily stand-up: Là một cuộc họp nhỏ 15 phút trước khi bắt đầu ngày làm việc, giúp mọi thành viên nắm bắt toàn bộ công việc của ngày hôm qua.
  • Epic: Một công việc lớn hơn mà cần được chia nhỏ thành nhiều issue hoặc câu chuyện người dùng (user story) nhỏ hơn. Người dùng có thể phải chạy nhiều sprint để hoàn thành một epic.
  • Issue: Một đơn vị công việc (task, bug, story, epic) trong Jira, hoạt động trong một quy trình từ khởi tạo đến khi hoàn thành.
  • Task (Nhiệm vụ): Một công việc hoặc hoạt động cụ thể cần được hoàn thành trong dự án.
  • Sub-task (Nhiệm vụ con): Một công việc nhỏ hơn, thuộc về một issue lớn hơn và cần được hoàn thành như một phần của issue đó.
  • User Story (Câu chuyện người dùng): Một yêu cầu từ quan điểm của người dùng cuối, thường được sử dụng trong các dự án Agile để mô tả chức năng mà sản phẩm cần cung cấp.
  • Swimlane: Phân loại các công việc để xem xét công việc nào nên tiến hành trước.
  • Velocity: Đo lường khối lượng công việc mà một đội có thể xử lý trong một thời hạn nhất định.
  • Cumulative Flow Diagram (CFD): Một biểu đồ thể hiện các trạng thái khác nhau của các mục công việc trong một khoảng thời gian cụ thể. Cột ngang x trong CFD định nghĩa là thời gian, và cột dọc y là mục công việc (issue). Mỗi vùng màu của biểu đồ tương đương với trạng thái luồng công việc (ví dụ một cột trong bảng).
  • Iteration: Dự án sẽ được thực hiện trong các phân đoạn lặp đi lặp lại.
  • Wallboard: Một bảng (viết tay hoặc điện tử) lớn được đặt tại vị trí dễ thấy thể hiện dữ liệu quan trọng về hoạt động của đội development.
  • Epic: Một công việc lớn hơn mà cần được chia nhỏ thành nhiều issue hoặc câu chuyện người dùng (user story) nhỏ hơn.
  • Status (Trạng thái): Tình trạng hiện tại của một issue, ví dụ: To Do (Cần làm), In Progress (Đang làm), Done (Hoàn thành).
  • Label (Nhãn): Thẻ gắn vào các issue để giúp phân loại và tìm kiếm dễ dàng hơn.

Ưu nhược điểm của phần mềm Jira

Ưu điểm của Jira là gì?

  • Jira có chức năng phân quyền cực kỳ chi tiết, không chỉ phân quyền trong dự án chung, mà còn phân quyền đối với từng nhiệm vụ, giúp team công nghệ bảo vệ thông tin độc quyền của mình.
  • Dễ dàng tích hợp với các hệ thống khác (như Email, Excel, RSS,…)
  • Hệ thống module và bộ công cụ phát triển bổ trợ cho phép tùy biến, mở rộng và tích hợp Jira vào trong hệ thống hiện tại
  • Jira được phát triển sử dụng chuẩn HTML và được thử nghiệm với tất cả các trình duyệt phổ biến hiện nay.
  • Có thể chạy trên hầu hết các nền tảng phần cứng, hệ điều hành và cơ sở dữ liệu
  • Mỗi màn hình trong Jira có một phiên bản có thể in đảm bảo việc luân chuyển bản cứng một cách dễ dàng
  • Có thể tích hợp trực tiếp với code trên môi trường phát triển, là một công cụ hoàn toàn phù hợp với các developer.

Nhược điểm của Jira là gì?

  • Chi phí cao, sau 7 ngày dùng thử thì doanh nghiệp càng có quy mô lớn thì càng tốn nhiều chi phí: $10 mỗi tháng dành cho tối đa 10 tài khoản; từ 11-100 tài khoản là $7/tài khoản/tháng
  • Tốn nhiều thời gian và công sức để setup nên chỉ phát huy tối ưu hiệu quả với dự án lớn, không phù hợp với dự án vừa và nhỏ (dưới 3 tháng).
  • Khó sử dụng cho người mới: Đối với những người không quen thuộc với các công cụ quản lý dự án, Jira có thể gây khó khăn ban đầu do giao diện và các tính năng phong phú của nó.
  • Tải lên kích thước tập tin bị hạn chế.
  • Các báo cáo được tạo ra không thể sử dụng lại.
  • Ngôn ngữ tiếng Anh với nhiều thuật ngữ khó sử dụng.

Tóm lại, Jira là một phần mềm quản lý dự án khá đặc thù, đây sẽ là lựa chọn hoàn hảo cho các team làm việc theo phương pháp Agile, đặc biệt là các team công nghệ hoặc phát triển phần mềm.

Đối tượng nên sử dụng Jira Software

Jira có thể hỗ trợ nhiều nhóm và phòng ban trong nhiều ngành công nghiệp khác nhau. Các tính năng đa dạng của nó làm cho nó trở nên có giá trị đối với các nhóm tham gia vào quản lý dự án, phát triển phần mềm và các nhiệm vụ cộng tác khác. Một số nhóm có thể hưởng lợi từ việc sử dụng Jira bao gồm:

Software Development Teams

Jira có nguồn gốc từ phát triển phần mềm, khiến nó đặc biệt phù hợp với các nhóm phát triển. Nó giúp quản lý tác vụ, theo dõi lỗi, giám sát tiến độ và tạo điều kiện thuận lợi cho sự cộng tác giữa các nhà phát triển, người thử nghiệm và các bên liên quan khác.

IT Operations Teams

Các nhóm CNTT có thể sử dụng Jira để theo dõi và quản lý các sự cố, yêu cầu thay đổi và yêu cầu dịch vụ. Nó giúp hợp lý hóa các quy trình quản lý dịch vụ CNTT và đảm bảo giải quyết hiệu quả các vấn đề kỹ thuật.

Project Management Teams

Khả năng quản lý dự án của Jira không chỉ giới hạn ở phát triển phần mềm. Người quản lý dự án có thể tạo và theo dõi nhiệm vụ, phân bổ nguồn lực, đặt mức độ ưu tiên và giám sát tiến độ dự án trong nhiều ngành khác nhau.

Marketing Teams

Các nhóm tiếp thị có thể sử dụng Jira để lập kế hoạch và quản lý chiến dịch, theo dõi các mục tiêu, lên lịch nhiệm vụ và cộng tác tạo nội dung. Nó cung cấp khả năng hiển thị các dự án tiếp thị và đảm bảo các nhiệm vụ được thực hiện đúng thời hạn.

Product Management Teams

Quản lý sản phẩm có thể sử dụng Jira để xác định lộ trình sản phẩm, theo dõi các yêu cầu về tính năng, ưu tiên cải tiến và cộng tác với các nhóm phát triển để cung cấp các sản phẩm lấy khách hàng làm trọng tâm.

Manufacturing and Operations Teams

Jira có thể theo dõi quy trình sản xuất, giám sát bảo trì thiết bị, quản lý hàng tồn kho và đảm bảo kiểm soát chất lượng trong sản xuất và vận hành.

Làm thế nào để sử dụng JIRA?

Tạo tài khoản sử dụng Jira

Hãy xem cách sử dụng JIRA ngay từ đầu (tạo tài khoản Atlassian).

Bước 1: Tạo tài khoản Atlassian

1. Đi tới trang đăng ký của Atlassian, nhập thông tin xác thực người dùng cần thiết được yêu cầu trên trang web rồi nhấp vào nút Đăng ký.

tạo tài khoản jira

2. Để hoàn tất thiết lập và đăng nhập, hãy nhấp vào liên kết xác minh trong hộp email.

3. Thiết lập tài khoản Atlassian của bạn.

tạo tài khoản jira

4. Nhấp vào đăng ký sau khi điền thông tin chi tiết. Tài khoản đã được tạo. Người dùng được tự động chuyển hướng đến trang chủ.

tạo tài khoản jira

Bước 2: Tạo một dự án mới

1. Đăng nhập vào tài khoản Atlassian của bạn.

2. Trên trang chủ, nhấp vào phần mềm Jira và điền thông tin chi tiết được yêu cầu.

tạo project đầu tiên trên Jira

3. Trả lời một số câu hỏi cơ bản để thiết lập JIRA cho nhóm của bạn.

4. Chọn tên dự án và khung mẫu như Scrum hoặc Kanban, v.v. cho dự án của bạn.

tạo project đầu tiên trên Jira

5. Sau khi hoàn thành các bước trên, màn hình sau sẽ hiển thị giao diện làm việc của Jira:

tạo project đầu tiên trên Jira

Làm cách nào để tạo issue trong JIRA?

1. Chọn nút Tạo màu xanh lam nằm ở đầu mỗi trang.

tạo issue trên jira

2. Nhập mô tả ngắn gọn về sự cố trong phần Tóm tắt.

tạo issue trên jira

3. Hoàn thành tất cả các trường bắt buộc và tất cả các trường bắt buộc khác. Khi hoàn tất, hãy chọn Tạo.

tạo issue trên jira

So sánh Jira và Trello

Jira và Trello đều là công cụ quản lý dự án nổi tiếng của Atlassian, nhưng chúng có mục đích và đặc điểm sử dụng khác nhau. Jira chủ yếu dành cho các nhóm phát triển phần mềm và dự án phức tạp. Nó cung cấp khả năng quản lý chi tiết với các workflow tùy chỉnh và khả năng theo dõi issue chi tiết. Jira nổi bật với các công cụ báo cáo và phân tích phong phú, hỗ trợ tốt cho các phương pháp Agile như Scrum và Kanban, và tích hợp tốt với các công cụ DevOps. Tuy nhiên, Jira có thể khá phức tạp và khó sử dụng cho người mới, đòi hỏi nhiều thời gian để thiết lập và cấu hình ban đầu, và chi phí cấp phép cao hơn so với Trello. Jira phù hợp nhất cho các nhóm phát triển phần mềm và dự án kỹ thuật phức tạp.

Ngược lại, Trello là một công cụ quản lý dự án đơn giản và trực quan, phù hợp cho mọi loại nhóm, từ cá nhân đến nhóm nhỏ và không chuyên về kỹ thuật. Trello dễ sử dụng với giao diện thân thiện và trực quan, cho phép kéo thả các thẻ giữa các cột. Nó dễ dàng tùy chỉnh và có phiên bản miễn phí với nhiều tính năng cơ bản. Tuy nhiên, Trello thiếu các tính năng quản lý dự án phức tạp và báo cáo chi tiết, không lý tưởng cho các dự án lớn hoặc yêu cầu quản lý phức tạp. Trello có nhiều tích hợp nhưng không mạnh mẽ và đa dạng như Jira. Trello phù hợp nhất cho các nhóm nhỏ, cá nhân và các dự án đơn giản hoặc phi kỹ thuật.

Đặc điểm Jira Trello
Mục tiêu chính Dự án phát triển phần mềm phức tạp Quản lý dự án đơn giản, trực quan
Độ phức tạp Cao, yêu cầu kỹ năng kỹ thuật Thấp, dễ sử dụng
Quản lý Agile Hỗ trợ tốt (Scrum, Kanban) Cơ bản (Kanban)
Báo cáo và phân tích Chi tiết, đa dạng Hạn chế
Chi phí Cao hơn Thấp hơn, có phiên bản miễn phí
Đối tượng sử dụng Nhóm phát triển phần mềm Nhóm nhỏ, cá nhân, dự án đơn giản

Kết luận, Jira phù hợp với các tổ chức và nhóm làm việc yêu cầu quản lý dự án phức tạp và chi tiết, trong khi Trello lý tưởng cho các nhóm nhỏ và cá nhân cần một công cụ quản lý dự án trực quan và dễ sử dụng.

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

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

Speed up Microservices 2: Tận dụng trình duyệt và cache

Cũng gần 9 tháng kể từ bài 1 ra mắt, trong bài này mình sẽ chia sẻ cách hệ thống Teamcrop đã tối ưu thế nào để tăng tốc cho hệ thống Microservices của mình. Cũng như bài 1 có đề cập, dữ liệu trong hệ thống microservices khá phân tán và khi cần lấy dữ liệu nếu không thiết kế tốt thì sẽ tốn rất nhiều thời gian cho các request lấy dữ liệu. Ví dụ lấy danh sách đơn hàng là một ví dụ rõ ràng nhất có nêu ở bài trước.

Teamcrop cũng lưu dữ liệu dạng này, trong một đơn hàng được lưu trong database thì chỉ lưu ID (Khóa ngoại) của các bảng như nhân viên, cửa hàng, nguồn đơn hàng…mà các thông tin này chỉ được cung cấp bởi các service liên quan như service Nhân viên, Store và Metadata. Để hiển thị thông tin như giao diện thì cần phải gọi thêm nhiều request (Restful) để fetch data từ các nguồn này và đây là cách hoàn toàn không hiệu quả bởi ảnh hưởng đến thời gian chờ của người dùng.

Trong kiến trúc của Teamcrop, các thông tin như nhân viên, cửa hàng, nhà kho, sản phẩm, … này được gọi là Tài nguyên công ty (Company Resource– CR) và hiện Teamcrop có khoảng gần 20 company resource.

Cách hoạt động của các Company Resource:

Các company resource cũng là dữ liệu và tất nhiên vẫn có các API như các resource khác, hầu hết đều được quản lý (CRUD) và có giao diện tương ứng để quản lý. Chỉ có một khác biệt là các company resource sẽ có thêm 1 web service cho phép lấy toàn bộ dữ liệu, gọi là api /fulldata. API này cho phép lấy toàn bộ dữ liệu resource, không phân trang.

Khi có một user truy cập vào website thì sẽ load toàn bộ các company resource và lưu trữ trong trình duyệt. Mình có thể setup thêm giao diện để thể hiện progress bar, khi nào toàn bộ company resource được load hết thì cơ chế router của web sẽ bắt đầu và tiến hành load giao diện tính năng đang truy cập. Hình dưới là ví dụ một action viết bằng PHP của việc lấy một company resource là Vendor (thương hiệu):

Company Resource sẽ ảnh hưởng thời gian tải trang

Nếu đọc đến đây thì sẽ có nhiều bạn thắc mắc là nếu mỗi truy cập đều phải load toàn bộ Company Resource thì sẽ chờ khá lâu bởi vì mỗi CR sẽ cần 1 request đến /fulldata và API này cũng phải lấy toàn bộ data của resource và response về.

Đối với phía server thì sẽ không có vấn đề nhiều vì mình sẽ tận dụng cache (Redis) để lưu kết quả vào memory và khi có request thì mình sẽ lấy từ cache ra mà thôi.

Ở phía client (trình duyệt) thì mới là vấn đề lớn, bởi dù server có nhanh thì có bao nhiêu company resource thì cũng sẽ tốn ngần ấy số request lên server để lấy /fulldata. Tuy nhiên, Teamcrop hầu như không tốn 1 request nào cho các company resource khi sử dụng…Service Worker của trình duyệt.

Đối với các API /fulldata thì script trong service worker của mình sẽ lấy từ cache trên trình duyệt ra mà không phải tốn 1 request nào lên server. Như vậy là tiết kiệm được mấy chục request và có được một số lượng data để hỗ trợ lấy dữ liệu.

Company Resource sẽ được lưu trữ thế nào?

Sau khi lấy được các dữ liệu company resource thì việc lưu trữ và sử dụng các dữ liệu này cũng là một vấn đề lớn. Bởi các company resource này sẽ được dùng cho việc tìm kiếm theo 1 ID (getById), tìm theo một số tiêu chí (search) và lấy toàn bộ danh sách (getList).

Để đảm bảo quá trình truy xuất, tìm kiếm thì nó phải nhanh cũng như gần gũi, dễ sử dụng nên mình đã chọn TaffyDB, được coi là một thư viện nhỏ gọn, In-memory Database, hỗ trợ tìm kiếm theo ID, điều kiện..và khá dễ dùng. Mỗi Company Resource sau khi lấy về sẽ trở thành 1 database và có thể truy xuất data thoải mái. Khá nhanh bởi vì nó là in-memory.

Như vậy thì từ giờ, mỗi khi có 1 dữ liệu có ID là ID của một company resource thì có thể tìm kiếm và lấy thông tin một cách nhanh nhất từ bộ nhớ của trình duyệt mà không phải tốn công JOIN bảng, request giữa các service hoặc client gửi request để lấy detail.

Tuy nhiên, một vấn đề lớn hơn đã xuất hiện đó là nếu dữ liệu company resource đã cache hoàn toàn ở trình duyệt thì khi có dữ liệu mới thì làm sao cập nhật (hay xóa cache). Đối với vấn đề này phát sinh 2 tình huống từ dễ đến khó, tình huống đầu tiên là xóa cache đối với người refresh lại trang web (reload) và tình huống thứ 2, đau đầu hơn là bởi vì Teamcrop là dạng Single Page App (SPA), nếu người dùng không reload trang thì làm sao cập nhật dữ liệu mới nhất. Mình sẽ xử lý lần lượt từng tình huống.

Xóa cache của Company Resource khi reload trang

Đối với trường hợp người dùng reload lại trang web thì chỉ cần thêm cơ chế versioning vào các company resource là giải quyết được.

Những thao tác thay đổi dữ liệu liên quan đến Company Resource (thêm, xóa, sửa) thì đều được gọi 1 API để nâng version của resource tương ứng.

Trước khi request các /fulldata API, hệ thống sẽ gửi request lấy thông tin version của các company resource, từ đó mới request để lấy full data. Do version được nối vào URL của fulldata nên Service Worker sẽ kích hoạt cơ chế cache theo URL, nếu version không đổi thì sẽ không request lên server, ngược lại thì sẽ request lên server.

Thậm chí còn làm tính năng nho nhỏ trên giao diện để debug version của các resource trong trường hợp không thể inspect được.

Xóa cache của Company Resource khi đang sử dụng và không reload

Đối với trường hợp một user vẫn “miệt mài” làm việc và không reload trang, bởi đặc thù của Single Page App là không reload mỗi khi chuyển tính năng nên xóa cache của company resource cho đối tượng này sẽ không theo cách thông thường. Bài toán đặt ra là làm sao trigger (thông báo) cho trình duyệt biết là có sự thay đổi là được bởi vì nếu được trigger thì chỉ cần gọi ajax lên Company Resource API sẽ lấy được bảng version của các resource và đối chiếu cái nào tăng thì lấy bản mới của /fulldata.

Suy nghĩ một hồi và nghĩ ngay đến giải pháp sử dụng Socket. Và Teamcrop sử dụng Pusher để cung cấp giải pháp socket bởi vì đây là một trong những dịch vụ tốt nhất hiện nay đối với dịch vụ socket.

Nhằm tận dụng cơ chế web socket sẵn có của Teamcrop (dùng cho cơ chế web notification) nên trình duyệt tiến hành “subscribe” để nghe trên một channel và mỗi khi version tăng thì server (PHP) của Teamcrop gửi một message cho trình duyệt đang lắng nghe ở một channel chung của công ty, tất nhiên thông qua Pusher API.

Sample code ở client (Javascript):

Sample code ở server (PHP):

Như vậy, mỗi khi company resource service nhận được yêu cầu nâng version thì sẽ trigger và client sẽ tự động cập nhật dữ liệu đang cache trên trình duyệt. Và giải quyết ổn thỏa bài toán cache data cho Company Resource.

Tiêu chí nào để trở thành Company Resource?

Như từ đầu đã chia sẻ, Company Resource sẽ lưu ở máy giúp  việc “phân giải” các ID khóa ngoại thành dữ liệu để hiển thị nhằm cải tiến performance chung của toàn hệ thống. Tuy nhiên, không phải tất cả tài nguyên đều có thể trở thành Company Resource.

Trước tiên, cần xác định rõ là Company Resource không phải là Transaction Data, ví dụ Đơn hàng, Khách hàng…không thể nào là ứng cử viên trở thành Company Resource bởi tính thay đổi cũng như số lượng của nó. Chỉ nên chọn những dữ liệu thường xuyên được tham chiếu, số lượng dữ liệu ít, tránh làm trình duyệt lưu quá nhiều dữ liệu vào bộ nhớ.

Lời kết, như vậy cùng với việc thay đổi mô hình microservice thì cũng phát sinh nhiều vấn đề mới liên quan đến kiến trúc này. Trên đây chỉ là một giải pháp cho một bài toán cụ thể mà Teamcrop gặp phải trong quá trình vận hành hệ thống của mình. Kỳ tiếp theo (kỳ 3) mình sẽ đề cập đến một bài toán cụ thể hơn là Export dữ liệu ra file (vd Excel). Bởi vì đặc thù là dữ liệu phân tán, nên export dữ liệu trong hệ thống cũng là một bài toán khá thú vị.

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

  Microservices là gì? Speed up Microservices 1: Tác dụng phụ và một số chiến lược cơ bản
  Giao tiếp hiệu quả giữa các Microservice
  Xác thực và phân quyền trong Microservices

Xem thêm việc làm Microsoft tại TopDev

Nguồn: Bloghoctap.com

Mẫu bảng mô tả công việc lập trình PHP

Mẫu mô tả công việc lập trình PHP

Lập trình PHP có nhiệm vụ chính là xây dựng các ứng dụng cấp doanh nghiệp, quản lí quá trình phát triển ứng dụng bằng PHP, đồng thời tham gia vào toàn bộ quá trình phát triển sản phẩm, từ lên ý tưởng, phân tích, thiết kế đến kiểm tra, vận hành thực tế theo kế hoạch. Hy vọng, Mẫu bảng công việc lập trình PHP này sẽ giúp các bộ phận nhân sự dễ dàng hơn cho việc tuyển dụng những vị trí này.

Về lập trình viên PHP: Để thành một PHP Developer giỏi, các lập trình viên cần nắm rõ cấu trúc dữ liệu và giải thuật, kỹ thuật lập trình hướng đối tượng cũng như có kiến thức hoặc kinh nghiệm về framework liên quan như Laravel, Zend, CI, Yii, CakePHP… để cùng tham gia nghiên cứu, thiết kế, phát triển và tích hợp các các giải pháp và hệ thống ứng dụng phục vụ công việc quản trị, vận hành và điều hành cho sản phẩm công ty/ khách hàng.

Mẫu bảng công việc lập trình PHP

YÊU CẦU CÔNG VIỆC

  • Có kinh nghiệm làm việc với PHP và framework liên quan như Laravel, Zend, CI, Yii, CakePHP. 
  • Có kiến thức ứng dụng các CSS và Javascript framework: jQuery, Boostrap…
  • Nắm vững cơ sở dữ liệu MySQL, NoSQL,.. 
  • Tinh thần trách nhiệm cao trong công việc, có thể làm việc dưới áp lực cao và tinh thần trách nhiệm cao.
  • Có sản phẩm thực tế là lợi thế.
  • Kỹ năng tư duy logic và thuật toán tốt, phân tích và giải quyết vấn đề
  • Có khả năng đọc hiểu tiếng Anh chuyên ngành

MÔ TẢ CÔNG VIỆC

  • Tham gia phát triển các ứng dụng, nâng cấp và triển khai các sản phẩm phần mềm theo xu hướng công nghệ trên nền tảng PHP. –
  • Tìm hiểu yêu cầu, phân tích, thiết kế, nghiên cứu công nghệ công nghệ mới và review source code, đưa ra giải pháp áp dụng vào sản phẩm dịch vụ của công ty
  • Duy trì và phát triển các website, code và cấu trúc dữ liệu có sẵn của công ty
  • Hỗ trợ các thành viên trong nhóm với các chức năng phức tạp, tham gia nhận xét, đánh giá source code của các thành viên trong nhóm.

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

Ginco đã sử dụng và tối ưu Cloud Functions như thế nào

sử dụng và tối ưu Cloud Functions

Bài viết được sự cho phép của tác giả Ngo Thang

Hôm nay mình chia sẻ đến mọi người 1 case study khá hay mà Ginco đã thực hiện để quản lí giao dịch trong Blockchain bằng cách sử dụng hệ sinh thái Firebase.

Gần đây công ty mình cũng bắt đầu đưa Firebase vào hệ thống. Đúng quả thật dùng Firebase xong thấy yêu nó hẳn. Nó quả thực rất mạnh và cũng khá rẻ. Nên thời gian tới mình sẽ tập trung viết nhiều bài hơn nữa về Firebase để mọi người có cái nhìn tổng quan hơn về nó.

Bây giờ chúng ta cùng nhau tìm hiểu xem Ginco đã sử dụng Firebase để xử lí các bài toán liên quan đến giao dịch Blockchain như thế nào.

  Tối ưu việc load ảnh với RxJava

Mục tiêu bài viết:
・Hiểu được cách dùng Cloud Functions trong hệ thống
・Biết cách tối ưu Cloud Functions để đạt hiệu năng tốt nhất

Đối tượng hướng đến:
・Người có chút hiểu biết về Cloud Functions
・Người đã từng làm việc với Firebase

Ginco là công ty như thế nào?

Ginco là công ty Nhật Bản chuyên cung cấp hệ thống quản lí wallet tiền ảo 1 cách an toàn và bảo mật. Nó có thể gửi, nhận tiền ảo 1 cách đơn giản thông qua hệ thống Blockchain.

Ginco đã sử dụng và tối ưu Cloud Functions như thế nào

Cloud Functions là gì?

Cloud Functions là 1 sản phẩm của Google.

Cloud Functions cho phép bạn chạy code backend tự động trigger các event được kích hoạt bởi tính năng của Firebase (Google).

Ví dụ như khi chúng ta upload 1 ảnh lên Google Storage thì Cloud Functions sẽ tự động trigger sự kiện đó để xử lí 1 tác vụ nào đó. Ví dụ như resize ảnh chẳng hạn …

Các lợi ích khi sử dụng Cloud Functions:

  • Tạo API 1 cách đơn giản. (Xem thêm API là gì)
  • Mỗi 1 hàm được deploy đều được chạy trong 1 môi trường hoàn toàn khác nhau. Do đó chức năng của hàm này sẽ không ảnh hưởng đến hàm khác. Và việc thêm sửa xoá chức năng được thực hiện 1 cách khá đơn giản.
  • Dựa vào số lượng request mà hệ thống sẽ tự động được scale.

Ứng dụng Cloud Functions trong Ginco

Ở Ginco thì Cloud Functions đảm nhiệm 4 chức năng chính:

  • Cung cấp API gọi giao thức RPC của Blockchain.
  • Cung cấp API thu thập thông tin về market (giá cả thị trường, volume …).
  • Push Notification.
  • Thực hiện backup Firestore định kì.

Dưới đây là kiến trúc hệ thống xung quanh Cloud Functions trong Ginco:

Ginco đã sử dụng và tối ưu Cloud Functions như thế nào

Cung cấp API gọi giao thức RPC của Blockchain

Toàn bộ các node blockchain được chạy trên GKE.

Bởi vì các API trong các node blockchain (ví dụ như bitcoin, ethereum…) này hoàn toàn khác nhau. Nên họ đã cung cấp 1 API đã wrapper lại tất cả các API đó thành chung 1 interface để dễ dàng sử dụng.

Giai đoạn đầu thì họ đã dùng HTTP trigger, nhưng cái này có 1 nhược điểm là khi gọi API thì nó không tự động gửi access token của người dùng lên. Nên thành ra mỗi lần gọi API phải tự mình đính kèm access token vào header của request.

Họ đã dùng onCall trigger. Cái này thì nó tự động đính kèm access token của người dùng vào header. Nên khá dễ dàng để chứng thực người dùng.

Cung cấp API thu thập thông tin về market (giá cả thị trường, volume…)

Ginco sử dụng Firestore là cơ sở dữ liệu chính để lưu trữ thông tin về market (giá cả thị trường, volume …)

Các thao tác CRUD liên quan đến dữ liệu sẽ được thực hiện trực tiếp từ phía Client (sử dụng Firebase SDK)

Còn 1 số dữ liệu quan trọng cần tính bảo mật cao hơn thì sẽ không gọi trực tiếp từ SDK Firebase phía Client mà sẽ thông qua Cloud Functions.

Push Notification

1 số event liên quan đến lịch sử gửi nhận coin sẽ thực hiện việc gửi thông báo (push notification) đến người dùng.

Vì Cloud Functions có thể trigger được các sự kiện liên quan đến Firestore nên khi dữ liệu trong Firestore mà bị thay đổi nó sẽ detect được và tiến hành gửi thông báo đến người dùng.

Thực hiện backup Firestore định kì

Việc backup Firestore sẽ được thực hiện thông qua Cloud Functions.

Bằng việc trigger Cloud Pub/Sub, Cloud functions sẽ dễ dàng backup được dữ liệu của Firestore thông qua Firestore command line.

Chúng ta chỉ cần sử dụng cronjob trong App Engine để gửi message đến Pub/Sub. Khi đó Cloud Functions sẽ trigger được event đó và thực hiện backup.

Tối ưu Cloud Functions

Mặc dù Cloud Functions khá là tiện nhưng khi số lượng function tăng lên thì tốc độ response của nó cũng giảm xuống đáng kể (đôi khi mất 13s cho 1 request).

Ở đây mình sẽ nói qua 1 số vấn đề gặp phải và cách khắc phục nó.

Kiến trúc Cloud Functions

Cloud Functions được thực hiện như sau:

  • 1 request sẽ được xử lí bằng 1 instance.
  • Trong trường hợp nhận được request mới:
    • Nếu có instance còn trống thì sẽ gửi request đó đến instance trống đó
    • Nếu không có instance trống thì sẽ tạo instance mới, và gửi request đến instance đó
  • Nếu trong 1 khoảng thời gian nào đó mà instance không xử lí request thì instance đó sẽ bị xoá đi.

Và trường hợp tạo instance mới và xử lí request là tốn thời gian nhất. Trường hợp này người ta gọi là Cold Start. (Mặc dù bản thân việc tạo 1 instance mới chỉ mất tầm mấy trăm ms thôi)

Dưới đây là hình ảnh về hiện tượng Cold Start. Nếu không có instance nào trống thì sẽ tạo ra instance mới để xử lí request.

Ginco đã sử dụng và tối ưu Cloud Functions như thế nào

Cải thiện Cold Start

Cải thiện Cold Start của Cloud Functions

Sau khi tìm hiểu thì họ thấy được, bản thân của việc tạo 1 instance mới hoàn toàn không tốn quá nhiều thời gian (chỉ mất mấy trăm ms). Mà việc tốn nhiều thời gian nhất ở đây là việc load library.

Giả sử như file index.js của chúng ta có nội dung như sau:

 
# index.js
 
exports.Func1 = require('./funcs/func1');
exports.Func2 = require('./funcs/func2');

Nội dung của funcs/func1.js:

 
# funcs/func1.js
 
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
module.exports = functions.https.onRequest((req, res)=>{
    // ......
});

Nội dung của funcs/func2.js:

 
# funcs/func2.js
 
const functions = require('firebase-functions')
const google = require('googleapis');
const rp = require('request-promise');
const projectId = process.env.GCLOUD_PROJECT;
module.exports = functions.storage.bucket(`${projectId}-bucket`)
                     .object()
                     .onFinalize((obj)=>{
    // ......
});

Như ví dụ trên ta có thể thấy được, khi index.js được gọi thì func1, func2 cũng được gọi theo. Khi đó chúng ta sẽ mất thêm thời gian để load các thư viện trong func1, func2.

Và điều này sẽ làm cho thời gian response của chúng ta giảm xuống. Để giải quyết bài toán này thì rất đơn giản. Chỉ cho load những thư viện cần thiết thôi.

 
# index.js
 
if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'Func1') {
    exports.Func1 = require('./funcs/func1');
}
if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'Func2') {
    exports.Func2 = require('./funcs/func2');
}

Khi Cloud Functions được gọi thì khi đó biến môi trường FUNCTION_NAME sẽ được gán tên của hàm được gọi. Ví dụ như chúng ta muốn gọi func1 thì khi đó giá trị trong FUNCTION_NAME sẽ là func1.

Up version của module thành mới nhất

Cloud Functions sẽ luôn luôn cache module Nodejs lại và chia sẻ đến mọi function trên toàn thế giới. Vì vậy nếu module bạn đang sử dụng có trong cache của Google Cloud Functions thì khi đó sẽ được dùng luôn và không phải mất thời gian load nữa.

Vì vậy để có thể dùng được cache trong Cloud Functions thì chúng ta cố gắng update mọi module đến phiên bản mới nhất.

Thay đổi region trong Cloud Functions

Trước kia thì Cloud Functions chỉ support mỗi region ở Mỹ. Nhưng từ tháng 6 năm ngoái nó support thêm 1 số region khác nữa. Nên các bạn cố gắng chọn region nào gần với hệ thống của các bạn nhất.

Để setting region cho function thì chúng ta làm như sau:

 
const functions = require('firebase-functions');
module.exports = functions.region('asia-northeast1')
 .https
 .onRequest((req, res) => {
    // ……
});

Về danh sách region mà Cloud Functions đang support thì các bạn có thể xem tại đây.

Kết luận

Qua bài này mình đã giới thiệu cho các bạn về 1 case study mà Ginco đã sử dụng và tối ưu Cloud Functions trong hệ thống của họ như thế nào.

Hi vọng nó sẽ giúp ích cho các bạn 1 phần nào đó trong việc cải thiện hiệu năng.

Cảm ơn bạn đã theo dõi bài viết!

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

Xem thêm việc làm Software Developers trên TopDev

Bài viết gốc được đăng tải tại Nghệ thuật coding

  Optimizing Laravel - Tối ưu hoá Laravel

Bài viết này giúp bạn hoàn thành mọi mục tiêu đề ra

Bài viết hôm nay mình muốn chia sẻ đến với các bạn một lý thuyết về đặt mục tiêu – nếu các bạn nắm vững lý thuyết này, các bạn sẽ có một năm rất tuỵệt vời. Bạn sẽ hoàn thành được mọi mục tiêu đặt ra trong năm và không bị trì hoãn như nhiều năm vừa qua nữa.

Một ngày chúng ta có 24 giờ đúng không nào? Thông thường chúng ta sẽ phân chia đơn giản như thế này:

  1. Ngủ: 8 tiếng (có bạn ngủ ít hơn, có bạn ngủ nhiều hơn chút)
  2. Làm: 8 tiếng (nếu chưa đi làm thì ta tính luôn việc học ở trường)
  3. Rảnh: 8 tiếng

Screen Shot 2018-01-16 at 5.40.32 pm.png

Vậy trong 8 TIẾNG RẢNH thì chúng ta thường làm những thứ gì:

  1. Chúng ta GIẢI TRÍ: bằng việc xem phim trên Pub, xem video trên YouTube, lướt Facebook, lướt Zalo, lướt Instagram.
  2. Chúng ta GẶP GỠ: với các hoạt động như đi xem phim với bạn bè, đi trà đá, đi trà sữa, đi cafe, nói chung là nói chuyện.
  3. Chúng ta làm VIỆC VẶT: ví dụ như là di chuyển từ chỗ này đến chỗ kia, nấu ăn giặt giũ tắm rửa các kiểu.

Screen Shot 2018-01-16 at 5.43.58 pm.png

Tiếp Xúc Nhiều Cái Gì, Chúng Ta Giỏi Cái Đó

Trong tâm lý học có một khái niệm tên là Cognitive Dissonance (Bất hòa nhận thức) có nghĩa là cảm giác không thoải mái của mỗi người chúng ta khi trong đầu có hai luồng tư tưởng khác nhau.

Ví dụ: Nhờ báo chí nói nhiều về thực phẩm bẩn, dầu ăn bẩn, tác hại có dầu ăn đến việc béo phí, dần dần chúng ta sẽ nhận thức được và cảm thấy không thoải mái khi ăn đồ ăn có nhiều dầu hay ăn đồ chiên bên ngoài đường. Từ đó ta thay đổi thói quen ăn uống một chút, hạn chế ăn bẩn lại.

Có thể hiểu đơn giản là, cho dù chúng ta không có ý định tìm hiểu về thực phẩm bẩn, nhưng việc vô tình thấy các bài báo hằng ngày, thấy mọi người nói chuyện, nghe ti vi đưa tin làm cho ta hiểu được cơ bản những thực phẩm như thế nào là bẩn.

Chốt lại, nếu ta tiếp xúc nhiều với thông tin gì đó một cách vô tình trong một thời gian dài, ta sẽ dần dần biết nhiều hơn về cái đó.

Quay lại với chuyện quản lý thời gian và đặt mục tiêu. Vấn đề của chúng ta ở đây là chúng ta không dành thời gian để tiếp xúc với những thứ giúp cải thiện cuộc sống của mình.

Xem TV, YouTube hay đi bar với bạn bè thì rất là vui, nhưng nó không giúp cho bản thân chúng ta tốt lên mỗi ngày được.

Khi không có sự tiếp xúc, ta sẽ không trải qua cảm giác không thoải máitừ đó rất khó để bản thân thay đổi thói quen.

Vậy chốt lại ở đây là: Hãy bớt một chút thời gian rảnh (không cần nhiều) để tiếp xúc với những thông tin có ích và liên quan đến mục tiêu và ta đang đề ra.

Chúng ta thường không hoàn thành được mục tiêu mà bản thân đề ra vì chúng ta đặt mục tiêu to lớn quá. Chúng ta thường tự hứa rằng mình sẽ bớt thời gian Facebook để đọc sáchhay bớt thời gian đi chơi với bạn bè để học tiếng Anh – được mấy ngày đầu thì hào hứng lắm, sau đó thì bỏ cuộc. Đơn giản vì nhu cầu con người, lúc nào cũng cần giải trí.

Screen Shot 2018-01-16 at 6.00.12 pm

Vậy lần tới khi quản lý thời gian, hãy giữ nguyên thời gian lướt Facebook hay hẹn hò lại, không phải cắt giảm làm gì.

Việc ta cần làm là thêm vào thời gian làm việc vặt những thông tin tự động và có liên quan đến mục tiêu. 

Ví dụ khi bạn đang Nấu ăn hay khi bạn đang ngồi xe bus hay khi bạn đang đi tắm, hãy mở podcast và NGHE những kênh YouTube liên quan đến việc giảm cân. Dần dần ngày qua ngày, đầu óc bạn sẽ được tiếp xúc nhiều với các thông tin giảm cân đó.

Và vì tâm lý Cognitive Dissonance, dần dần đầu óc bạn sẽ thấy không thoải mái nếu mình làm những thứ ngược với những gì mình được nghe như ăn nhiều đường, ăn nhiều dầu ăn, lười tập thể dục chẳng hạn.

Cứ như vậy, dần dần bạn sẽ có thêm nhiều kiến thức hơn nữa và hoàn thành được mục tiêu giảm cân của bản thân.

Nếu bạn muốn giảm cân, hãy nghe nhiều về Health, Nutrition và Fitness.

Nếu bạn muốn tiết kiệm, hãy thử tìm trang Financial Diet và nghe mỗi ngày.

Nếu bạn muốn nói chuyện tốt hơn, lên YouTube gõ từ khóa Public Speaking và nghe thật nhiều.

Nếu bạn muốn hạnh phúc và bình an, hãy nghe về Mediation và Mindfulness.

Sắp tới bạn sẽ nghe gì?

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

Xem thêm việc làm Software Developers tại TopDev

Nguồn: OneCV

  Quy tắc 24x3 cho sáng tạo trong lập trình!
  12 nguyên tắc làm lập trình của Joel để tạo nên phần mềm tốt hơn

Chặng đường 4 năm 1 sứ mệnh cùng cộng đồng IT Việt Nam của TopDev

Năm 2019 đánh dấu cột mốc kỷ niệm chặng đường 04 năm của TopDev – Một cột mốc quan trọng đánh dấu bước đi phát triển của TopDev cùng cộng đồng Công nghệ Việt Nam.

  • 04 năm – Với hệ sinh thái fanpage đã phủ sóng toàn cộng đồng Lập trình viên và người làm Công nghệ khắp đất nước.
  • 04 năm – Cùng hỗ trợ và hiện thực hóa ước mơ việc làm của không ít lập trình viên all level tại Việt Nam. Khi tất cả ứng viên – cộng đồng Developer đã có thể làm chủ giấc mơ và chủ động theo đuổi các mục tiêu thì TopDev mới hoàn thành sứ mệnh của mình.
  • 04 năm – Không chỉ mang cơ hội việc làm cho cộng đồng IT Talent Việt Nam, TopDev không ngừng tổ chức các sự kiện công nghệ và việc làm lớn với gần 25,000 lượt tham dự mỗi năm.

Nhân kỷ niệm 04 năm khởi động mạng lưới TopDev, trên Fanpage TopDev đang có chương trình Mini-Giveaway Mừng TopDev 4 Tuổi với 04 hạng mục giải thưởng, như một lời cảm ơn đến các bạn đã đồng hành cùng TopDev trong suốt thời gian vừa qua:

🔥Bàn phím rời đa năng của Logitech
🔥Balo đa năng kèm Ví + Cáp Sạc USB + Tai Nghe + Khóa Số Chống Trộm bản giới hạn
🔥Ly nước Avengers cực ngầu
🔥Lót chuột có đệm tay cho anh em nhà Developer OT không mỏi tay

Thể lệ tham gia Birthday Minigame Giveaway chỉ 04 bước “trong 01 búng tay”:
👉B1: Like fanpage TopDev
👉B2: Thêm khung ảnh/ frame “I’m A Developer” trên avatar cá nhân
👉B3: Comment 4 số bất kì để bốc thăm trúng thưởng
👉B4: Share lại bài post “Sinh nhật TopDev” để chế độ Public

HẠN CHÓT chốt comment: thứ Tư – ngày 14.08.2019

TopDev sẽ công bố danh sách trúng mỗi giải thưởng vào ngày thứ Năm 15/08. Đừng quên theo dõi và rủ thêm anh em hội tham gia nhé!

Cảm ơn và Chúc các bạn may mắn!

Thông tin chi tiết Giveaway Birthday: https://www.facebook.com/topdevvietnam/posts/2276564385726012

  Báo cáo toàn cảnh thị trường IT Việt Nam 2019 - Các công ty công nghệ tại Việt Nam đang làm gì?
  Tập trung vào kết quả cần đạt, chứ đừng chú trọng vào giờ giấc!

Growth Hacking dành cho Developer

TL;DR: Nếu bạn nghĩ rằng một developer thì không cần phải biết về Growth Hacking, thì bạn nên đọc bài viết này.

Đã bao giờ bạn nghe tới khái niệm “Growth Hacking” chưa?

Đã bao giờ bạn nghe tới khái niệm “Growth Hacking” và tự nhủ rằng “Đó là công việc của bọn làm marketing/SEO các kiểu, mình không cần phải quan tâm” chưa?

Đã bao giờ bạn tự hỏi “bản chất của một Growth Hacker, anh ấy là ai” chưa?

Đã bao giờ bạn tự hỏi “tại sao project của mình trên GitHub lại ít ‘sao’ đến thế?”, “tại sao bài blog mình viết ra không ai thèm đọc?”, “làm sao để quảng cáo cái side-project của mình ra cho mọi người vào sử dụng?” chưa?

Mà khoan đã, Developer thì cần gì biết mấy cái này?

Khái niệm “Growth Hacking” chắc là bắt đầu được nhắc tới nhiều trong khoảng 1, 2 năm trở về trước và đến bây giờ thì cũng không còn nóng lắm. Bản thân mình cũng rất ghét và tìm cách tránh đọc các bài liên quan tới “Growth Hacking” khi nó còn hot.

Cho tới cách đây 2 tháng, mình bị a @kiennt@huydx ở Kipalog dụ dỗ đọc cuốn Growth Hacker Marketing: A Primer on the Future of PR, Marketing, and Advertising, thì mình mới nhận ra một điều rất quan trọng là Growth Hacking là một kĩ năng thực sự cần thiết cho một developer chứ không đơn thuần là một nghề cho một nhóm người non-tech nào cả.

Growth Hacker, anh ấy là ai?

Nói sơ về cuốn sách trên một tí, tác giả của nó là một marketer kì cựu, và anh ấy nóng mặt khi thấy báo chí bắt đầu tung hô Growth Hacking như là một nghề sắp soán ngôi của marketing truyền thống, nên bắt đầu tìm hiểu xem nghề này thực sự nó là cái gì, và anh ấy viết sách để giải thích nó dưới góc nhìn của một marketer, cách mà các công ty công nghệ lớn như Dropbox, Google, Facebook, Uber kiếm được những khách hàng đầu tiên của mình mà không cần phải tốn đồng nào cho việc quảng cáo truyền thống.

“Not a blowout grand opening, but a strategic opening or a stunt that catches the attention of our core audience”

Và cuốn sách đưa ra một nhận định: Những người đầu tiên làm nên định nghĩa của một Growth Hacker không phải là những marketer truyền thống, mà chính là các Engineer.

Tại sao Growth Hacker lại là các Developer/Engineer?

Để trả lời cho câu hỏi trên, cuốn sách đưa ra vài quan điểm về công việc Growth Hacking:

  • Mục đích của Growth Hacking là: Kiếm được user cho sản phẩm của mình, và làm sao để từ một user sẽ kiếm thêm được 2 hay 100, 1000 users (growth)
  • Yêu cầu của Growth Hacking là: Làm cho nhiều người biết đến sản phẩm của mình mà không phải tốn một đồng nào cho việc quảng cáo (hack).
  • Cách để Growth Hacking là: Không có một công thức cụ thể nào cả, phương pháp thay đổi liên tục từng ngày theo sự biến động của công nghệ, nhưng có một điểm không thay đổi đó là Growth Hacking sử dụng công nghệ, và những người sử dụng được công nghệ (hacker), và không ai khác, đó chính là các engineers.

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

  Liệu bạn có đang mắc phải các sai lầm sau trong sự nghiệp lập trình?
  Tại sao nhiều lập trình viên giỏi không đưa ra lời khuyên để người khác có thể được như họ?

Người ta growth hacking như thế nào?

“Do it in a cheap, effective, and usually unique and new way”

Cuốn sách cũng có đề cập tới cách mà các công ty công nghệ đã ứng dụng growth hacking để tìm được user cho sản phẩm của mình, không cách nào giống cách nào, nhưng có một điểm chung đó là không ai phải bỏ ra 1 đồng nào cho những cách đó cả:

    • Hotmail khi mới ra mắt đã chèn vào phần cuối của mỗi email do user gửi đi một lời mời sử dụng dịch vụ thư điện tử của mình. Từ đó dùng chính user làm công cụ phát tán =)). Sau này thì Apple cũng bắt chước bằng cái chữ kí “Sent from my iPhone” thần thánh.
    • Google thì launch Gmail dưới hình thức invite-only, mỗi user sẽ được cấp cho 5 đến 10 invite và dùng nó để mời bạn bè mình tham gia vào dịch vụ, tạo ra tâm lý tò mò. Cái này chính bản thân mình cũng từng chạy đi hỏi khắp nơi xin cho bằng được cái invite Gmail hồi năm 2004.
    • Dropbox thì tự làm một video demo sản phẩm, với giọng điệu hài hước và post lên các diễn đàn mà dân xài công nghệ hay lui tới như là Digg, Slashdot, Reddit,… vài năm sau đó họ cũng lanch sản phẩm Mailbox bằng chính phương pháp tương tự và đã có 1 triệu users đăng kí trong vòng 6 tuần đầu tiên.

Growth hacking không phải là thứ chỉ dành cho các sản phẩm vừa mới launch, mà còn là chiến lước giúp lôi kéo, tìm thêm khách hàng cho những dịch vụ đã và đang hoạt động.

“This is not just about finding your first customers. Established brands and companies can use the same techniques to pull in more customers. Growth is growth.”

Ví dụ như eBay vào năm 2012 đã hợp tác với Gogo, một công ty cung cấp dịch vụ wifi trên máy bay để cung cấp chức năng truy cập vào eBay.com miễn phí cho các hành khách khi đang bay (nếu bay đường dài thì các bạn sẽ biết là Wifi trên máy bay thì ko có miễn phí), eBay nhắm tới hàng trăm ngàn hành khách phải ngồi bó gối trên máy bay suốt mười mấy tiếng (rất chán, không có việc gì làm ngoài nằm ngủ, xem phim) thông qua dịch vụ của người khác (đó, hack đó).

Hay Airbnb, viết tool để cho user có thể đăng thông tin cho thuê ở Airbnb của mình lên Craigslist, một dịch vụ rao vặt khá là nổi tiếng ở Mỹ (vâng, rất là thủ đoạn =))))

Hay như mình mỗi khi viết xong bài nào, dù là về JavaScript hay Rust thì cũng chạy vào room thảo luận Ruby của cộng đồng Ruby Việt Nam để quảng cáo, đơn giản vì trong này có gần 1k3 người, hoặc dùng luôn fan page JavaScript Việt nam để quảng cáo, nên khả năng ai đó rãnh rỗi vào đọc bài của mình cũng vì thế mà cao hơn rất nhiều :)))

Và còn rất nhiều những ví dụ khác nữa.

Tóm lại thì growth hack là phải làm đủ mọi thủ đoạn, mọi cách để giành giật từng user một. Ở đây là nói đến user – những người thực sự sẽ sử dụng sản phẩm của bạn, chứ không phải là bỏ ra 1 đống tiền chạy quảng cáo trên truyền hình để được nhiều người biết tới nhưng không ai dùng (ví dụ Google chẳng bao giờ đi quảng cáo Gmail trên tivi trước giờ chiếu phim Cô dâu 8 tuổi hết :)))

It doesn’t matter how many people know about you or how they find out about you. It matter how many sign up. If handing out flyers on the street corner accomplisheds that, then consider it growth hacking.

Thế thì chúng ta growth hacking như thế nào?

Vậy đám developer chúng ta cần áp dụng growth hacking để làm gì?

Câu trả lời hết sức đơn giản, để quảng cáo sản phẩm của mình!

Xem nào, một developer thì có thể đẻ ra những sản phẩm gì ta? Một cái blog về kĩ thuật, hoặc một project trên Github.

Tìm đúng nơi, share đúng người

Nếu bạn vừa làm xong một gem hay ho để cho các Ruby on Rails developer sử dụng, bạn sẽ làm gì?

  • Share vào các group lập trình Game mobile? -> Sai lầm hoàn toàn
  • Đem về khoe với người yêu? -> Cũng được, nếu người yêu bạn cũng là 1 Rails developer
  • Khoe với bạn gái của người yêu? -> Chà, những hành vi này thường mang lại những tai nạn không đáng có
  • Share vào các group lập trình Ruby? -> Chính xác!

Một sản phẩm làm ra (một project, hoặc một bài blog), luôn luôn nhắm đến một nhóm đối tượng nào đó rất cụ thể, như ví dụ ở trên thì chúng ta làm ra một sản phẩm cho các Rails developers, thì khi muốn quảng bá sản phẩm, chúng ta phải tìm tới những nơi mà các Rails developer hay lui tới, ví dụ:

  • HackerNews
  • Subreddit Ruby hoặc Rails ở Reddit
  • Các diễn đàn nhiều Rails developer lui tới
  • Các group lập trình web trên Facebook
  • Cộng đồng Ruby Việt Nam trên Slack

Nếu đọc đến đây, mà bạn nói: Mình không biết các Rails developer thường lui tới ở những đâu cả. Thế thì bạn chưa thực sự hiểu được nhóm đối tượng người dùng mà mình muốn nhắm đến, lời khuyên cho bạn lúc này là đừng làm nữa, bạn không thể làm một gem cho các Rails developer sử dụng nếu bạn không hiểu các Rails developer muốn cái gì và muốn dùng như thế nào.

Chú trọng vào chi tiết

Bạn chia sẽ đúng chỗ, nhưng chưa chắc người ta đã hưởng ứng sản phẩm của bạn.

Nếu bạn làm một project trên Github mà file README.md chỉ vỏn vẹn có 3 dòng chữ, không thèm mô tả xem project đó làm gì, bạn nắm chắc tấm vé rớt. Hãy bỏ chút thời gian viết hướng dẫn thật kĩ và thật chi tiết, nếu project của bạn hay và có hướng dẫn cực kì chi tiết thì không ai ngại gì mà không đi share với mọi người về sản phẩm của bạn cả.

Cách đây không lâu mình có viết 1 project nhỏ clone lại trò chơi Agar.io, và dành ra 2 ngày để viết một tài liệu hướng dẫn cực kì chi tiết để giúp cho người mới vào tìm hiểu về project dễ dàng hơn.

Hiệu quả của việc này là rất nhiều người đã đi share lại tài liệu này trong các cuộc thảo luận về làm game online, project của mình cũng vì thế mà được quảng bá miễn phí.

Hoặc như bác @quocnguyen trong một vài bài viết gần đây, nhờ vào cách viết dí dỏm thân thiện và hình minh họa home-made độc đáo đã thu hút được rất nhiều người tự nguyện share lại khắp nơi.

Hoặc bác @HuyHoangPham Tôi Đi Code Dạo làm ra ứng dụng nhận diện khuông mặt các diễn viên phim người lớn để giới thiệu loạt bài viết về xử lý ảnh/nhận diện của mình =)))

Còn gì nữa không?

Còn, rất nhiều, kể không hết được. Để lôi kéo được user cho sản phẩm của mình thì có rất nhiều cách, dễ có, rất khó cũng có. Và bản thân bài viết này cũng chưa nói hết toàn bộ các yếu tố cần thiết về Growth Hacking.

Cá nhân mình không phải lúc nào cũng thành công với những project trên Github hay các bài viết, có những lúc đơn giản chỉ là làm ra mà share không đúng thời điểm (đang có một bài top của người khác vừa ra lò, share vào cuối tuần không ai online,…) hoặc nội dung không được nhiều người quan tâm, không hiểu user mà mình nhắm tới, viết bài quá nhiều chữ khiến người xem đọc mệt =)))

Tóm lại, growth hacking là cả một quá trình, nó không phải là chuyện dành cho các marketer hay những người làm SEO chuyên nghiệp, mà đó là một kĩ năng cực kì cần thiết của một developer. Bạn nên tìm hiểu nó nếu muốn tạo ra các sản phẩm tốt và được nhiều người đón nhận.

TopDev via huyblog

  Cách chọn “GROWTH HACKING” channel phù hợp dựa trên Data
  Growth hacking một loại hình nghệ thuật mới dành cho lập trình viên

Thuật toán CNN là gì? Cấu trúc mạng Convolutional Neural Network

thuat-toan-cnn-convolutional-neural-network

CNN (Convolutional Neural Network) là gì?

CNN là gì? Convolutional Neural Network (CNNs – Mạng nơ-ron tích chập) là một trong những mô hình Deep Learning tiên tiến. Nó giúp cho chúng ta xây dựng được những hệ thống thông minh với độ chính xác cao như hiện nay.

Như hệ thống xử lý ảnh lớn như Facebook, Google hay Amazon đã đưa vào sản phẩm của mình những chức năng thông minh như nhận diện khuôn mặt người dùng, phát triển xe hơi tự lái hay drone giao hàng tự động.

CNN được sử dụng nhiều trong các bài toán nhận dạng các object trong ảnh. Để tìm hiểu tại sao thuật toán này được sử dụng rộng rãi cho việc nhận dạng (detection), chúng ta hãy cùng tìm hiểu về thuật toán này.

Tìm hiểu Convolutional là gì?

Là một cửa sổ trượt (Sliding Windows) trên một ma trận như mô tả hình dưới:

Tìm hiểu Convolutional là gì?

 

Các convolutional layer có các parameter(kernel) đã được học để tự điều chỉnh lấy ra những thông tin chính xác nhất mà không cần chọn các feature.

Trong hình ảnh ví dụ trên, ma trận bên trái là một hình ảnh trắng đen được số hóa. Ma trận có kích thước 5×5 và mỗi điểm ảnh có giá trị 1 hoặc 0 là giao điểm của dòng và cột.

Convolution hay tích chập là nhân từng phần tử trong ma trận 3. Sliding Window hay còn gọi là kernel, filter hoặc feature detect là một ma trận có kích thước nhỏ như trong ví dụ trên là 3×3.

Convolution hay tích chập là nhân từng phần tử bên trong ma trận 3×3 với ma trận bên trái. Kết quả được một ma trận gọi là Convoled feature được sinh ra từ việc nhận ma trận Filter với ma trận ảnh 5×5 bên trái.

Tìm hiểu Convolutional là gì? Tìm hiểu Convolutional là gì?

Cấu trúc mạng CNN

Mạng CNN là một tập hợp các lớp Convolution chồng lên nhau và sử dụng các hàm nonlinear activation như ReLU và tanh để kích hoạt các trọng số trong các node. Mỗi một lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừu tượng hơn cho các lớp tiếp theo.

Mỗi một lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừu tượng hơn cho các lớp tiếp theo. Trong mô hình mạng truyền ngược (feedforward neural network) thì mỗi neural đầu vào (input node) cho mỗi neural đầu ra trong các lớp tiếp theo.

Mô hình này gọi là mạng kết nối đầy đủ (fully connected layer) hay mạng toàn vẹn (affine layer). Còn trong mô hình CNNs thì ngược lại. Các layer liên kết được với nhau thông qua cơ chế convolution.

Layer tiếp theo là kết quả convolution từ layer trước đó, nhờ vậy mà ta có được các kết nối cục bộ. Như vậy mỗi neuron ở lớp kế tiếp sinh ra từ kết quả của filter áp đặt lên một vùng ảnh cục bộ của neuron trước đó.

Mỗi một lớp được sử dụng các filter khác nhau thông thường có hàng trăm hàng nghìn filter như vậy và kết hợp kết quả của chúng lại. Ngoài ra có một số layer khác như pooling/subsampling layer dùng để chắt lọc lại các thông tin hữu ích hơn (loại bỏ các thông tin nhiễu).

Trong quá trình huấn luyện mạng (traning) CNN tự động học các giá trị qua các lớp filter dựa vào cách thức mà bạn thực hiện. Ví dụ trong tác vụ phân lớp ảnh, CNNs sẽ cố gắng tìm ra thông số tối ưu cho các filter tương ứng theo thứ tự raw pixel > edges > shapes > facial > high-level features. Layer cuối cùng được dùng để phân lớp ảnh.

Cấu trúc của mạng CNN

Trong mô hình CNN có 2 khía cạnh cần quan tâm là tính bất biến (Location Invariance) và tính kết hợp (Compositionality). Với cùng một đối tượng, nếu đối tượng này được chiếu theo các gốc độ khác nhau (translation, rotation, scaling) thì độ chính xác của thuật toán sẽ bị ảnh hưởng đáng kể.

Pooling layer sẽ cho bạn tính bất biến đối với phép dịch chuyển (translation), phép quay (rotation) và phép co giãn (scaling). Tính kết hợp cục bộ cho ta các cấp độ biểu diễn thông tin từ mức độ thấp đến mức độ cao và trừu tượng hơn thông qua convolution từ các filter.

Đó là lý do tại sao CNNs cho ra mô hình với độ chính xác rất cao. Cũng giống như cách con người nhận biết các vật thể trong tự nhiên.

Mạng CNN sử dụng 3 ý tưởng cơ bản:

  • các trường tiếp nhận cục bộ (local receptive field)
  • trọng số chia sẻ (shared weights)
  • tổng hợp (pooling).

Xem thêm: Tuyển dụng lập trình Network lương cao lên đến 3000 USD

Trường tiếp nhận cục bộ (local receptive field)

Đầu vào của mạng CNN là một ảnh. Ví dụ như ảnh có kích thước 28×28 thì tương ứng đầu vào là một ma trận có 28×28 và giá trị mỗi điểm ảnh là một ô trong ma trận. Trong mô hình mạng ANN truyền thống thì chúng ta sẽ kết nối các neuron đầu vào vào tầng ảnh.

Tuy nhiên trong CNN chúng ta không làm như vậy mà chúng ta chỉ kết nối trong một vùng nhỏ của các neuron đầu vào như một filter có kích thước 5×5 tương ứng (28- 5 + 1) 24 điểm ảnh đầu vào. Mỗi một kết nối sẽ học một trọng số và mỗi neuron ẩn sẽ học một bias. Mỗi một vùng 5×5 đấy gọi là một trường tiếp nhận cục bộ.

Một cách tổng quan, ta có thể tóm tắt các bước tạo ra 1 hidden layer bằng các cách sau:

  1. Tạo ra neuron ẩn đầu tiên trong lớp ẩn 1

  2. Dịch filter qua bên phải một cột sẽ tạo được neuron ẩn thứ 2.

    với bài toán nhận dạng ảnh người ta thường gọi ma trận lớp đầu vào là feature map, trọng số xác định các đặc trương là shared weight và độ lệch xác định một feature map là shared bias. Như vậy đơn giản nhất là qua các bước trên chúng ta chỉ có 1 feature map. Tuy nhiên trong nhận dạng ảnh chúng ta cần nhiều hơn một feature map.

Như vậy, local receptive field thích hợp cho việc phân tách dữ liệu ảnh, giúp chọn ra những vùng ảnh có giá trị nhất cho việc đánh giá phân lớp.

Trọng số chia sẻ (shared weight and bias)

Đầu tiên, các trọng số cho mỗi filter (kernel) phải giống nhau. Tất cả các nơ-ron trong lớp ẩn đầu sẽ phát hiện chính xác feature tương tự chỉ ở các vị trí khác nhau trong hình ảnh đầu vào. Chúng ta gọi việc map từ input layer sang hidden layer là một feature map. Vậy mối quan hệ giữa số lượng Feature map với số lượng tham số là gì?

Chúng ta thấy mỗi fearture map cần 25 = 5×5 shared weight và 1 shared bias. Như vậy mỗi feature map cần 5×5+1 = 26 tham số. Như vậy nếu có 10 feature map thì có 10×26 = 260 tham số. Chúng ta xét lại nếu layer đầu tiên có kết nối đầy đủ nghĩa là chúng ta có 28×28=784 neuron đầu vào như vậy ta chỉ có 30 neuron ẩn. Như vậy ta cần 28x28x30 shared weight và 30 shared bias. Tổng số tham số là 28x28x30+30 tham số lớn hơn nhiều so với CNN. Ví dụ vừa rồi chỉ mô tả để thấy được sự ước lượng số lượng tham số chứ chúng ta không so sánh được trực tiếp vì 2 mô hình khác nhau. Nhưng điều chắc chắn là nếu mô hình có số lượng tham số ít hơn thì nó sẽ chạy nhanh hơn.

Tóm lại, một convolutional layer bao gồm các feature map khác nhau. Mỗi một feature map giúp detect một vài feature trong bức ảnh. Lợi ích lớn nhất của trọng số chia sẻ là giảm tối đa số lượng tham số trong mạng CNN.

Lớp tổng hợp (pooling layer)

Lớp pooling thường được sử dụng ngay sau lớp convulational để đơn giản hóa thông tin đầu ra để giảm bớt số lượng neuron.

Thủ tục pooling phổ biến là max-pooling, thủ tục này chọn giá trị lớn nhất trong vùng đầu vào 2×2.

Như vậy qua lớp Max Pooling thì số lượng neuron giảm đi phân nửa. Trong một mạng CNN có nhiều Feature Map nên mỗi Feature Map chúng ta sẽ cho mỗi Max Pooling khác nhau. Chúng ta có thể thấy rằng Max Pooling là cách hỏi xem trong các đặc trưng này thì đặc trưng nào là đặc trưng nhất. Ngoài Max Pooling còn có L2 Pooling.

Cuối cùng ta đặt tất cả các lớp lại với nhau thành một CNN với đầu ra gồm các neuron với số lượng tùy bài toán.

 

2 lớp cuối cùng của các kết nối trong mạng là một lớp đầy đủ kết nối (fully connected layer) . Lớp này nối mọi nơron từ lớp max pooled tới mọi nơron của tầng ra.

Cách chọn tham số cho CNN

  1. Số các convolution layer: càng nhiều các convolution layer thì performance càng được cải thiện. Sau khoảng 3 hoặc 4 layer, các tác động được giảm một cách đáng kể
  2. Filter size: thường filter theo size 5×5 hoặc 3×3
  3. Pooling size: thường là 2×2 hoặc 4×4 cho ảnh đầu vào lớn
  4. Cách cuối cùng là thực hiện nhiều lần việc train test để chọn ra được param tốt nhất.

Hy vọng với thông tin bài viết trên sẽ tóm tắt được các kiến thức hữu ích cho bạn về CNN là gì? Cấu trúc mạng CNN và am hiểu hơn về mô hình CNN machine learning cơ bản. Chúc các bạn có những kinh nghiệm thật bổ ích cho nghề Dev của mình nhé!

Bạn có muốn tìm hiểu thêm các công việc lập trình Network có thể xem tại đây

Tham khảo thêm các việc làm lập trình lương cao tại Topdev

Tập trung vào kết quả cần đạt, chứ đừng chú trọng vào giờ giấc!

Việc làm việc từ xa có rất nhiều ưu điểm, nhưng có lẽ điểm mà tôi tâm đắc nhất đó là: bạn không cần phải thấp thỏm lo lắng xem có ai đang đứng sau lưng dòm bạn đang làm gì cả.

Hướng con người theo mục tiêu cần đạt được 

Nếu bạn cứ tập trung vào thời gian làm việc của team, thì okay, bạn sẽ đạt được 2 thứ: các thành viên đi làm đúng giờ nhất hệ, và luôn về nhà sau bạn (wow congrats… 😒). Nhưng liệu đây có phải là ưu tiên hàng đầu? Chẳng khác nào bạn đang đề cao việc đi làm đúng giờ đủ giờ hơn cả việc làm việc năng suất và có hiệu quả. Mục tiêu của việc đề ra bao nhiêu thời gian làm việc – ví dụ, từ 9h sáng đến 5h tối – là phải đi kèm với bấy nhiêu Năng suất/ Kết quả công việc mà bạn mong muốn có được.

Có một cách hay hơn để xử lý việc này. Nếu từ đầu bạn nêu rõ mục tiêu cần đạt được và một số phương tiện/ tool hỗ trợ giúp họ đạt được mục tiêu này, họ có thể sắp xếp thời gian lịch trình của mình thế nào cũng được miễn sao họ đem lại kết quả như mong muốn.

Ngoài ra sớm muộn bạn cũng sẽ trở nên ấn tượng hơn trong mắt khách hàng. Khi team được truyền tải về mục tiêu thay vì là nhiệm vụ, họ sẽ quan tâm nhiều hơn đến kết quả cần đạt được. Đôi lúc bạn – leader nhìn vào chúng và biết rằng mình có những cách khác hay hơn. Nhưng quan trọng là, bạn đang cho mọi người cơ hội để đánh liều, để mắc lỗi, để học và phát triển hơn so với “họ lúc đầu” (their old self). Vá không sớm thì muộn, bạn sẽ có được những đồng đội lành nghề nhất và nhanh chóng đạt được mục tiêu, trong khi bạn có thể lo được nhiều thứ khác nữa.

Kết quả có tệ cũng là một thành tựu 

Một mặt tối của việc tập trung vào kết quả, đó là các nỗ lực được bỏ ra sẽ không được để tâm đến (recognition). Nhưng cho dù thế, những kết quả không đạt vẫn là kết quả của một quá trình. Việc build sản phẩm bao giờ cũng là một quá trình dai dẳng lâu dài để “bớt lỗi” và đạt được cái người ta muốn.

Những dạng kết quả không đạt này vẫn nên được chấp nhận nếu như bạn học được gì đó từ nó. Bạn luôn cần phải tiến hành kiểm tra project hậu kì và tìm cho ra nguyên nhân sai sót. Có thể do concept tệ, hoặc không đủ resource, hoặc có factor bên ngoài ảnh hưởng lên timeline, hoặc là, do team làm không đủ tốt. Có cả trăm ngàn lí do tại sao nó fail, nhưng rất hiếm khi do một cá thể riêng biệt nào đấy. Nên hãy cố tìm cho ra, học về nó, sửa, và lặp lại.

Ứng dụng văn hoá làm việc từ xa, ngay cả khi đang ngồi cũng một chỗ 

Khi làm từ xa, bạn sẽ auto note lại mọi thứ đã làm, còn thiếu cái gì, chưa xong cái gì,… Quan trọng hơn là, để làm việc từ xa team phải có sự tin tưởng nhất định lẫn nhau và bỏ qua bớt các khâu giám sát nhỏ lặt vặt để build nên văn hoá team tốt hơn và để thông điệp, mục tiêu được truyền tải hiệu quả hơn.

Good luck, and happy coding!

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

Xem thêm việc làm Software Developers trên TopDev

  Dù là nhân viên hay ông chủ, bạn cũng cần phải nắm 4 nguyên tắc này để nâng cao chất lượng công việc

Mất dữ liệu qua máy fax và bình pha cà phê – Đâu mới là giới hạn của tấn công mạng?

Biên dịch: Đinh Quốc Hội

Hy vọng rằng bạn bảo vệ máy tính của bạn khỏi các cuộc tấn công trên mạng. Bạn có thể có phần mềm chống vi-rút trên điện thoại, máy tính bảng, máy tính xách tay hoặc máy tính để bàn. Bạn có thể tránh sử dụng chúng để truy cập các trang web đáng ngờ và cẩn thận bảo vệ các chi tiết đăng nhập khác nhau của bạn.

Nhưng nó không còn là những gì chúng ta thường nghĩ đến như máy tính được kết nối với internet và do đó có nguy cơ tấn công mạng. Và nếu nhiều thiết bị được kết nối với cùng một mạng trong nhà hoặc văn phòng của bạn, thì nếu một hacker xâm nhập vào một máy, họ có thể truy cập vào tất cả chúng.

Các nhà nghiên cứu bảo mật gần đây đã tuyên bố đã tấn công vào một mạng máy tính bằng cách gửi một bản fax độc hại. Và có nhiều cách khác dường như không chắc chắn mà một hacker có thể truy cập vào hệ thống của bạn. Bạn có thể có một cửa trước được bảo vệ tốt với internet, nhưng ai đó có thể vào được bằng một chiếc nắp được lắp đặt gần đây trong nhà kính?

  9 hiểu lầm "ngớ ngẩn" về machine learning

Máy in và màn hình nhỏ

Một số thiết bị mà chúng tôi nhận ra là có liên quan đến máy tính của chúng tôi, nhưng chúng tôi không nhất thiết phải nghĩ đến chúng như đang được kết nối với internet. Ngày nay, máy in thường có kết nối internet riêng của họ để cho phép họ nói chuyện với các thiết bị khác trong nhà hoặc văn phòng của bạn, thường không dây.

Kết nối này cung cấp bước đầu tiên để tin tặc truy cập từ xa mạng của bạn. Sau đó, họ chỉ cần để có được xung quanh bất kỳ điều khiển an ninh và họ có thể hack vào không chỉ máy in nhưng các thiết bị khác kết nối với nó. Lỗ hổng máy in đã được ghi nhận rõ ràng, với một hacker tuyên bố đã chia thành 150.000 máy in để nâng cao nhận thức về sự bất an của họ.

Tương tự như vậy, nhiều màn hình bé và camera an ninh hiện kết nối với internet để cho phép mọi người truy cập chúng từ bên ngoài nhà. Bộ phận người tiêu dùng của New York đã ban hành một cảnh báo công khai về an ninh theo dõi trẻ em sau một số sự cố được báo cáo rộng rãi về tiếng nói của người lạ được nghe qua chúng.

Đồ chơi và máy pha cà phê

Việc tạo ra cái gọi là Internet of Things có nghĩa là nó không chỉ là phụ kiện máy tính mà bây giờ được kết nối mà còn là thiết bị, thiết bị và đồ vật mà theo truyền thống chúng ta không thấy có liên quan gì đến loại công nghệ này. Và có vẻ như gần như ngay sau khi bất kỳ thiết bị nào được kết nối với internet, nó bị tấn công. Ví dụ gần đây bao gồm xe hơi , đồ chơi , bộ điều nhiệt , bộ cấy ghép y tế và thậm chí cả máy pha cà phê .

Một hacker thành công trong giao tiếp với một trong những thiết bị này sau đó có thể tiến hành bất kỳ số lượng các cuộc tấn công có thể. Họ có thể làm gián đoạn thông tin liên lạc, điều này sẽ gây khó chịu trong trường hợp máy pha cà phê, nhưng có khả năng đe dọa tính mạng trong trường hợp cấy ghép y tế. Họ cũng có thể truy cập dữ liệu được gửi đến thiết bị, có thể không quan tâm đến trường hợp đồ chơi, nhưng có thể là nguy cơ bảo mật nếu ai đó có thể tìm ra nơi chiếc xe của bạn có thể không được giám sát hoặc khi nhà của bạn trống (và hệ thống sưởi của bạn tắt).

Bạn có thực sự cần phải kiểm soát máy cà phê của bạn thông qua điện thoại của bạn? Shutterstock

Máy fax

Thật thú vị, ngay cả một số thiết bị không được cắm trực tiếp vào internet có thể bị tấn công. Như đã đề cập, gần đây đã báo cáo rằng các máy fax có thể bị tấn công bằng cách gửi các tệp hình ảnh được tạo cẩn thận đến chúng chứa mã độc. Khi hình ảnh này được chuyển đổi thành dữ liệu để truyền trong mạng máy tính nội bộ, mã bị ẩn trong dữ liệu này có thể chạy và gây thiệt hại cho nó.

Phương pháp xâm nhập này, bất kỳ thiết bị nào có kết nối bên ngoài với thế giới bên ngoài đều có khả năng dễ bị tấn công, cho phép tin tặc chèn phần mềm độc hại như vi-rút vào mạng máy tính được kết nối với thiết bị. Mã này có thể không chỉ được sử dụng để tấn công mạng thâm nhập, nhưng cũng có thể kết nối các thiết bị trên mạng với một mạng lưới phân tán rộng hơn các máy bị tấn công . Các tin tặc sau đó có thể sử dụng sức mạnh tính toán tập thể này để ăn cắp mật khẩu, tìm kiếm chi tiết thẻ ngân hàng, trang web ném bom với yêu cầu dữ liệu để phá vỡ dịch vụ của họ hoặc tấn công nhiều máy tính hơn.

Giữ an toàn

Tất nhiên, chỉ vì một cái gì đó có thể bị tấn công không có nghĩa là nó sẽ được. Một người dùng chuyên gia có thể sử dụng các công nghệ bảo mật mạng như tường lửa và các phương pháp xác thực mạnh để giảm thiểu rủi ro của người ngoài tấn công các thiết bị được kết nối internet. Nhưng hầu hết người dùng không phải là chuyên gia và mọi thiết bị chúng tôi kết nối đều tạo ra cơ hội mới cho bất kỳ ai cố gắng đột nhập vào hệ thống máy tính của chúng tôi.

Là một xã hội, chúng ta phải tự hỏi mình hai câu hỏi lớn. Đầu tiên, công nghệ nào sẽ thực sự mang lại lợi ích cho chúng ta khi kết nối internet? Một giám sát tim có thể được theo dõi bởi bác sĩ của bạn? Có lẽ. Một con búp bê có thể có những cuộc trò chuyện phức tạp nhưng cũng ghi lại mọi thứ con bạn nói? Ít hơn.

Thứ hai, đối với những công nghệ mà chúng tôi muốn kết nối, làm thế nào để chúng tôi có được các nhà sản xuất thiết bị thực hiện nghiêm túc an ninh mạng của họ? Hầu hết các sản phẩm kết nối internet mới đều thiếu tính bảo mật của các máy tính truyền thống hơn như máy tính xách tay và điện thoại. Câu trả lời có lẽ phụ thuộc vào áp lực của thị trường, điều này luôn mất thời gian để gây ảnh hưởng. Chúng tôi có thể tự mình thực hiện bằng cách đặt câu hỏi về bảo mật trước khi mua thiết bị mới nhưng cuối cùng, đó là nhà cung cấp phải đảm bảo an toàn cho thiết bị của họ.

Điều đó nói rằng, chỉ vì ấm đun nước của bạn có thể kết nối với internet, không có nghĩa là bạn phải để nó làm như vậy. Tuy nhiên, tôi sợ rằng chúng ta sẽ đọc về tủ lạnh không an toànlò nướng bánh mì có thể hack được trong một thời gian đáng kể.

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

Xem thêm việc làm Software Developers trên TopDev

TopDev via The Conversation