Categories
Dev's Corner

Cách tương tác với Smart Contract từ một web app

Juan Cruz Martinez sẽ hướng dẫn chúng ta tạo một smart contract (hợp đồng thông minh) nhỏ để lưu trữ và truy xuất dữ liệu trên Ethereum blockchain và tạo một web app cho phép truy cập và thay đổi dữ liệu trên smart contract này.

Hãy thực hành cùng Gambaru nhé!

Smart Contract

Đầu tiên, tôi sẽ trình bày về smart contract mà ta sẽ sử dụng để xây dựng các ứng dụng web.

Vì bài viết tập trung vào việc liên kết JavaScript với blockchain, nên tôi tạo contract càng đơn giản càng tốt:

Tạo một Smart Contract đơn giản
Tạo một Smart Contract đơn giản. Xem code gốc ở đây

Hợp đồng CoolNumberContract chứa một biến trên blockchain được gọi là coolNumber với giá trị ban đầu là 10.

Biến này là public, nghĩa là ta có thể truy cập giá trị của nó từ blockchain mà không cần tạo hàm getter.

Ngoài ra, contract này chứa một hàm publicsetCoolNumber, sẽ thay đổi giá trị của biến trên blockchain.

Điều quan trọng cần nhớ ở đây là bất kỳ thay đổi nào trong dữ liệu blockchain đều cần được thể hiện bằng một giao dịch.

Có nghĩa là việc gọi phương thức setCoolNumber sẽ yêu cầu một giao dịch và giao dịch đó sẽ có phí gas đi kèm.

Hãy triển khai hợp đồng trên một test network trước khi tiếp tục.

Thiết lập project và dependency

Để tương tác với bất kỳ Ethereum blockchain nào từ JavaScript, bạn sẽ cần một library.

Trong trường hợp này, hãy sử dụng web3 https://web3js.readthedocs.io/en/v1.3.0/

Web3 sẽ cho phép tương tác với bất kỳ Ethereum network nào thông qua MetaMask hoặc provider của web3 như Ganache.

Hãy bắt đầu một project mới. Tôi sẽ sử dụng JavaScript HTML, nhưng mọi người có thể sử dụng bất kỳ framework nào mình muốn như React hoặc Vue.

Tất cả code sẽ đi vào một file là index.html và hãy bắt đầu với cấu trúc sau:

Thiết lập project và dependency
Thiết lập project và dependency. Xem code gốc ở đây

Hãy xem thử thẻ body.

Đây là một giao diện người dùng đơn giản với hai button và một khoảng biểu thị trạng thái.

Cả hai button đều gọi các hàm JavaScript mà hiện tại vẫn chưa được định nghĩa.

Trên thẻ head, thẻ quan trọng là script ta đang import. Đó là thành phần phụ thuộc vào web3.

Hãy thêm thành phần phụ thuộc này vào code như tôi đã làm hoặc nếu đang sử dụng một framework, chỉ cần import package này với:

Import Package
Import Package

Nếu chưa cài đặt library, bạn có thể thông qua NPM:

Cài thông qua NPM
Cài thông qua NPM

Cuối cùng, trước khi tiếp tục, lời khuyên là hãy cài đặt tiện ích mở rộng MetaMask.

Nếu muốn sử dụng bất kỳ provider nào khác, bạn có thể phải thay đổi các phần của code cho phù hợp, vì các sample được cung cấp sử dụng provider web3 được MetaMask đưa vào.

Kết nối web app với Ethereum Blockchain

Khi cấu trúc cơ bản và các thành phần phụ thuộc sẵn sàng, ta có thể thêm code để kết nối ứng dụng với blockchain.

Bên trong script tag ở body, hãy thêm:

Kết nối web app với Ethereum Blockchain
Kết nối web app với Ethereum Blockchain. Xem code gốc ở đây

Các đoạn code trên khá đơn giản ngoại trừ hàm loadWeb3.

Chức năng này chịu trách nhiệm thiết lập kết nối và cấp quyền tương tác với blockchain.

Để làm việc với smart contract này, ta sẽ cần một instance Web3 mới. Khi tạo instance này, cần chỉ định provider ta muốn sử dụng.

Vì đang sử dụng MetaMask làm proxy nên hãy dùng provider window.ethereum được đưa vào bởi tiện ích mở rộng MetaMask.

Khi truy cập trình duyệt và tải trang (bằng file hoặc trình duyệt web), ta sẽ thấy luồng ủy quyền MetaMask như sau:

Cấp quyền kết nối cho app thông qua MetaMask
Cấp quyền kết nối cho app thông qua MetaMask

Hãy nhấn Next Connect.

Truy cập vào smart contract

Đến lúc này, code đã có quyền truy cập để tương tác với blockchain.

Tạo một chức năng mới để tạo một contract instance phù hợp với giao diện contract.

Tạo Contract Instance
Tạo Contract Instance

Để có được một instance của bất kỳ contract nào trên blockchain, tất cả những gì chúng ta cần là: thông số ABI của contract và địa chỉ contract, cả hai đều có thể trích xuất từ ​​Remix.

Để có thông số kỹ thuật ABI của contract, hãy đến Remix trên tab Compile. Compile và nhấp vào ABI.

Sao chép ABI specification của contract
Sao chép ABI specification của contract

Nút này sẽ sao chép thông số ABI cho contract dưới dạng một JSON array trên clipboard mà ta có thể sử dụng trực tiếp như một phần của tham số đầu tiên.

Tham số thứ hai là địa chỉ contract đã triển khai, có thể lấy từ Remix tại thời điểm triển khai hoặc Etherscan.

Sao chép địa chỉ contract từ Remix
Sao chép địa chỉ contract từ Remix
Sao chép địa chỉ contract từ Remix
Sao chép địa chỉ contract từ Remix

Code chức năng hoàn chỉnh cho contract này sẽ như sau:

Code chức năng hoàn chỉnh cho Contract
Code chức năng hoàn chỉnh cho Contract. Xem code gốc ở đây

Sau khi hoàn tất, ta có thể chỉ cần gọi loadContract từ hàm loader:

Gọi loadcontract từ hàm loader
Gọi loadcontract từ hàm loader

Đọc các giá trị từ smart contract

Nay ta đã sẵn sàng để bắt đầu gọi các chức năng của smart contract và sẽ bắt đầu bằng cách lấy coolNumber từ contract này.

Có thể lấy dữ liệu từ contract rất nhanh nhờ web3. Đây là một ví dụ để lấy giá trị của biến public coolNumber:

Lấy giá trị của biến public coolNumber
Lấy giá trị của biến public coolNumber. Xem code gốc ở đây

Siêu dễ đúng không?

Sử dụng instance contract từ phần trước, hãy lấy các phương thức và gọi một hàm với tên biến (đây là getter đã được đề cập ở phần đầu), và cuối cùng, sử dụng lệnh call để bắt đầu yêu cầu từ xa.

Cập nhật các giá trị vào smart contract

Cuối cùng, cần đảm bảo rằng ta cũng có thể giao dịch với smart contract.

Do đó, hãy hiển thị một instance bằng cách truy cập hàm setter để thay đổi coolNumber được lưu trữ trong contract.

Chức năng change sẽ chỉ định một số ngẫu nhiên mới và lưu nó trên blockchain:

Truy cập hàm setter để thay đổi coolNumber
Truy cập hàm setter để thay đổi coolNumber. Xem code gốc ở đây

Có hai điều cần chú ý:

  • Đầu tiên, chúng ta đề cập đến một hàm getCurrentAccount() hiện chưa được định nghĩa. Ta sẽ làm việc này sau.
  • Thứ hai là cách gọi setter. Hãy chú ý đến dòng gọi phương thức setCoolNumber từ contract, nó trông hơi khác so với những gì đã làm cho caller:
Cách gọi setter
Cách gọi setter

Thay vì sử dụng phương thức call, ta đang sử dụng phương thức send. Ta cần xác định tài khoản người gửi. Tại sao? Phải cần một giao dịch để thay đổi các giá trị trên blockchain. Như đã nói, một giao dịch yêu cầu tài khoản từ và đến phải hợp lệ – từ người khởi tạo giao dịch và trong trường hợp này, là địa chỉ của smart contract này.

Có thể sử dụng bất kỳ tài khoản nào làm từ giá trị không? Không! Đó phải là tài khoản bạn có quyền truy cập (và trong trường hợp này, tài khoản được đăng ký trên ví MetaMask của bạn), vì bạn sẽ cần ủy quyền giao dịch và xác nhận hóa đơn tiền gas.

Vấn đề đã được giải quyết, hãy xây dựng phương thức getCurrentAccount():

Xây dựng phương thức getCurrentAccountxây dựng phương thức getCurrentAccount
Xây dựng phương thức getCurrentAccount

Web3 thực sự tuyệt vời. Mọi người có thể tương tác với blockchain và ví của mình, vì vậy có thể thông qua Web3 để yêu cầu thông tin về các tài khoản đã đăng ký trên ví. Trong trường hợp này, chỉ cần lấy tất cả và sử dụng tài khoản đầu tiên để thực hiện các giao dịch.

Vận dụng những gì đã học

Tôi đã tải code lên GitHub gist để bạn so sánh và tham khảo. Hãy thử xây dựng dự án nhỏ nhưng thú vị này nào!

Application Flow
Application Flow

Nếu thành công, bạn hãy comment phía dưới cho Gambaru biết nhé!

Theo Juan Cruz Martinez

Categories
Dev's Corner

Đừng chỉ viết code, hãy tập giải quyết vấn đề

Những lần gặp khó khăn khi code là những lần ta tích lũy kinh nghiệm, nhận ra được các mẫu có tính lặp lại và khám phá những chiến lược nhất định. Nếu phân loại được đoạn code và những vấn đề tương tự sẽ giúp ích rất nhiều cho lập trình viên.

Tập trung giải quyết vấn đề
Tập trung giải quyết vấn đề để cải thiện kỹ năng lập trình. Ảnh: lloorraa – Pixabay

Việc học giải quyết vấn đề theo hệ thống như vậy đã được thảo luận từ rất lâu.

Gambaru xin giới thiệu với các bạn một trong những nhà toán học tuyệt vời đã chia sẻ về vấn đề này, George Polya, qua cuốn sách nổi tiếng How to solve it, a new aspect of mathematical method xuất bản lần đầu năm 1945.

Không rõ George Polya có mong đợi lập trình viên thế kỷ 21 đọc được tác phẩm toán của mình hay không, nhưng tôi mong các bạn nhận ra được những góc nhìn của ông có giá trị đến thế nào.

George Polya
Nhà toán học George Polya. Ảnh: Alchetron
How to Solve it
Sách How to Solve it – A new aspect of mathematical method viết bởi George Polya. Ảnh: Amazon

Giải quyết vấn đề không phải là một năng khiếu

“Giải toán là một kỹ năng thực tế như bơi lội. Chúng ta thành thục được bất kỳ kỹ năng nào bằng cách bắt chước và thực hành. Khi tập bơi, bạn bắt chước theo cách mọi người dùng tay và chân để giữ cho đầu ở trên mặt nước và cuối cùng, bạn biết bơi nhờ tập luyện. Khi tập giải toán, bạn quan sát và bắt chước những gì người khác làm khi giải toán và cuối cùng, bạn biết giải toán nhờ thực hành.”

George Polya, How to solve it

Giải quyết vấn đề không chỉ là về “trí óc”

“Dạy giải toán chính là sự rèn luyện ý chí. Để giải quyết những bài khó, người học sẽ học cách kiên trì vượt qua thất bại, trân trọng những tiến bộ nhỏ, chờ đợi ý tưởng cần thiết và tập trung hết sức khi ý tưởng xuất hiện.”

George Polya, How to solve it

Quyết tâm và cảm xúc đóng một vai trò quan trọng khi giải quyết các vấn đề khó.

Quy trình giải quyết vấn đề

Bất cứ khi nào thực hiện quá trình giải quyết vấn đề, hãy ghi nhớ bốn bước sau:

  • Hiểu vấn đề
  • Lập kế hoạch
  • Thực hiện kế hoạch
  • Nhìn lại và đánh giá

1. Hiểu vấn đề

Hiểu vấn đề
“Thật ngớ ngẩn khi trả lời một câu hỏi bạn không hiểu. Thật đáng buồn khi làm việc để ra một kết quả bạn không mong muốn.” – George Polya, How to solve it. Nguồn ảnh: Rawpixel

Trước khi đi tìm giải pháp, cần phải trình bày được tất cả các yếu tố của vấn đề để hiểu nó rõ hơn.

Bạn có thể nêu vấn đề trong một câu không?

Bài tập nhỏ này rất hữu ích: thuyết phục bản thân rằng bạn đã hiểu mục tiêu và không tốn quá nhiều năng lượng để hiểu nó nữa khi đang tập trung giải quyết vấn đề.

Như được đề cập trong sách The Pragmatic Programmer, khi lập trình viên debug với “vịt cao su” chính là buộc bản thân phải hiểu rõ vấn đề để có thể dạy nó cho người khác.

Debug bằng vịt cao su
Kỹ thuật debug đỉnh cao với vịt cao su: Bạn có giải thích được vấn đề cho người khác

Có những ràng buộc nào cần phải đáp ứng không?

Những ràng buộc cần đáp ứng
“Trước hết, hãy hiểu vấn đề một cách tổng thể. Từ đó, ta mới có thể đánh giá những điểm cụ thể nào là quan trọng nhất. Sau khi xem xét một hoặc hai điểm trọng yếu, ta mới có thể đánh giá xem chi tiết nào đáng để điều tra kỹ hơn. Hãy đi vào sâu chi tiết và phân tích vấn đề dần dần, nhưng không đi xa hơn mức mình cần.” – George Polya, How to solve it. Ảnh: Freepik

Những hạn chế trong vấn đề bạn đang giải quyết là gì?

Hãy viết chúng ra. Nó có thể là một comment phía trên dòng đầu tiên của một hàm bạn viết, một danh sách các gạch đầu dòng trên đầu tài liệu thiết kế.

Điều quan trọng là phải tập trung vào chúng khi cố gắng tìm giải pháp.

Gỡ bỏ nhiều ràng buộc khỏi bộ não cũng là một cách loại bỏ một số quả bóng khi tâm trí ta chơi trò “tung hứng” trong khi cố gắng đưa ra một ý tưởng hay.

Ngoài ra, hãy cẩn thận nếu có quá nhiều ràng buộc.

Theo Polya, nếu xem xét quá nhiều chi tiết cùng một lúc, bạn có thể lạc lối. Chúng có thể khiến bạn mất tập trung vào điểm chính yếu hoặc thậm chí không nhìn thấy điểm chính yếu đó.

Bạn có thể vẽ hình minh họa hay một hệ thống ký hiệu phù hợp?

Vẽ minh họa hay hệ thống ký hiệu
Vẽ minh họa hay hệ thống ký hiệu “Một bước quan trọng khi giải toán là chọn hệ thống ký hiệu. Điều này cần được thực hiện một cách cẩn thận. Làm được ta sẽ tiết kiệm thời gian cho sau này do tránh được những do dự và nhầm lẫn không đáng.” – George Polya, How to solve it. Nguồn ảnh: Sarah Pflug – Burst

Các bản vẽ hay phác thảo sẽ giúp bỏ bớt một số suy nghĩ ra giấy và tạo nhiều khoảng trống hơn cho bộ não tập trung vào những phần khó.

Hãy chọn hệ thống ký hiệu giúp bạn hiểu rõ mọi thứ hơn: diagram, flowchart….

2. Lập kế hoạch

Lập kế hoạch
“Ta có kế hoạch khi biết, hoặc ít nhất là biết sơ bộ, mình phải thực hiện những phép tính, thuật toán hoặc cấu trúc nào để tìm ra lời giải. Con đường từ hiểu vấn đề đến hình thành một kế hoạch có thể dài và quanh co. Thành tựu chính khi tìm ra giải pháp là hình thành ý tưởng về một kế hoạch.” – George Polya, How to solve it. Nguồn ảnh: ThisIsEngineering – Pexels

Giải quyết vấn đề trên giấy trước. Việc viết code luôn có vẻ dễ dàng hơn trong đầu và trở nên phức tạp hơn nhiều khi làm nó chạy được.

Đừng làm cả hai việc cùng một lúc. Đầu tiên, hãy giải quyết vấn đề. “Chạy thử” một ví dụ trên sổ hoặc trên pseudocode. Sau đó, chạy trên máy.

Bạn có biết một vấn đề liên quan?

Bạn cần biết ít nhất loại vấn đề hoặc nhóm vấn đề bạn đang giải quyết. Đối với dân phần mềm, hãy thử trả lời những câu hỏi sau:

  • Đây có phải là vấn đề kiến ​​trúc không?
  • Có những mẫu kiến ​​trúc nào thường được sử dụng trong kịch bản này không?
  • Vấn đề này có nhiều hơn ở cấp độ của một giải thuật không?
  • Có giải thuật đã được chứng minh có thể giải quyết loại vấn đề này không?

Khi có thể tìm thấy một vấn đề liên quan đến vấn đề của mình và đã được giải quyết trước đó, bạn nên ăn mừng.

Đặt tiếp câu hỏi: “Mình có thể sử dụng nó không?”

Nhiều vấn đề có thể có một số điểm chung, nhưng những vấn đề có chung các yêu cầu hoặc nền tảng cốt lõi nhất có lẽ sẽ hữu ích nhất.

Bạn có thể trình bày lại vấn đề được không?

Bạn có thể nhìn nhận vấn đề ở một góc độ khác? Có thể bỏ một phần điều kiện hoặc một số yêu cầu không? Có thể nêu vấn đề này theo một kịch bản cụ thể hơn không?

Nếu đang viết các bài test, hãy thử nghĩ đến các ví dụ đơn giản được tạo ra chỉ bởi các điều kiện cụ thể của vấn đề để tìm ra giải pháp cuối cùng, tổng quát hơn.

Điều này dẫn chúng ta đến…

Nếu không thể giải quyết vấn đề được đề xuất, hãy cố giải quyết một số vấn đề liên quan trước tiên

Hoặc một vấn đề liên quan và đơn giản hơn.

Giống như viết phần mềm hiệu quả, việc thực hiện giải quyết vấn đề hiệu quả có thể được coi là một quá trình mang tính tịnh tiến.

Đừng cố làm mọi thứ cùng một lúc.

Xây dựng code cuối cùng hoặc thậm chí là các sơ đồ và ý tưởng thiết kế hệ thống là một quá trình sẽ mang lại lợi ích rất nhiều từ việc thực hiện điều tương tự cho các vấn đề quy mô nhỏ hơn.

3. Thực hiện kế hoạch

Thực hiện kế hoạch
“Đề ra phương án, hình thành ý tưởng giải pháp không hề đơn giản. Ta cần rất nhiều yếu tố để thành công: kiến ​​thức tích lũy, thói quen tư duy, sự tập trung và may mắn. Thực hiện kế hoạch lại dễ hơn nhiều; yếu tố chủ chốt là kiên nhẫn.” – George Polya, How to solve it. Nguồn ảnh: Pixabay

Phiên bản dành cho lập trình viên của câu trên là “Nghĩ trước, code sau”. Khi đã hiểu các bước của giải thuật hoặc thiết kế hệ thống, việc triển khai sẽ dễ dàng hơn rất nhiều.

Polya cho rằng những người giải toán giỏi có khả năng kiểm tra từng bước trong giải pháp sau khi hoàn thành và chất vấn từ đầu đến cuối.

Chỉ một dòng suy nghĩ về phân tích, phép toán sai sẽ làm hỏng mọi thứ.

Điều này có vẻ không mang đến nguy hiểm tức thì trong lập trình phần mềm, nhưng nó có thể là nguy hiểm chí mạng, vì bug nghiêm trọng sẽ xuất hiện trong thời điểm tồi tệ nhất – và có thể trong trường hợp rất cụ thể.

Điều này có nghĩa là cần có phạm vi kiểm thử tốt.

Nếu không kiểm thử, bạn sẽ không chất vấn, cứ tự tin coi giải pháp của mình là hoàn hảo.

Rất hữu ích khi có tư duy “Nó sẽ có lỗi chứ?” và liên tục đưa ra tất cả các kịch bản thất bại khác nhau trong giải pháp của mình và tư duy này sẽ được thể hiện rõ trong các bài test phần mềm.

4. Nhìn lại

Nhìn lại
“Ngay cả học sinh khá giỏi, khi đã có được lời giải bài toán và viết xong các lập luận, các bạn liền đóng tập lại. Các bạn đã bỏ lỡ một giai đoạn quan trọng. Khi nhìn lại bài giải, xem xét và nhìn nhận lại kết quả và con đường dẫn đến nó, các bạn có thể củng cố kiến ​​thức và phát triển khả năng giải quyết vấn đề của mình.” – George Polya, How to solve it. Nguồn ảnh: Reshot

Không nhìn lại và đánh giá sự đánh đổi của giải pháp thường xảy ra khi mọi thứ được thực hiện trong vội vàng.

Nếu đó là một giải thuật, bạn có thể nói rõ độ phức tạp về thời gian và không gian không? Code có đọc tốt không?

Nếu đang đưa ra quyết định sẽ có tác động đến toàn hệ thống, hãy ghi ra những đánh đổi.

Dành một giờ để xem xét lại kết quả công việc sẽ giúp bạn tiết kiệm hơn rất nhiều sau này.

Bạn có thể nghỉ ngơi rồi quay lại với nó sau. Việc đắm chìm sâu vào vấn đề đang giải quyết có thể sẽ khiến bạn quên mất những chi tiết liên quan.

Ngoài ra, giải pháp cho vấn đề cụ thể đó có thể được tổng quát hóa để được sử dụng trong nhiều tình huống.

Dùng sự nhạy bén và tư duy cẩn thận để tạo ra những abstraction mới là một cách giải quyết vấn đề đó cho những người khác đối mặt với nó sau này.

Kết

Dù là một cuốn sách dạy giải toán, nhưng How to solve it của George Polya với những lời khuyên vượt thời gian của ông lại hữu ích với dân lập trình như tôi khi tập giải quyết vấn đề bởi lập trình thực sự là một quá trình sử dụng nhiều tư duy và kỹ năng giải quyết vấn đề hiệu quả.

Theo Douglas Navarro

Categories
Gambaru News

5 Xu hướng phát triển phần mềm cần năm 2021

Làm việc từ xa và giãn cách xã hội ảnh hưởng lớn đến hầu hết mọi người; song khi nói đến chuyển đổi kỹ thuật số và phần mềm, mọi thứ vẫn diễn ra sôi nổi hơn bao giờ hết.

Đại dịch đã buộc rất nhiều doanh nghiệp phải thay đổi và thích ứng sự hiện diện trực tuyến của mình bằng cách này hay cách khác.

Đồng thời, các dịch vụ phát triển phần mềm trở nên ngày càng quan trọng.

Đây là lý do tại sao việc cập nhật các xu hướng hiện tại đang diễn ra trong ngành là vô cùng cần thiết.

5 Xu hướng phát triển phần mềm thống trị năm 2021

Dưới đây là một số xu hướng dự đoán sẽ thống trị lĩnh vực phát triển phần mềm cho năm 2021. Hãy cùng Gambaru cập nhật và thảo luận!

1. Điện toán không máy chủ (Serverless Architecture)

Serverless Architecture
Serverless Architecture. Ảnh: AWS Amazon

Điện toán không máy chủ là sự kết hợp của Chức năng như một Dịch vụ (stateless Function as a Service – FasS), chẳng hạn như AWS Lambda và Máy chủ lưu trữ như một Dịch vụ (stateful storage Backend as a Service – BaaS), chẳng hạn như AWS S3.

“Theo định nghĩa của chúng tôi, một dịch vụ được coi là không có máy chủ khi nó cho phép thanh toán dựa trên mức độ sử dụng, tự động mở rộng quy mô mà không cần cấp quyền thủ công.”

– A Berkeley View on Serverless Computing
  • Điện toán không máy chủ là nơi các dịch vụ đám mây được quản lý hoàn toàn. Nó cho phép ta viết code để phát triển ứng dụng mà không cần quản lý hoặc duy trì các cơ sở hạ tầng, chẳng hạn như máy chủ.
  • Điện toán không máy chủ hỗ trợ phương thức thanh toán: dùng bao nhiêu thanh toán bấy nhiêu. So với các nền tảng điện toán truyền thống, điện toán không máy chủ cho phép người dùng lựa chọn phương thức thanh toán dựa trên các tình huống cụ thể, giúp giảm chi phí.
  • Điện toán không máy chủ hướng đến ứng dụng, khác với các nền tảng điện toán hướng đến tài nguyên, chẳng hạn như các máy ảo và container.

Tham khảo sơ đồ kiến ​​trúc của một ứng dụng không máy chủ 100% để biết thêm cách thức hoạt động.

2. Framework đa nền tảng (Multi-Platform Frameworks)

Với lập trình đa nền tảng, cùng một đoạn code sẽ có khả năng chạy được trên nhiều nền tảng khác nhau.

Đa nền tảng ngày càng trở nên phổ biến vì ta có thể sử dụng lại rất nhiều code của dev và các công việc khác.

Ví dụ, một ứng dụng có thể dùng Kotlin/JVM cho back-end và Kotlin/JS cho front-end.

Điều này mang đến một số lợi ích: ngoài cú pháp, nó còn cho phép chia sẻ library và paradigm (chẳng hạn như sử dụng coroutines), trên cả front-endback-end.

Sử dụng Kotlin cũng giúp viết các lớp và hàm có thể được sử dụng cho cả JVM và JS.

Ta còn có thể sử dụng KMM (Kotlin Multiplatform Mobile) để tạo một ứng dụng di động hoạt động trên cả iOS và Android!

Kotlin Multiplatform Mobile
Kotlin Multiplatform Mobile. Nguồn ảnh: Kotlin
Phát triển ứng dụng hoàn chỉnh mà chỉ sử dụng 1 ngôn ngữ lập trình
Ta hoàn toàn có thể phát triển một ứng dụng hoàn chỉnh chỉ sử dụng một ngôn ngữ lập trình. Nguồn ảnh: Freepik

3. Công nghệ Low-Code/No-Code

Lập trình low-code cho phép doanh nghiệp nhanh chóng xây dựng và triển khai các ứng dụng phần mềm mà không cần đến một lập trình viên chuyên nghiệp.

Thay vì viết từng dòng code cho một ứng dụng nhất định, người dùng của nền tảng low code hoặc no code có thể xây dựng các dự án bằng giao diện point-and-click.

Bằng cách này, doanh nghiệp có thể tạo website từ các building block được lập trình sẵn, thiết lập trao đổi dữ liệu với các giải pháp CRM, bổ sung tính năng thanh toán trực tuyến qua Stripe và thậm chí thu thập phản hồi của khách hàng qua Google Forms hoặc một nhà cung cấp khác.

Công nghệ Low Code / No Code
Các doanh nghiệp có thể tiết kiệm thời gian và nguồn lực với công nghệ low code/no code. Ảnh: Rawpixel

Gartner dự đoán rằng hơn một nửa số doanh nghiệp vừa đến lớn sẽ áp dụng các nền tảng ứng dụng low-code trong vòng hai năm tới.

Các công cụ như Salesforce Flow Builder giúp người dùng tạo quy trình làm việc kỹ thuật số từ đầu đến cuối.

Công cụ này cũng tự động hóa các quy trình.

Nó có các thành phần và dịch vụ để người dùng lựa chọn và sử dụng lại.

Cộng đồng các nhà phát triển ứng dụng của Salesforce Flow Builder là một cộng đồng lớn, được hỗ trợ tích cực.

4. Sự thống trị của Native App

Sự thống trị của Native app
Native App mang đến trải nghiệm người dùng xuất sắc. Ảnh: cottonbro – Pexels

Trước xu hướng cross-platform và sự nổi lên của Flutter hiện nay, sẽ thật lạ khi tôi đưa ra dự đoán trên; nhưng quả thực, khi nói đến việc cung cấp trải nghiệm người dùng tốt hơn và hiệu suất mạnh mẽ hơn, bạn phải sử dụng native app.

Ngày càng có nhiều doanh nghiệp đầu tư vào các ứng dụng gốc cho iOS và Android để mang đến cho người dùng trải nghiệm xuất sắc.

Tuy nhiên, tôi thực sự cảm thấy rằng Flutter có một tương lai rất hứa hẹn. Flutter đã có cú chạy đà tốt và kết quả rất khả quan.

Tham khảo thêm bài so sánh chuyên sâu về Flutter và các ứng dụng gốc tại đây.

Nếu là dev về native app và chịu khó học thêm về Flutter thì bạn sẽ càng có nhiều lợi thế.

Với sự thống trị ngày càng tăng của hệ điều hành iOS và Android trên thị trường, việc đầu tư vào phát triển ứng dụng dường như khó mà suy giảm.

5. AI và ML

Artificial Intelligence – trí tuệ nhân tạoMachine Learning – học máy đã trở thành tâm điểm nóng trong một thời gian dài – và sẽ tiếp tục như vậy vì rất nhiều tiềm năng khả thi chúng mang lại.

AI và Machine Learning
Tiềm năng vô hạn từ Artificial Intelligence và Machine Learning. Nguồn ảnh: Alex Knight – Unsplash

Chúng ta chỉ mới bắt đầu khám phá các khả năng đó mà thôi.

Ví dụ, ta đang hướng tới một tương lai với xe hơi không người lái, hay sử dụng drone không người lái để giám sát tình hình giãn cách xã hội trong thời kỳ đại dịch.

Klarna, một trong những start-up kỳ lân lớn nhất châu Âu, đã sử dụng AI và ML để cá nhân hóa trải nghiệm thanh toán cho khách hàng.

Các công cụ và nền tảng AI đã sẵn sàng để giúp các doanh nghiệp nắm bắt cách khách hàng của mình đang thích ứng ra sao với thực tại mới hậu đại dịch.

“Nghiên cứu AI mới nhất của chúng tôi cho thấy 86% doanh nghiệp hiện đang gặt hái được những lợi ích từ trải nghiệm khách hàng tốt hơn thông qua AI và 25% doanh nghiệp áp dụng AI sẽ có doanh thu tăng trong năm 2021 nhờ vào công nghệ này. Đại dịch COVID-19 đã hé mở những giá trị của AI, hoàn toàn phù hợp với việc cải thiện các nhiệm vụ liên quan đến lập kế hoạch nguồn nhân lực, lập mô phỏng và dự báo nhu cầu.”

– Rohan Amin, CIO của Chase

Trong năm 2021 này, khả năng bổ sung các năng lực AI tiên tiến vào các dự án và quy trình kinh doanh sẽ là cực kỳ quan trọng đối với các doanh nghiệp, đặc biệt với doanh nghiệp mong muốn đạt được những bước tiến đột phá trong ngành.

Tham khảo:

  1. Kotlin MPP
  2. Gartner report
  3. Serverless days 2020

Theo Manish Jain

Categories
Dev's Corner

20 năm Tuyên ngôn Agile

Tháng 2 năm 2021 tròn đúng kỷ niệm 20 năm Tuyên ngôn phát triển Phần mềm Agile – một cuộc cách mạng trên thị trường phần mềm và có tầm ảnh hưởng trên nhiều ngành nghề.

Tuyên ngôn phát triển phần mềm Agile
Tuyên ngôn phát triển phần mềm Agile

Ngay cả khi bản tuyên ngôn không thay đổi, việc áp dụng cách hiểu của nó cũng khác nhau ở mỗi nơi.

Trong bài viết này, chúng ta sẽ xem xét khái niệm về Agile, những thực tiễn đã thay đổi theo thời gian và hướng đi của nó trong một thế giới đang thay đổi.

Tuyên ngôn Agile

Phát triển phần mềm theo Agile
Phát triển phần mềm theo Agile

Chúng tôi đã tìm ra được những cách thức phát triển phần mềm tốt hơn bằng cách thực hiện và giúp đỡ người khác áp dụng chúng. Qua đó, chúng tôi đánh giá cao:

  • Cá nhân và sự tương tác hơn là quy trình và công cụ
  • Phần mềm hoạt động tốt hơn là tài liệu đầy đủ
  • Sự cộng tác với khách hàng hơn là đàm phán hợp đồng
  • Phản hồi trước thay đổi hơn là bám sát kế hoạch.

Mặc dù những hạng mục bên phải có giá trị của chúng, chúng tôi vẫn đánh giá cao những hạng mục ở bên trái hơn.

12 Nguyên tắc Agile

12 nguyên tắc Agile.
12 nguyên tắc Agile. Ảnh: Unsplash
  1. Làm hài lòng khách hàng thông qua việc chuyển giao sớm và liên tục phần mềm có giá trị là ưu tiên cao nhất.
  2. Đón nhận những thay đổi trong yêu cầu, thậm chí thay đổi muộn trong quá trình phát triển. Các quy trình Agile khai thác những thay đổi vì lợi thế cạnh tranh của khách hàng.
  3. Thường xuyên chuyển giao phần mềm hoạt động tốt tới khách hàng, từ vài tuần đến vài tháng, khoảng thời gian càng ngắn càng tốt.
  4. Đội ngũ business và đội ngũ lập trình phải cùng làm việc hàng ngày xuyên suốt dự án.
  5. Xây dựng dự án với những cá nhân có động lực cao. Mang đến cho họ môi trường và sự hỗ trợ cần thiết, đồng thời tin tưởng họ có thể hoàn thành tốt công việc.
  6. Phương pháp hiệu quả nhất để truyền đạt thông tin là đối thoại trực tiếp.
  7. Phần mềm hoạt động tốt là thước đo chính của tiến độ dự án.
  8. Các quy trình Agile thúc đẩy phát triển bền vững. Các nhà đầu tư, lập trình viên, và người dùng nên luôn duy trì nhịp độ phát triển liên tục.
  9. Liên tục quan tâm đến các công nghệ và thiết kế tiên tiến để gia tăng tính linh hoạt.
  10. Sự đơn giản – nghệ thuật tối đa hóa lượng công việc chưa hoàn thành – là vô cùng quan trọng.
  11. Các kiến ​​trúc, yêu cầu, và thiết kế tốt nhất được tạo ra bởi các team tự quản.
  12. Theo định kỳ, đội ngũ phát triển cùng nghiệm lại cách làm việc hiệu quả hơn, sau đó sẽ điều chỉnh và thay đổi hành vi cho phù hợp.

Những thay đổi trong quy trình phát triển phần mềm Agile

Trong một thế giới đang thay đổi, kỳ vọng về phần mềm ngày càng tăng và lập trình viên độc lập nay đã được thay thế bằng nguyên một đội ngũ lập trình.

Giao tiếp và điều phối trong phát triển phần mềm ngày càng phức tạp
Giao tiếp và điều phối trong phát triển phần mềm ngày càng phức tạp, nên việc bám sát phương pháp truyền thống không còn là lựa chọn tối ưu. Ảnh: Burst

Trong bài “20 Jahre Agiles Manifest – Deftiv den Kinderschuhen entwachsen”, Jutta Eckstein (business coach, change manager) đưa ra danh sách những thay đổi về phát triển phần mềm theo Agile. Trích đoạn:

  • Nếu team đảm bảo rằng các story luôn có cùng size thì việc estimate từng story sẽ không cần thiết nữa.
  • Trong một thời gian dài, các story chỉ được công nhận nếu chúng tương ứng với format Connextra (“As a …, I want …, so …”). Thay vào đó, giờ đây, các story chỉ đóng vai trò như một loại ghi nhớ cho một cuộc hội thoại về nội dung của story (và không có format cho các bản ghi nhớ hội thoại).
  • Flow ngày càng trở nên quan trọng. Điều này bao gồm thực tế là các sprint hay iteration thường không còn đóng vai trò quan trọng nữa. Điều này có nghĩa là các team không lập kế hoạch hai tuần một lần, mà phối hợp hàng ngày theo Kanban những gì có thể hoàn thành và những gì được bổ sung sau từ backlog. Như vậy, việc lập kế hoạch, phản ánh và điều chỉnh có tính liên tục hơn.
  • Với sự gia tăng của tốc độ phát triển phần mềm, những trào lưu mới như DevOps đã góp phần tạo ra một cách nhìn tốt hơn về phát triển phần mềm trong một bối cảnh rộng hơn. Tuy nhiên, không phải lúc nào người ta cũng hiểu được ý tưởng cơ bản của DevOps. Ngày càng có nhiều công ty đặt đội ngũ DevOps bên cạnh đội ngũ phát triển hoặc đảm nhiệm vai trò kỹ sư DevOps. Họ bỏ qua thực tế rằng DevOps là một thái độ, một văn hóa chứ không phải một chức năng, vai trò hay nhiệm vụ đặc biệt.

Jutta Eckstein bổ sung rằng một vài phương pháp vốn là cơ sở của bản tuyên ngôn vẫn còn đóng một vai trò nhất định ở thời điểm hiện tại.

Ví dụ: crystal method (tập trung vào cá nhân và sự tương tác) hoặc phát triển phần mềm mang tính thích ứng.

Extreme Programming (XP) phát triển trong những năm gần đây vì người sáng lập Kent Beck đã quay trở lại sau khi ông vắng bóng trong nhiều năm vì lý do cá nhân.

Cũng cần lưu ý rằng có một sự thiển cận trong nguyên tắc thứ 3 của Tuyên ngôn Agile khi giới hạn tần suất chuyển giao phần mềm xuống còn “một vài tuần” nhưng DevOps và chu kỳ continuous delivery ngày nay cho phép chúng ta release nhiều phần mềm trong một ngày.

Uncle Bob (Robert Cecil Martin) trả lời cho điểm này như sau:

“Vào thời điểm năm 2001, chúng tôi không thể tưởng tượng sẽ làm được gì nhanh hơn vài tuần. Tom Gilb là người duy nhất trong cộng đồng có thể làm được, nhưng ông ấy không có mặt tại cuộc họp. Chúng tôi nghĩ rằng hai tuần là giới hạn thấp hơn và không ai bận tâm đến việc chất vấn điều này, và rõ ràng đây là điểm thiển cận”.

Tương lai của Agile

Agile không còn chỉ được hiểu trong bối cảnh phát triển phần mềm nữa.

Chúng ta có “Scaling Agile” với niềm tin rằng toàn bộ tổ chức cần hoạt động theo các nguyên tắc Agile.

Agile trong doanh nghiệp hiện là một chủ đề ngày càng nhận được nhiều quan tâm và động lực.

Để áp dụng Agile vào các quy trình truyền thống của doanh nghiệp, Bjarte Bogsnes nhấn mạnh một thách thức lớn trong bài “Chuyển đổi Agile và hiện tượng con voi trong phòng” (tựa gốc: Agile Transformation and the Elephant in the Room).

“Thật khó để mở rộng quy mô Agile bằng cách sử dụng cùng một framework và cùng một ngôn ngữ đã hoạt động rất tốt để chuyển đổi phát triển phần mềm. Đối với các giám đốc điều hành, “Scrum” nghe có vẻ giống như một căn bệnh ngoài da, “Sprint” không chỉ việc chạy nhanh hơn, “Slack” không phải nói về sự lười biếng, còn “continuous delivery” không phải là chỉ đến một dây chuyền lắp ráp hiệu quả.
Chúng ta cần một bản dịch, một thứ giúp ban điều hành doanh nghiệp hiểu rõ hơn ý nghĩa của Agile ở cấp độ kinh doanh. Agile trong doanh nghiệp thực sự có ý nghĩa gì trong thực tế?”

Theo Bogsnes, “con voi trong phòng” (một điều hiển nhiên nhưng ai cũng lờ đi) chính là quy trình lập ngân sách.

Vì trước giờ đây được coi là quy luật kinh doanh rồi, nên khó mà thay đổi nó. Nếu nó không được thay đổi, bất kỳ sự chuyển đổi theo hướng Agile nào cũng sẽ gặp khó khăn.

“Quy trình lập ngân sách có lẽ là rào cản cơ bản nhất đối với sự chuyển đổi Agile. Ngân sách hàng năm, quá trình lập ngân sách, và tư duy đằng sau nó đều là phản đề của Agile theo nhiều khía cạnh. Lập ngân sách được xây dựng dựa trên hai giả định cơ bản: tương lai có thể dự đoán được và không thể tin ai được. Còn gì ngược với Agile hơn chứ?”


Nhiều tổ chức trên khắp thế giới đã giải quyết vấn đề này và bổ sung nguyên lý Agile cho các quy trình trong doanh nghiệp bằng cách tuân theo 12 nguyên tắc bên cạnh việc lập ngân sách theo Bjarte Bogsnes.

Thay vì được sử dụng theo nghĩa hẹp của nó là lập kế hoạch và kiểm soát, “ngân sách” có thể là văn hóa lãnh đạo và hệ thống quản lý hiệu suất.

12 nguyên tắc bên cạnh việc lập ngân sách doanh nghiệp theo Agile.
12 nguyên tắc bên cạnh việc lập ngân sách doanh nghiệp theo Agile. Ảnh: Agile Alliance
12 nguyên tắc bên cạnh việc lập ngân sách doanh nghiệp theo Agile (tiếng Việt)
12 nguyên tắc bên cạnh việc lập ngân sách doanh nghiệp theo Agile (tiếng Việt)

Theo Agilemanifesto.org & Rakia Ben Sassi

Categories
Dev's Corner

8 Extension Visual Studio Code mọi developer phải có

Visual Studio Code là một trong những trình soạn thảo code phổ biến và được sử dụng rộng rãi nhất. Nó cũng đi kèm với rất nhiều tính năng miễn phí so với các code editor khác.

Hãy thử tải về các tiện ích mở rộng trên VS Code và bạn sẽ thấy thêm một khía cạnh khác ở các tính năng tuyệt vời này.

8 Extension Visual Studio Code

1. Turbo Console Log

Turbo Console Log là một tiện ích mở rộng xuất sắc cho việc debug.

Tiện ích mở rộng này giúp debug dễ dàng hơn bằng cách tự động hóa quá trình viết log message có ý nghĩa.

Tự động chèn log message có ý nghĩa với hai bước sau:

  • Chọn biến là chủ đề debug
  • Nhấn Ctrl + Alt + L
Turbo Console Log
Turbo Console Log. Ảnh: Medium

2. Import cost

Tốc độ là yếu tố quan trọng cho trang web. Nếu trang web hoặc ứng dụng không thể tải nhanh, thì chẳng phải có cũng như không sao.

Tiện ích mở rộng này hiển thị kích cỡ import. Bằng cách này, bạn sẽ biết khối lượng sẽ tải xuống và tìm ra nguyên nhân ứng dụng hoạt động chậm.

Với tiện ích mở rộng này, bạn có thể quyết định xem mình nên viết một function hay import toàn bộ bundle.

Import cost
Import cost

3. Prettier

Prettier dành cho tất cả mọi dev viết Python, JavaScript hoặc bất kỳ ngôn ngữ lập trình nào khác.

Cái tên nói lên tất cả, tiện ích này làm cho code đẹp hơn lên.

Cá nhân tôi rất tệ trong việc giữ cho các dòng, khoảng cách và tab bằng nhau. Do vậy, code của tôi nhìn rất lộn xộn.

Với Prettier, ngay sau khi nhấn tổ hợp lệnh + S, bạn sẽ chứng kiến điều kỳ diệu xảy ra. Tất cả code sẽ có khoảng cách chính xác và đều tăm tắp, khoảng cách các dòng cũng sẽ thống nhất.

Không ai có thể nhận ra bạn là người lộn xộn như thế nào 😐.

Prettier
Prettier. Ảnh: Medium

4. Bracket pair colorizer

Đã bao nhiêu lần xảy ra trường hợp khi chỉnh sửa code JavaScript, bạn luôn gặp khó khăn khi tìm dấu đóng mở ngoặc?

Đừng lãng phí thêm thời gian nữa chứ! Dùng tiện ích này, các dấu mở và đóng ngoặc sẽ được tô màu giống nhau và mọi việc sẽ dễ thở hơn hẳn.

Bracket pair colorizer
Bracket pair colorizer. ẢNh: Medium

5. Live share

Live share là một tiện ích mở rộng tuyệt vời để code cùng bạn bè và team.

Live share cho phép điều khiển từ xa trình soạn thảo VS code, các tệp đã mở. Một người khác có thể thay đổi và lưu code; vì vậy, giờ đây bạn có thể nhận được mọi trợ giúp từ xa.

Một tính năng khác là bạn có thể code real-time, biết ai đang type và type gì. Bên cạnh đó, nó cũng cấp quyền truy cập vào localhost và thiết bị đầu cuối.

Bonus: Bạn còn có thể tải xuống tiện ích mở rộng âm thanh Live share, bổ sung khả năng gọi âm thanh cực đỉnh. Với các dự án làm việc từ xa, đây quả là một extension miễn phí không thể hoàn hảo hơn!

6. Projects

Nếu bạn đang làm nhiều dự án cùng một lúc thì việc chuyển đổi giữa các folder quả rất khó, khi phải điều hướng đến folder cần thiết phải không.

Projects có thể hoạt động như một tab yêu thích của bạn.

Ví dụ: bạn có thể lưu trữ CSS và bootstrap tùy chỉnh trong một folder và sử dụng Projects để điều hướng giữa các folder một cách nhanh chóng.

Projects
Projects. Ảnh: Medium

7. Settings Sync

Tiện ích mở rộng này giúp lưu trữ tất cả bản sao lưu cài đặt của bạn trong GitHub. Bằng cách này, bạn có thể có các cài đặt giống nhau cho nhiều thiết bị hoặc các thiết bị mới của mình. Bất kỳ thay đổi nào đều được đồng bộ hóa liền mạch.

Setting Sync cho phép đồng bộ hóa hầu như là mọi thứ bạn tùy chỉnh trên VS Code sang Github, từ việc cài đặt phím tắt cho đến các tiện ích mở rộng VS Code khác.

8. JavaScript (ES6) Code Snippets

VS Code đi kèm với JS IntelliSense tích hợp sẵn, nhưng JS Code Snippets nâng cao trải nghiệm này hơn nữa bằng cách thêm các đoạn JavaScript snippet được tạo sẵn, chứa các đoạn code được sử dụng phổ biến nhất. Hãy nói tạm biệt việc liên tục lặp lại đoạn code! 🙌

Tiện ích mở rộng này hỗ trợ JS, TypeScript, JS React, TS React, HTML và Vue.

JavaScript (ES6) Code Snippets
JavaScript (ES6) Code Snippets. Ảnh: Medium

Còn extension nào mà bạn thấy hữu ích nữa không nhỉ? Hãy comment cho cộng đồng Gambaru biết nhé!

Theo Ali Haider

Categories
Dev's Corner

5 Giá trị của Scrum và cách Scrum Master làm việc

5 Giá trị của Scrum

Scrum là công cụ tạo nên thành công của rất nhiều team trong suốt nhiều năm nay và có thể nói, yếu tố thành công chủ yếu xoay quanh 5 giá trị của Scrum.

Tôi sẽ kể cho các bạn về khoảng thời gian tôi tham gia nhóm nhảy trường trung học nhé.

Trải nghiệm này liên quan ra sao đến Scrum nhỉ? Gambaru sẽ cùng bạn kết nối dữ kiện và hướng đến 5 giá trị cốt lõi và cực kỳ thực tế của Scrum.

5 Giá trị của Scrum và cách Scrum master làm việc
5 Giá trị của Scrum và cách Scrum master làm việc

1. Can đảm

Trong nhóm nhảy, chúng tôi là một nhóm theo đuổi nhiều phong cách khác nhau.

Tôi nhớ có lần một số chị lớp trên đã lên tiếng và đề xuất một số thay đổi cho bài nhảy giáo viên đã chuẩn bị trước đó, sao cho phù hợp hơn với phong cách khiêu vũ cổ điển.

Các thành viên của một Scrum Team có lòng can đảm để làm những gì phải làm và giải quyết những thách thức khó khăn - The Scrum Guide.
Các thành viên của một Scrum Team có lòng can đảm để làm những gì phải làm và giải quyết những thách thức khó khăn – The Scrum Guide. Ảnh: Pexels

Điều gì xảy ra tiếp theo?

Một số bước nhảy đã được điều chỉnh. Hậu bối chúng tôi lúc đó mới nhận ra rằng bạn có thể nói ra suy nghĩ của mình và điều đó thực sự đã giúp cả nhóm gắn kết tốt hơn.

Tương tự, Scrum Team cần sẵn sàng dũng cảm áp dụng văn hóa phê bình mang tính xây dựng và giao tiếp cởi mở.

Bạn có thể làm gì với tư cách là một Scrum Master?

  • Giúp đỡ team – Nếu thành viên trong team chuẩn bị thực hiện một task mới, hãy hướng dẫn họ nếu họ cần giúp đỡ. Khuyến khích, động viên team trở thành một không gian an toàn để mọi người không cảm thấy có trở ngại trong việc yêu cầu hỗ trợ.
  • Hãy tự xây dựng lòng can đảm – Hãy làm gương. Hãy đứng lên bảo vệ lẫn nhau nếu cảm thấy team mình đang gặp áp lực hoặc tinh thần đội nhóm đang đi xuống.

2. Tập trung

Vì các cuộc thi thay đổi chủ đề và phong cách liên tục, chúng tôi phải chuẩn bị các điệu nhảy trong thời gian ngắn và chuẩn bị/biểu diễn chúng với khả năng tốt nhất của mình.

“Hãy luôn nhớ rằng, sự tập trung sẽ quyết định thực tại của bạn.” - George Lucas.
“Hãy luôn nhớ rằng, sự tập trung sẽ quyết định thực tại của bạn.” – George Lucas. Ảnh: Paul Skorupskas – Unsplash

Trong Sprint theo khung thời gian cố định (time-boxed Sprint), team cần phải tập trung vào các mục tiêu đã đặt ra ban đầu.

Bạn có thể làm gì với tư cách là một Scrum Master?

  • Điều phối – Hướng dẫn team bạn giới hạn lại số lượng task và mức độ ưu tiên cho mỗi người trong một Sprint để đảm bảo mọi thành viên đều tập trung.
  • Nhắc lại trọng tâm trong Daily Scrum – Thảo luận với team làm thế nào để cả nhóm đạt được mục tiêu.

3. Cam kết

Cam kết là điều đã thúc đẩy nhóm nhảy của chúng tôi.

Chúng tôi đều có chung mong muốn giành được danh hiệu cấp khu vực và tất cả mọi người đều cam kết thực hiện mục tiêu trên.

“Các cá nhân cần cam kết đạt được các mục tiêu của Scrum Team.” - The Scrum Guide.
“Các cá nhân cần cam kết đạt được các mục tiêu của Scrum Team.” – The Scrum Guide. Ảnh: freepik

Ở mỗi buổi biểu diễn, chúng tôi phải cố gắng hết sức và làm việc cùng nhau.

Chúng tôi phải nghĩ làm thế nào để mang đến màn trình diễn tốt nhất với tư cách là một nhóm nhảy và đồng thời cũng phải trình diễn đạt nhất có thể với tư cách vũ công cá nhân.

Các thành viên một Scrum Team nên cam kết hướng đến tầm nhìn của team và cùng nhau tạo ra các mục tiêu thực tế.

Các team nhỏ trong Scrum Team cần duy trì cam kết với Mục tiêu Sprint và tự tổ chức để đạt được các mục tiêu này trong thời gian Sprint đề ra.

Bạn có thể làm gì với tư cách là một Scrum Master?

  • Điều phối Sprint Planning – Đảm bảo rằng team mình cảm thấy thoải mái với việc lập kế hoạch và có phạm vi để giải quyết các lỗi hay vấn đề trong quá trình thực hiện.
  • Bảo vệ nhóm trước việc phạm vi dự án bị thay đổi, vượt phạm vi (scope creeps/changes) – Là Scrum Master, hãy bảo vệ team khỏi những thay đổi không mong muốn trong Sprint, những thay đổi về Mục tiêu Sprint và cả áp lực không đáng có từ Product Owner.

4. Tôn trọng

Là một team, để thực hiện hết khả năng của mình, chúng ta cần làm việc như một nhóm duy nhất và điều đó chỉ có thể xảy ra nếu có sự tôn trọng lẫn nhau.

"Không ai trong chúng ta thông minh bằng tất cả chúng ta." - Ken Blanchard, Tác giả sách Vị giám đốc một phút.
“Không ai trong chúng ta thông minh bằng tất cả chúng ta.” – Ken Blanchard, Tác giả sách Vị giám đốc một phút. Ảnh: Matthew Henry – Burst

Trong Scrum Team, tôn trọng có nghĩa là tin tưởng các thành viên hoàn thành nhiệm vụ của họ, lắng nghe và xem xét ý tưởng của mọi người cũng như công nhận thành tích của nhau.

Bạn có thể làm gì với tư cách là một Scrum Master?

  • Ăn mừng các thành tựu – Là một team, hãy cùng ăn mừng thành tích lớn nhỏ của nhau.
  • Tôn trọng các cá nhân – Cho các thành viên không gian riêng của mình và tôn trọng những đóng góp của họ cho cả team.

5. Cởi mở

Khi học một bài nhảy mới, nếu ai trong nhóm gặp khó khăn, chúng tôi thường trao đổi, nói chuyện sớm nhất để có thể học và giải quyết mọi vấn đề sớm nhất.

“Scrum Team và các bên liên quan đồng ý cởi mở về tất cả công việc và những thách thức khi thực hiện công việc.” - The Scrum Guide
“Scrum Team và các bên liên quan đồng ý cởi mở về tất cả công việc và những thách thức khi thực hiện công việc.” – The Scrum Guide. Ảnh: Reshot

Khi các thành viên của một Scrum Team sớm nói về những trở ngại họ đang gặp phải, họ có xác suất quyết tâm và tiến bộ cao hơn.

Bạn có thể làm gì với tư cách là một Scrum Master?

  • Hãy trung thực – Điều này phải bắt đầu từ bạn, hãy có những buổi trò chuyện trung thực với cả nhóm.
  • Hãy là tấm lưới an toàn – Là một Scrum Master, hãy tập quan sát những điểm đang gặp vấn đề. Nếu thấy các vấn đề không được đề cập trong các buổi stand-up chẳng hạn, hãy hỏi các thành viên trong team xem họ có đang đi đúng hướng không.

Bạn nghĩ gì về 5 giá trị Scrum này? Mời các Scrum Master tài năng chia sẻ thêm những kinh nghiệm của riêng các bạn ở phần comment phía dưới cho cả cộng đồng Gambaru học hỏi thêm nhé!

Theo Rishika Mittal

Categories
Dev's Corner

Tại sao lập trình viên không thể estimate thời gian hiệu quả?

Hãy cùng Gambaru xem xét một cách tiếp cận thống kê để giải thích tại sao nhiều dự án công nghệ lại trễ hạn.

Cho dù bạn là lập trình viên junior, senior, quản lý dự án hay quản lý cấp cao với 20 năm kinh nghiệm, việc ước lượng thời gian trong các dự án phần mềm không bao giờ là dễ dàng.

Không ai dù có kinh nghiệm hay thiên tài đến đâu luôn có thể dõng dạc tuyên bố mình biết chắc chắn các mốc thời hạn chính xác của một dự án phần mềm cả
Không ai dù có kinh nghiệm hay thiên tài đến đâu luôn có thể dõng dạc tuyên bố mình biết chắc chắn các mốc thời hạn chính xác của một dự án phần mềm cả. Ảnh: Medium

Tổng quan

Trước tiên, hãy nhìn tổng thể vào vấn đề, hậu quả và nguyên nhân gốc rễ tiềm ẩn.

Vấn đề

Các dự án phần mềm hiếm khi đáp ứng đúng thời hạn.

Hậu quả

Các nỗ lực tiếp thị bị lãng phí, khách hàng không hài lòng, lập trình viên gặp áp lực có thể viết code chất lượng kém để chạy kịp deadline, khiến độ tin cậy của sản phẩm bị ảnh hưởng, và cuối cùng, các dự án hoàn toàn có thể bị hủy.

Các nguyên nhân đã được biết

  • Estimate thời gian sai (trọng tâm của bài viết này).
  • Yêu cầu không rõ ràng khi bắt đầu dự án và các yêu cầu thay đổi ở những giai đoạn sau.
  • Hội chứng “dát vàng” (gold plating): quá chú ý đến những chi tiết ngoài phạm vi công việc.
  • Không dành đủ hoặc mất quá nhiều thời gian cho giai đoạn nghiên cứu và thiết kế kiến ​​trúc.
  • Bỏ qua các vấn đề tiềm ẩn liên quan đến sự tích hợp của bên thứ ba.
  • Mong muốn “làm đúng ngay lần đầu tiên”.
  • Thực hiện quá nhiều dự án cùng một lúc hoặc bị phân tâm (thường xuyên phá vỡ quy trình).
  • Quy mô chất lượng-số lượng không cân bằng.

Lạc quan quá mức, Hiệu ứng Dunning-Kruger, Yếu tố bất định hay Tất cả chỉ là toán?

Hãy thử điểm qua các giả thuyết
Hãy thử điểm qua các giả thuyết! Ảnh: Unsplash
  • Thật dễ để loại bỏ giả thuyết về việc lạc quan quá mức chỉ vì một lẽ thường thấy rằng không có lập trình viên nào từng vật vã với deadline lại lạc quan khi đặt ra thời hạn làm task. Còn tình huống khi việc quản lý dự án đến từ người không có nền tảng kỹ thuật và họ đặt ra thời hạn mà không biết mình đang làm gì lại là một vấn đề hoàn toàn khác nằm ngoài phạm vi của bài viết này.
  • Một số cũng cho rằng việc ước lượng thời gian kém là do hiệu ứng Dunning-Kruger (đánh giá năng lực của bản thân cao hơn thực tế). Tuy nhiên, nếu việc thiếu kinh nghiệm hoặc đánh giá quá cao khả năng của một người là nguyên nhân dẫn đến đánh giá thấp thời gian, vậy có phải nhiều kinh nghiệm hơn sẽ giảm bớt vấn đề không? Thực tế, các công ty lớn với nhiều nguồn lực vẫn có tỷ lệ trễ deadline cao choáng váng, do đó giả thuyết này bị loại bỏ. 
  • Hầu hết các lập trình viên, đặc biệt là lập trình viên có kinh nghiệm, nhanh chóng kết luận cho yếu tố bất định. Theo họ, việc ước lượng thời gian sẽ luôn sai, “cuộc sống mà”, và điều duy nhất ta có thể làm là cố gắng đáp ứng yêu cầu khách hàng và bảo team lập trình “thôi ráng thêm xíu nữa” khi có sự cố. Tất cả chúng ta đều quen thuộc với những căng thẳng, code lỗi và sự hỗn loạn ở kịch bản này.

Đây có thực sự là cách tốt nhất mà ta có thể hoàn thành công việc không? Chà, tôi không nghĩ vậy và đó là khi tôi bắt đầu cố tìm ra một lời giải thích có tính toán học hợp lý về lý do tại sao những người thông minh như kỹ sư phần mềm không thể ước lượng thời gian hiệu quả được.

Nó chỉ là toán thôi!

3 giả thuyết đã bị loại!
3 giả thuyết đã bị loại!

Ngày nọ, tôi thực hiện một task lẽ ra chỉ mất 10 phút nhưng rốt cuộc nó tốn mất 2 giờ. Tôi bắt đầu suy ngẫm về lý do tại sao.

  • Tôi nghĩ sẽ mất 10 phút vì thực tế trong đầu đã biết 100% đoạn code mình cần viết.
  • Sau đó, nó ngốn mất của tôi đến 2 giờ vì có bug trong framework mà tôi hoàn toàn không biết.

Trong quản lý dự án, điều này được gọi là force majeure (sự kiện bất khả kháng): các nguyên nhân bên ngoài không thể kiểm soát được gây nên chậm trễ.

Đến đây bạn có thể nghĩ rằng tôi đang chứng minh cho giả thuyết các yếu tố bất định với kịch bản này. Đúng và Sai. Hãy nhìn rộng hơn một chút.

Sự bất định là nguyên nhân gốc rễ cho sự chậm trễ của task này bởi vì tôi sẽ không bao giờ đoán trước được có bug đó. Nhưng có nên cho đó là lý do dẫn đến sự chậm trễ của toàn bộ dự án?

Đến đây, ta cần phân biệt được rằng một task đơn lẻ không phải đại diện cho toàn bộ dự án và ngược lại.

Cách chúng ta “thường” ước lượng thời gian

  • Mean (giá trị trung bình)
  • Median (giá trị trung vị): giá trị tách giữa nửa lớn hơn và nửa bé hơn của một mẫu.
  • Mode (giá trị yếu vị): giá trị thường xuyên xuất hiện nhiều nhất.
Phân phối chuẩn (đường cong hình chuông)
Phân phối chuẩn (đường cong hình chuông)

Phân phối chuẩn

Phân phối chuẩn (normal distribution) rất phổ biến và bộ não người đã khá quen với chúng.

Về bản chất, chúng ta là những chuyên gia ước lượng mọi thứ tuân theo nguyên tắc phân phối chuẩn; đó là cơ sở để tích lũy kinh nghiệm trong quá trình làm việc.

Nếu bạn đã đi làm 7-11 lần trên 20 lần trong tháng này và mỗi lần đều mất 5 phút, ngoại trừ hôm thang máy đang bảo trì và bạn phải đợi 10 phút và có hôm bạn đợi vài phút cho đến khi trời tạnh mưa mới đi làm.

Vậy bạn ước tính thời gian đến chỗ làm hôm nay là bao nhiêu? 5 phút?

Nếu nói 15 phút thì không hợp lý vì thang máy hư là sự cố hy hữu hoặc 7 phút nếu hôm nay trời mưa.

Nếu 7-11 lần trên 20 lần, bạn mất 5 phút thì chắc chắn có khả năng lớn là hôm nay cũng chỉ mất 5 phút (median – giá trị trung vị), xác suất khoảng 90%.

Phân phối lệch

Ngay cả khi thực sự giỏi ước lượng thời gian cho một task, điều đó không có nghĩa là bạn sẽ giỏi ước lượng thời gian cho toàn dự án! Trái với những gì mọi người thường nghĩ, bạn sẽ ngày càng mắc nhiều sai lầm.

Meme ở phần 3 chính là nói về phân phối lệch (skewed distribution)! Hãy thử làm rõ cùng tôi.

Phân phối lệch
Giá trị trung vị (median) vẫn có xác suất đúng cao hơn giá trị trung bình (mean), đối với cùng 1 việc! Nếu đoán yếu vị (mode) (giá trị có xác suất cao nhất), bạn thậm chí còn sai nhiều hơn trên quy mô lớn hơn.

Phỏng đoán “tự nhiên” của chúng ta dựa trên số trung vị (median) giúp tối đa hóa xác suất đoán đúng; tuy nhiên, con số thực khi “sự kiện” đó xảy ra đủ số lần sẽ luôn gần với giá trị trung bình (mean).

Nói cách khác: Bạn càng làm nhiều task tương tự nhau, lỗi đó càng tích lại nhiều hơn!

Phương trình tính thời gian trễ theo giả thuyết trên.Phương trình tính thời gian trễ theo giả thuyết trên.
Phương trình tính thời gian trễ theo giả thuyết trên.

Các task lập trình trong một dự án thường khá giống nhau hoặc ít nhất được nhóm thành vài cụm tương tự! Phương trình này cũng gợi ý rằng vấn đề có thể mở rộng! Ai cũng muốn mọi thứ trong dự án phần mềm có thể mở rộng, trừ các vấn đề!

Vậy làm thế nào để áp dụng kiến ​​thức này?

Thành thật mà nói, khi viết bài, tôi không hề có ý định đưa ra “hướng dẫn” dựa trên giả thuyết này.

Bài viết là một phân tích mang tính khám phá, việc kết luận với một giả thuyết và hiểu nó là tùy thuộc vào độc giả.

Tuy nhiên, tôi biết rằng nhiều người sẽ thất vọng với kết luận mở trên, vì vậy đây là những gì cá nhân tôi đúc kết.

  1. Sẽ dễ dàng hơn để biết liệu task X sẽ mất nhiều / ít / cùng thời gian so với task Y hơn là nói chính xác chúng sẽ mất bao lâu. Điều này là do việc so sánh các giá trị median hoạt động giống như việc so sánh giá trị mean nếu độ lệch của các đường cong gần như nhau (điều này đúng với các task tương tự nhau).
  2. Tôi không nhớ hoặc ghi lại mọi task tương tự để tính toán và lấy giá trị trung bình. Vì vậy, tôi thường ước tính sai số không thể tránh khỏi (mean – median) theo phần trăm thời gian làm task đó tăng / giảm tùy thuộc vào mức độ thoải mái của tôi với môi trường development (tôi có thích ngôn ngữ / framework này không? (40%) Tôi có công cụ debug tốt không? (30%) Hỗ trợ IDE có tốt không? (25%) v.v.).
  3. Tôi chia sprint thành các task tương đương nhau, nhằm tạo sự đồng nhất trong quá trình ước lượng thời gian. Điều này cho phép tôi hưởng lợi từ điểm 1 ở trên, do sẽ dễ dàng biết được liệu hai task có thời gian gần bằng nhau hay không. Điều này cũng làm cho các task có thể có độ tương đương nhiều hơn, để có thể áp dụng hiệu quả giả thuyết trên và mọi thứ trở nên dễ đoán hơn.

Áp dụng các nguyên tắc này, bạn có thể thực hiện “thử nghiệm” nếu có đủ tài nguyên.

Ví dụ: nếu trong X1 ngày với Y1 lập trình viên, Z1 task tương đương đã được hoàn thành, thì ta có thể dễ dàng giải quyết X2 (ngày) nếu biết có sẵn Y2 lập trình viên và Z2 số task còn lại.

Theo Hesham Meneisi

Categories
Dev's Corner

Làm thế nào để viết một unit test hiệu quả?

Viết unit test là một phần quan trọng của quá trình phát triển phần mềm bởi khi làm chính xác và hiệu quả, bạn có thể giảm đáng kể số lượng bug và đẩy nhanh tiến độ công việc.

Hãy cùng Gambaru xem qua một số cách tiếp cận viết unit test sau
Hãy cùng Gambaru xem qua một số cách tiếp cận viết unit test sau! Nguồn ảnh: freepik

Kiểm thử phương thức (method) với business logic

Giả sử ta có lớp Story với phương thức publish. Ta chỉ được phép publish một story nếu nó có trạng thái DRAFT.

Kiểm thử phương thức với Business Logic
Xem code gốc.

Trong trường hợp này, sẽ hợp lý nếu viết bài unit test cho phương thức này bởi nó chứa một quy tắc nghiệp vụ quan trọng.

Ta cần tạo hai bài unit test để bao quát hoàn toàn được quy tắc này:

  • Kiểm tra xem có xuất hiện Error khi trạng thái không phải là DRAFT hay không.
  • Kiểm tra xem liệu trạng thái có chuyển đổi thành Published khi trạng thái là DRAFT hay không.
Kiểm thử phương thức
Xem code gốc.

Chỉ bằng cách kiểm thử phương thức, ta có thể giữ cho các bài unit test ở mức nhỏ. Điều này đặc biệt hữu ích khi kiểm tra business logic khó.

Hãy cố gắng luôn bao quát mọi nhánh trong business logic của mình.

Ngoài ra, sử dụng công cụ báo cáo code coverage để thống kê phần trăm code đã được kiểm thử cũng là một thực tiễn tốt.

Giả lập các thành phần phụ thuộc

Trong một số trường hợp, để đảm bảo rằng mình chỉ đang kiểm tra business logic, bạn sẽ cần giả lập các thành phần phụ thuộc (mock the dependencies). Hãy sử dụng ví dụ sau:

Giả lập các thành phần phụ thuộc

Dịch vụ này có một phụ thuộc vào một event dispatcher. Cần phải giả lập phụ thuộc này vì ta không muốn dispatch MoneyTransferredEvent trong quá trình tiến hành làm unit test.

Ta chỉ muốn biết liệu dịch vụ này có xử lý tất cả các business logic như mong đợi hay không.

Giả lập các thành phần phụ thuộc
Xem code gốc.

Khi giả lập phụ thuộc này, ta có thể thay thế triển khai thực tế bằng triển khai “giả” (fake implementation) và sử dụng triển khai giả này để kiểm tra xem phương thức chính xác đã được gọi hay chưa.

Một giả lập cũng có thể trả về dữ liệu. Điều này có thể hữu ích khi ta giả lập repository chẳng hạn.

Hãy giữ các bài unit test ở mức độ nhỏ và chi tiết. Nếu có các assertion không liên quan trong một bài unit test, bạn có thể xem xét việc tách chúng thành nhiều bài unit test. Dưới đây là một ví dụ:

Tách thành nhiều bài unit test
Xem code gốc.

Bằng cách tách các assertion này ra, bạn sẽ biết trực tiếp phần nào của ứng dụng không hoạt động khi bài unit test không thành công.

Kiểm thử mô-đun

Đôi khi, sẽ hữu ích hơn khi kiểm thử toàn bộ mô-đun thay vì viết một bài unit test cho mọi phương thức.

Giả sử chúng ta có một số code cho cronjob trong ứng dụng của mình. Cronjob này sẽ tìm lấy tất cả các story đang chờ và publish chúng:

Kiểm thử module
Xem code gốc.

Điều quan trọng duy nhất đối với mô-đun này là nó lấy các story và publish từng story một. Viết một bài kiểm thử cho một mô-đun như thế này mang lại một số lợi ích tuyệt vời sau:

  • Bạn chỉ có thể kiểm tra những gì quan trọng: Các endpoint chính xác có được gọi với dữ liệu chính xác không?
  • Bạn có thể dễ dàng tái cấu trúc code của mình. Bài kiểm thử sẽ pass miễn là các endpoint được gọi với dữ liệu mong đợi.
  • Việc kiểm thử một mô-đun thường có thể được thực hiện nhanh hơn so với việc viết một bài kiểm thử cho mọi phương thức.

Hãy cùng xem qua bài kiểm thử mô-đun dưới đây:

Bằng cách giả lập API client, ta có thể trả về hai story. Kiểm thử sẽ pass nếu hai story này cũng được publish. Thêm một số bài kiểm thử khác cho các kết quả API khác nhau cũng là một ý hay.

Một lựa chọn tốt khác để kiểm thử các mô-đun là viết các bài kiểm tra tích hợp (integration test).

Tuy nhiên, lợi ích của làm unit test là bạn có thể dễ dàng chạy nó cục bộ hoặc trong một pipeline. Các bài kiểm thử mô-đun này cũng rất hữu ích cho phát triển hướng kiểm thử (test-driven development – TDD).

Nếu mô-đun chứa nhiều business logic, bạn có thể muốn thêm một số bài kiểm thử cho các quy tắc nghiệp vụ cụ thể này.

Khi bao quát được business logic trong các bài kiểm thử phương thức, các bài kiểm thử mô-đun sẽ trở nên đơn giản.

Các bài kiểm thử mô-đun sẽ vẫn hữu ích để xác nhận xem liệu tất cả các lớp có hoạt động cùng nhau như mong đợi hay không.

Kết

Tôi cực kỳ chuộng kiểm thử mô-đun vì chúng bao quát được rất nhiều code. Chúng cũng có thể hữu ích để kiểm thử dependency injection.

Tuy nhiên, chỉ viết các bài kiểm thử mô-đun thường sẽ không đủ. Sự kết hợp các bài kiểm thử mô-đun và kiểm thử phương thức sẽ mang đến nhiều lợi ích mỹ mãn.

Một điều quan trọng khác cần lưu ý là có nhiều bài kiểm thử phương thức quá có thể làm bạn chậm lại.

Ví dụ, khi thay đổi một chuỗi thành một enum, hầu hết các bài kiểm thử sẽ không thành công.

Tuy nhiên, các bài kiểm thử mô-đun vẫn sẽ pass. Vì vậy, hãy cân nhắc việc chỉ viết các bài kiểm thử này cho các phương thức chứa business logic.

Nếu bạn chưa bao giờ viết một bài unit test, lời khuyên là bạn nên bắt đầu bằng việc thử nghiệm các phương pháp nhất định.

Các bài kiểm thử mô-đun có thể hơi gian nan, phức tạp hơn – đặc biệt nếu chúng có nhiều thành phần phụ thuộc.

Quan trọng nhất là các bài kiểm thử của bạn bao quát hết logic quan trọng nhất và giúp cải thiện chất lượng code của mình
Quan trọng nhất là các bài kiểm thử của bạn bao quát hết logic quan trọng nhất và giúp cải thiện chất lượng code của mình. Ảnh: freepik

Để viết được các bài unit test hiệu quả, bạn sẽ cần tách code của mình đúng cách. Hãy tuân theo nguyên tắc SOLID.

Việc tách dự án của bạn thành các lớp khác nhau bằng cách sử dụng kiến ​​trúc đa tầng (multitier architecture) chẳng hạn, cũng có thể giúp việc kiểm thử ứng dụng dễ dàng hơn.

Theo Stein Janssen

Categories
Dev's Corner

Cộng đồng PHP: Mâu thuẫn và Tầm nhìn

Một bài viết tâm huyết từ một lập trình viên PHP. Dù bạn là developer trẻ, đang có hứng thú với ngôn ngữ lập trình này, hay một leader nhiều năm kinh nghiệm, hãy cùng Gambaru nhìn nhận góc nhìn của Neal và thảo luận ở phần comment cuối bài viết nhé.

Bạn có quan tâm về lập trình PHP?
Bạn có quan tâm về lập trình PHP? Ảnh: Pixabay – Pexels

Tôi đã lập trình với PHP được khoảng 7 năm, tự mình mày mò, khám phá về các framework, library, hệ sinh thái xung quanh các nền tảng quản lý nội dung, và quen biết một cộng đồng đông đảo lập trình viên PHP.

Rất nhiều người đã trở thành những người bạn thực sự và theo đánh giá của các bài phát biểu tại các diễn đàn tôi từng tham dự, tôi biết mình không đơn độc khi tin rằng chúng tôi có thể giúp mọi người cùng học hỏi và phát triển, xây dựng phần mềm tốt hơn, cũng như chung tay hỗ trợ lập trình viên tiến xa hơn trong sự nghiệp.

Ngôn ngữ PHP thường bị chỉ trích và chế nhạo bởi những lập trình viên cho rằng ngôn ngữ chúng ta lựa chọn chẳng khác gì một mớ hỗn độn và chỉ dân nghiệp dư mới sử dụng PHP.

(Có thể quan điểm này có lý trong quá khứ, nhưng bây giờ chỉ có người thiếu hiểu biết mới tranh luận như vậy, đặc biệt khi sự thật là PHP 7 đã đóng góp rất nhiều để giúp PHP trở thành một ngôn ngữ hoàn thiện hơn).

Tuy nhiên, cộng đồng PHP chẳng ngán gì “dăm ba lời khen chê này”, họ ngày càng bản lĩnh hơn và tiếp tục xây dựng các sản phẩm, thư viện, công cụ và tính năng mới.

Trong bài viết này, tôi muốn nói đến mâu thuẫn ngày càng gia tăng trong chính cộng đồng PHP, giữa những nhóm lập trình viên ủng hộ giữa các framework Laravel, Symfony và Doctrine ORM.

Nhiều người chuộng Symfony/Doctrine đưa ra những nhận xét chê bai về Laravel.

Đáp lại, những người ủng hộ Laravel dường như ngày càng trở nên chống đối và có xu hướng phản ứng quyết liệt với những lời chỉ trích (dù mang tính xây dựng hay không). 

Mâu thuẫn ngay trong chính cộng đồng PHP
Mâu thuẫn ngay trong chính cộng đồng PHP. Ảnh: freepik

Tôi chắc chắn rằng hầu hết lập trình viên chúng ta đều đã từng bị chỉ trích về cách mình code.

Chỉ trích cũng có đủ loại, có thể là “Cái quái gì thế này?” hoặc “Anh nên thử áp dụng các nguyên tắc SOLID / [x design pattern] ở đây, vì nó sẽ tiết kiệm thời gian và đỡ phải bực mình sau này đấy”.

Cách ta đưa ra và đón nhận phê bình đặt nền tảng cho cách ta phát triển như một nhà lập trình chuyên nghiệp cũng như sự nhìn nhận của những người xung quanh.

Đối với những người lãnh đạo, nó xác định cách những người theo gương và tôn trọng bạn cư xử ra sao đối với đồng nghiệp của họ.

Hiện nay, ta có thể thấy các lập trình viên ở vị trí Senior, các leader dự án và những nhân vật có tầm ảnh hưởng tham gia vào các cuộc tranh luận công khai trên các nền tảng như Twitter và Reddit.

Bạn đọc được những bình luận có tính gây hấn về khả năng mở rộng của dự án với framework x hoặc phương thức của library y chứa bao nhiêu dòng code.

Họ làm như vậy chẳng để đạt được điều gì ngoài việc thuyết phục người đọc rằng họ đã đúng khi không dùng những framework hay tool này.

Tóm lại, khi cứ mãi tranh luận như vậy, chúng ta đang cướp đi cơ hội của những lập trình viên ít kinh nghiệm hơn để thử nghiệm và trải nghiệm các cách tiếp cận khác nhau đối với các giải pháp chung.

Chúng ta phủ nhận họ có khả năng thoải mái thể hiện quan điểm và thảo luận về những cái lợi và hại của mỗi framework mà không sợ bị chế giễu.

Chúng ta ngăn họ đánh giá và học cách chọn công cụ phù hợp cho từng công việc cụ thể.

Chúng ta dần dần ngăn cản tiến trình sự nghiệp của họ. Điều này tạo ra một rào cản có hại cho họ và cho cả chúng ta như một hệ sinh thái của những nhà lập trình PHP.

Hãy nói về Symfony và Laravel nàoHãy nói về Symfony và Laravel nào
Hãy nói về Symfony và Laravel nào! Ảnh: Pixabay – Pexels

Về cá nhân mình, Symfony là framework ưa thích của tôi, nhưng tôi đã làm việc chuyên nghiệp với cả Laravel [versions 4 & 5] và Zend.

Symfony sử dụng Doctrine 1, triển khai ActiveRecord pattern, bao gồm rất nhiều tính năng bổ sung theo mặc định và khiến việc liên kết business logic với framework trở nên cực kỳ dễ dàng.

Là một opinionated framework (có tính quy chuẩn và áp đặt), Symfony đặt ra các công cụ nó mong đợi bạn sử dụng ngay trước bạn và cho phép bạn nhanh chóng bắt đầu công việc.

Symfony 2 bắt đầu thay đổi tất cả những điều đó.

Lập trình viên sử dụng Symfony muốn có nhiều sự lựa chọn và tính linh hoạt hơn khi chọn các công cụ và những gì cần đưa vào dự án. Họ muốn đưa các thư viện khác vào dễ dàng hơn nếu giải pháp ban đầu không còn ổn nữa.

Symfony đã phát triển rất nhanh giữa các phiên bản 1 và 2 và trở nên khác biệt so với phiên bản ban đầu.

Nó chuyển từ một framework cố định với tất cả các công cụ được đóng gói bên trong và một mức độ chưa đủ tinh vi sang khả năng tương tác với các gói bên ngoài Symfony.

Symfony đã đi một chặng đường dài để chuyển mình thành một tập hợp các gói và thành phần có thể tái sử dụng và việc kết hợp các đề xuất của PHP-FIG có nghĩa là các thành phần có thể dễ dàng được đưa vào các framework, library và hệ thống CMS khác.

Lập trình viên sử dụng Symfony có quyền tự hào về Symfony và mong muốn chia sẻ cách họ làm được điều đó.

Phần lớn các nhà lập trình tôi biết đồng tình rằng tài liệu của Laravel dễ tiếp cận hơn của Symfony và cũng dễ bắt đầu với Laravel hơn nhiều.

Ngày nay, Laravel có tính áp đặt hơn Symfony, vì vậy, tài liệu hướng dẫn có thể ít trừu tượng hơn và trực tiếp hơn về cách đạt được mục tiêu với các công cụ được cung cấp.

Người ta thường có xu hướng gán Laravel là framework cho người mới bắt đầu hoặc chỉ là một công cụ cho RAD (Rapid Application Development – phát triển ứng dụng / tạo mẫu nhanh) và khuyên không dùng nó cho các dự án phức tạp hơn.

Tất nhiên, phản ứng từ người dùng Laravel là sau đó sẽ là “Chà, nó đã được sử dụng trên trang x đó nhe!”.

Người dùng Doctrine phản ứng lại “Tụi tôi đã bỏ ActiveRecord từ lâu rồi, ORM của mấy ông phèn quá”, và rồi bên kia tiếp “Muốn cãi nhau về facade pattern thật sao?”, rồi lại một hồi dài tranh cãi.

Than phiền duy nhất của tôi về Laravel Eloquent là việc thêm các foreign key và index vào cơ sở dữ liệu sẽ tốn nhiều công sức hơn.

Tôi nghĩ đây là điều có độ ưu tiên cao khi thiết kế cấu trúc dữ liệu. Tôi đã kế thừa nhiều dự án Laravel bởi các công ty khác nhau, và không có dự án nào trong số đó có một foreign key hoặc index nào.

Điều này dẫn đến mất tính toàn vẹn của dữ liệu cũng như các vấn đề khác về hiệu suất.

Tôi cũng cảm thấy rằng Laravel và nhiều tài nguyên hướng dẫn về nó khuyến khích người dùng liên kết code ràng buộc với framework.

Một dev ở công ty tôi từng làm việc đã dành hàng tháng trời làm một việc đáng ra rất đơn giản là nâng cấp Laravel 4 lên Laravel 5. Anh chàng sao chép và viết lại các file và file logic được đặt trong controller.

Nếu như code được tách ra thì công ty hẳn sẽ chi ít tiền hơn cho việc nâng cấp này và anh ấy đã có thể chuyển sang phát triển tính năng mới sớm hơn nhiều.

Theo tôi, Laravel có thể được sử dụng cho các ứng dụng quy mô lớn, nhưng trừ khi lập trình viên đủ kinh nghiệm để biết những gì họ đang tìm kiếm trong tài liệu để cho phép scale ứng dụng, họ có thể sẽ không dùng Laravel.

Phải thừa nhận rằng rất dễ để liên kết code với Symfony controller, nhưng cộng đồng Symfony biết rằng làm như vậy là một ý tưởng tồi.

Theo trải nghiệm riêng, tôi chưa thấy người dùng Symfony chế nhạo ý tưởng tách code nhưng tôi thấy một số người dùng Laravel chế giễu cách làm này.

Dấu hiệu của một vấn đề sâu xa hơn
Tuy nhiên, tranh luận về việc này chỉ là một dấu hiệu của một vấn đề sâu xa hơn. Ảnh: Pixabay – Pexels

Lập trình viên chúng ta thường đưa ra lựa chọn về các công cụ yêu thích và hợp tác với những người khác đã giải quyết các vấn đề tương tự theo cùng cách.

Khi hạn chế bản thân bằng cách liên tục sử dụng những gì chúng ta biết và ở trong cộng đồng những người có cùng tư duy và ý tưởng, chúng ta hạn chế cách mình code và cả con đường sự nghiệp.

Tự ta buộc xích vào chân mình.

Việc ta giải quyết vấn đề theo một cách không nhất thiết có nghĩa là cách tiếp cận của người khác tốt hơn hay tệ hơn mà chỉ là chúng khác nhau mà thôi
Việc ta giải quyết vấn đề theo một cách không nhất thiết có nghĩa là cách tiếp cận của người khác tốt hơn hay tệ hơn mà chỉ là chúng khác nhau mà thôi. Ảnh: cottonbro – Pexels

Điều khiến tôi lo lắng nhất là ảnh hưởng mà chúng ta có thể có đối với lựa chọn của các lập trình viên trẻ, ít kinh nghiệm.

Có lẽ ai cũng đều cảm thấy hài lòng khi khuyên bảo một người và sau đó thấy họ nối gót mình.

Tuy nhiên, điều ta không nên làm là khuyến khích lập trình viên trẻ tuổi đừng thử nghiệm framework x hoặc y, đừng học lập trình ngôn ngữ z vì những thành kiến ​​của riêng mình. 

Hãy để người trẻ tự thử nghiệm và cho họ lời khuyên
Hãy để người trẻ tự thử nghiệm và cho họ lời khuyên. Ảnh: Arijit manna -Unsplash

Hãy để người trẻ tự thử nghiệm và cho họ lời khuyên. Hãy quan sát cách một người đưa ra và đón nhận chỉ trích.

Hãy nghĩ thử “Đây có phải là loại phản hồi đóng góp tích cực cho cộng đồng không? Đây có phải là mẫu người tôi nên lấy làm gương không? ”

Với tư cách là một leader, hãy tự hỏi bản thân “Tôi có đang buộc chiếc xích của chính mình vào chân những người xung quanh không? Tôi có ảnh hưởng tiêu cực đến người khác thông qua sự lựa chọn của chính mình không? ”

Các cuộc tranh luận gay gắt không có tác dụng gì trong việc thúc đẩy sự nghiệp chung của cộng đồng lập trình viên mà chỉ khiến mọi người e ngại gia nhập cộng đồng PHP toàn cầu mà thôi.

Theo Neal Brooks

Categories
Gambaru News

6 Công cụ lập trình web front-end hàng đầu năm 2020

Công cụ lập trình web front end
Công cụ lập trình web front end. Ảnh: KOBU Agency – Unsplash

Trong bài viết này, mời bạn cùng Gambaru khám phá một số công cụ giúp giải quyết các thách thức trong quá trình lập trình web front-end và đồng thời đảm bảo tăng năng suất làm việc nhé.

Các công cụ lập trình web front-end hàng đầu

1. Chrome DevTools

Chrome DevTools là bộ công cụ tạo web và debug được tích hợp sẵn của Google Chrome.

Nó có rất nhiều tùy chọn cho việc kiểm thử, debug và cải thiện chất lượng trang web.

Từ chỉnh sửa đến test được web trên nhiều độ phân giải khác nhau, DevTools chứng tỏ được sự hữu ích của nó, giúp việc xây dựng trang web nhanh hơn.

Cần thời gian và công sức để nghiên cứu và hiểu rõ UI của DevTools, song thành quả đạt được chính là năng suất làm việc sẽ tăng rất đáng kể nhờ công cụ hiệu quả này.

Sử dụng Chrome DevTools
Sử dụng Chrome DevTools. Ảnh: Medium

2. Các tiện ích mở rộng trên trình duyệt

Các trình duyệt hiện đại như Google Chrome giúp việc lướt web an toàn hơn và mang đến trải nghiệm người dùng mượt mà.

Ngoài ra, chúng còn cung cấp các công cụ tuyệt vời cho web developers xây dựng các ứng dụng xuất sắc.

Danh sách dưới đây là một số tiện ích mở rộng tốt nhất sẽ giúp front-end dev làm việc hiệu quả hơn:

Ngoài ra, bạn có thể tìm hiểu bài viết này để biết thêm danh sách chi tiết các tiện ích mở rộng trên Chrome tốt nhất.

3. Gulp và Grunt

Lập trình viên front-end không chỉ giải quyết các tasks phức tạp và tạo dựng web mà còn thường xuyên buộc phải thực hiện một số quy trình lặp đi lặp lại và tốn thời gian, như việc tổng hợp Less và SCSS thành các file CSS và nén các file hình ảnh chẳng hạn.

Tin vui là ta có thể tự động hóa các quy trình này với sự trợ giúp của bộ công cụ Gulp hoặc Grunt.

Cả hai đều cho phép ta kiểm tra file mới hoặc các thay đổi trong file hiện có và chạy các tác vụ áp dụng được cho chúng.

Một số tác vụ phổ biến nhất mà một trong hai công cụ có thể thực hiện bao gồm:

  • Tổng hợp các files Less hoặc Sass sang CSS.
  • Nén các file hình ảnh mà không làm ảnh hưởng đến chất lượng.
  • Tìm lỗi code trong mã nguồn (linting code).
  • Tối ưu dung lượng (minify), nối (concatenate) và dọn dẹp các files CSS và JavaScript.
  • Gửi cập nhật đến production server.

Bằng cách tự động hóa những tasks thường nhật này, ta có thể tiết kiệm một lượng lớn thời gian nên dành cho lập trình và tăng năng suất làm việc.

4. Các công cụ kiểm tra khả năng đáp ứng

Lập trình viên front-end cần biết đến khái niệm responsive web design (thiết kế web đáp ứng) và cách làm cho trang web hiển thị hoàn hảo trên mọi thiết bị hoặc kích thước màn hình.

Để đảm bảo rằng trang web hoàn toàn có tính đáp ứng như vậy, ta cần thực hiện test trên các thiết bị khác nhau.

Sự trợ giúp của các công cụ sau mang đến chất lượng test được cải thiện rõ rệt và giảm thời gian lập trình.

Responsinator

Responsinator rất dễ sử dụng và hoàn toàn miễn phí.

Bạn chỉ cần cung cấp URL của trang web và Responsinator sẽ cho bạn biết cách trang web đó sẽ được hiển thị ra sao ở các hình dạng và kích thước màn hình phổ biến nhất.

Gambaru.io - iPad landscape · width: 1024px
Gambaru.io – iPad landscape · width: 1024px

Google DevTools Device Mode

Google DevTools Device Mode giúp Dev dễ dàng mô phỏng thiết bị di động trong trình duyệt Chrome.

Bạn thậm chí có thể mô phỏng đầu vào thiết bị để chạm, định vị địa điểm và hướng thiết bị trong trình mô phỏng.

Gambaru.io trên Google DevTools
Gambaru.io trên Google DevTools

Browser Stack

Browser Stack là một trong những công cụ test tiên tiến, đầy đủ tính năng nhất hiện nay.

Công cụ trả phí này cung cấp quyền truy cập vào hơn 1.000 trình duyệt trên điện thoại di động và máy tính cho mục đích kiểm thử.

Test thử Gambaru.io trên Browser Stack!
Test thử Gambaru.io trên Browser Stack!

5. Một số công cụ CSS hữu ích

CSS ngày càng trở nên mạnh mẽ hơn và ngày nay cung cấp rất nhiều khả năng để tạo ra các trang web tuyệt đẹp về mặt trực quan.

Nếu quá trình tạo gradient và animation trở nên phức tạp, hãy thử áp dụng một số công cụ hữu ích sau:

Browserhacks

Browserhacks là một trang web cung cấp một bộ sưu tập các bản hack CSS và JavaScript dành riêng cho trình duyệt để giải quyết các vấn đề phức tạp và khó hiểu trang web của bạn có thể gặp phải.

Browserhacks
Browserhacks. Ảnh: Medium

Animista

Animista là một trang web tuyệt vời để tạo và tùy chỉnh code cho CSS animation với nhiều hiệu ứng đa dạng.

Chọn bất kỳ animation nào trong bộ sưu tập, như nền, hiệu ứng thoát, văn bản, v.v. và tha hồ tùy chỉnh nó.

Bước tiếp theo, bạn sẽ nhận được đoạn code cho hiệu ứng animation vừa rồi và chỉ cần tích hợp nó vào trang web của mình là xong!

Animista
Animista – Ảnh: Medium

Grabient

Grabient là một UI dễ sử dụng để tạo các gradient tuyến tính cho web. Chọn màu bạn muốn và điều chỉnh các góc cần thiết.

Khi đã có gradient mong muốn, hãy lấy gradient CSS và áp dụng nó vào trang web của mình.

Grabient
Grabient. Ảnh: Medium

6. Các thư viện UI Components

Thư viện được tạo ra là để giúp cuộc sống của các lập trình viên dễ dàng hơn. Một thư viện UI Components tốt là một tập hợp các thành phần giao diện người dùng được tạo sẵn có thể:

  • Cắt giảm thời gian lập trình.
  • Duy trì tính nhất quán của giao diện người dùng.
  • Duy trì khả năng tương thích và tính đáp ứng của trình duyệt.
  • Dễ dàng sử dụng và tùy chỉnh.

Sử dụng những thư viện như vậy trong ứng dụng sẽ tăng năng suất và giúp bạn hoàn thành nhiều đầu công việc hơn. Hãy thử xem qua Syncfusion nhé!

Theo Rajeshwari Pandinagarajan