Home Blog Page 180

The Product Mindset — Tư duy làm sản phẩm

Người viết: Đoàn Văn Tuyển

Lần trước mình đã từng viết về Product Mindset (Tư duy làm sản phẩm), nhưng sau gần 2 năm trải nghiệm những gì mình nghĩ về Product Mindset có chút thay đổi. Giờ mình xin chia sẻ lại những gì mình hiện tại mình cảm nhận. Dưới đây mình chỉ chia sẻ những thể hiện bên ngoài của của một tư duy làm sản phẩm tốt. (Nó chỉ là trải nghiệm cá nhân nên đôi lúc nó viết không được hoàn hảo, không được bài bản hay quy củ)

1. Deliver value, not feature

Đây chính là thứ đầu tiên mình muốn nói. Kết quả của sản phẩm không phải là những tính năng cho người dùng, cho hệ thống, mà là giá trị đem lại. Người dùng không cần những tính năng, họ cần những thứ giải quyết được vấn đề của họ. Để hiểu được điều này chúng ta cần thực sự hiểu được giá trị thực sự mà những thứ mà chúng ta làm ra mang lại cho người dùng. Hiểu được việc này thì team sẽ thực sự hiểu tại sao ta cần phải làm nó và thực sự làm sản phẩm CÓ ÍCH.

Để làm được điều này thì team cần biết được VẤN ĐỀ LÀ GÌ, chứ không chỉ GIẢI PHÁP LÀ GÌ. Business Analyst (PO/PM) phải hiểu được giá trị mà việc cần làm mang lại từ đó mô tả cho team Developer cách thức để giải quyết vấn đề (ko phải chỉ là tính năng là gì). Developer cũng phải hiểu được VẤN ĐỀ LÀ GÌ để có thể đưa ra được cách lập trình, tính năng phù hợp và có thể góp ý ngược lại với BA. Nếu developer chỉ hiểu tính năng thì chắc chắn sản phẩm họ deliver sẽ bị phụ thuộc vào BA rất nhiều. Nếu phương án của BA không hoàn toàn hợp lý thì có thể tính năng đưa ra chưa chắc đã giải quyết được vấn đề. Ngoài ra nếu không hiểu được câu hỏi TẠI SAO PHẢI LÀM mà chỉ biết LÀM THẾ NÀO (HOW) thì thông thường Developer yêu cầu BA mô tả phải thật sự rõ ràng.

Image result for value illustrationĐối với các team khác, nếu các bạn chỉ mô tả cho team Product tính năng thì có thể thứ bạn nhận được không hoàn toàn phù hợp. Nếu tính năng đó bắt nguồn từ đối tác thì chúng ta có thể mất 3 lần trao đổi để đến được người trực tiếp giải quyết vấn đề: Đối tác => Sale => BA => Developer. Với việc mô tả qua 3 cầu như vậy rất dễ có sự sai lệch thông tin, chưa kể góc nhìn của Sale không phải góc nhìn sản phẩm nên mô tả không triệt để. Do vậy thông thường BA (thậm chí Developer) cần phải được ra ngoài để nói chuyện với đối tác để có thể hiểu được phần nào những thứ đối tác THỰC SỰ mong muốn.

Ngoài ra một vấn đề nữa khiến cho sản phẩm không được như mong muốn là việc không có sự đồng nhất về cách đánh giá thế nào là hoàn thành tính năng / vấn đề (Define of DONE). Nếu không có được mô tả về Define Of DONE và có sự đánh giá bằng con số thì rất dễ có sự tranh cãi giữa các team sau khi vấn đề được giải quyết.

  Máy học - Machine Learning và một vài hạn chế.

2. Data-Driven Development

Một vấn đề nữa mình muốn rất rất muốn nói đến là vai trò của dữ liệu trong việc đưa ra quyết định. Data-Driven là thứ bắt buộc phải làm theo để có thể xây dựng sản phẩm thành công. Mọi thứ cần được đo đạc ở tất cả các khâu. Việc đo đạc nên được thực hiện trong hầu hết các bước và nó phải là nền tảng của việc ra quyết định.

Ví dụ ở bước đánh giá một lỗi phát sinh, một tính năng vừa hoàn thành… thì dữ liệu là thứ bắt buộc phải có để đưa ra quyết định. Ví dụ nếu ta chỉ nhìn vào thể hiện bên ngoài của lỗi thì rất khó đánh giá giá trị mà mình có thể mang lại sau khi sửa lỗi hoặc đánh giá hậu quả. Ví dụ cùng một thể hiện bên ngoài nếu ta đo được lỗi ảnh hưởng khiến cho doanh thu công ty sai lệch để cả trăm triệu đồng sẽ rất khác lỗi chỉ ảnh hưởng một vài ngàn đồng, lỗi ảnh hưởng đến toàn bộ đối tác sẽ rất khác lỗi chỉ ảnh hưởng rất ít đến đối tác nhỏ. Như vậy data sẽ rất cần để đánh giá giá trị của việc ta làm là gì => Từ đó đưa ra được quyết định lệu ta sẽ làm gì tiếp theo.

Image result for data driven illustration

Tương tự như vậy việc đánh giá một tính năng, một yêu cầu được hoàn thành cũng cần phải có các con số. Nếu ta biết được việc ta làm ảnh hưởng thế nào thì ta mới có cơ sở để đưa ra quyết định ta có tiếp tục làm hoặc nếu có một tình huống tương tự nếu ta chưa có dữ liệu thì cũng có thể phỏng đoán được kết quả. Túm lại nếu ta không đánh giá được kết quả ta tạo ra bằng một con số cụ thể thì việc ta có làm hay không làm cũng chả khác gì nhau, từ đó khiến cho ta có thể thấy việc ta đã làm là hoàn toàn vô ích.

Một việc cần phải xem xét là thang đo để đánh giá, từ đó ra quyết định. Việc lựa chọn thang đo quyết định đến hơn 50% giá trị của việc đo lường. Nếu ta chọn sai thang đo thì giá trị của dữ liệu rất thấp. Thang đo phải được đánh giá rất cẩn thận để có được dữ liệu có giá trị. Một điều cần ghi nhớ, không phải mọi dữ liệu đều có ý nghĩa như nhau. Thông thường ta không thể đo đạc mọi thứ thế nên câu hỏi luôn phải đặt ra là dữ liệu là dữ liệu quan trọng nhất trong tình huống này. Và bạn phải luôn ghi nhớ: không phải cái gì tăng cũng tốt, không phải cái gì giảm cũng xấu, không phải số to đã là to, không phải số nhỏ đã là nhỏ. Dữ liệu luôn phải đặt vào context cụ thể mới có ý nghĩa.

3. Focus on the Product, Not the Code.

Một điều nữa ta cần ghi nhớ, chúng ta không phải là những công nhân lập trình, không phải là thợ xây. Do đo đó Team làm sản phẩm không nên chỉ chú trọng vào kỹ thuật. Một lần nữa mình nhắc lại cái mà khách hàng, đối tác, các team khác cần là giá trị chứ không phải là công nghệ, không phải công sức ta bỏ ra. Tất nhiên khi ta lựa chọn một công nghệ mà nó giúp tạo ra giá trị lớn (và phù hợp) thì luôn được hoan nghênh. Nhưng công nghệ có tốt đến mức nào mà không giải quyết được vấn đề thì cũng vô nghĩa. Thông thường Developer hay bị chú tâm quá nhiều vào công nghệ, họ có thể điên cuồng với một công nghệ mới nhưng thực sự đó không phải là thứ ta nên quan tâm đầu tiên.

Đôi khi chúng ta cần đánh đổi giữa công nghệ, những thức “tốt” để tập trung vào giải quyết bài toán sản phẩm. Một số thang đo cần được đưa vào để đánh giá ngoài chuyện nó có “tốt” không như: công nghệ này đã thực sự ổn định chưa? Cộng đồng có lớn không? Người có dễ tìm không? Nó có dễ phát triển không, vận hành hay không? Đôi khi ta phải đánh đổi giữa những thứ về kỹ thuật để tập trung tạo ra sản phẩm tốt hơn. Quan điểm của mình là luôn lựa chọn những công nghệ đơn giản để giải quyết vấn đề, theo nguyên tắc 80/20.

Image result for code product illustration

Tuy nhiên thực sự thì sản phẩm không chỉ gồm những yêu cầu tính năng. Sản phẩm còn bao gồm cả những yêu cầu phi chức năng (Non-Functional Requirements). Những yêu cầu chỉ những người thực sự hiểu về kiến trúc hệ thống mới đưa ra được. Thông thường sản phẩm ngắn hạn thì Non-Functional Requirements ít được đặt ra, nhưng sản phẩm dài hạn thì điều này cần đánh giá. Những yêu cầu như Coding Convention, Coding Style, System Architect cần được viết/vẽ ra một cách rõ ràng. Nếu ta không đưa ra và làm tốt thì rất dễ đưa đến những sản phẩm có nhiều món nợ kỹ thuật (Technical Debt)

4. UX

Trong quan điểm của mình đối với team Product thì User ko chỉ gồm những đối tượng mà sản phẩm thực sự hướng tới (End-User, Đối tác). Mà user bao gồm cả những thành phần tham gia phát triển sản phẩm (Developer Team, BA), Các team nội bộ và đối tác. Khi đặt vấn đề như thế thì trải nghiệm người dùng bao gồm cả những trải nghiệm cho team phát triển. Với góc nhìn như thì ta để ý đến trải nghiệm của cả những “user” phát triển sản phẩm. Trong thực tế thì ta có thể thấy: BA viết Requirements phục vụ Developer & Tester, Developer có user là Tester & Debops, Tester lại có user là Developer… Như vậy thực tế khi xây dựng sản phẩm chúng ta cần hình dung ra toàn bộ quá trình để xây dựng sản phẩm, hình dung việc team tham gia vào vận hành sản phẩm khác như team sale, team marketing, team vận hành…

Image result for code product illustration

Tiếp để hiểu được UX cho user bên ngoài thì đầu tiên ta cần biết: user là ai? User có tính chất gì? User biết gì? User sử dụng tính năng X trong tình huống gì? Những sai sót, hiểu nhầm hay gặp phải? Thông thường khi Developer xây dựng một tính năng, chúng ta chỉ nhìn vào tính năng chúng ta cần xây dựng là gì, bỏ quên mất người sử dụng. Nếu chúng ta không tự đặt mình vào tình huống của người sử dụng, tinh thần, khả năng của người sử dụng thì chúng ta có thể xây dựng tính năng cho chính chúng ta. Bạn phải luôn ghi nhớ rằng người dùng của chúng ta hoàn toàn không giống chính chúng ta, họ thường không có được suy nghĩ và nền tảng để hiểu hết những gì chúng ta hiểu. Từ đó ta phải xây dựng tính năng mà người ta không cần phải “động não” (Mình hay nói vui là chỉ cần IQ kém cũng dùng được, hay như trong quyển sách gối đầu giường về UX “Don’t Make Me Think”). Các tính năng phải bản thân nói giải thích chính nó, chúng không nên cần có một hướng dẫn sử dụng để có thể sử dụng. Nếu tính năng cần có hướng dẫn sử dụng thì coi như tính năng vô ích.

Thực ra mình cũng không phải là người làm tốt về UX, thế nên để hiểu sâu hơn và rõ ràng hơn mọi người có thể xem slide mình chia sẻ bên dưới của Tùng Jacob (Slide là video khá dài kéo dài đến 1h)

5. Minimum Viable Product:

Đầu tiên ta cần hiểu MVP là gì? Tại sao cần có MVP? MVP là cách thức xây dựng sản phẩm đơn giản nhất có thể nhưng vẫn đảm bảo những tính năng cơ bản cần thiết và có thể giúp ta đánh giá được kết quả, từ đó đưa ra phương án tiếp theo là gì. Tại sao việc này lại quan trọng? Thực tế thị trường thường biến đổi rất nhanh, nếu ta chọn cách làm phân tích, thiết kế, triển khai theo mô hình thông thường thì sau khi sản phẩm được đưa ra thị trường nó đã lỗi thời. Ngoài ra cũng có thể những gì ta nghĩ chưa chắc đã đúng, điều này đôi khi rất khó để có thể đoán biết được. Do vậy cần một phương án có thể nhanh chóng kiểm chứng được những gì ta nghĩ và MVP là một trong những cách thức kiểm chứng như vậy.

Theo như trong cuốn sách “Lean Startup” (Khởi nghiệp tinh gọn), ta có thể triển khai MVP theo 3 bước đơn giản và xoay vòng: Xây dựng — Đo Lường — Rút ra bài học. Việc này được thực hiện lặp đi lặp lại, qua mỗi vòng lặp sản phẩm sẽ được thay đổi và sẽ có một diện mạo khác. Để triển khai MVP thì bạn luôn nhớ đến 3 bước trên. Vậy mọi thứ phải bắt đầu từ đâu: Để lựa chọn được phương thức để triển khai MVP bạn phải quay lại đọc các phần 1–2–3–4 trước sẽ hình dung ra được những gì mình phải làm: Bắt đầu từ câu hỏi điều gì tạo ra giá trị, từ đó hiểu được điều quan trọng nhất là gì (keypoint là gì), từ đó có thể chỉ lựa chọn một mục tiêu quan trọng nhất chứ ko đưa ra quá nhiều mục tiêu. Tiếp theo mình cần đo lường những chỉ số quan trọng từ đó đưa ra được đánh giá tốt nhất. Tiếp theo là trong lúc triển khai, với suy nghĩ rằng lập trình không phải là thứ quan trọng nhất ta nên lựa chọn những phương án đơn giản, dễ đánh giá thay cho những giải pháp “tốt” khác. Tương tự khi tìm hiểu về UX chúng ta có thể hình dung đối tượng chúng ta cung cấp là ai, chỉ cần tập trung UX cho user thực sự “tiềm năng”, những user phục vụ việc mình nhanh chóng đưa ra được đánh giá và quyết định tiếp theo.

Image result for product mindset

Sách tham khảo: 
Lean Analytics
Lean Startup
Don’t Make Me Think

Slide về UX: 
https://www.youtube.com/watch?v=Z6icneN4jEY

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

Xem thêm việc làm Android Developer trên TopDev 

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

  Kỹ thuật phần mềm vs Khoa học máy tính - Nên chọn ngành nào/
  Máy học - Machine Learning và một vài hạn chế.

Kendo UI – HTML5

Mô tả công việc - Vị trí lập trình Front-end

Kendo UI là gì?

Kendo UI là 1 framework dựa trên nền tảng HTML5 và jQuery hỗ trợ chúng ta toàn diện trong việc xây dựng các ứng dụng Web hiện đại một cách dễ dàng và linh hoạt đến không ngờ.

Có thể bạn sẽ nghĩ rằng: Kendo UI chắc cũng giống như jQuery UI – một framework cũng được xây dựng dựa trên jQuery đang được sử dụng phổ biến nhất hiện nay.

Nhưng thật sự jQuery UI chỉ hỗ trợ mạnh việc xây dựng ứng dụng Web chuyên chạy trên Desktop và chỉ hỗ trợ một phần nho nhỏ để phát triển ứng dụng Web chạy trên Mobile.

Còn Kendo UI framework mà chúng ta đang cùng tìm hiểu thì lại hỗ trợ rất mạnh cả 2 phần này, ngoài ra Kendo UI còn rất mạnh trong việc trực quan hóa dữ liệu Data Visualization (Kendo UI DataViz) giúp ứng dụng Web trông và hành xử y như các ứng dụng thuần Mobile, hay thuần Desktop.

Như vậy có thể thấy Kendo UI bao gồm 3 phần chính:

  • Kendo UI Web: Hỗ trợ xây dựng một ứng dụng Web trên Desktop.
  • Kendo UI Mobile: Hỗ trợ xây dựng ứng dụng Web trên Mobile.
  • Kendo UI DataViz: Hỗ trợ thiết lập và tương tác dữ liệu trực quan.

Ngoài ra, Kendo UI còn có cả tính năng Kendo UI-Server Swapper độc đáo giúp chúng ta xây dựng 1 ứng dụng HTML5 mà không cần phải viết code JavaScript. Để làm được điều đó Kendo UI phát triển một số thư viện dưới dạng các helpers trên Server, Kendo UI-Server Swapper sẽ tiếp nhận các câu lệnh đơn giản của lập trình viên trong mã nguồn các ngôn ngữ lập trình ASP, PHP hoặc JSP và sau đó sẽ tự phát sinh ra (tự render) các mã HTML và JavaScript cần thiết.

Cài đặt

Chúng ta có thể download trọn bộ Kendo UI tại trang chủ của Kendo UI.

Sau khi download Kendo UI về và giải nén, chúng ta có thể thấy được cấu trúc thư mục như sau:

  • example: chứa các ví dụ minh họa
  • js: chứa file JavaScript đã được tối ưu hóa
  • src: chứa mã nguồn của Kendo UI (phần này sẽ không có trong bảng dùng thử)
  • styles: chứa các file CSS và theme
  • swapper: chứa thành phần server-side swapper đã đề cập bên trên.

Để sử dụng KenDo UI cho trang HTML, chúng ta cần include các tập tin CSS và JavaScript

Sử dụng

Bước 1: Download Kendo UI Web và giải nén
Bước 2: Copy thư mục js và style vào thư mục chính trong ứng dụng web của bạn
Bước 3: Include Kendo Ui Web JavaScript và CSS vào phần thẻ head trong trang HTML.

<html>
        <head>
            <title>Welcome to Kendo UI!</title>
            
            <link href="styles/kendo.common.min.css" rel="stylesheet" />

            
            <link href="styles/kendo.rtl.min.css" rel="stylesheet" type="text/css" />

            
            <link href="styles/kendo.default.min.css" rel="stylesheet" />

            
            <link href="styles/kendo.default.mobile.min.css" rel="stylesheet" type="text/css" />

            
            <script src="js/jquery.min.js"></script>

            
            <script src="js/kendo.all.min.js"></script>
        </head>
        <body>
            Hello World!
        </body>
        </html>

 

Bước 4 : Khởi tạo Widget.
Ví dụ sau minh hoạ làm thế nào để khởi tạo widget DatePicker:

<input id="datepicker" />
    <script>
    $(function() {
        // Initialize the Kendo UI DatePicker by calling the kendoDatePicker jQuery plugin
        $("#datepicker").kendoDatePicker();
    });
    </script>
<html>
    <head>
        <title>Welcome to Kendo UI!</title>
        <link href="styles/kendo.common.min.css" rel="stylesheet" />
        <link href="styles/kendo.default.min.css" rel="stylesheet" />
        <script src="js/jquery.min.js"></script>
        <script src="js/kendo.all.min.js"></script>
    </head>
    <body>
        <input id="datepicker" />
        <script>
            $(function() {
                $("#datepicker").kendoDatePicker();
            });
        </script>
    </body>
</html>

Xem thêm

Các bài viết khác về cách bắt đầu với Kendo UI:

  • Kendo UI CDN Services
  • Include Only What You Need
  • JavaScript Prerequisites
  • Initialize Widgets Using jQuery Plug-Ins
  • Initialize Widgets Using Markup
  • Access Widget DOM Elements: wrapper and element
  • Set Data Attributes
  • Widget Methods and Events
  • Destroy Widgets
  • Edit Widgets
  • Create Custom Widgets
  • Bower Packages
  • NuGet Packages

Tài liệu tham khảo

https://docs.telerik.com/kendo-ui/introduction
https://docs.telerik.com/kendo-ui/intro/installation/getting-started

Xem thêm các vị trí tuyển dụng lập trình HTML5 lương cao tại Topdev.

Làm sao Google cho ra kết quả tìm kiếm nhanh đến thế?

Làm sao Google cho ra kết quả tìm kiếm nhanh đến thế?

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

Vào thời đại công nghệ như ngày nay thì việc tìm kiếm thông tin cũng trở nên rất quan trọng. Thử hỏi nếu 1 ngày Google không hoạt động thì thế giới sẽ như thế nào nhỉ? Chắc mình sẽ bị rơi vào thời kì đồ đá mất.

Dùng nhiều Google nhưng nhiều lúc băn khoăn không biết vì sao Google lại tìm kiếm cho ra kết quả nhanh như vậy.

Chỉ với từ khoá “lập trình hướng đối tượng” mà Google trả về trong 0.42 giây trong tổng 60 triệu kết quả. Quá nhanh.

Không chỉ tốc độ trả về nhanh mà kết quả trả về cũng khá gần với mục đích tìm kiếm của người dùng nên Google đã trở thành 1 trong những công cụ có lẽ mạnh nhất trên thế giới.

Vậy cùng nhau tìm hiểu xem vì sao Google lại trả về kết quả nhanh đến như vậy nhé.

Mục đích của bài viết:

  • Giúp các bạn có cái nhìn chung về 1 công cụ tìm kiếm nó gồm những bộ phận nào, vì sao nó hoạt động lại nhanh đến như vậy.
  • Bài viết sẽ không giải thích sâu về từng bộ phận, mà chỉ nói qua về từng bộ phận để ai cũng có thể hiểu được.

Kiến trúc Search Engine

Search Engine gồm 3 bộ phận chính. Đó là Search ServerIndexSearch Backend.

Trong đó:

  • Search Server đảm nhiệm việc trả về kết quả tìm kiếm cho người dùng.
  • Seach Backend đảm nhiệm việc thu thập thông tin toàn bộ website trên toàn thế giới.
  • Index giống như 1 cơ sở dữ liệu được sử dụng bởi Search Server và Search Backend.

Nhiệm vụ chính của Search Server là trả về kết quả tìm kiếm của người dùng nhanh nhất có thể. Bởi vì nếu không trả về ngay lập tức mà mất 10s, 1 phút, 2 phút mới trả về kết quả thì quả thực sẽ không thể trở thành 1 công cụ tìm kiếm được. Do đó Search Server sẽ được thiết kế để trả về kết quả nhanh nhất có thể.

Mặt khác, nhiệm vụ của Search Backend thì khác hoàn toàn với Search Server. Cho dù xử lí mất 5p, 10p hay 1 tiếng đi chăng nữa thì cũng không thành vấn đề. Miễn là nó thu thập dữ liệu từ toàn bộ website trên toàn thế giới và tạo ra Index mà Search Server dễ dùng là được.

Nhiệm vụ chính của thằng Index là lưu thông tin toàn bộ dữ liệu đã được thu thập từ Search Backend. Khi người dùng tìm kiếm, Search Server chỉ cần tìm trong Index và trả về kết quả là xong. Chứ không phải lúc đó mới bắt đầu đi thu thập dữ liệu và trả về đâu nhé.

Ví dụ như khi tìm kiếm với từ khoá “lập trình” thì khi đó từ khoá “lập trình” đã có sẵn trong Database (hay là Index) của Google rồi. Và nó chỉ trả về kết quả là xong.

Chính vì điều đó mà khiến cho Search Server luôn trả về kết quả ngay tức khắc là vì thế.

Đến đây ít nhiều chúng ta cũng đã hiểu được vì sao Google lại hoạt động nhanh đến thế. Vậy chúng ta thử đi tìm hiểu xem cụ thể bên trong nó hoạt động như nào nhé.

Search Server thì tốc độ là số 1

Bây giờ chúng ta thử tìm hiểu xem Search Server hoạt động thế nào nhé.

Về cơ bản thì Search Server nó cũng không khác gì Web Server cả. Nó chủ yếu đảm nhiệm những nhiệm vụ chính sau:

  • Quản lí truyền thông với người dùng
  • Phân tích request từ người dùng
  • Tìm kiếm thông tin cần thiết từ Index
  • Trả kết quả về cho người dùng

Quay lại với ví dụ bên trên, giả sử như người dùng tìm kiếm với từ khoá “lập trình”. Khi đó lúc này ở Index đã thực sự có kết quả về “lập trình” rồi. Và Search Server chỉ cần lấy kết quả từ Index trả về cho người dùng là xong nhiệm vụ.

Trong trường hợp mà Index không có kết quả nào, thì khi đó Search Search trả về kết quả là “Hiện tại không tìm thấy kết quả nào” đến cho người dùng.

Do đó việc tổ chức dữ liệu trong Index để làm sao mà Search Server có thể lấy nhanh nhất là 1 điều vô cùng quan trọng.

Search Backend luôn chuẩn bị trước dữ liệu

So với Search Server thì Search Backend quả thực nó phức tạp hơn rất nhiều. Về cơ bản Search Backend sẽ bao gồm 2 thành phần chính đó là “Crawling” và “Tạo Index“.

Crawling là có nhiệm vụ đi thu thập toàn bộ trang web trên toàn thế giới về để xử lý. Vì công việc này vô cùng mất thời gian nên nó đã phân tách ra thành nhiều bộ phận con hơn để xử lý, đó là Crawler.

Hiện nay trên toàn thế giới chắc phải có đến tỉ tỉ website mất. Vậy mà Google đi thu thập từng đó website về để phục vụ cho người dùng thì quả thực quá kinh khủng.

Nhưng vì quá trình crawl, thu thập đến việc tạo Index là vô cùng mất thời gian. Nên bạn nào có blog riêng mà sau khi viết bài xong, search trên Google nó không ra là vì thế. Phải đợi Google crawl đến trang web của mình thì lúc đó các bạn search trên Google mới ra được.

Những trang web mà Crawler thu thập sẽ lưu tạm thời vào 1 nơi giống như cơ sở dữ liệu, cái này được gọi là Repository (kho).

Bộ phận tạo Index (Index Creation) sẽ lấy trang web từ Repository ra để phân tích, xử lý và cuối cùng là tạo ra Index để cho Search Server dùng.

Đối với Search Engine thì đây là 1 công việc vô cùng vô cùng mất thời gian. Chính vì luôn có thằng tạo trước dữ liệu như vậy mà đã làm cho Google luôn trả về kết quả ngay như tức thì.

Vậy khi nào thì Google sẽ crawl trang web của mình?

Với trang web nào nhiều người yêu thích, nội dung chất lượng thì luôn luôn được ưu tiên crawl trước. Những trang web nào nội dung kém chất lượng thì sẽ mất tầm 3 đến 1 tuần mới được crawl.

Làm thế nào để thúc Google crawl trang của mình?

Google cung cấp 1 trang để gửi yêu cầu thực hiện crawl. Chỉ cần vào đó đăng kí tên website, gửi nội dung trang muốn crawl là được. Còn nếu không thực hiện thì mình khẳng định sẽ mất tầm từ 3 đến 7 ngày mới được crawl.

Index là linh hồn của việc tìm kiếm

Nhiệm vụ chính của Index là lưu dữ liệu 1 cách an toàn và giúp Search Server trả về kết quả nhanh nhất có thể. Để dễ hình dùng thì chúng ta có thể xem Index như là 1 Database.

Trong Index có rất nhiều thông tin, phù hợp với nhiều mục đích tìm kiếm khác nhau.

Ở trong 1 Search Engine thì Index chính là 1 “cấu trúc dữ liệu” mà chỉ có Search Engine mới có thể hiểu được.

Nên việc thiết kế Index như nào, tổ chức dữ liệu ra sao để cho Search Server có thể query và trả về kết quả nhanh nhất có thể là điều vô cùng quan trọng. Và bài hôm nay mình sẽ không đi sâu vào giải thích cách tổ chức dữ liệu của Index nữa. Vì như thế có thể sẽ rất dài và càng làm cho bài viết trở nên phức tạp.

Tổng kết

1 Search Engine sẽ bao gồm 3 bộ phận sau:

  • Search Server: nhận yêu cầu từ người dùng, truy vấn trong Index để lấy kết quả và trả kết quả về cho người dùng.
  • Search Backend:Có nhiệm vụ đi thu thập thông tin của toàn bộ trang web trên toàn thế giới, phân tích, xử lý và tạo ra Index để dùng cho Search Server. Search Backend này hoạt động 24/24 không ngừng nghỉ.
  • Index giống như 1 database được tổ chức dữ liệu hợp lý giúp cho Search Server có thể truy vấn 1 cách nhanh nhất có thể.

Các bạn thấy thế nào? Đã hình dung được tại sao mà Google luôn trả về kết quả nhanh như vậy chưa ak?

Mặc dù bài viết này không giúp các bạn tạo ra được 1 Search Engine nhưng ít nhiều cũng giúp các bạn có 1 chút hình dung Search Engine nó làm việc như thế nào.

Và đây là quyển mình đã tham khảo. Mình tìm mãi không thấy quyển tiếng anh đâu. Nên nếu ai biết tiếng nhật thì mình khuyên nên đọc quyển này. Theo mình cảm nhận khá là hay. Từ việc Search Engine làm việc thế nào cho đến việc tổ chức lưu dữ liệu ra sao, tối ưu server thế nào để cho chi phí vận hành là thấp nhất…

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

TopDev via Nghệ thuật Coding

Kiến thức ngành lập trình – Bạn có đang giới hạn bản thân?

Kiến thức ngành lập trình

Trước khi định hướng theo chuyên ngành, không chỉ sinh viên ngành lập trình mà còn là bộ phận sinh viên nói chung còn khá thụ động trong việc tiếp nhận kiến thức. Trong khi đó, kiến thức ngành lập trình lại rất nhiều và luôn thay đổi, cập nhật từng ngày.

Bài viết này sẽ phân tích kỹ hơn những lầm tưởng mà sinh viên hay gặp phải và làm mất điểm trong mắt nhà tuyển dụng.

“Em chưa được học cái này”

Câu nói thường gặp ở đa số các bạn sinh viên khi giải thích về những khiếm khuyết của mình thường là “Mấy cái này trường em không dạy”. Thật ra, với lượng kiến thức khổng lồ và luôn cập nhật trong ngành lập trình, những gì bạn biết hôm nay sang ngày mai đã trở nên cũ kỹ. Do đó, để kịp với sự thay đổi nhanh chóng này, cách tốt nhất là tự học.

Đại học là bước đệm cần thiết, nhưng chưa đủ vì những kiến thức ở đại học chỉ là nền tảng về lập trình, như cấu trúc hay cơ sở dữ liệu. Còn những bước cao hơn như code như thế nào, cách sử dụng ngôn ngữ lập trình ra sao, thì chính bạn phải tự dạy cho bản thân.

Đây cũng chính là lầm tưởng đầu tiên trên con đường học vấn, khi bị động trong việc tiếp nhận kiến thức. Nếu quá phụ thuộc vào những gì được dạy mà không tự tìm hiểu lộ trình học lập trình, yêu cầu công việc, xem xét và bổ sung cho bản thân, thì kiến thức của bạn sẽ nhanh chóng lỗi thời và cản trở sự thăng tiến trong công việc.

Nhà tuyển dụng giờ đây cũng không còn quá đề cao tấm bằng Đại học, mà chỉ quan tâm đến kỹ năng chính của bạn cũng như kinh nghiệm làm việc. Vì thế, những chuyện như kiến thức bạn có bắt nguồn từ đâu, do trường dạy hay tự tìm hiểu, đó là câu chuyện của riêng bạn.

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

Biết nhiều là sẽ giỏi?

Mô hình hoàn hảo khi hiểu biết về một lĩnh vực là theo hình chữ T. Có nghĩa là không chỉ hiểu chuyên sâu về một thứ (chữ I) mà còn có kiến thức tổng quan về các khái niệm khác (như dấu gạch ngang trên đầu).

Phần lớn độc giả tại Việt Nam khá phong trào, và khiếm khuyết Tư duy phản biện (Critical Thinking). Khi thích tác giả nào thì ủng hộ ý kiến của tác giả đó, không thích cây bút nào thì bài trừ và không tiếp nhận.

Tuy nhiên, cách tiếp cận kiến thức như vậy sẽ làm hạn chế tầm nhìn của lập trình viên. Thay vào đó, hãy tham khảo từ nhiều nguồn, tập cách kiểm chứng thông tin khi tiếp nhận, không “nuốt chữ” của tác giả ruột chỉ vì nó nghe khá logic, …

Tổng kết

Những rào cản mà lập trình viên thường gặp chính là tự giới hạn kiến thức với nền tảng từ những gì “được dạy”, và chưa có tư duy phản biện khi tiếp nhận thông tin/kiến thức. Nếu khắc phục được và tránh khỏi hai vấn đề trên, bạn đã sẵn sàng là dev chính hiệu!

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

Cách đặt nút “Cancel” trong thiết kế UX tối ưu nhất

cách đặt nút cancel trong thiết kế UX

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

Trong design, nút cancel ngoài cái tên gọi là cancel ra, nó còn 1 vài cái tên gọi khác nữa.「Not Now – Không làm bây giờ」 hay「Maybe Later – Làm lúc khác」 là 1 trong những ví dụ đó.

Nhưng đôi khi có 1 số trường hợp mà nút Cancel không thể đặt là Cancel hay những tên gọi tương tự khác. Vì có thể làm người dùng khó hiểu, hay nói cách khác sẽ khó thể thực hiện được hành động CTA (Call to Action).

Call to Action (CTA): là thuật ngữ viết tắt của call to action trong quảng cáo Google. Chúng được thể hiện thông qua văn bản hoặc hình ảnh nhằm mục đích kêu gọi người xem phải hành động bằng những cú click chuột. Như vậy, hiểu một cách đơn giản, CTA có nhiệm vụ tạo ra tỉ lệ chuyển đổi từ người dùng thành khách hàng tiềm năng.

Vậy chúng ta hãy cùng đi xem cách đặt nút Cancel trong thiết kế UX sao cho tối ưu nhất. Khi nào nút Cancel không nên đặt là Cancel các bạn nhé.

  Hiểu tất tần tật về UX Design với UX360: User Experience in a nutshell.

Phòng chống ấn cancel “nhầm”

Ví dụ như có 1 màn hình “cancel subscription” như bên dưới.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Đây là sự nhầm lẫn của nút cancel. Nếu như chúng ta đặt 1 cái nút Cancel ở ngay bên trên nút Cancel Subscription thì theo các bạn điều gì sẽ xảy ra?

Như ở cái màn hình bên trái. Có thể dịch đơn giản như sau: Bạn có muốn huỷ subscription không?

  • Nút bên trên là “Huỷ”.
  • Nút bên dưới là “Huỷ subscription”.

Nếu để 2 nút như này đúng quả thật gây khó hiểu thật. Cả 2 nút đều là “Huỷ”. wtf @@

Vậy nếu đặt 2 nút như này thì có thể gây ra vấn đề gì?

Đó chính là người dùng có thể ấn nhầm vào nút Cancel Subscription ở bên dưới.

Với những ai đang muốn huỷ Subscription thì không sao, nhưng ai không muốn huỷ mà ấn nhầm vào nút Cancel Subscription thì quả thực gây thiệt hại cho công ty rồi đúng không nào.

Nếu chúng ta thay nút Cancel bằng nút Not Now hay là Maybe Later thì cũng vẫn gây hiểu nhầm. Bởi vì những nút này có ngụ ý là sẽ không huỷ subscription lúc này mà sẽ huỷ vào lúc khác.

Để giải quyết vấn đề đó thì chúng ta nên thay cái nút Cancel bằng nút Keep Plan – Vẫn giữ nguyên subscription sẽ thân thiện và an toàn với người dùng hơn rất nhiều.

Tên nút không được gây xung đột nhau

Khi nghĩ về 1 tên mà đối lập với “Cancel” có thể ai trong chúng ta cũng đều nghĩ là “Do not Cancel“. Nhưng cái tên này không phải là lựa chọn tốt bởi vì nó đang cùng sử dụng từ giống nhau đó là “Cancel“.

Đây cũng là lí do mà “Keep Subscription” sẽ không phải sự lựa chọn tốt, mà chúng ta nên đặt là “Keep Plan“.

Khi mà chúng ta cùng sử dụng 1 từ giống nhau cho 2 button thì có thể làm người dùng nhầm lẫn nút này với nút kia. Hay nói cách khác, để không bị nhầm lẫn người dùng sẽ bỏ ra khoảng thời gian nào đó để đọc thật kĩ 2 nút đó.

Với UX Design thì điều đó là không tốt 1 chút nào.

Hơn nữa, “Do Not Cancel” không phải là từ trái lập với “Cancel” bởi vì cả 2 từ này đều mang ý nghĩa là phủ định.

Nếu cả 2 nút đều mang nghĩa là phủ định thì khi đó người dùng sẽ xem 2 từ này như là “Huỷ“, và đây cũng chính là nguyên nhân gây nhầm lẫn.

Từ “Cancel – Huỷ” nó mang nghĩa phủ định. Nếu mà 1 lúc nhìn vào 2 từ “Do Not Cancel” và “Cancel Subscription” thì người dùng có cảm giác khi ấn vào 1 trong 2 nút này thì có thể làm mất đi “1 thứ nào đó”.

Để đặt tên nút an toàn hơn trong trường hợp này, thì từ “Keep Plan” có lẽ sẽ là giải pháp tốt nhất.

Cancel Subscription vs Unsubscribe

Đôi khi chúng ta nghĩ, sử dụng “Unsubscribe” có thể thay thế cho từ “Cancel Subscription“. Nhưng các bạn đã nhầm.

2 từ “Subscription” với “Subscribe” là 2 từ không thể thay thế cho nhau được. Bởi vì ngữ cảnh sử dụng nó là hoàn toàn khác nhau.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Chắc xem nhiều Youtube chúng ta cũng đều nghe thấy từ “Subscribe” đúng không nào?

Ý nghĩa của từ “Subscribe” là muốn nói đến việc người dùng đăng kí theo dõi kênh đó, và sẽ nhận thông báo khi có bài viết mới.

Còn từ “Subscription” thì sao? Nó lại có ý nghĩa hoàn toàn khác.

Với những ai đăng kí dùng Netflix hay là Spotifyđể nghe nhạc thì cũng biết. Cả 2 dịch vụ này đều tính tiền theo tháng, và chúng ta phải mua thì mới dùng được. Nó có những plan khác nhau.

Nếu chúng ta đăng kí plan và trả tiền theo tháng, cứ đến đầu tháng sẽ bị rút tiền từ thẻ VISA. Cái hành động đó được gọi là “Subscription“.

Do đó tuỳ vào ngữ cảnh, nếu chúng ta không phân biệt cách sử dụng của 2 từ này 1 cách rõ ràng thì có thể gây nhầm lẫn cho người dùng.

Như ảnh ở bên trên, nếu chúng ta muốn hỏi người dùng là “Có muốn huỷ subscribe kênh hay không?” thì có lẽ câu trả lời tốt nhất vẫn là “Stay Subscribed” đúng không nào?

Qua đó ta thấy được, để làm rõ hành động của người dùng thì việc đặt tên nút phù hợp với từng ngữ cảnh là điều khá quan trọng.

Nếu sử dụng tên nút không thích hợp sẽ không chỉ làm người dùng nhầm lẫn, mà còn khiến người dùng “phải bỏ chút thời gian” để hiểu rõ xem nút này có ý nghĩa là gì.

Và còn rất nhiều ví dụ khác nữa cũng khá thú vị. Đặc biệt là Nitendo họ đã làm rất tốt điều này.

Nếu bạn nào biết tiếng nhật có thể tham khảo bài này về Design Nitendo (mình tìm mãi không thấy có bài viết về tiếng anh): Nintendo SwitchのUIはなぜ使い勝手がいいのか!? 全員で体験し、“あたりまえ”を磨く任天堂のもの作り【CEDEC 2018】

Kết luận

Các bạn thấy UX nó quan trọng thế nào với người dùng chưa?

Việc đặt tên nút dường như là 1 việc rất nhỏ trong design, thế nhưng nó lại mang lại 1 hiệu quả vô cùng to lớn.

Nếu tên nút đặt thích hợp, người dùng phán đoán nhanh, sẽ là nhân tố kết nối đến CTA (Call to Action) được cao hơn.

Chúc các bạn thành công.

Xem thêm việc làm UX/UI Design trên TopDev

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

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

Call API trong VueJS theo cách thông minh nhất

cach-call-api-trong-vuejs

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

Call API? Gần đây thấy VueJs có vẻ đang hot nên thử tìm hiểu xem thực sự nó như thế nào.

Mình cũng thử đọc code của 1 vài sample, tutorial thì thấy chỗ call API đa số đều dùng axios ở Component hay là ở bên trong Vuex.

Nếu mà áp dụng những cái đó vào trong dự án thực tế thì sẽ xảy ra những vấn đề sau:

  • Việc viết API trực tiếp trong component sẽ rất khó cho việc viết unit test. (Tìm hiểu thêm về component là gì?)
  • Tính mở rộng của Vuex(actions) (đối với những xử lý không dùng lại thì không nên viết ở trong Store)
  • Việc module hoá phần giao tiếp API với PureJS không làm giảm đi độ phụ thuộc. Vì API được định nghĩa trong component nên muốn thay đổi API hay logic sẽ phải sửa trong nhiều file khác.

  Cách tạo một Docker đơn giản cho Node.JS

Và còn rất nhiều vấn đề nữa…

Sau khi tìm hiểu thì mình thấy có rất nhiều design pattern có thể áp dụng cho việc gọi API. Nhưng có 1 design pattern mà mình thấy tốt nhất đó là Repository Factory. (Xem thêm Design Pattern là gì?)

Quả thực mình rất thích cái pattern này vì nó scale khá là dễ.

Mục đích bài viết

  • Biết cách áp dụng design pattern vào việc call API. Đặc biệt là Repository Factory pattern.
  • Mặc dù bài viết lấy ví dụ là VueJS nhưng mà Angular, ReactJS mình thấy đều có thể áp dụng được.

Tại sao lại dùng nó?

Đầu tiên mình sẽ dùng repository pattern để truy cập vào tài nguyên theo cách độc lập, không có bất kì logic nào ngoài việc trả về dữ liệu.

Cái thứ 2 là sẽ sử dụng factory pattern để khởi tạo logic của môi trường hay repository cần thiết cho từng case. Factory có 1 lợi thế là có thể khởi tạo 1 mock repository hoặc là production repository nếu cần thiết.

Chắc hẳn mọi người đọc example hay tutorial cũng đều thấy axios luôn được sử dụng trong component. Vậy có vấn đề gì xảy ra chỗ này:

  • Điều gì sẽ xảy ra nếu chúng ta muốn tái sử dụng việc call api?
  • Điều gì xảy ra nếu endpoint thay đổi?
  • Điều gì xảy ra nếu muốn tái sử dụng việc call api cho dự án khác?
  • Điều gì xảy ra nếu muốn refactor 1 vài lời gọi hàm hoặc muốn di chuyển nó đến Vuex actions?
  • Mình có nhiều hơn 1 cái resource, thế bây giờ phải định nghĩa tận 4 cái endpoint?
  • Làm thế nào có thể dùng 1 cái mock api cho việc test?

Đương nhiên là thay đổi 1 file sẽ dễ dàng hơn là thay đổi 30 file rồi đúng không?

Phương pháp đúng

Trong case này, để đơn giản hoá code và có thể định nghĩa được 1 vài loại resource khác nhau thì mình sẽ sử dụng POJO (Plain Old JavaScript Objects). Đương nhiên có thể sử dụng Class nếu bạn muốn.

Bây giờ cùng bắt đầu đi định nghĩa asxios nhé.

Mình sẽ đặt tên file là Repository.js vì nó đảm nhiệm việc kết nối đến các resources.

Cũng có 1 vài người thích cái tên Service hay là API, nhưng trong hoàn cảnh này mình thấy cái tên Repository có vẻ hợp lí hơn.

Call API

Tiếp theo chúng ta sẽ đi định nghĩa cho từng Entity của project.

Ví dụ như bạn có 1 blog. Khi đó chúng ta sẽ có 1 Entity là posts. Và bây giờ chúng ta sẽ đi định nghĩa tất cả các thao tác CRUD (Create Update Delete).

Và khi đó postsRepository.js sẽ trở thành như sau:

Call API

Tiếp theo chúng ta sẽ đi tạo Factory.

Call API

Nhìn vào trên ta thấy việc tạo Repository từ Factory trở nên thật simple phải không?

Hơn nữa ở đây ta cũng dễ dàng tạo mock repository (phù hợp với từng môi trường ví dụ develop, staging, production) hay thêm 1 vài logic vào trong hàm get ở trên cũng đều được hết.

Còn đây là cách áp dụng vào trong component:

tuyển dụng it

Nhìn vào chúng ta thấy nó simple phải không nào? Vì phần logic đã được tách ra ở 1 chỗ khác nên việc dùng 1 endpoint khác như GraphSQL cũng hoàn toàn có thể.

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

Kết luận

Hiện tại pattern này mình đang áp dụng vào dự án thấy khá ngon. Nhưng điều đó cũng không có nghĩa là nó phù hợp với dự án của các bạn.

Tuy nhiên, theo mình thấy thì pattern này có 1 số ưu điểm sau:

  • Có thể dễ dàng test 1 đoạn code nào đó 1 cách đơn giản
  • Code của component trông đẹp hơn
  • Có thể dễ dàng mở rộng (Đúng không ta?)
  • Có thể đảm bảo tính DRY (Donot repeat your self)

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

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

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

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

Lập trình Java 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 Java/ Java EE, đồ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 Java 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 Java: Để thành một Java 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ề Spring/ Hibernate/ Struts để 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 Java

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

  • Thành thạo lập trình với ngôn ngữ Java/J2EE
  • Nắm vững lập trình OOP, MVC
  • Có kinh nghiệm lập trình với các framework: Struts, SpingMVC, Hibernate
  • Có kiến thức tốt về HTML/CSS, JQuery, Oracle, SQL Server, MySQL
  • Có kinh nghiệm với các công nghệ Springboot, Mybatis, JUnit, Redis, Docker, Microservices 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

  • Lập trình Java tham gia quá trình triển khai dự án lập trình trên nền tảng Java, đưa hệ thống, sản phẩm đã phát triển vào vận hành thực tế theo kế hoạch
  • Nghiên cứu công nghệ mới để áp dụng cho các dự án 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
  • Thực hiện nâng cấp đều đặn để giúp phần mềm và các hệ thống trở nên bảo mật và hiệu quả hơn.
  • Phối hợp với các technical writers để viết các tài liệu hỗ trợ người dùng
  • 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.

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

Tâm sự về nỗi lo khi là một lập trình viên amateur

nỗi lo khi là một lập trình viên amateur

Mình đã từng suy nghĩ khá nhiều về cái nghề lập trình viên của mình. Và những suy nghĩ này chẳng dễ chịu chút nào.

Từ lúc đảm nhận một công việc lập trình thực sự, mình luôn lo lắng về công việc này. Không một lời cảnh báo hay tư vấn nào từ bạn bè, đồng nghiệp, hay bất cứ ai làm dịu đi nỗi lo của mình. Luôn có một nỗi sợ ngự trị, nỗi sợ bị khiếm khuyết về kỹ năng lập trình, các kỹ năng mềm, networking, kỹ năng học hỏi, hay tất cả những thứ khác, sẽ một ngày hạ gục chính mình.

Nhiều lần mình có cảm giác hoảng loạn, khi chứng kiến thành công từ những người khác. Đôi lúc mình cô lập bản thân để tránh khỏi những cảm xúc tiêu cực đó. Vì rõ ràng nó chẳng hề giúp ích cho sự nghiệp hay cuộc sống này.

  5 điều NÊN và KHÔNG NÊN khi review tăng lương mà lập trình viên nào cũng nên biết!

Cảm nhận sự bất an dưới góc độ khác

Mình thử đủ mọi cách để thoát khỏi cảm giác lo sợ, nhưng có vẻ như chưa đủ. Thế nên thay vì loại bỏ nó, mình tìm cách để nhìn nhận vấn đề dưới một lăng kính khác.

Lo lắng về kiến thức lập trình cơ bản, nên mình tìm kiếm và take note những khái niệm JavaScript cơ bản như curry và coercion.

Lo lắng về kiến thức Ruby on Rails vì nó liên quan nhiều đến công việc hiện tại, mình sưu tầm nhiều tài liệu để có cái nhìn tổng quát hơn.

Lo lắng khi không hiểu những thay đổi code từ đồng nghiệp, nên mình bắt đầu đọc lại những pull request để tìm hiểu vì sao họ lại thay đổi và họ đổi những gì. Bất kỳ những gì không hiểu thì mình sẽ tiếp tục nghiên cứu sâu hơn.

Lo lắng khi nhận feedback về chủ đề hay tool mà mình không nắm rõ, nên sau đó research nhiều hơn khi sửa chúng. Gần đây mình nhận feedback liên quan đến validations in Rails, nên mình research thêm về ActiveRecord và ActiveModel gems.

Lo lắng về những kỹ năng mềm, mình đọc “Burn Your Portfolio” và đọc thêm những cuốn sách được giới thiệu trong đây.

Lo lắng về lộ trình sự nghiệp, mình thử đọc và tìm hiểu những chuyên gia trong ngành, lộ trình của họ đa dạng thế nào, những thăng trầm trong nghề, những khó khăn họ trải qua và đa phần là những lo lắng của họ nữa.

Cách xua tan những bất an – quản trị nỗi sợ bản thân 

Mình có rất nhiều sự lo lắng nhưng trên một góc độ khác, chúng cũng là công cụ giúp mình luôn tiến về phía trước và cố gắng làm tốt hơn. Đôi lúc mình cũng không chế ngự được sự bất an này, đôi lúc mình tự ti với chính bản thân và chỉ muốn dừng lại.

Liệu những cảm giác này có cấp độ không nhỉ? Đủ mạnh để thúc đẩy bản thân cố gắng, hay quá yếu để không gây tác động gì?  Và chúng có đáng để mình tự đấu tranh hay không?

Mình chưa tìm được câu trả lời cho vấn đề này, nhưng trước mắt những nỗi lo này sẽ chưa biến đi. Cho nên mình sẽ tìm cách làm chủ chúng, ít nhất là vậy.

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

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

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ọ?

Câu hỏi “sốt dẻo” của Quora:

“Tại sao nhiều lập trình viên và hacker tài năng không đưa ra những lời khuyên để những người khác đều được như họ?”

Trả lời bởi Vincent Guidry – Software Engineer của Great Big Story (2016 đến nay):

Trùng hợp ghê! Sáng nay mới mở mắt ra đường, đang trên đường đi làm thì một nhân viên đã hỏi tôi làm nghề gì. Tôi nói mình là một kỹ sư phần mềm, và anh ta mừng như bắt được vàng, đúng kiểu “Oimeoi CƠ HỘI!” và bắt đầu dò la hỏi đủ thứ trên đời. Thì ra là ảnh đang học một trường về bảo mật phần mềm nào đó.

Tôi nói anh nên tải nhiều phần mềm vào và bắt đầu nghiên cứu dò xem nó có lỗ hổng không, người ta hay gọi là pentest (có thể hiểu là một phương pháp đánh giá độ an toàn của hệ thống bằng cách tấn công nó). Ngoài ra cũng không ít các khoá học phần mềm hướng dẫn chi tiết cho bạn cách làm nữa. Thiệc tình thì, tôi cũng chẳng biết gì nhiều ngoài những cái căn bản cả, tôi làm kĩ sư phần mềm chứ có phải bảo mật đâu!

Tôi viết cho ảnh cái URL tới Hacker News với kèm theo một vài tên tuổi nổi tiếng của những người làm về bảo mật hoặc có tư duy bảo mật tốt, toàn những người dễ tiếp cận thôi. Hết! Đó là tất cả những gì tôi có thể làm.

Tuy nhiên, có một điều mà mọi người quên mất rằng, để có thể làm những công việc của một chuyên gia thì bạn phải là một chuyên gia cái đã! Khi anh đang chơi thể thao, thì tôi đang học cách lắp ráp máy tính. Rồi học cách build web. Sau đó học cả cách “dạy” Windows làm những việc tôi muốn nữa. Tiếp đến là học Linux. Tôi còn cài cả đống bản distro và bằng mọi cách ép nó hoạt động.

Có một câu chuyện mà tôi hay kể với mọi người là 4 năm trước, tôi có một chuyến đi dài hai tháng tới Colombia. Tôi dành phần lớn thời gian của chuyến đi đó để học cách phát triển web một cách “thực tế”. Tôi rất hạnh phúc khi biết rằng quán trọ mình đang ở có sẵn một chiếc bàn để tôi có thể ngồi làm. Liệu tôi có đi chơi đây đó tán gái không ấy hả? Có chứ – vào những lúc tôi không làm.

Tôi yêu công nghệ và yêu code, chưa kể là tôi cũng hơi bị giỏi nữa.

Những người như anh nhân viên ấy chỉ đến gặp tôi và muốn trở thành “tôi” bởi họ thấy tôi kiếm được quá nhiều tiền mỗi năm và sống trong những nơi xa hoa lộng lấy, tất cả đều nghĩ rằng chỉ cần chịu khó học một vài năm là có thể được như vậy. Họ chỉ nghĩ rằng vấn đề nằm ở chỗ mình chưa có được những công cụ học cần thiết mà thôi.

Nhưng thực tế thì, tôi cũng chỉ có bấy nhiêu tài liệu mà các bạn cũng có thể sở hữu mà thôi. Khác biệt ở chỗ tôi đã quyết định là nếu có được chúng là sẽ phải sử dụng chúng. Còn bạn thì dùng thời gian của mình để làm việc khác mất rồi.

Tôi đã tiêu tốn vô số giờ đồng hồ để tìm bug, nhúng hết não vào các bản hướng dẫn sử dụng, đọc bao nhiêu sách lập trình, build hết thứ này đến thứ khác và rồi lại phải vứt hết khi nhận ra rằng những thứ đó sẽ chẳng thể nào chạy hiệu quả nổi… Dù có lâu hay mau thì tôi cũng đâu thể nhét hết những thứ trên đây vào đầu bạn được.

Cách đây không lâu một người bạn lâu năm đã đến gặp tôi và thú thật là cậu ấy muốn học viết code. Cậu bạn đó cực kỳ thông minh và rất quyết tâm, tôi đã nghĩ rằng mình chỉ cần đưa cho cậu ấy một số định hướng đúng là đủ. Vì thế mà – khúc cao trào đây – bằng chính tiền của mình, tôi đã mua cho cậu ấy khóa học Ruby on Rails của Michael Hartl và bảo với cậu rằng nếu có vấn đề khó khăn gì thì chỉ cần gọi là tôi sẽ đến. Thậm chí tôi còn offer sẽ ngồi làm việc cùng cậu ấy hàng tuần và kiểu “cầm tay chỉ việc” giúp đỡ cậu ấy làm từng thứ một.

Vậy đoán xem, tôi có nhận được cuộc gọi nào không? NOPE – Không nhé. Tôi đã theo sát cậu ấy khi có thể, và đã sớm nhận ra rằng khóa Ruby ấy vượt quá sức của cậu. Khối lượng thông tin quá nặng nề, ngay cả các giáo trình nhẹ hơn cũng sẽ cần khoảng vài năm mày mò, và cậu ấy không có từng ấy thời gian đâu.

Ai cũng muốn đi sao cho nhanh, “đánh nhanh thắng nhanh” cả. Và có lối tắt cho bạn luôn! Không đâu khác là các “trại” code (Code Camp): chỉ cần chi khoảng X000 đô là bạn sẽ được học một khoá được thiết kế RIÊNG dành cho những người như bạn – từ chỗ chẳng có chút kỹ năng nào đến mức level skill “vừa đủ xài” để bạn có thể tìm được một công việc ở mức căn bản nhất trong phát triển phần mềm. From ZERO to HERO đúng nghĩa!

Nhưng NO! Các bạn lại không thích đường tắt này – “Tốn quá” là cách diễn đạt phổ biến nhất. Các bạn lại muốn có lối tắt MIỄN PHÍ cơ. Hỡi ôi xin lui… Tôi ước tôi giúp được, thật đấy, tôi thực sự mong rằng mình có thể phát minh được ra được cách đó để cứu rỗi những linh hồn ấy. Tôi mà phát minh được ma thuật này thì bạn chẳng cần trả tiền cho tôi đâu – Tôi sẽ phát FREE cho bạn luôn… (Lạy chúa trên cao)

Nhưng tạm thời là, tôi không nghĩ mình làm được việc này. Và trong tương lai gần xa hằng hà xa số nào đấy, cũng sẽ chẳng có ai làm được đâu…

TopDev via Quora

  Hot trend AI, không hề "gắt" như bạn nghĩ
  Quy tắc 24x3 cho sáng tạo trong lập trình!

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

MySQL ngoại truyện

Cuối tuần vừa rồi mới vừa clear gần 50% table trong database của Teamcrop, đây là những table của những tính năng không còn sử dụng và đã trải qua thời gian deprecated (chờ xử trảm), thấy có lẽ nên viết một bài về database nhân dịp đầu năm mới cũng như khai blog 2019.

Cũng giống như nhiều đàn anh, đàn chị thời nay, mình đã sớm tiếp xúc với PHP từ 2003 khi xu hướng diễn đàn lớp, diễn đàn trường, diễn đàn vớ vẫn nở rộ. Những đoạn code đầu tiên là những mod diễn đàn viết bằng PHP, cũng như những câu truy vấn database MySQL đầu tiên cũng xuất hiện từ thời điểm này. Bài viết mang tính chất cổ súy MySQL nói riêng (RDBMS nói chung) nên nếu ai không biết nó là gì thì nên tìm hiểu hoặc làm với nó ít ít rồi hẳn đọc tiếp và đối tượng bài viết có thể là DB Administrator hoặc Developer có nhiệm vụ làm việc với MySQL, hầu hết chúng ta – web developer cũng là những người maintain database schema.

Làm việc với MySQL hơn 15 năm (và hiện nay vẫn chỉ tin và dùng MySQL), nên ít nhiều có chút kinh nghiệm khi sử dụng cũng như hình thành những quy trình, đường lối cho cá nhân và team khi tham gia xây dựng dự án. Mỗi khi có Web developer mới tham gia vào công ty thì những kiến thức này lại được truyền đạt, tuy nhiên đó giờ vẫn chưa có một tài liệu cụ thể nên bài blog này cũng là một phần phục vụ việc training này.

Tại sao lại gọi là ngoại truyện?

Hầu hết những gì mình chia sẻ ở đây có thể các bạn sẽ rất ít thấy đề cập ở các sách hay giáo trình về MySQL. Thậm chí có những thứ có thể được coi là đi ngược với những gì bạn biết về MySQL.

Để dễ chia sẻ thông tin, mình sẽ tách thành 3 giai đoạn khi các bạn làm việc với MySQL, đó là trước khi có dữ liệu (data), trong khi có dữ liệu và khi không còn dữ liệu. Ở mỗi giai đoạn sẽ có những kinh nghiệm khác nhau và phù hợp với ngữ cảnh để mọi người tiện theo dõi.

Trước khi có dữ liệu

Theo quan sát và kinh nghiệm, rất nhiều bạn khá hời hợt và xem thường giai đoạn này, tức giai đoạn phân tích và thiết kế database, hay nói 1 cách dân dã là tạo bảng (CREATE TABLE..). Rất nhiều vấn đề phát sinh bởi việc thiết kế bảng hời hợt, thậm chí là thiết kế sai, kéo theo technical debt sẽ ngày càng lớn và thậm chí là phải bỏ cả tính năng / bảng đang sử dụng để refactoring lại thành tính năng mới, tạo table mới và migrate dữ liệu từ bảng cũ sang bảng mới.

Ngoài việc thiết kế bảng đúng, duy trì tính dễ hiểu (understandable), dễ bảo trì (maintainable) và đồng nhất (consistent) cũng là một số yếu tố luôn được cân nhắc khi thiết kế một table. Bên dưới là một số “guideline” mà ai muốn tham gia vào team của Tuấn sẽ được training và bắt buộc phải theo:

Về database:

  • Trong một Database, tất cả tên bảng phải có tiền tố giống nhau (prefix). Ví dụ: crp_, abc_…
  • Để tăng khả năng chuyển đổi DBMS và tương thích với các hệ SQL, không sử dụng các khái niệm “phức tạp” của database như Store procedure, View, Constraint
  • Không sử dụng khái niệm ràng buộc khóa chính, khóa ngoại cài đặt trong DBMS. Chỉ sử dụng khái niệm này trong quá trình trao đổi thông tin giữa các developer và thiết kế bảng.
  • Áp dụng kiến trúc Microservices để chia nhỏ database theo từng domain/context riêng để giúp giảm tải chung cho toàn Database. Ví dụ: Mỗi service sẽ cần 1 kiến trúc / server DB riêng để vận hành riêng biệt.
  • Những phiên bản MySQL khác nhau sẽ có một số config khác nhau kéo theo những lỗi không ngờ tới khi nâng cấp phiên bản.
  • Không sử dụng docker / VM cho MySQL Server.

Về bảng (table):

  • Khi đặt tên bảng, tên cột thì không sử dụng chữ HOA hoặc ký tự đặc biệt. Cho phép a-z, 0-9 và underscore (gạch dưới “_”).
  • Tên bảng luôn là tiếng anh và sử dụng từ số ít. Ví dụ: crp_product, crp_news
  • Nếu tên bảng là tổ hợp nhiều từ, thì mỗi từ cần cách nhau gạch dưới (underscore). Ví dụ: abc_product_category, abc_order_detail
  • Trừ các cột khóa ngoại, các cột dữ liệu riêng của một bảng luôn có tiền tố giống nhau, và tổng hợp từ chữ cái đầu tiên của tên bảng (không bao gồm tiền tố database). Ví dụ: bảng abc_product_category thì các cột của bảng này phải có tiền tố là “pc_”, như “pc_id”, “pc_name”..
  • Tên cột ngoài tiền tố bảng thì là các từ tiếng anh, số ít và không có khoảng cách, các từ phải viết liền nhau. Ví dụ: p_countview, p_datecreated..
  • Khóa chính của một cột trong bảng luôn là tiền tố của bảng + “id”. Ví dụ: “pc_id”, “p_id”, “n_id”..
  • Khóa ngoại của một bảng sẽ được nằm đầu tiên trong danh sách cột của bảng này, trước cả cột khóa chính. Tên cột khóa ngoại phải giữ nguyên tên cột mà nó làm khóa chính trong bảng của nó. Ví dụ: u_id là User ID và là khóa chính trong bảng “abc_user”, thì khi làm khóa ngoại trong bảng “abc_product” thì nó vẫn là cột “u_id”.
  • Collation của database / table / text column là “utf8_general_ci”
  • Table luôn có engine mặc định là MyISAM (tối ưu cho SELECT dữ liệu)
  • Có thể tận dụng engine MEMORY để tối ưu truy vấn vì toàn bộ dữ liệu của table loại MEMORY sẽ nằm trong RAM thay vì ổ cứng.

Về kiểu dữ liệu của cột trong bảng:

  • Kiểu dữ liệu của khóa ngoại và khóa chính phải trùng khớp nhau (data type & data length)
  • Không sử dụng kiểu dữ liệu DATETIME trừ trường hợp lưu ngày sinh.
  • Không sử dụng kiểu dữ liệu ENUM trong trường hợp cần lưu theo logic này, chỉ cần lưu INT (11) hoặc SMALLINT(3) và trong Model của code sẽ khai báo constant.
  • Tất cả cột thời gian đều lưu Timestamp và kiểu dữ liệu INT(10).
  • Các cột dữ liệu thời gian luôn là những cột nằm cuối cùng của bảng. Hầu hết các bảng luôn có cột: datecreated (ngày tạo) và datemodified (ngày cập nhật).
  • Trường IP Address luôn là BIGINT (20), và sử dụng hàm ip2long() và long2ip() của PHP để encode/decode.
  • Giá trị tiền nên là DECIMAL (18), tốt nhất là DECIMAL (18,4)
  • Cẩn thận khi thiết kế dữ liệu cho việc lưu ký tự emoji.
  Tại sao không bao giờ nên sử dụng utf8 trong MySQL?

Việc tuân thủ các guideline này sẽ giúp rất nhiều trong việc debug cũng như đoán được nguồn gốc, xuất xứ của 1 cột khi làm việc, và tạo sự nhất quán trong toàn team để dễ trao đổi, debug. Ví dụ bên dưới là thiết kế cho table user, product.

CREATE TABLE `crp_user` (
  `u_id` int(11) NOT NULL,
  `u_email` varchar(128) NOT NULL,
  `u_password` text NOT NULL,
  `u_ipaddress` bigint(20) NOT NULL,
  `u_status` smallint(3) NOT NULL,
  `u_datecreated` int(10) NOT NULL,
  `u_datemodified` int(10) NOT NULL,
  `u_datelastloggedin` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `crp_product` (
  `u_id` int(11) NOT NULL,
  `p_id` int(11) NOT NULL,
  `p_name` varchar(255) NOT NULL,
  `p_description` text NOT NULL,
  `p_price` decimal(18,4) NOT NULL,
  `p_status` smallint(3) NOT NULL,
  `p_ishot` tinyint(1) NOT NULL,
  `p_datecreated` int(10) NOT NULL,
  `p_datemodified` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Với những tiêu chí trên thì đảm bảo team bạn sẽ dễ dàng làm việc trên các bảng dữ liệu của các dự án.

Trong khi có dữ liệu

Sau quá trình thiết kế bảng hoàn tất và đã được đưa lên hệ thống, tính năng cũng đã được chạy và bạn bắt đầu có dữ liệu, không gì tuyệt hơn là có dữ liệu. Đến giai đoạn này, việc duy trì cho hệ thống đang chạy là ưu tiên hàng đầu, và một số chia sẻ ở giai đoạn này cũng nhằm giúp việc đảm bảo hệ thống DB không bị gián đoạn.

  • Không thay đổi tên cột trong bất kì tình huống nào.
  • Không xóa cột trong bất kì tình huống nào.
  • Chỉ đổi kiểu dữ liệu cột sang cùng loại và sang dung lượng lớn hơn. Ví dụ cho phép đổi từ VARCHAR(50) -> VARCHAR (100), SMALLINT(3) -> INT (11).
  • Cần áp dụng replicate database (Master / Slave) dữ liệu để giảm tải. Để tránh rắc rối không cần thiết, chỉ nên sử dụng 1 Master và có thể cho phép nhiều Slave.
  • Trong bất kì tình huống nào liên quan đến vấn đề đồng bộ giữa Master & Slave và liên quan đến lỗi đồng bộ binlog, tốt nhất là disable replicate, chỉ sử dụng Master, tìm ra nguyên nhân cụ thể để khắc phục và phần lớn vấn đề liên quan đến networking, ổ cứng mạng, tắt bất tử.
  • Lưu ý “Delay Gap” (thời gian bất đồng bộ dữ liệu) giữa Master và Slave(s).
  • Đồng bộ dữ liệu vào thời gian ít truy cập nhất
  • Backup dữ liệu định kì và upload lên một hệ thống / server khác hệ thống đang chạy. Bên mình kết hợp S3cmd để đẩy file backup sql lên Amazon S3 để backup mỗi ngày.
  • Tuyệt đối lưu ý đến max connection mặc định của MySQL là 150 để tránh lỗi MySQL connection.
  • Nếu cài đặt max connection lớn thì lưu ý việc MySQL server sẽ block IP do cơ chế security.
  • Hạn chế đến mức tối đa việc sử dụng JOIN TABLE để tăng khả năng refactoring, migration cũng như giảm thiểu vấn đề về performance / SQL execution. Chỉ JOIN khi đây là hoạt động bất khả kháng và không còn phương án nào tối ưu hơn cho việc truy vấn (tìm kiếm).
  • Không sử dụng JOIN cho các entity không liên quan đến nhau hoặc cùng 1 domain/service. VD: không join user & comment, product & comment..Có thể JOIN order & order detail.
  • Luôn có Cache layer ở tầng Application (Redis, memcached) để hạn chế truy vấn vào Database cũng như hỗ trợ việc hạn chế JOIN.

Khi dữ liệu không cần thiết

Hầu hết dự án nào cũng có những tính năng “không còn sử dụng” và có nhu cầu xóa bỏ luôn dữ liệu thì bạn cũng cần có những quy định cho việc này. Vì sao phải xóa dữ liệu? Theo thời gian, giữ liệu sẽ ngày một phình to, nếu vẫn cố giữ những dữ liệu không còn sử dụng thì sẽ kéo theo thời gian backup / migration / recovery lớn hơn, dẫn đến nhiều rủi ro tiềm ẩn không cần thiết, do đó, tốt nhất là xóa những gì không dùng. Hoặc nếu muốn giữ lại thì cũng nên tách data này sang 1 nơi mà không ảnh hưởng đến performance / rủi ro chung của toàn hệ thống.

Bên dưới là một số bước mà bên mình dùng để xóa dữ liệu, các bạn có thể tham khảo và áp dụng.

  • Bởi vì không có cài đặt ràng buộc tự động (Constraint) nên tầng Application cần có các tính năng (cronjob) tự động để xóa các dòng dữ liệu không cần thiết hoặc update các cột dữ liệu bị lỗi.
  • Đảm bảo các bảng cần xóa không được tham chiếu bởi bất kì tính năng nào. Nếu có tham chiếu thì cần đảm bảo tính năng này hiện đã không còn sử dụng.
  • Kiểm tra ngày cuối cùng mà bảng này có dữ liệu mới, hay modified date của bảng.
  • Không có bảng ngay mà chỉ đổi tên bảng và thêm tiền tố. Ví dụ: thêm OLD_, DEPRECATED_
  • Chờ tối thiểu 1 tháng -> 3 tháng và chỉ xóa các bảng có tiền tố định trước là sẽ xóa.
  • Hạn chế tối đa việc gõ tên bảng, nên copy tên bảng ra trước rồi copy vào CMD.
  • Khi xóa bảng thì không nên dùng MySQL Client / GUI để thao tác mà thông qua MySQL CLI và thực thi SQL mà thôi.
  • Theo dõi hệ thống support / CS tối thiểu 1 ngày để phát sinh những support ticket liên quan đến mất dữ liệu, lỗi tính năng do khách hàng report.

Trên đây là tất cả những quy trình, kinh nghiệm mà team mình áp dụng khi làm việc với MySQL. Hy vọng mọi người cũng có những quy trình để giúp bảo vệ dữ liệu tốt hơn và cải thiện quá trình lưu trữ và làm việc nhóm liên quan đến cấu trúc dữ liệu.

TopDev via Bloghoctap

Đánh giá điểm mạnh và điểm yếu của PHP

diem-manh-va-diem-yeu-cua-php

Bài viết được sự cho phép của tác giả Đoàn Văn Tuyển

Có quá nhiều ý kiến chê PHP. Thế nên dựa trên kinh nghiệm làm việc với PHP nên mình muốn viết lại những đánh giá của mình với ngôn ngữ trên. Những đáng giá bên dưới vừa so sánh với những thứ khác trên quan điểm PHP là Web Programing chứ không so với những mảng khác. Phần bài viết sẽ gồm 4 phần, phần đầu nói qua về cách thiết kế và thực thi của PHP, hai phần sau sẽ đánh giá điểm mạnh và điểm yếu của PHP dựa trên thiết kế đó, phần cuối mình viết khi nào nên sử dụng PHP, khi nào không:

1. Cách thức thực thi của PHP

Như đã nói ở trên, mình chỉ nói về PHP Web (ko tính đến PHP chạy dưới dạng Command Line, thực thế PHP CLI có khác một chút nhưng không quá nhiều).

1.1 Kết nối với Web Server

PHP không được thiết kế để trực tiếp handle request mà thông qua Web Server (Thông thường là Apache hoặc Nginx). Khi client (Web Browser / HTTP Client) gửi request lên Web Server. Web Server sẽ kết nối với PHP và tạo ra một tiến trình độc lập để xử lý request đó. Những tiến trình đó có thể là Process (với apache) hoặc thread (với Nginx / PHP-FPM). Tuy nhiên dù là process hay thread thì có một đặc điểm là những tiến trình đó không chia sẻ tài nguyên với nhau. Nghĩa là hai request của 2 client gửi lên thì tạo 2 tiến trình hoàn toàn tách biệt tài nguyên xử lý. Tài nguyên tách biệt bao gồm: RAM, CPU, kết nối… Sau khi request hoàn thành, kết quả trả về cho Web Server và client thì tiến trình đó kết thúc. Những tài nguyên đã được cấp phát (Bộ nhớ, CPU, kết nối I/O khác…) được giải phóng.

điểm mạnh và điểm yếu của PHP
điểm mạnh và điểm yếu của PHP

1.2 Kết nối với PHP Extension

PHP không thiết kế dưới máy ảo như JAVA, PHP chạy trên nền Zend Engine. Zend Engine đảm nhận việc thông dịch mã PHP thành mã máy và thực thi nó. Toàn bộ việc quản lý tài nguyên của PHP được Zend Engine đảm nhận. Bản thân Zend Engine cung cấp sẵn một số thư viện để PHP có thể chạy trực tiếp mà không cần thư viện ngoài, tuy nhiên phần lớn những thư viện đó là những thư viện xử lý Text. Những thư viện khác của PHP được viết dưới dạng extension, những thư viện này chủ làm việc với PHP thông qua Zend Engine. Đã số những những xử lý I/O của PHP là thông qua thư viện ngoài chứ không phải hỗ trợ từ core: ví dụ kết nối DB, làm việc với HTTP, xử lý ảnh…

điểm mạnh và điểm yếu của PHP
điểm mạnh và điểm yếu của PHP
  10 PHP Instagram Scripts & Widgets tốt nhất

2. Điểm mạnh

Đơn giản, linh động:

Từ thiết kế của PHP, cộng với việc PHP là ngôn ngữ Script và cú pháp khá thoải mái nên nó rất linh động. Cú pháp PHP cũng rất dễ học nên rất nhiều người biết PHP. Với một người chưa biết gì về lập trình chỉ cần một khóa học vài ba tháng có thể bắt đầu với PHP và thậm chí có thể bắt đầu… kiếm tiền được rồi. Chính vì sự dễ dàng đó nên số lượng developer rất đông và hung hãn.

Support bởi cộng đồng lớn:

PHP sở hữu một trong những cộng đồng developer lớn nhất. Số lượng job về PHP cũng luôn thuộc hàng top. Chính vì có cộng đồng rất lớn như vậy nên hầu như vấn đề kỹ thuật nào bạn gặp phải cũng có thể có người hỗ trợ ngay lập tức. Nếu bạn đã từng sử dụng những ngôn ngữ lập trình ít phổ biến thì sẽ thấy tầm quan trọng của cộng đồng lớn đến thế nào.

Hỗ trợ xử lý text rất tốt:

PHP có rất nhiều phần xử lý liên quan đến text cực tốt. PHP được viết dựa trên Perl, một ngôn ngữ lập trình sinh ra để làm việc với Text. PHP cực tốt để giải quyết các bài toán liên quan đến Text, mà HTML hay Web lại là bài toán xử lý text. Do vậy thật dễ hiểu tại sao PHP lại là ngôn ngữ phổ biến nhất để xây dựng các Website.

Có rất nhiều Framework, thư viện:

Cùng với việc sở hữu cộng đồng lớn, PHP cũng sỡ hữu vô số bộ thư viện, extension, rất nhiều Framework. Do vậy PHP có thể giải quyết rất nhiều bài toán khác nhau. Hầu như nói đến vấn đề gì cũng có thể có những thư viện liên quan để PHP. Do vậy đôi khi người ta còn tưởng PHP là lời giải cho mọi vấn đề.

Xem tin tuyển lập trình viên PHP đãi ngộ tốt trên TopDev

3. Điểm yếu

Mặc dù có nhiều điểm mạnh nhưng PHP cũng sở hữu những điểm yếu chết người. Những điểm yếu khiến cho ở một số bài toán PHP rất khó giải quyết thậm chí không thể giải quyết.

Không chia sẻ tài nguyên

Vấn đề đầu tiên mình cũng nghĩ là vấn đề hạn chế lớn nhất của PHP chính là việc không chia sẻ tài nguyên giữa các tiến trình. Việc đóng khung các tiến trình giúp ích rất lớn cho việc PHP không phải đối mặt với những vấn đề như: quản lý bộ nhớ (chả mấy khi PHP Developer quan tâm đến vấn đề này), crash hệ thống (một hai tiến trình chết thì chả ảnh hưởng gì đến hệ thống). Tuy nhiên việc này lại dẫn đến rất nhiều hạn chế khác.
Đầu tiên là việc không chia sẻ tài nguyên khiến cho tài nguyên sử dụng (RAM, CPU, I/O connection) tăng lên rất nhanh.

Bạn tưởng tượng cùng lúc có 100 request được xử lý, tương đương 100 tiến trình được chạy. Nếu một biến cùng được sử dụng thì số lượng RAM sử dụng sẽ là 100 lần (các ngôn ngữ khác vì sử dụng chung RAM nên những phần việc memory cache rất đơn giản), số lượng kết nối DB phải là 100 kết nối cùng lúc (ở phần tiếp theo mình sẽ phân tích tiếp ví dụ về kết nối này) … Điều này hoàn toàn khác xa so với những ngôn ngữ như JAVA, .NET, Node JS…. Do vậy khi sử dụng PHP cho hệ thống lớn thì cực khó để scale hệ thống, ngưỡng của PHP.

Quá linh động

Đây được nêu ra như một điểm mạnh của PHP, nhưng cũng là điểm chết người của nó. PHP quá dễ dễ, quá linh động, điều này khiến cho Developer có vô số cách để đạt được kết quả. Cùng với việc nó quá dễ để học khiến cho chất lượng của PHP developer thấp hơn khá nhiều so với đa số các ngôn ngữ lập trình khác. Chuyên môn kém lại gặp ngôn ngữ quá linh động, kết quả thường thấy là chất lượng code rất tệ, quá nhiều Technical Debt được tạo ra.

Điều này khiến cho việc maintain một dự án PHP trở lên quá kinh khủng (Đấy là còn chưa kể đến tính tương thích ngược của những framework và một vài yếu tố bên ngoài nữa). PHP cũng có quá nhiều thư viện bên ngoài, đôi khi chất lượng cũng rất tệ khiến cho tình trạng càng trở lên tồi tệ hơn.

Phụ thuộc quá nhiều vào extension:

Những xử lý hỗ trợ từ Core của PHP rất hạn chế do vậy PHP phải phụ thuộc nhiều vào các thư viện Extension ngoài. Những Extension ngoài không tương tác trực tiếp mà làm việc với PHP thông qua Zend Engine. Cơ chế này cũng khiến cho mọi thứ trở lên chậm hơn. Do vậy nhiều khi Extension không giúp cải thiện quá nhiều. Mình lấy ví dụ điển hình rất hay xảy ra là kết nối Database. Trong khi các ngôn ngữ lập trình khác thường sử dụng Connection Pool để quản lý kết nối với DB. PHP sử dụng cơ chế khác là persistent Connection để tăng tốc kết nối. Persistent Connection giúp cho việc khi một request được hoàn thành thì kết nối DB tạo ra bởi Request đó không được “đóng” mà lại được tiếp tục sử dụng ở request tiếp theo. Điều này giúp giảm thời gian kết nối với DB.

Tuy nhiên khi Request chưa dừng thì kết nối này không được share với một request khác (cho dù ở thời điểm hiện tại, request đó không thao tác DB đi nữa). Điều này dẫn đến nếu PHP phải xử lý 100 request đồng thời thì cần có 100 kết nối đến Database (nếu tăng lên 1000 thì số đó là 1000). Điều này hoàn toàn khác với cơ chế connection pool của các ngôn ngữ như JAVA. Connection Pool đảm bảo chỉ có tối đa x Connection đến DB được tạo ra (x do Developer set được).

Kể cả có 100 request, hay 1000 request đồng thời đến Web Server ở thời điểm đó thì con số x không đổi (Nếu cùng lúc có nhiều hơn x request cần kết nối thì sẽ có một số request phải chờ, chú ý ở đây hoàn toàn có thể có 1000 request đồng thời nhưng cùng một thời điểm có thể chỉ có 100 thằng kết nối DB, còn 900 thằng khác đang xử lý dữ liệu nào đó khác). Điều này giúp JAVA kiểm soát được số kết nối đến DB, qua đó đảm bảo được performace của DB, còn PHP thì không thể.

  Lập trình PHP và những câu hỏi thường gặp khi phỏng vấn
  Học lập trình web với 13 tài liệu lập trình PHP không thể bỏ qua

Sau khi nhận feedback của nhiều bạn mình xin phép cập nhật lại bỏ phần đánh giá liên quan đến Non-Blocking I/O đi. Thực tế PHP có nhiều phương án support phần này rồi. Phần Performace của ngôn ngữ thì thực ra cũng không phải là vấn đề quá lớn, chủ yếu liên quan đến những bài toán xử lý dữ liệu lớn hoặc hình ảnh, video.

Không hỗ trợ Non-blocking I/O, Performace kém:

Một trong những điểm yếu khác của PHP là không hỗ trợ Non-blocking I/O. Điều này có nghĩa là nếu một tiến trình cần gọi vào I/O thì tiến trình đó sẽ “chờ” cho đến khi việc xử lý I/O được thực hiện xong. Trong suốt quá trình chờ đó thì toàn bộ tài nguyên của tiến trình đó vẫn bị chiếm giữ (đặc biệt là CPU). Một tiến trình của PHP tốn ít tài nguyên hơn khá nhiều so với những ngôn ngữ khác (ví dụ JAVA Web). Nhưng 1000 tiến trình cùng chạy thì lại tốn hơn rất rất nhiều so với những thằng khác. Một điểm nữa có thể nhắc đến là các hàm xử lý trong core của PHP cũng chạy chậm hơn khá nhiều khi so sánh với những ngôn ngữ lập trình khác. Nếu so với JAVA, nếu vòng lặp lớn có thể thấy PHP kém hơn cả trăm lần, so với C++ thì thậm chí còn kém cả ngàn lần.

4. Vậy thì khi nào nên sử dụng PHP, khi nào không:

PHP phù hợp với những dự án:

  • Không quá phức tạp về mặt xử lý tính toán
  • Số lượng truy cập ít hoặc trung bình, hoặc số lượng truy cập lớn nhưng logic không quá phức tạp.
  • Đặc biệt phù hợp với các bài toán liên quan nhiều đến giao diện Web
  • Chất lượng Developer ở mức trung bình khá trở lên (Chất lượng dev kém qua thì khó làm việc)

PHP không phù hợp để phát triển các dự án:

  • Yêu cầu realtime, cực kỳ nhiều kết nối với thời gian xử lý cực nhanh
  • Sử lý số lượng rất lớn request với logic rất phức tạp
  • Cần xử lý Data lớn, các bài toán Big Data.

Túm lại PHP tuy không thiết kế để giải quyết các bài toán cực kỳ phức tạp nhưng thực tế nó vẫn dùng tốt để handle lượng lớn request và vẫn là một ngôn ngữ lập trình mạnh. Ngoài PHP rất tốt cho những bài toán Web-base nói chung, nhất là những bài toán liên quan đến quản lý hoặc bán hàng.

P/S: Nếu tối ưu tốt PHP vẫn có thể Handle được lượng request rất lớn, lên đến khoảng vài chục ngàn req/ phút. Xem thêm slide của mình ở đây.

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

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

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

5 điều NÊN và KHÔNG NÊN khi review tăng lương mà lập trình viên nào cũng nên biết!

kinh nghiệm review lương cho dev

Kinh nghiệm review lương cho Dev là chủ đề chính của bài viết dưới đây. Tăng lương là vấn đề nhạy cảm và không dễ để mở lời với sếp. Để gia tăng cơ hội review lương thành công lập trình viên nên lưu ý một số điểm sau:

Những điều lập trình viên nên làm để được tăng lương

1.Chọn đúng thời điểm

Bạn cần xác định thời gian và địa điểm lý tưởng cho việc này, một nơi chỉ có bạn và sếp. Không đề cập đến vấn đề này trong một buổi tiệc đông đúc càng không nên nói đến việc tăng lương trước mặt những đồng nghiệp khác.

Hãy lựa chọn thời điểm sếp của bạn đang có tâm trạng tốt, thỏa mái và có thời gian rảnh để lắng nghe đề xuất của bạn, đây là kinh nghiệm review lương cho dev đầu tiên và rất thiết thực.

Bạn có thể tận dụng thời điểm vào những buổi review nhân viên được tổ chức định kỳ. Lưu ý đừng bắt đầu buổi review ngay với chủ đề lương bổng, hãy để sếp của bạn chia sẻ hết những gì ông ấy đã chuẩn bị, lắng nghe tất cả và kết thúc buổi review với đề xuất về lương sẽ hiệu quả hơn.

2. Yêu cầu sếp đánh giá về hiệu quả công việc hiện tại

kinh nghiệm review lương cho dev

Hãy tìm kiếm cơ hội để xin đánh giá của sếp về hiệu quả công việc hiện tại mà bạn đang đảm nhận. Lưu ý đừng tùy ý đánh giá năng lực của bản thân một cách chủ quan vì có thể nó sẽ gây ra tác dụng ngược. Nhiều khả năng bạn sẽ nghe những đóng góp tích cực và cả tiêu cực.

Nếu có nhiều phản hồi tích cực thì chúc mừng khả năng review lương của bạn thành công được hơn một nữa, còn nếu ngược lại những review không mấy tốt thì xin chia buồn cùng bạn 🙁

  Làm kỹ sư AI, mức lương 500 triệu là bình thường
  3 workhack để duy trì năng lượng tích cực tại công sở cho kĩ sư phần mềm

Nhưng đừng vội nản chí, hãy chân thành cảm ơn những đóng góp của sếp và xin lỗi về những thiếu sót của mình, quan trọng hơn là hãy cho sếp của bạn thấy bạn thực sự quyết tâm khắc phục những thiếu sót. Sau đó hãy mở lời: Như anh/chị đã nói hài lòng với công việc hiện tại của em/tôi vì.. em/tôi rất vui vì điều đó, và em/tôi thực sự thích công việc hiện tại của mình, chỉ có một điều em/tôi chưa hài lòng về mức lương hiện tại của mình..”

3. Đề cập đến những thành quả mà bạn đã đạt được trong công việc

Suy cho cùng việc quan trọng nhất mà sếp của bạn quan tâm chính là lợi ích mà bạn mang lại, được thể qua doanh số, thành công của dự án, hiệu quả làm việc. Vậy thì không lý gì bạn không tận dụng những thành quả mà mình đã đóng góp để thuyết phục sếp, rằng bạn hoàn toàn xứng đáng với mức lương tốt hơn.

4. Đề cập đến những đóng góp của bạn vào công việc chung của team

Đừng quên nhắc đến việc bạn đã nỗ lực như thế nào để giúp team mình đạt được những thành công: giúp đỡ đồng nghiệp mới, chuẩn bị tài liệu cho buổi báo cáo, đóng góp ý tưởng mới cho team, đại diện team tham gia các sự kiện, tham gia các khóa học kỹ năng,.. Những đóng góp này tuy không tạo ra những giá trị hữu hình, nhưng nó cho sếp bạn thấy rằng bạn thực sự nghiêm túc và nỗ lực đóng góp cho sự phát triển của công ty.

5. Nhắc lại những công việc mà bạn đang đảm nhận

Cần nhắc lại những đầu việc mà bạn đang phụ trách ví dụ: chịu trách nhiệm về một phần mềm, các chức năng, các dự án con, tổ chức các buổi họp, chịu trách nhiệm training người mới, … bất cứ thứ gì mà bạn đang làm (chỉ ngoại trừ những công việc bạn làm không tốt)

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

Những điều lập trình viên không nên làm để được tăng lương

1. Không so sánh mình với những đồng nghiệp khác

Đừng bao giờ bắt đầu với “Tôi đang làm việc chăm chỉ hơn XY”, đó chưa bao giờ là một lý do chính đáng để sếp cân nhắc tăng lương cho bạn. Bạn không biết liệu rằng mình có đang chỉ trích một nhân viên yêu thích của sếp hay không đâu, và rõ ràng ông ấy sẽ rất không vui khi bạn chỉ trích người mà ông ấy yêu thích. Giả dụ trong trường hợp sếp bạn không hài lòng với nhân viên đó thực thì ông cũng chỉ nghĩ đơn giản: công việc của bạn không quá khó để bạn có được hiệu quả tốt hơn những người khác.

2. Không so sánh công ty mình với những công ty khác, đặc biệt là công ty đối thủ

Việc so sánh mức lương của bạn ở công ty hiện tại với vị trí tương đương ở những công ty khác chưa bao giờ là một ý tưởng hay, ngay cả nó thực sự là cao hơn thật. Điều đó chỉ khiến sếp bạn nghĩ bạn không đủ trung thành và không còn tin tưởng bạn nữa. Bạn chỉ nên đề cập đến điều này chỉ khi bạn chuẩn bị nghỉ việc.

  Chuyện Elon Musk sa thải trợ lý gắn bó với anh 12 năm vì đòi tăng lương và bài học dành cho tất cả chúng ta
  Làm sao tăng lương cho ngọt?

3. Không dùng các lý do cá nhân làm cái cớ cho việc tăng lương

Không lấy những vấn đề cá nhân: gia đình đông con, mẹ già, con bệnh,… là cơ sở cho việc tăng lương- nó không hề thuyết phục. Điều đó chỉ là bạn trở nên yếu đuối hơn. Công ty không phải là tổ chức từ thiện, và họ chỉ trả tiền cho những đóng góp của bạn chứ không phải là dựa trên tình yêu thương.

kinh nghiệm review lương cho dev

4. Không đề cập đến điểm yếu của bạn

Sẽ tốt nếu bạn biết điểm yếu của mình là gì, nhưng thời điểm review lượng không phải là lúc để đề cập đến những vấn đề này. Trong trường hợp này chúng ta nên chứng minh mình là một nhân viên tốt, ngay cả khi đó chưa hẳn là sự thật.

5. Đừng nôn nóng

Có thể ngay tại thời điểm bạn đề cập đến vấn đề tăng lương sếp của bạn hứa sẽ cân nhắc về việc này. Hãy thực sự kiên nhẫn chờ đợi, đừng hỏi về chuyện đó mỗi ngày, hãy cho sếp của bạn thời gian để suy nghĩ.

Nếu bạn có ý tưởng mới về kinh nghiệm review lương cho dev hãy chia sẻ nó với chúng tôi!

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

Xem thêm việc làm IT mức lương lương hấp dẫn nhất thị trường

Những lập trình viên phiên bản X-men: Những code project “dị” nhất trên GitHub

nhung-lap-trinh-vien-phien-ban-x-men-nhung-code-project-di-nhat-tren-github

Trong số 35 triệu project nguồn mở trên GitHub, có rất nhiều gói phần mềm phức tạp dành cho doanh nghiệp trên toàn cầu. Số khác thì nhẹ hơn, là các thư viện code phục vụ cho 1 mục đích mà các dev không thể sống thiếu. Và những cái còn lại, chỉ để cho vui thôi.

Code joke với người ngoài sẽ nghe sẽ hơi kiểu “chỉ dân lập trình mới hiểu”, “những câu đùa của nerd”. Nó sẽ cần một đoạn chú thích nhỏ, nhưng đừng lo – đó là lý do chúng ta ở đây. Dưới đây là top những project “độc nhất vô nhị” trên GitHub.

  Git - Học nghiêm túc một lần (Phần 1)
  Cấu hình SSH Key cho Github

TrumpScript: “Ngôn ngữ minh hoạ về Trump”

68747470733a2f2f7261772e6769746875622e636f6d2f73616d7368616477656c6c2f5472756d705363726970742f6d61737465722f5472756d705363726970742e6a7067    Logo của TrumpScript 

TrumpScript là một ngôn ngữ lập trình ảo tạo ra bởi 4 sinh viên Đại học một cuộc thi Hackathon trong 36 tiếng. Họ làm ra nó vì nhận thấy “không có ngôn ngữ lập trình nào ở hiện tại có quá nhiều tiêu chuẩn và có thể đáp ứng được những đòi hỏi của Trump như những gì ông ta mong đợi ở đất nước mình.”

Tạo nên nhờ 1,000 dòng code, TrumpScript dường như hoạt động được ổn định như một ngôn ngữ lập trình thông thường. Nó có một số feature như sau:

  • TrumpScript chỉ cho phép lập trình viên làm việc với những số lớn hơn 1 triệu, bởi vì “the small stuff is inconsequential”. (những thứ nhỏ nhặt là không xứng đáng) Những số dưới 1 triệu sẽ xuất ra một tin báo lỗi dựa trên câu nói của Donald Trump: “I’m really rich, Part of the beauty of me is I’m very rich.” (Tôi khá giàu, và một trong những nét đẹp trong tôi đó là sự giàu có)
  • TrumpScript không cho phép dùng phân số hoặc số thập phân – chỉ được dùng nguyên số, bởi “America never does anything halfway”. (Người Mỹ không bao giờ làm gì nửa vời cả)
  • Nếu user muốn chạy TrumpScript trên máy tính Microsoft, nó sẽ xuất tin báo lỗi: “Windows? ‘The big problem this country has is being PC.’”
  • “Tất cả mọi chương trình đều phải kết thúc là ‘America is great’.”

Nghe mô rả thật sự thú vị, nhưng TrumpScript sẽ khá khó sử dụng vì sẽ bị báo lỗi thường xuyên, do “code không đúng tiêu chuẩn của Trump”. Như lời của những người tạo ra nó nó bởi vì “Trump không thích nói nhiều về những sự thất bại của mình.”

Tham khảo việc làm lập trình viên Git lương cao trên TopDev

is-thirteen: Phần mềm check xem một số có bằng 13 hay không

Trong các ngôn ngữ lập trình thông thường, câu lệnh check một số có bằng 13 hay không sẽ trông như thế này:

if (someNumber == 13)
  // true
else
  //false

Logo của is-thirteen 

Trông thật đơn giản phải không? Nhưng phần mềm này thì không. is-thirteen là một project gồm hàng trăm dòng code, 92 contributor, và một chính sách viết code dài ngoằn, tất cả phục vụ cho một phần mềm check giá trị của một số có bằng 13 hay không.

Project có vẻ làm ra cho vui như một phần mềm cung cấp một tính năng “vô duyên” không cần thiết. Trước đây cũng có một project check xem số có lớn hơn 0 không… Các phần mềm nhỏ, một tính năng như vậy đã gây tranh cãi nhiều từ hồi tháng Ba khi một cái bị xoá – một bước đi làm chao đảo thế giới lập trình toàn cầu.

Phần highlight của project is-thirteen là phần của GitHub repository nơi mọi người có thể đăng câu hỏi, comment, và các request thêm các feature. Dưới đây là một số ví dụ:

Nếu bạn cần một phần mềm như is-thirteen, hãy đảm bảo rằng bạn đã đọc phần README trên đầu trang: “LÀM ƠN ĐỌC KĨ SOURCE CODE vì chúng tôi đi rất nhanh và hơi phá hoại.”

ComcastifyJS (bởi The Onion)

Ảnh một bé koala chỉ load một nửa (ClickHole)

Có bao giờ bạn tự hỏi, tại sao có những trang web load ảnh… quá nhanh không? Ồ không sao, bởi vì đã có project của chúng tôi!

Hoá ra, thương hiệu độc quyền hài hước này của The Onion không chỉ là một chuyện nhảm trong số nhiều project tuyệt vời và “real” khác của mình. ComcastifyJS, là một thư viện JavaScript “giúp” làm cho ảnh trên web page load chậm hơn so với thông thường.

File README của project có ghi “Với tình trạng hiện tại của Internet, đôi khi bạn chỉ muốn trải nghiệm thử một trang web load chậm. Nó trao cho người dùng cơ hội trải nghiệm cảm giác tĩnh lặng và mong chờ thông qua thao tác load ảnh chậm với ComcastifyJS!”

Các developer còn tạo cả một page demo, ví dụ cho việc load ảnh “cực chậm”. Còn có người comment đã đề xuất add thêm “hệ thống đòi phí mà thành viên premium có thể giảm tốc độ tải ảnh HƠN so với người dùng free!!!” Người khác thì gợi ý biến nó trở thành một tiện ích Chrome.

Có vẻ như, thư viện này được viết dựa trên story trên ClickHole tên là “Các bé Koala này không muốn load thêm để ủng hộ Net Neutrality.” Các dev khác từ The Onion cũng đã upload lên GitHub fartscroll.js, một plugin có tiếng xì hơi khi bạn kéo web page, và Betty Cropper, một tool cắt ảnh tên lạ.

Bản thay thế lorem ipsum

Khi tạo các webpage, designer và developer thường dùng placeholder text gọi là “lorem ipsum” để preview text trông như thế nào ở một vùng nhất định trên page. Nó thay cho đoạn text “text here text here text here” phiên bản tiếng Latin. Có rất nhiều web cho dev có thể tạo và copy một số lorem ipsum. Nó trông như thế này:

ipsum dolor sit amet, consectetur adipiscing elit. Quisque consequat eleifend justo vitae facilisis. Praesent ut felis in velit feugiat accumsan.

Với nhiều dev thì một vài text đơn giản tiếng Latin là chưa đủ. Trong awesome-ipsum repository trên GitHub, có một list hàng tá các thay thế cho placeholder text. Dưới đây là một số cái tôi thích, kèm cả ví dụ của text mà họ đã tạo:

Pasta Ipsum: “Feature nhiều loại pasta, bao gồm option được add các từ ngẫu nhiên.”

Pasta ipsum dolor sit amet farfalloni marziani mafalde shit ricciutelle pappardelle rat fart lasagne spaghettini orzo. Lasagne lasagnette conchiglie frakking sumbitch cellentani fagioloni maltagliati conchiglie farfalloni. Creste di galli strozzapreti penne zita asshole mafaldine pastina asshole foglie d’ulivo.

Hipster Ipsum: “Điền text thủ công cho site hoặc project.”

Brooklyn photo booth blue bottle tumblr, franzen 8-bit crucifix meh godard four dollar toast neutra cray asymmetrical. Pug DIY brunch trust fund XOXO, lo-fi sartorial kickstarter heirloom kitsch plaid bespoke pork belly tacos viral.

Corporate Ipsum: “Được design để đáp ứng nhu cầu.”

Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition.

Justin Bieber Ipsum: “Baby, baby, baby, bao nhiêu paragraph tất cả?”

It’s a Bieber world live it or die I make good grilled cheese and I like girls don’t be so cold, we could be fire. And all the haters I swear they look so small from up here swag swag swag, on you, chillin by the fire.

Các library Mock JavaScript

Trong thế giới lập trình, các dev luôn cố gắng làm cho mọi thứ dễ dàng hơn. Thông thường họ sẽ viết library, là các extension của ngôn ngữ lập trình để xử lý các task đơn giản, phổ biến. Các library cho phép lập trình viên dễ thực hiện task mà không cần phải viết code. Khi các thư viện xuất hiện ở khắp nơi, như nhiều cái trong JavaScript, nó giúp người mới dùng ngôn ngữ, nhưng có thể họ sẽ không biết mình đang làm gì. Do đó, họ thường phải dùng thư viện vận hành mà JavaScript tự xử lý được.

Từ đó, một số dev tạo ra các thư viện mock dùng để mua vui lẫn cho những phản hồi có tính xây dựng trên các thư viện thực:

  • vapor.js là một thư viện JavaScript không chứa dòng code nào. Trên project page, nó được gán cho là “Thư viện JavaScript nhanh nhất và nhỏ nhất trên thế giới.”
  • semicolon.js là một vapor.js phiên bản đáng tin hơn và an toàn hơn, và nó chứa các dấu chấm phẩy.
  • Tương tư vậy, vanilla.js là một JavaScript compiler gộp JavaScript vào JavaScript. Thế thôi, không làm gì khác. Nhưng GitHub page của nó cũng đủ thuyết phục để làm cho người ta tin vào nó.

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

Đừng bỏ lỡ những bài viết hay liên quan:

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

SOLID là gì? Áp dụng SOLID để trở thành lập trình viên giỏi

SOLID là gì? Áp dụng SOLID để trở thành lập trình viên giỏi

Phần mềm được xem là tốt khi khi nó có kiến trúc tốt. Kiến trúc phần mềm tương tự như móng nhà, móng yếu nhà sẽ không vững. Để viết được phần mềm tốt bạn phải học rất nhiều, điều đầu tiên bạn cần biết là SOLID.

SOLID ra đời như thế nào?

Lập trình hướng đối tượng (object oriented programming – OOP) là một trong những mô hình lập trình được sử dụng nhiều nhất. Các tính chất đặc biệt khiến việc hướng đối tượng trở nên hiệu quả đó là:

  • Tính trừu tượng (abstraction): Tạo ra các lớp trừu tượng mô hình hoá các đối tượng trong thế giới thực.
  • Tính đóng gói (Encapsulation): Các thực thể của lớp trừu tượng có các giá trị thuộc tính riêng biệt.
  • Tính kế thừa (Inheritance): Các đối tượng có thể dễ dàng kế thừa và mở rộng lẫn nhau.
  • Tính đa hình (Polymorphism): Có thể thực hiện một hành động đơn theo nhiều cách thức khác nhau tuỳ theo loại đối tượng cụ thể đang được gọi.

Các tính chất đặc biệt này của OOP giúp chúng ta xây dựng được các chương trình giải quyết được nhiều vấn đề cụ thể khác nhau trong thế giới thực. Hầu hết lập trình viên đều đã biết các tính chất này của OOP, nhưng cách thức để phối hợp các tính chất này với nhau để tăng hiệu quả của ứng dụng thì không phải ai cũng nắm được. Một trong những chỉ dẫn để giúp chúng ta sử dụng được OOP hiệu quả hơn đó là nguyên tắc SOLID.

SOLID là gì?

SOLID là viết tắt của 5 chữ cái đầu trong 5 nguyên tắc thiết kế hướng đối tượng. Giúp cho lập trình viên viết ra những đoạn code dễ đọc, dễ hiểu, dễ maintain. Nó được đưa ra bởi Robert C. Martin và Michael Feathers. 5 nguyên tắc đó bao gồm:

  • Single responsibility priciple (SRP)
  • Open/Closed principle (OCP)
  • Liskov substitution principe (LSP)
  • Interface segregation principle (ISP)
  • Dependency inversion principle (DIP)

Single responsibility priciple

Nội dung:

Mỗi lớp chỉ nên chịu trách nhiệm về một nhiệm vụ cụ thể nào đó mà thôi.

Nguyên lý đầu tiên ứng với chữ S trong SOLID, có ý nghĩa là một class chỉ nên giữ một trách nhiệm duy nhất. Một class có quá nhiều chức năng sẽ trở nên cồng kềnh và trở nên khó đọc, khó maintain. Mà đối với ngành IT việc requirement thay đổi, cần thêm sửa chức năng là rất bình thường, nên việc code trong sáng, dễ đọc dễ hiểu là rất cần thiết.

Ví dụ: Hình dung rằng nhân viên của một công ty phần mềm cần phải làm 1 trong 3 việc sau đây: lập trình phần mềm (developer), kiểm tra phần mềm (tester), bán phần mềm (salesman). Mỗi nhân viên sẽ có một chức vụ và dựa vào chức vụ sẽ làm công việc tương ứng. Khi đó bạn có nên thiết kế lớp “Employee” với thuộc tính “position” và 3 phương thức developSoftware(), testSoftware()saleSoftware() không?

class Employee
{
    string position;
 
    function developSoftware(){};
    function testSoftware(){};
    function saleSoftware(){};
}

Câu trả lời là KHÔNG. Thử hình dung nếu có thêm một chức vụ nữa là quản lí nhân sự, ta sẽ phải sửa lại lớp “Employee”, thêm phương thức mới vào sao? Nếu có thêm 10 chức vụ nữa thì sao? Khi đó các đối tượng được tạo ra sẽ dư thừa rất nhiều phương thức: Developer thì đâu cần dùng hàm testSoftware()saleSoftware() đúng không nào, lỡ may dùng lầm phương thức cũng sẽ gây hậu quả khôn lường.

Áp dụng nguyên tắc Single Responsibility: mỗi lớp 1 trách nhiệm. Ta sẽ tạo 1 lớp trừu tượng là “Employee” có phương thức là working(), từ đây bạn kế thừa ra 3 lớp cụ thể là Developer, Tester và Salesman. Ở mỗi lớp này bạn sẽ implement phương thức working() cụ thể tuy theo nhiệm vụ của từng người. Khi đó chúng ta sẽ bị tình trạng dùng nhầm phương thức nữa.

Open/Closed principle

Nội dung:

Không được sửa đổi một Class có sẵn, nhưng có thể mở rộng bằng kế thừa.

Nguyên lý thứ 2 ứng với chữ O trong SOLID.

Theo nguyên lý này, mỗi khi ta muốn thêm chức năng cho chương trình, chúng ta nên viết class mới mở rộng class cũ (bằng cách kế thừa hoặc sở hữu class cũ) chứ không nên sửa đổi class cũ. Việc này dẫn đến tình trạng phát sinh nhiều class, nhưng chúng ta sẽ không cần phải test lại các class cũ nữa, mà chỉ tập trung vào test các class mới, nơi chứa các chức năng mới.

Thông thường việc mở rộng thêm chức năng thì phải viết thêm code, vậy để thiết kế ra một module có thể dễ dàng mở rộng nhưng lại hạn chế sửa đổi code ta cần làm gì. Cách giải quyết là tách những phần dễ thay đổi ra khỏi phần khó thay đổi mà vẫn đảm bảo không ảnh hưởng đến phần còn lại.

Ví dụ:

  • Đặt vấn đề: Ta cần 1 lớp đảm nhận việc kết nối đến CSDL. Thiết kế ban đầu chỉ có SQL Server và MySQL. Thiết kế ban đầu có dạng như sau:
class ConnectionManager
{
    public function doConnection(Object $connection)
    {
        if($connection instanceof SqlServer) {
            //connect with SqlServer
        } elseif($connection instanceof MySql) {
            //connect with MySql
        }
    }
}

Sau đó yêu cầu đặt ra phải kết nối thêm đến Oracle và một vài hệ CSDL khác.
Để thêm chức năng ta phải thêm vào code những khối esleif khác, việc này làm code cồng kềnh và khó quản lý hơn.

  • Giải pháp:
    • Áp dụng Abstract thiết kế lại các lớp SqlServer, MySql, Oracle…
    • Các lớp này đều có chung nhiệm vụ tạo kết nối đến csdl tương ứng có thể gọi chung là Connection.
    • Cách thức kết nối đến csdl thay đổi tùy thuộc vào từng loại kết nối nhưng có thể gọi chung là doConect.
    • Vậy ta có lớp cơ sở Connection có phương thức doConnect, các lớp cụ thể là SqlServer, MySql, Oracle… kế thừa từ Connection và overwrite lại phương thức doConnect phù hợp với lớp đó.

Thiết kế sau khi làm lại có dạng như sau:

abstract class Connection()
{
        public abstract function doConnect();
}

class SqlServer extends Connection
{
    public function doConnect()
    {
        //connect with SqlServer
    }
}

class MySql extends Connection
{
    public function doConnect()
    {
        //connect with MySql
    }
}

class ConnectionManager
{
    public function doConnection(Connection $connection)
    {
        //something
        //.................
        //connection
        $connection->doConnect();
    }
}

 

Với thiết kế này khi cần kết nối đến 1 loại csdl mới chỉ cần thêm 1 lớp mới kế thừa Connection mà không cần sửa đổi code của lớp ConnectionManager, điều này thỏa mãn 2 điều kiện của nguyên lý OCP.

Liskov substitution principle

Nội dung:

Các đối tượng (instance) kiểu class con có thể thay thế các đối tượng kiểu class cha mà không gây ra lỗi.

Nguyên tắc thứ 3, ứng với chữ L trong SOLID.

SOLID là gì? Áp dụng SOLID để trở thành lập trình viên giỏi
Minh hoạ một trường hợp vi phạm nguyên tắc Liskov substitution. Nếu thiết kế lớp như thế này, thì lớp CleanerStaff sẽ dùng được hàm checkAttendance(), mà điều này là không đúng, nên đây sẽ là một kiểu thiết kế sai nguyên tắc.

Quay trở lại ví dụ lớp Emloyee trong phần 1, ta giả sử có công ty sẽ điểm danh vào mỗi buổi sáng, và chỉ có các nhân viên thuộc biên chế chính thức mới được phép điểm danh. Ta bổ sung phương thức checkAttendance() vào lớp Employee.

Hình dung có một trường hợp sau: công ty thuê một nhân viên lao công để làm vệ sinh văn phòng, mặc dù là một người làm việc cho công ty nhưng do không được cấp số ID nên không được xem là một nhân viên bình thường, mà chỉ là một nhân viên thời vụ, do đó sẽ không được điểm danh.

Nguyên tắc này nói rằng: Nếu chúng ta tạo ra một lớp CleanerStaff kế thừa từ lớp Employee, và implement hàm working() cho lớp này, thì mọi thứ đều ổn, tuy nhiên lớp mới này cũng lại có hàm checkAttendance() để điểm danh, mà như thế là sai quy định dẫn đến chương trình bị lỗi. Như vậy, thiết kế lớp CleanerStaff kế thừa từ lớp Employee là không được phép.

Có nhiều cách để giải quyết tình huống này ví dụ như tách hàm checkAttendance() ra một interface riêng và chỉ cho các lớp Developer, Tester và Salesman implements interface này.

Interface segregation principle

Nội dung:

Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể.

Nguyên lý này rất dễ hiểu. Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100 methods. Việc implements sẽ rất vất vả vì các class impliment interface này sẽ bắt buộc phải phải thực thi toàn bộ các method của interface. Ngoài ra còn có thể dư thừa vì 1 class không cần dùng hết 100 method. Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc implement và quản lý sẽ dễ hơn.

Ví dụ:

Chúng ta có một interface Animal như sau:

interface Animal {

    void eat();

    void run();

    void fly();

}

 

Chúng ta có 2 class Dog và Snake implement interface Animal. Nhưng thật vô lý, Dog thì làm sao có thể fly(), cũng như Snake không thể nào run() được? Thay vào đó, chúng ta nên tách thành 3 interface như thế này:

interface Animal {

    void eat();

}

interface RunnableAnimal extends Animal {

    void run();

}

interface FlyableAnimal extends Animal {

    void fly();

}

 

Dependency inversion principle

Nội dung:

1.Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction.
2.Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại (Các class giao tiếp với nhau thông qua interface (abstraction), không phải thông qua implementation.)

Có thể hiểu nguyên lí này như sau: những thành phần trong 1 chương trình chỉ nên phụ thuộc vào những cái trừu tượng (abstraction). Những thành phần trừu tượng không nên phụ thuộc vào các thành phần mang tính cụ thể mà nên ngược lại.

Những cái trừu tượng (abstraction) là những cái ít thay đổi và biến động, nó tập hợp những đặc tính chung nhất của những cái cụ thể. Những cái cụ thể dù khác nhau thế nào đi nữa đều tuân theo các quy tắc chung mà cái trừu tượng đã định ra. Việc phụ thuộc vào cái trừu tượng sẽ giúp chương trình linh động và thích ứng tốt với các sự thay đổi diễn ra liên tục.

Ví dụ:

Lấy ví dụ về ổ cứng của máy tính, bạn có thể dùng loại ổ cứng thể rắn SSD đời mới để chạy cho nhanh, tuy nhiên cũng có thể dùng ổ đĩa quay HDD thông thường. Nhà sản xuất Mainboard không thể nào biết bạn sẽ dùng ổ SSD hay loại HDD đĩa quay thông thường. Tuy nhiên họ sẽ luôn đảm bảo rằng bạn có thể dùng bất cứ thứ gì bạn muốn, miễn là ổ đĩa cứng đó phải có chuẩn giao tiếp SATA để có thể gắn được vào bo mạch chủ. Ở đây chuẩn giao tiếp SATA chính là interface, còn SSD hay HDD đĩa quay là implementation cụ thể.

Trong khi lập trình cũng vậy, khi áp dụng nguyên lý này, ở những lớp trừu tượng cấp cao, ta thường sử dụng interface nhiều hơn thay vì một kiểu kế thừa cụ thể. Ví dụ, để kết nối tới Database, ta thường thiết kế lớp trừu tượng DataAccess có các phương thức phương thức chung như save(), get(), … Sau đó tùy vào việc sử dụng loại DBMS nào (vd: MySql, MongoDB, …) mà ta kế thừa và implement những phương thức này. Tính chất đa hình của OOP được vận dụng rất nhiều trong nguyên lý này.

Tổng kết

SOLID là 5 nguyên tắc cơ bản trong việc thiết kế phần mềm. Nó giúp chúng ta tổ chức sắp xếp các function, method, class một cách chính xác hơn. Làm sao để kết nối các thành phần, module với nhau.

Rõ ràng, dễ hiểu

Teamwork là điều không thể tránh trong lập trình. Áp dụng SOLID vào công việc bạn sẽ tạo ra các hàm tốt, dễ hiểu hơn. Giúp cho bạn và đồng nghiệp đọc hiểu code của nhau tốt hơn.

Dễ thay đổi

SOLID giúp tạo ra các module, class rõ ràng, mạch lạc, mang tính độc lập cao. Do vậy khi có sự yêu cầu thay đổi, mở rộng từ khách hàng, ta cũng không tốn quá nhiều công sức để thực hiện việc thay đổi.

Tái sử dụng

SOLID khiến các lập trình viên suy nghĩ nhiều hơn về cách viết phần mềm, do vậy code viết ra sẽ mạch lạc, dễ hiểu, dễ sử dụng.

Nguồn tham khảo:

Tham khảo thêm các vị trí tuyển dụng lập trình it lương cao nhất tại Topdev

Mô tả công việc các vị trí lập trình cho nhân sự tuyển dụng IT

LẬP TRÌNH LÀ NGÀNH CHƯA BAO GIỜ HẾT HOT VÀ NHU CẦU TUYỂN DỤNG IT CHƯA BAO GIỜ HẠ NHIỆT!

Ngành công nghệ lập trình đang tăng trưởng nhanh và là một trong những xu thế đầy tiềm năng trong lựa chọn nghề nghiệp của các bạn trẻ, đồng thời là ngành có nhu cầu tuyển dụng rất cao trong những năm gần đây. Có rất nhiều nhà tuyển dụng IT luôn phải trong tâm thế “chạy đua” cạnh tranh trong tìm kiếm ứng viên.

Để tuyển được lập trình viên phù hợp, các nhà tuyển dụng cần chú ý tiếp cận ứng viên thông qua các mô tả công việc sát với nhu cầu của dự án, sản phẩm mà lập trình viên sẽ tham gia phụ trách và đánh giá đúng thị trường tuyển dụng IT để có những quyết định tuyển dụng phù hợp nhất. Từng vị trí sẽ có những yêu cầu và trách nhiệm ra sao? Công việc cụ thể của một lập trình viên là gì? Hãy cùng TopDev khám phá mô tả công việc các vị trí dưới đây: 

1- Lập trình Web

Tập trung vào mảng phát triển xây dựng giao diện và trải nghiệm cho người dùng, là người phụ trách phát triển hiển thị và trải nghiệm người dùng cho ứng dụng web

Chịu trách nhiệm chính cho Server của các ứng dụng chạy trên Web, hiểu đơn giản hơn là những hoạt động mà không thể nhìn thấy được ở trình duyệt. Chi tiết mô tả công việc tại đây

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 Java/ Java EE, đồ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

Lập trình mã nguồn mở giúp dễ dàng xây dựng phần mềm đơn giản, đáng tin cậy và hiệu quả. Mô tả chi tiết công việc Golang tại đây

Vị trí này đảm nhiệm việc cài đặt, nâng cấp và giám sát phần mềm và phần cứng. Họ cũng có thể tham gia vào việc sao lưu và khôi phục dữ liệu. Bạn có thể tham khảo chi tiết các yêu cầu công việc của một lập trình system tại đây

Có nhiệm vụ tiến hành theo dõi và kiểm tra hệ thống liên tục và xuyên suốt trong quá trình sử dụng để đảm bảo rằng việc bảo trì và khắc phục sự cố luôn được xử lý kịp thời và nhanh chóng. Xem thêm các mô tả công việc hằng ngày cần có tại đây

2- Lập trình Mobile

3- Lập trình Game

Là nhà phát triển phần mềm tạo ra các trò chơi video

Có thể bạn muốn xem thêm: Game EditorGame ArtistGame Master

4- Technical Leader

5- Project Manager

6- Product Manager

7- Solution Architect

Mô tả công việc – Vị trí lập trình Backend

TỔNG QUAN

Back-end Developer chịu trách nhiệm chính cho Server của các ứng dụng chạy trên Web, hiểu đơn giản hơn là những hoạt động mà không thể nhìn thấy được ở trình duyệt. Back-end Developer yêu cầu có kĩ năng lập trình phát triển ứng dụng hoặc cải tiến các ứng dụng có sẵn để trực tiếp với các kỹ sư đảm bảo sự thống nhất toàn hệ thống cũng nhưng cải thiện trải nghiệm của người dùng. Ngoài ra Back-end Developer còn có trách nhiệm phải tìm cách tối ưu chức năng, đảm bảo về tốc độ xử lý và hiệu suất của toàn bộ trang web.

YÊU CẦU

  • Kinh nghiệm phát triển ứng dụng/services về mặt Back-End.
  • Thành thạo lập trình với một trong các ngôn ngữ lập trình back-end
  • Nắm rõ toàn bộ quá trình phát triển web (thiết kế, phát triển và thực thi)
  • Có hiểu biết cơ bản về cơ sở dữ liệu và hệ thống: MySQL, MongoDB hay PostgreSQL
  • Có kiến thức về lập trình hướng đối tượng.
  • 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 vào toàn bộ vòng đời của ứng dụng, tập trung và coding và debug các dự án website và hệ thống
  • Viết API kết nối giữa các hệ thống, và phục vụ trao đổi dữ liệu với mobile & front-end
  • Xây dựng code có thể sử dụng lại và các thư viện để thuận tiện cho việc sử dụng trong tương lai
  • Thu thập và xử lí các yêu cầu thiết kế và kĩ thuật
  • Tham gia vào quá trình phân tích và thiết kế hệ thống;
  • Nghiên cứu và áp dụng các công nghệ mới để tối ưu hóa hiệu quả phát triển sản phẩm.
  • Đảm bảo sản phẩm làm ra cần phải chạy đúng nghiệp vụ và tốc độ xử lý cũng phải tối ưu cho lượng người dùng lớn

Xem ngay các vị trí Backend Developer tuyển dụng trên TopDev

Mô tả công việc – Vị trí lập trình Front-end

Mô tả công việc - Vị trí lập trình Front-end

TỔNG QUAN

Lập trình viên Front-end là người tập trung phát triển phía Client Side, nói một cách đơn giản dễ hiểu là tập trung vào mảng phát triển xây dựng giao diện và trải nghiệm cho người dùng, là người phụ trách phát triển hiển thị và trải nghiệm người dùng cho ứng dụng web. Front-end Developer chính là người quyết định cái nhìn đầu tiên của người dùng về trang web, đồng thời mang lại một trang web dễ dàng thao tác và sử dụng.

>>> Xem thêm: Frontend cần học những gì để trở nên thật giỏi

Những yêu cầu từ phía nhà tuyển dụng

Một frontend dev phải có tư duy về UI/UX

Lập trình viên không đơn thuần chỉ là một coder giỏi mà còn phải có tư duy như một Designer, một Business Analyst (BA) có thể phát triển sản phẩm đẹp, tiện dụng mang lại trải nghiệm tốt nhất cho người dùng.

Bởi vì trong sự cạnh tranh khốc liệt thì một sản phẩm đẹp hơn sẽ chiếm được tình cảm và sự ủng hộ từ phía người dùng, người ta không thể sử dụng một thiết bị rất đẹp về mọi thứ như iPhone, nhưng khi mở ứng dụng của bạn lên lại thấy xấu, thiết kế cẩu thả, mắc phải các lỗi cơ bản về hiển thị. Có hàng tá sản phẩm giống bạn nhưng lại rất tiện dụng, trong khi đó sản phẩm của bạn lại rối rắm, phức tạp, thì rõ ràng không ai muốn bỏ thời gian, công sức để tìm hiểu. Nói một cách khác, một sản phẩm xấu, hoặc khó sử dụng sẽ làm cho người dùng cảm thấy nó thiếu chuyên nghiệp và không tôn trọng họ. Sản phẩm đẹp sẽ giúp bạn nâng cao tính cạnh tranh, dễ quảng bá và truyền thông đến với người dùng.

Một frontend dev phải có tư duy về làm sản phẩm có performance tốt

Một sản phẩm có performance tệ, người sử dụng sẽ nghĩ sản phẩm này ảnh hưởng đến thiết bị ví dụ như điện thoại của họ, ảnh hưởng đến thói quen sử dụng hằng ngày và như vậy họ sẽ đưa sản phẩm của bạn vào blacklist.

Một frontend dev phải có tư duy nắm bắt các nền tảng công nghệ

Phương pháp phát triển hiện đại đang thống trị hiện nay như Angular, Reactjs, Vuejs, Webpack, Gulp

Những nền tảng công nghệ không đơn thuần chỉ là cung cấp phương pháp để phát triển ứng dụng theo một cách thức nhất định nào đó, mà còn mang trong mình triết lý và phương pháp luận để phát triển sản phẩm hiệu quả: nhanh, ổn định, ít bug, chi phí thấp, dễ dàng để mở rộng, bảo trì. Nền tảng công nghệ mới còn mang trong mình sức mạnh từ việc kế thừa ưu điểm những nền tảng trước đó, và tận dụng được các thế mạnh từ version mới của ngôn ngữ như Js, trình duyệt v.v…

Ngoài ra, một frontend dev phải có kiến thức về bảo mật, hiểu đúng bản chất của ngôn ngữ như Javascript, hiểu cơ chế hoạt động của trình duyệt. Để tránh ứng dụng gặp phải các lỗi bảo mật, các lỗi về leak memory cơ bản ảnh hưởng đến uy tín và thương hiệu của sản phẩm.

Một bảng mô tả công việc mẫu cho vị trí Frontend Developer

YÊU CẦU

  • Thành thạo HTML, CSS, Boostrap và ngôn ngữ lập trình JavaScript
  • Nắm rõ toàn bộ quá trình phát triển web (thiết kế, phát triển và thực thi)
  • Có kiến thức về các quy tắc trong SEO
  • Có kinh nghiệm sử dụng Photoshop (Hoặc Sketch)
  • Có kiến thức cơ bản về UX/UI
  • Có kiến thức về Responsive Design
  • Khả năng làm việc tốt trong môi trường tốc độ cao

Ứng tuyển ngay các vị trí tuyển dụng Frontend trên TopDev

 MÔ TẢ CÔNG VIỆC

  • Tham gia phát triển các dự án về Web, xây dựng các chức năng front-end của Website, Web application.
  • Triển khai giao diện HTML/CSS Javascript theo yêu cầu của khách hàng trên hệ thống website xây dựng sẵn
  • Phối hợp với các back-end developers và web designers để cải thiện tính khả dụng
  • Đảm bảo tiêu chuẩn đồ họa chất lượng cao và sự thống nhất trong brand
  • Thu thập ý kiến phản hồi và xây dựng các hướng giải quyết cho người sử dụng và khách hàng
  • Nghiên cứu, tìm hiểu các công nghệ về HTML/CSS Javascript mới nhất để áp dụng cái tiến sản phẩm

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

So sánh Java và Node.js: Cuộc chiến không hồi kết?

Java vs Node.js

1995 là một trong những năm điên rồ nhất lịch sử máy tính. Phiên bản Java đầu tiên xuất hiện, và rồi lòi ra thêm cậu em JavaScript. Hai cái tên “na ná” nhau làm mọi người lầm tưởng cả hai là “anh em song sinh dính liền” vừa mới tách ra vậy, nhưng thực tế cả hai chả giống gì nhau cả.

Một cái theo kiểu compiled và stactical, cái kia thì interpreted và dynamical. Và đây chỉ là khởi đầu cho sự khác biệt “trời-vực” giữa hai ngôn ngữ này. Sau này, sự xuất hiện của Node.js sẽ càng khiến người ta điên đầu.

Có lẽ, những bạn lập trình viên “già” vẫn còn nhớ ngày xưa, thời đỉnh điểm mà Java còn làm mưa làm gió trước khi dần nhường sân khấu cho những đàn em khác.

Ngày ấy, mọi người cứ tưởng Java sẽ bất bại và thống trị cả thế giới máy tính cơ, nhưng đự đoán này chỉ đúng một nửa. Ngày nay, Java vẫn thống trị, nhưng chủ yếu trên Android, môi trường doanh nghiệp và thế giới embed (như blu-ray chẳng hạn).

Dù đã có nhiều thành công như vậy, Java chưa bao giờ có sức ảnh hưởng quá lớn trên môi trường desktop hay trình duyệt. Người ta cứ hay ca tụng sức mạnh của applets và những công cụ dựa trên Java khác, nhưng lại hay kết hợp loạn xạ cả lên. Và rồi server dần chuyển thành “điểm G” của Java.

Lúc này, nhiều người cho rằng JavaScript là một “người song sinh đần độn” của Java dần nhận ra sức mạnh của nó. Hiển nhiên, JavaScript trước đó vẫn “gắng gượng” được vài năm trong môi trường HTML, và Web cũng đang dần thống trị thế giới. Nhưng bỗng nhiên, AJAX xuất hiện, và “người song sinh đần độn” dần dần có thêm sức mạnh mới.

Rồi lại lòi ra thêm Node.js, với tốc độ làm biết bao developers chao đảo. JavaScript không những thao tác trên server nhanh hơn người ta dự đoán, mà còn nhanh hơn cả Java và vô số công cụ khác mới đáng sợ. Menu nhẹ, nhanh, request data vô tận tiếp tục khiến Node.js nổi tiếng đến tận ngày nay, và các trang Web ngày càng mọc ra nhiều hơn bao giờ hết.

20 năm trôi qua, có ai lại ngờ được: Cả hai người anh em này ngày nay lại “kẻ tám lạng người nửa cân” đến vậy, ai cũng lăm le thống trị thế giới lập trình. Một bên cán cân, ta có một nền móng bám sâu, mạnh với cấu trúc và nguyên lý vững vàng. Bên kia lại có sự đơn giản và linh hoạt không kém phần tinh tế. Thế giới compiler “hoài niệm” của Java sẽ giữ được ngôi vương, hay bị tốc độ và sự linh hoạt của JavaScript với Node.js lật đổ?

Cùng so sánh Java và Nodejs trong bài viết hôm nay nhé.

Thế mạnh của Java: Nền tảng vững chắc

Tôi bắt đầu nghe thấy tiếng vài người cười nhạo nhễ rồi đấy, có khi còn cười đến trụy tim cũng không chừng. Hiển nhiên, Java vẫn có glich và bug (chương trình nào lại không có chứ), nhưng công bằng mà nói, nền móng của nó vững như đá tảng. Còn với Node.js, muốn vững thế này chắc cũng phải… vài năm nữa.

Thực ra, chắc cũng phải vài chục năm nữa thì phía JavaScript mới cho ra được mấy cái regression tests như Sun/Oracle làm được trên Java Virtual Machine. Khi bạn khởi động một JVM, bạn có ngay một “người” quản trị kỳ cựu 20 năm kinh nghiệm quyết tâm thống trị server doanh nghiệp.

Còn khi bạn khởi động JavaScript, bạn cũng có ngay một “liên minh tạp nham”, “lâu lâu” mới muốn hợp tác một lần, nhưng “lâu lâu” cũng muốn dùng chuẩn JavaScript để ngầm đấu đá với nhau.

Thế mạnh của Node: Chỗ nào cũng góp mặt

Nhờ ơn Node.js, JavaScript mới bám vúi được một chút ở server và trên trình duyệt. Nhưng ở đời có chuyện gì chắc chắn đâu, cả ngành công nghiệp máy tính cũng vậy.

Ta thà viết hết bằng JavaScript cho cả hai bên client/server, còn hơn là mải mê viết trước bằng Java rồi lại ngậm ngùi viết lại bằng JavaScript; bạn chắc hẳn phải viết lại nếu quyết định chuyển business logic đã viết cho server bằng Java sang browser đấy.

Cũng có khi ông xếp còn sẽ nài nỉ bạn chuyển logic đã built cho browser về ngược lại server cũng nên. Dù có chuyển theo chiều nào đi nữa, Node.js và JavaScript vẫn giúp ta migrate code dễ hơn nhiều.

Xem thêm Node.js thực sự là gì.

Thế mạnh nữa của Java: IDEs vượt trội

Lập trình Java có Eclipse, NetBeans và IntelliJ. Đến 3 công cụ hàng đầu có tích hợp mạnh mẽ debuggers, decompilers, và servers. Cái nào cũng đã qua nhiều năm phát triển, với lượng người dùng trung thành, và hệ sinh thái đầy plugins.

Trong khi đó, đa số lập trình viên Node.js phải ngồi cặm cuội gõ từng từ vào command line và code vào text editor. Nhiều người lựa chọn Eclipse hoặc Visual Studio, cả hai đều có hỗ trợ Node.js. Hiển nhiên, sự chú ý gần đây vào Node.js đồng nghĩa với nhiều công cụ hơn nữa trong tương lai.

Chẳng hạn như WebStorm từ JetBrains, xâu chuỗi nhiều công cụ command-line build lại với nhau, là một công cụ khá chất lượng. Nhưng muốn hoàn thiện như Eclipse. Còn lâu!

Tất nhiên, nếu bạn đang tìm kiếm một IDE giúp đơn thuần “cắt xén và tung hứng”, những công cụ mới có hỗ trợ Node.js đã khá đủ rồi. Nhưng nếu bạn đòi hỏi IDE vừa edit vừa vận hành trên soure code đang chạy như “vừa ăn vừa nói”, thì Java vẫn tốt hơn nhiều.

Thế mạnh của Node: dùng cùng một ngôn ngữ để đơn giản hóa build process

Các build tools phức tạp như Ant và Maven đã phần nào cách mạnh hóa cách lập trình trên Java. Nhưng vẫn còn một vấn đề. Bạn phải viết specification bằng XML, một kiểu data format không được thiết kế để hỗ trợ việc lập trình logic.

Hiển nhiên, biểu thị branching bằng nested tags không khó. Nhưng việc chuyển đổi liên tục giữa Java và XML cũng không kém phần khó chịu.

  Nhập môn Nodejs API (Authentication - CRUD) cho người mới học

Thế mạnh của Java: Debug từ xa

Java tràn ngập đủ loại công cụ mạnh mẽ giúp ta quản lý được hàng đống thiết bị. Thậm chí những công cụ đào sâu vào JVM và chi tiết hóa profiling giúp xác định bottlenecks và failures cũng không thiếu.

Stack doanh nghiệp Java quản lý một trong những hệ thống servers phức tạp nhất hành tinh, và những công ty sử dụng những server này đã từng có những yêu cầu hàng đầu… từ xa. Tất cả những công cụ dùng để theo dõi và debug hầu như đã trưởng thành và sẵn sàng làm việc hết công suất.

Thế mạnh của Node: Database queries

Queries cho các database mới hơn, như CouchDB, được viết bằng JavaScript. Trộn lẫn giữa CouchDB và Node.js không cần phải đổi công cụ, nên cũng chả cần nhớ cả khác biệt cú pháp luôn.

Trong khi đó, Nhiều lập trình viên Java sử dụng SQL. Ngay cả khi sử dụng Java DB (database viết bằng Java cho lập trình viên Java) họ cũng viết queries bằng SQL (SQL là gì)

Nhiều bạn thấy chỉ việc call Java methods thôi phải không? Nhưng sai rồi!

Bạn phải viết database code bằng SQL, rồi để Derby phân tích từ SQL. SQL là một ngôn ngữ hay, nhưng quá khác biệt và và có khi team phải cần đến hai người khác nhau để một người chuyên cho SQL, và người kia chuyên về Java.

Thế mạnh của Java: Thư viện

Hiện Java có một tập hợp thư viện khổng lồ, và những thư viện này là giải pháp rút ngắn mạnh mẽ. Những công cụ text indexing như Lucene, và computer vision toolkits như OpenCV là hai ví dụ open source projects có thể làm nền tảng vững chắc cho các project nghiêm túc.

Còn có rất nhiều thư viện được viết bằng JavaScript, trong đó có không ít thư viện hết sức tuyệt vời, nhưng khó có thể so với Java code base, cả về chất lượng lẫn số lượng.

Thế mạnh của Node: JSON

Khi Database đã là câu trả lời cho nhiều vấn đề, Java lại nỗ lực hết sức để chuyển kết quả về phía Java objects. Giới lập trình chắc sẽ tranh cãi hàng tiếng đồng hồ về POJO mappings, Hibernate…

Tinh chỉnh những công cụ này sẽ tốn hàng tiếng đồng hồ, thậm chí nhiều ngày liền. Dần dần, đoạn mã java này sẽ lấy tất cả các đối tượng sau khi chuyển đổi chúng.

Nhiều dịch vụ và database Web hiện định hoán data bằng JSON, một phần tự nhiên sẵn có của JavaScript. Format JSON hiện thông dụng và hữu ích, đến nỗi nhiều lập trình viên Java đã chuyển sang dạng JSON luôn, và như vậy việc các thư viện Java chuyển sang JSON là không thể tránh khỏi.

Nhưng cần gì đến thư viện, JSON đã có sẵn trong JavaScript rồi còn gì, cứ lấy và dùng thôi (JSON là gì)

Thế mạnh của Java: Kết cấu vững chắc

Nhìn chung, nhiều bộ phần mềm phức tạp cho các công trình khoa học được viết bằng Java, vì Java có nền tảng thuật toán siêu vững chắc. Sun dành nhiều thời gian để “rặng” ra chi tiết của utility classes. Còn có BigIntegers, elaborate IO routines, và code Date phức tạp có bổ sung cả lịch Gregorian và lịch Julian.

JavaScript, phù hợp với các công việc đơn giản hơn, và vẫn còn nhiều vướng mắc. Như ta thấy, trong JavaScript, một function không có kết quả được trả về đến ba kiểu: undefined, NaN, và null. Cái nào mới đúng? Mỗi kết quả đều có vai trò riêng — và cả ba đều có chung một mục đích là làm developer phát điên mới thôi. Những vấn đề “nho nhỏ” như thế này tuy không gây quá nhiều khó khăn cho những công việc đơn giản, nhưng khi động đến lượng lớn thuật toán phức tạp thì lại khác.

Điểm mạnh của Node: Tốc độ

Mọi người mải mê đắm say trong tốc độ của Node.js. Dữ liệu vào, kết quả ra với tốc độ ánh sáng. Node.js không không quá chú trọng vào setting thread độc lập với locking. Cũng không có overhead làm mọi thứ chạy chậm chạp hẳn đi. Bạn cứ việc dùng code đơn giản, và Node.js sẽ nhanh chóng hoàn thành mọi thứ.

Nhưng “nhân bất thập toàn”. Node.js yêu cầu code của bạn phải đơn giản và ít bug. Nếu bị deadlock, có khi cả server cũng lock up luôn. Lập trình viên bù đầu bứt tóc viết nets an toàn tránh lỗi bao nhiêu, Node.js lại quăng đi hết bấy nhiêu.

Điểm mạnh của Java: Threads

Web server của Java đều là đa nhiệm. Tuy việc tạo nhiều threads sẽ tốn bộ nhớ và thời gian, nhưng kết quả đem lại hoàn toàn xứng đáng. Nếu một thread deadlocks, những thread khác sẽ theo sau. Nếu một thread cần tính toán lâu hơn, các thread khác (thường) sẽ không chen đẩy.

Khi một Node.js request chạy quá chậm chạm, cái gì cũng chậm hết. Vì Node.js chỉ có một thread duy nhất, và chỉ ra event khi nó sẵn sàng. Trông thì nhanh đấy, nhưng thực tế không khác gì bưu điện ngày tết mà chỉ có một ô phục vụ cả.

Bây giờ, khi người ta đã hướng đến những hệ thống có thể cùng lúc làm nhiều thứ. Tại sao phải quay lại thời máy tính đơn nhiệm thập niên 60 làm gì?

Thế mạnh của Node: Tuổi trẻ

Lời dạy “tham thì thâm” của các cụ có vẻ càng ngày càng đúng: Java có thể đuổi theo Node, nhưng có quá nhiều code cũ còn tồn tại. Chắc hẳn rồi, Java có IO routines mới, những vẫn còn IO routines cũ tồn tại. Quá nhiều applet và util class có thể gây nhiều khó khăn.

Thế mạnh của cả hai: Cross-compiling với nhau

Nên dùng Java hay Node.js cho server, có cãi đến tết công-gô cũng chưa quyết được. Thay vì tranh cãi, tại sao không dùng luôn cả hai. Java cũng có thể cross-compiled vào JavaScript được. Google rất hay áp dụng biện pháp này cho Google Web Toolkit, mà nhiều website quan trọng nhất có Java code chạy trong đó — Java đã được dịch sang JavaScript.

Tương tự, ngược lại ta có nhiều JavaScript engines như Rhino chạy JavaScript trong ứng dụng Java ở những điểm link được. Nếu “tham vọng”, bạn có thể link vào Google’s V8 engine.

Tuyệt vời chưa, tất cả code đều link vừa khít với nhau mà không cần phải “kén cá chọn canh”.

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

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

Xem thêm Tuyển dụng Java, NodeJS trên TopDev

Tại sao nên dùng [SerializeField] thay vì biến public?

tai-sao-nen-dung-serializefield-thay-vi-bien-public

Cách đây độ hơn một năm, mình có viết một bài giải thích về thẻ [ SerializeField ] trong Unity C# hoạt động như thế nào. Trong bài đó, mình có nói rằng các trường dữ liệu public có thể là những mối nguy tiềm ẩn trong chương trình của bạn. Với các lập trình viên có kinh nghiệm, việc này khá là hiển nhiên, như kiểu trái đất quay quanh mặt trời vậy.

Tuy nhiên, với các bạn newbie hoặc các bạn tự học lập trình tại nhà, nguy cơ đến từ các biến public có vẻ chẳng đáng lo ngại lắm. Trong bài viết này mình sẽ giải thích kỹ hơn quan điểm của mình, và bạn sẽ thấy vì sao nhiều lập trình viên khác cũng có chung quan điểm đó.

“Em thấy hai cách chả khác quái gì nhau cả.”

Nhìn qua thì việc dùng một biến public và một biến private + [SerializeField] có vẻ không khác gì nhau. Cả hai cách đều cho phép mọi người trong project của bạn chỉnh sửa trực tiếp giá trị của biến trong Unity Inspector. Nghĩa là dù bạn làm như thế này:

public class Character : MonoBehaviour
{
    [SerializeField]
    private int healthPoint;
}

… hay như thế này:

public class Character : MonoBehaviour
{
    public int healthPoint; // Đừng làm theo, mình khuyên thật
}

… thì ai cũng có thể mở script Character ra và sửa giá trị HP của nhân vật đó, ví dụ như từ 5 lên 10. Sự khác biệt có vẻ không rõ ràng lắm?

Giờ thì hãy nhìn theo hướng của lập trình viên. Tưởng tượng một ngày thằng Dũng ngồi cạnh bạn sẽ dùng đám code trên cho tính năng mà nó đang xử lý. Nếu bạn dùng biến public, thì thằng Dũng có thể truy cập tới biến đó từ bất cứ đâu trong chương trình, và đoạn code dưới đây hoàn toàn hợp lệ:

public class Foo: MonoBehaviour
{
    void Update()
    {
        Character c;
        Debug.Log(c.healthPoint);
    }
}

Nhưng nếu bạn chọn cách dùng biến private, Dũng không thể dùng biến đó được nữa. Sự khác biệt là đây.

Hàng công cộng tức là công chúng xài sao cũng được

Sự khác biệt này có vẻ không đáng kể – Dũng có thể dùng biến HP đó hoặc không, chấm hết. Vậy tại sao lại phải làm to chuyện lên làm gì? Tại sao bạn cần giấu các biến dữ liệu của bạn mà không phải phô ra?

Hãy xét trường hợp bạn dùng biến public. Thằng Dũng chỉ cần lấy giá trị HP hiện tại để làm thanh máu của nhân vật, ví dụ thế. Ừ thì không phải cái gì to tát lắm, nó chỉ đọc thôi mà, chẳng ảnh hưởng gì tới bạn. Nhưng đến khi Cường nhảy vào project và nó phải lập trình một vật phẩm giúp x2 máu của nhân vật. Vì biến HP của bạn là public, nên thằng Cường chỉ cần nhặt nó lên và xài như bình thường, tự nhiên như ruồi vậy.

Character c;
c.healthPoint = c.healthPoint * 2;

Cách làm này sẽ dẫn tới những vấn đề đau đầu rất nhanh. Với trường hợp đoạn code ở trên, chẳng có giá trị giới hạn nào cho máu của nhân vật cả, nó có thể tăng, tăng nữa, tăng mãi. Rõ ràng là không ổn chút nào. Bạn cần phải thêm một giá trị nữa vào class Character của bạn để giới hạn giá trị lớn nhất của giá trị HP. Lấy ví dụ, nhân vật đang có máu là 80/100 và nó nhặt được vật phẩm của Cường. Nếu không có giới hạn trên, máu của nhân vật sẽ là 160/100 (wtf?) thay vì giá trị đúng là 100/100.

public class Character : MonoBehaviour
{
    public int healthPoint;

    // Bạn thêm giá trị max HP vào để giới hạn giá trị max của HP
    public int maxHealthPoint;
}
// Code của Cường
Character c;
c.healthPoint = c.healthPoint * 2;
if (c.healthPoint > c.maxHealthPoint)
    c.healthPoint = c.maxHealthPoint;

Để đạt được điều này, Cường phải sửa phần code của nó sau khi bạn đã thêm giá trị max HP vào code của bạn – thật sự là phiền. Tại sao không phải đơn giản là nó chỉ việc tập trung vào vật phẩm hồi máu của nó, còn bạn xử lý những chi tiết lặt vặt ở trên. Dù gì bạn cũng là người chịu trách nhiệm cho class Character cơ mà?

Trường hợp của Cường là một ví dụ cho việc sử dụng biến public làm cho code của bạn mong manh dễ vỡ thế nào. Các yêu cầu phát triển của mọi phần mềm, bao gồm cả game, không bao giờ là bất biến trong suốt quá trình phát triển. Thậm chí, các yêu cầu này thay đổi nhanh như người yêu cũ trở mặt vậy. Mặc dù các biến public có thể được truy cập dễ dàng từ mọi nơi, nhưng nó đồng nghĩa với việc code của bạn khó có thể thích nghi với sự thay đổi từ yêu cầu. Giờ chúng ta sẽ thử thay đổi phương án tiếp cận, bằng cách đổi sang sử dụng biến private.

Đẹp khoe xấu che

public class Character : MonoBehaviour
{
    [SerializeField]
    private int maxHealthPoint;

    private int healthPoint; // Notice that I removed [SerializeField] on purpose

    public int HealthPoint { get { return healthPoint; } }
    public int GetHealthPoint() { return healthPoint; }

    public void Damage(float value)
    {
        healthPoint -= value;
        if (healthPoint < 0) 
            healthPoint = 0; 
    } 
    
    public void Heal(float value) 
    { 
        healthPoint += value; 
        if (healthPoint > maxHealthPoint)
            healthPoint = maxHealthPoint;
    } 
}

Chúng ta có hai sự thay đổi chính với hai giá trị về máu của nhân vật. Thứ nhất, cả hai giá trị bây giờ đều là các biến private, tức là nó chỉ có thể được đọc hoặc ghi trong phạm vi class Character của bạn. Nói cách khác, bạn là người toàn quyết quyết định rằng hai giá trị này sẽ được xử lý ra sao. Thứ hai, bây giờ nếu mọi người mở script Character của bạn ra trong Unity, họ chỉ có thể thay đổi giá trị max HP. Giá trị HP hiện tại hoàn toàn không thể bị chỉnh sửa tuỳ tiện được. Sự thay đổi này là hợp lý, bởi nếu một ai đó sửa giá trị HP hiện tại của nhân vật trong Play mode, có thể sẽ có lỗi logic xảy ra.

Vấn đề của Dũng, người cần đọc giá trị máu của nhân vật, được giải quyết bằng một hàm getter hoặc một property giúp đọc giá trị của biến healthPoint. Nếu bạn đến từ background về C++ như mình thì bạn sẽ thấy hàm getter khá quen thuộc. Thực ra trong công việc hàng ngày, mình thích cách sử dụng hàm getter hơn là property, bởi mục đích của nó rõ ràng hơn. Thêm nữa là thao tác tìm kiếm các chỗ sử dụng hàm getter dễ hơn nhiều so với property, bởi bạn không cần phải lọc ra các đoạn mà property dùng để sửa giá trị của biến. Đây hoàn toàn là vấn đề sở thích cá nhân thôi, bạn cứ xài cách nào khiến bạn cảm thấy thoải mái là được.

Với việc để các biến trong class của bạn là private, nếu Dũng hoặc Cường trực tiếp truy cập tới các biến này trong code của chúng nó, chúng nó sẽ bị quăng vào mặt một đống lỗi biên dịch. Với mình thì đây là một điều tốt, bởi ý đồ của mình là không nơi nào khác trong code base, ngoại trừ class Character, có thể trực tiếp truy cập tới những biến này. Nếu Dũng hoặc Cường muốn đọc hoặc ghi các giá trị này, chúng nó phải xài những hàm do mình cung cấp và chơi theo luật của mình đề ra. Ví dụ, Cường chỉ cần tập trung vào việc hồi máu của vật phẩm với hàm Heal mà không cần phải lo đến việc máu nhân vật vượt ngưỡng max, bởi mình đã xử lý đoạn đó rồi. Mình không cần phải bảo nó xử lý những trường hợp đó, nó cũng bớt việc phải làm. Một người khoẻ, hai người vui.

Khi các biến được giới hạn trong phạm vi của class, bạn có thể kiểm soát toàn bộ mọi việc liên quan đến các biến này như theo dõi, maintain hoặc update. Lấy ví dụ, nếu bạn nhìn hàm Heal và Damage ở trên, bạn có thể thấy mình hoàn toàn chưa hề xử lý trường hợp tham số đầu vào có giá trị âm. Nếu Cường vô tình (hoặc cố tình) truyền vào một tham số âm, chắc chắn sẽ có biến xảy ra, khi mà vật phẩm được cho là sẽ giúp hồi máu nhân vật thực tế lại làm cho nhân vật ngoắc ngoải đến mức muỗi đốt cái là chết. Vậy đây là một bug. Bạn chỉ cần thêm các đoạn code xử lý cho trường hợp tham số âm, và đời lại phơi phới. Cường và Dũng thậm chí còn chẳng phải sửa gì trong code của chúng nó.

Đặt lại vấn đề, nếu như bạn dùng biến public. Dũng sẽ phải xử lý trường hợp máu của nhân vật tụt xuống giá trị âm. Cường còn thảm hơn. Nó phải xử lý mọi thứ như giá trị âm hay giá trị max một mình. Điều này làm code của nó trông như một mớ rác vậy. Rồi một ngày nó nhận ra là phía game design yêu cầu làm thêm phần trang bị, trong đó có một trang bị giúp tăng max HP của nhân vật. Và nó phải tìm đến từng chỗ một để cập nhật các thay đổi. Sau đó nó rage quit, tìm đến bạn để phang cả cái bàn phím vào đầu bạn, rồi phi ra khỏi cửa và không bao giờ quay lại.

Thế là bạn phải tiếp quản phần việc của Cường. Bạn nhận thấy với những tính năng mới được thêm vào, bạn có thể sẽ ổn hơn nếu bạn chuyển hết phần xử lý máu vào một script khác, gọi là Health Component. Chuyển xong, bạn nhận được 666 lỗi biên dịch, bởi những biến public này được dùng ở khắp mọi nơi xung quanh project. Kể cả khi bạn dọn sạch những lỗi biên dịch này, bạn vẫn cần phải miệt mài test đi test lại các tính năng để đảm bảo rằng chúng vẫn hoạt động đúng như trước khi bạn refactor.

Kết

Phàm trên đời cái gì xảy ra cũng có nguyên nhân của nó. Giấu dữ liệu của bạn vào trong phạm vi class (hay nói văn hoa hơn theo chuẩn OOP là đóng gói – encapsulation) cũng không ngoại lệ. Với tất cả những bất lợi đã trình bày ở trên, mình tin rằng việc sử dụng một biến public chỉ để bạn có thể thay đổi giá trị của nó trong Unity Inspector là không đáng. [SerializeField] đảm nhiệm việc đó ngon lành, và bạn vẫn có thể tận dụng mọi lợi thế của tính đóng gói.

Mình thừa nhận là khi mới viết những dòng code đầu tiên, làm mọi thứ public có vẻ dễ dàng hơn nhiều so với việc viết thêm các đoạn accessor như getter hay setter. Nhưng hãy nhớ rằng, một phút lười nhác bây giờ có thể tốn của bạn hàng giờ làm bù trong tương lai.

Vậy nên đừng dùng các biến public. Nếu phải dùng, bạn tốt nhất là nên có nhiều lý do thật tốt để sử dụng chúng.

Người viết: Giang – Bài viết gốc được đăng tải tại vinaludens

Xem thêm việc làm Software Developers hấp dẫn trên TopDev

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

  Cách cài đặt cấu hình máy tính cá nhân thành một public server trên Internet
  Vì sao tôi chuyển từ Visual Studio Code sang Sublime Text
  100 Tips cho Lập trình viên siêu giỏi

List các thuật ngữ căn bản .NET- Bách khoa toàn thư

bach-khoa-toan-thu-net

.NET đã phát triển vượt trội kể từ những ngày đầu xuất hiện vào năm 2000 và đến thời điểm này nó đang dần vươn lên để đối đầu với Java. Bài viết này là một list các thuật ngữ căn bản trong .NET để giúp cho những ai chưa quen với ngôn ngữ này có thể phần nào hiểu được khi làm việc với nó.

.NET Framework là gì?

NET Framework là tên của tập lệnh nguyên bản .Net runtime và các thư viện chỉ chạy trên Windows. Nó bắt đầu từ version 1.0, rồi lên dần 1.1, 2.0, 3.0, 3.5, 4.0, 4.5 trước khi bùng nổ hệ sinh thái. Từ đó mà các phiên bản ra mắt thường xuyên hơn và giống các bản patch hơn. Phiên bản hiện tại bài này viết là bản 4.7.1.

TOP các vị trí tuyển dụng .net lương cao tại đây

Mono là gì?

Là phiên bản cộng đồng nhằm mang .NET đến những nền tảng ngoài Windows. Mono được phát triển chủ yếu nhằm xây dựng những ứng dụng với giao diện người dùng và được sử dụng rất rộng rãi: Unity Game, Xamarin…

Xamarin là gì?

Xamarin framework cùng tên với công ty có nguồn gốc base từ source của Mono. Giờ đây nó thuộc sở hữu của Microsoft,  Framework này là các ứng dụng runtime/ library được thiết kế để chạy lần lượt trên iOS và Android.

.NET Core là gì?

Cho đến năm 2013, Microsoft định hướng đi đa nền tảng và phát triển .NET core. .NET core hiện được sử dụng trong các ứng dụng Universal Windows platform và ASP.NET Core.

.NET Standard là gì?

.Net Standard mở rộng thêm một tập các APIs có sẵn bao gồm rất nhiều các tính năng còn thiếu. Nó đã hỗ trợ đến 32.000 API. Việc này giúp cho việc nâng cấp code có sẵn từ phiên bản .NET cũ mà không cần phải thay đổi nhiều code. .NET Standard được đưa  vào vào một giải pháp cho sự tương thích là hỗ trợ hoàn  toàn thư viện đã có trong .NET Framework.

UWP

Universal Windows Platform là một nỗ lực từ Microsoft để thống nhất từ điện thoại, tablet, và desktop vào một code base. Đây là môi trường sandbox mà nó chứa các ứng dụng được thiết kế để phân phối trên Windows Store.

Roslyn là gì?

Nó là tên của một C# compiler environment mới nhất của Microsoft. Đây là opensource và có sẵn các library prebuilt để bất cứ app nào cũng có thể access vào C# compilation và các phương thức analysis mạnh mẽ của Visual Studio sử dụng.

.NET Native là gì?

Đây là một AOT (ahead of time) compiler cho UWP, nó sẽ precompile .NET IL (một loại ngôn ngữ trung cấp, là một dạng compile của các assembly được .Net runtime sử dụng) thành các code căn bản (either x86, x64, or ARM) được thiết kế để chạy trên Windows.

ASP.NET

Đây là một framework Microsoft để build các app server side được thiết kế để tương tác qua các HTTP call. Nó chỉ dành cho Windows thôi, nhưng đứa em mới trẻ trung của nó – ASP .NET Core thì được thiết kế để chạy được đa platform.

.NET Runtime

Đây là một engine phụ trách host các app viết bằng .NET. Nó là một chương trình C++ thiết kế để xác định bộ nhớ được quản lý, thực hiện thu thập “rác” (garbage collection:thực hiện quá trình tự động khôi phục lại bộ nhớ không được sử dụng tại runtime một cách tự động. Nói cách khác, đó là một cách để phá hủy các đối tượng không sử dụng nữa.), và load các .NET assembly vào và ra khỏi address space của nó và sau đó compile chúng theo ý muốn bởi operating system host.

Các library .NET Framework

 Đây là các library cung cấp các tính năng căn bản như một platform. Chúng cung cấp những thứ như string operations, file I/O, threading, v.v. Ban đầu nó được nhóm với các phiên bản đã ra mắt của .NET Framework, nhưng ngày nay chúng đã tách ra.

Assembly trong C# là gì

Khi một mã lệnh đơn lẻ được người lập trình viết xong , nó sẽ được biên dịch bởi trình biên dịch. sau khi biên dịch mã lệnh được chuyển đổi thành tập tin dạng EXE/DLL. Kết quả này được hiểu là “đơn vị chương trình được quản lý – Managed Module”. Trên thực tế Managed Module được hiểu là ASSEMBLY, nó bao gồm ngôn ngữ trung gian (Intermediate Language (IL) ) và thông tin về dữ liệu (siêu dữ liệu – Metadata).

Bài viết liên quan:

  1. Hệ sinh thái .NET – Anh Em Nhà .NET
  2. .NET – Strong Named Assembly là gì?
  3. teraapp TERAAPP.NET – Tạo ứng dụng di động bằng .NET
  4. Fix lỗi .NET runtime optimization service

Xem thêm việc làm fresher .NET tại TopDev