“Ruby có ngoại hình đơn giản, nhưng tâm hồn bên trong phức tạp giống như con người vậy.” – Matz, cha đẻ của ngôn ngữ lập trình Ruby.
Mục Lục
Giới thiệu
Đây là một bài hướng dẫn nhỏ, chỉ cần không quá 20 phút để hoàn thành. Giả thiết là bạn đã cài sẵn Ruby. (Nếu bạn chưa có Ruby, hãy cài đặt trước khi bắt đầu nhé.)
Tương tác với Ruby
Ruby có một chương trình hiển thị kết quả của bất kỳ câu lệnh Ruby nào bạn gõ vào. Thử sức với Ruby code theo cách tương tác như thế này là một cách tuyệt vời để khám phá nó.
Mở IRB (hiểu là Tương tác với Ruby).
- Nếu bạn sử dụng macOS, mở
Terminal
và gõirb
rồi enter. - Nếu bạn sử dụng Linux, mở một shell và gõ
irb
rồi enter. - Nếu bạn sử dụng Windows, mở
Interactive Ruby
từ phần Ruby trên Start Menu.
irb(main):001:0>
Rồi, nó đã mở. Giờ ta phải làm gì?
Gõ: "Xin chào thế giới"
irb(main):001:0> "Xin chào thế giới"
=> "Xin chào thế giới"

Ruby phục vụ bạn!
Điều gì đã xảy ra vậy? Chúng ta vừa viết chương trình “Xin chào thế giới” ngắn nhất thế giới ư? Không phải vậy. Dòng thứ 2 chỉ là cách mà IRB nói cho ta biết kết quả của phép toán cuối cùng nó nhận được. Nếu muốn in ra “Xin chào thế giới” ta cần viết nhiều hơn:
irb(main):002:0> puts "Xin chào thế giới"
Xin chào thế giới
=> nil
puts
là cú pháp cơ bản để in ra trong Ruby. Nhưng sau đó => nil
là gì? Nó là kết quả của phép toán. puts
luôn trả về nil – giá trị rỗng.
Máy tính miễn phí của bạn đây
Rõ ràng, chúng ta có thể sử dụng IRB như một chiếc máy tính cơ bản:
irb(main):003:0> 3+2
=> 5
Ba cộng hai. Quá dễ. Thế còn ba nhân hai thì sao? Bạn có thể gõ trực tiếp vì nó rất ngắn, tuy nhiên bạn có thể sẽ sửa lại những gì mình vừa nhập vào. Bấm nút mũi tên lên trên bàn phím và nó sẽ hiển thị dòng 3+2
. Nếu được, bạn có thể sử dụng phím mũi tên trái để di chuyển đến dấu +
và thay nó bằng dấu *
.
irb(main):004:0> 3*2
=> 6
Tiếp theo, hãy thử tính 3 bình phương:
irb(main):005:0> 3**2
=> 9
Trong Ruby, **
nghĩa là “bình phương”. Nhưng nếu bạn muốn tìm căn bậc hai thì sao?
irb(main):006:0> Math.sqrt(9)
=> 3.0
Bạn thấy gì ở kết quả? Nếu bạn nghĩ, đó là “căn bậc hai của 9” thì bạn đã đúng. Nhưng hãy chú ý vào những thứ khác. Đầu tiên: Math
là gì?

Gộp nhóm mã module theo chủ đề
Math
là một module của toán học. Các module phụ vụ hai vai trò trong Ruby. Ở đây là một vai trò: nhóm các phương thức giống nhau lại với nhau dưới một cái tên tương tự. Math
còn có các phương thức như sin()
và tan()
.
Tiếp theo là dấu chấm. Dấu chấm có tác dụng gì? Dấu chấm dùng để xác định nơi nhận của một câu lệnh. Câu lệnh là gì? Trong trường hợp này thì nó là sqrt(9)
, nghĩa là gọi phương thức sqrt
, viết tắt của “căn bậc hai (square root)” với tham số là 9.
Kết quả của việc gọi phương thức này là 3.0
. Chú ý rằng nó không chỉ là 3
bởi vì phần lớn căn bậc 2 của một số không phải là một số nguyên, do đó phương thức luôn trả về một số thực.
Nếu muốn lưu lại một vài kết quả của phép toán này, hãy gán kết quả cho một biến.
irb(main):007:0> a = 3 ** 2
=> 9
irb(main):008:0> b = 4 ** 2
=> 16
irb(main):009:0> Math.sqrt(a+b)
=> 5.0
Nếu muốn nói “Xin chào” rất nhiều mà không muốn mỏi tay, ta cần định nghĩa một phương thức!
irb(main):010:0> def h
irb(main):011:1> puts "Xin chào Thế giới!"
irb(main):012:1> end
=> nil
Đoạn mã def h
bắt đầu định nghĩa phương thức. Nó báo với Ruby rằng “Chúng tôi đang định nghĩa một phương thức tên là h
”. Dòng tiếp theo là phần thân của phương thức, tương tự với dòng chúng ta đã thấy trước đây: puts "Xin chào Thế giới"
. Cuối cùng, dòng cuối cùng end
thông báo với Ruby rằng ta đã định nghĩa xong phương thức. Ruby trả lại => nil
để xác nhận.

Tóm tắt, vòng đời của một phương thức
Bây giờ ta sẽ chạy phương thức vừa rồi vài lần:
irb(main):013:0> h
Xin chào Thế giới!
=> nil
irb(main):014:0> h()
Xin chào Thế giới!
=> nil
Tốt rồi, rất đơn giản. Gọi một phương thức trong Ruby rất dễ dàng, chỉ cần gõ tên của nó vào. Nếu phương thức không cần tham số, bạn có thể thêm cặp ngoặc đơn trống nếu thích vì chúng cũng không cần thiết.
Nếu bạn muốn nói xin chào tới một người mà không phải là cả thế giới, hãy định nghĩa lại h
để thêm tên là tham số truyền vào.
irb(main):015:0> def h(tên)
irb(main):016:1> puts "Xin chào #{tên}!"
irb(main):017:1> end
=> nil
irb(main):018:0> h("Matz")
Xin chào Matz!
=> nil
Nó đã hoạt động… nhưng hãy dành vài giây để xem có gì ở đây.
Giữ các đoạn trong xâu
Đoạn #{tên}
nghĩa là gì? Đó là cách mà Ruby chèn thứ gì đó vao trong một xâu. Đoạn ở giữa cặp ngoặc nhọn được chuyển thành một xâu (nếu nó chưa phải) sau đó chèn vào xâu bên ngoài tại chỗ mà đoạn đó được viết. Bạn có thể sử dụng cái này để chắc chắn rằng tên của ai đó đã được viết hoa:
irb(main):019:0> def h(tên = "Thế giới")
irb(main):020:1> puts "Xin chào #{tên.capitalize}!"
irb(main):021:1> end
=> nil
irb(main):022:0> h "chris"
Xin chào Chris!
=> nil
irb(main):023:0> h
Xin chào Thế giới!
=> nil
Ta thấy có hai cách gọi khác nhau ở đây. Một là gọi phương thức không cần ngoặc đơn một lần nữa. Nếu đó là mục đích của bạn thì ngoặc đơn chỉ là tùy chọn. Cách còn lại là lấy tham số mặc định là “Thế giới”. Điều này nghĩa là “Nếu không cung cấp tên thì ta sử dụng tên mặc định là ‘Thế giới’”
Phát triển thành ChàoMừng
Phải làm gì nếu chúng ta muốn có những ChàoMừng thực sự ở xung quanh, nhớ tên bạn, chào đón bạn và luôn kính trọng bạn. Bạn sẽ phải dùng đối tượng! Chúng ta sẽ tạo một lớp ChàoMừng.
irb(main):024:0> class ChàoMừng
irb(main):025:1> def initialize(tên = "Thế giới")
irb(main):026:2> @tên = tên
irb(main):027:2> end
irb(main):028:1> def xin_chào
irb(main):029:2> puts "Xin chào #{@tên}!"
irb(main):030:2> end
irb(main):031:1> def tạm_biệt
irb(main):032:2> puts "Tạm biệt #{@tên}, hẹn gặp lại."
irb(main):033:2> end
irb(main):034:1> end
=> nil
Từ khóa mới ở đây là class
nghĩa là lớp
. Nó định nghĩa một lớp mới tên là ChàoMừng và một vài phương thức thuộc lớp. Thông báo tới @tên
, đây là một biến đối tượng và nó có thể sử dụng trong tất cả các phương thức của lớp, như trong đối tượng được sử dụng với xin_chào
và tạm_biệt
.
Bây giờ, chúng ta hãy tạo một đối tượng ChàoMừng và sử dụng nó:
irb(main):035:0> g = ChàoMừng.new("Pat")
=> #<ChàoMừng:0x16cac @tên="Pat">
irb(main):036:0> g.xin_chào
Xin chào Pat!
=> nil
irb(main):037:0> g.tạm_biệt
Tạm biệt Pat, hẹn gặp lại.
=> nil
Khi đối tượng g
được tạo, nó nhớ rằng cái tên là Pat. Vậy nếu chúng ta muốn lấy một cái tên trực tiếp thì sao?
irb(main):038:0> g.@tên
SyntaxError: compile error
(irb):52: syntax error
from (irb):52
Ồ, không thể làm được.
Bên trong của đối tượng
Các biến đối tượng thường ẩn trong trong đối tượng. Chúng không ẩn hoàn toàn, bạn sẽ thấy chúng mỗi khi khởi tạo một đối tượng và có nhiều cách để gọi chúng, nhưng Ruby sử dụng phương pháp tiếp cận hướng đối tượng tốt trong việc giữ dữ liệu ẩn đi phần nào.
Vậy những phương thức nào tồn tại cho đối tượng ChàoMừng?
irb(main):039:0> ChàoMừng.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
"__send__", "equal?", "taint", "frozen?",
"instance_variable_get", "kind_of?", "to_a",
"instance_eval", "type", "protected_methods", "extend",
"eql?", "display", "instance_variable_set", "hash",
"is_a?", "to_s", "class", "tainted?", "private_methods",
"untaint", "xin_chào", "id", "inspect", "==", "===",
"clone", "public_methods", "respond_to?", "freeze",
"tạm_biệt", "__id__", "=~", "methods", "nil?", "dup",
"instance_variables", "instance_of?"]
Quá tuyệt! Có rất nhiều method hay phương thức. Chúng ta chỉ định nghĩa 2 phương thức, vậy cái gì đây? Đó là tất cả các phương thức cho đối tượng Người chào đón, một danh sách hoàn chỉnh bao gồm cả những phương thức được kế thừa. Nếu chúng ta muốn một danh sách chỉ có các phương thức định nghĩa cho ChàoMừng, chúng ta có thể loại bỏ các phương thức được kế thừa bằng cách thêm tham số false
, nghĩa là chúng ta không muốn bất kỳ phương thức được kế thừa nào.
irb(main):040:0> ChàoMừng.instance_methods(false)
=> ["xin_chào", "tạm_biệt"]
A, được hơn rồi đó. Bây giờ chúng ta hãy xem phương thức nào được đối tượng ChàoMừng phản hồi:
irb(main):041:0> g.respond_to?("tên")
=> false
irb(main):042:0> g.respond_to?("xin_chào")
=> true
irb(main):043:0> g.respond_to?("to_s")
=> true
Nó hiểu được xin_chào
và to_s
(to string – chuyển sang chuỗi kí tự, một phương thức mặc định cho mọi đối tượng), nhưng không biết tên
.
Thay thế các lớp – Không bao giờ là quá muộn
Nếu bạn muốn có thể xem hoặc thay đổi tên? Ruby cung cấp một cách dễ dàng để truy xuất dữ liệu tới các biến của một đối tượng.
irb(main):044:0> class ChàoMừng
irb(main):045:1> attr_accessor :tên
irb(main):046:1> end
=> nil
Trong Ruby, bạn có thể mở một lớp ở phía trên và sửa nó. Sự thay đổi sẽ xuất hiện trong các đối tượng mới mà bạn tạo và cả những đối tượng đã tồn tại của lớp này. Vậy thì chúng ta hãy tạo một đối tượng mới và thử với thuộc tính @tên
của nó.
irb(main):047:0> g = ChàoMừng.new("Andy")
=> #<ChàoMừng:0x3c9b0 @tên="Andy">
irb(main):048:0> g.respond_to?("tên")
=> true
irb(main):049:0> g.respond_to?("tên=")
=> true
irb(main):050:0> g.xin_chào
Xin chào Andy!
=> nil
irb(main):051:0> g.tên="Betty"
=> "Betty"
irb(main):052:0> g
=> #<ChàoMừng:0x3c9b0 @tên="Betty">
irb(main):053:0> g.tên
=> "Betty"
irb(main):054:0> g.xin_chào
Xin chào Betty!
=> nil
Sử dụng attr_accessor
định nghĩa 2 phương thức mới cho chúng ta: tên
để lấy giá trị và tên=
để gán giá trị.
MegaChàoMừng chào mừng tất cả mọi thứ
Trình chào mừng này không thú vị gì nếu nó chỉ chào được một người trong cùng một thời điểm. Sẽ thế nào nếu chúng ta có thể vài kiểu MegaChàoMừng có thể đồng thời chào Thế giới, chào một người nào đó hay một danh sách cá nhân?
Chúng ta sẽ viết trong một tập tin thay vì gõ trực tiếp trên IRB.
Để thoát IRB, gõ “quit”, “exit” hoặc tổ hợp phím Control-D.
#!/usr/bin/env ruby
class MegaChàoMừng
attr_accessor :danh_sách_tên
# Create the object
def initialize(danh_sách_tên = "Thế giới")
@danh_sách_tên = danh_sách_tên
end
# Nói xin chào tới mọi người
def xin_chào
if @danh_sách_tên.nil?
puts "..."
elsif @danh_sách_tên.respond_to?("each")
# @danh_sách_tên là danh sách tên, lặp đi lặp lại!
@danh_sách_tên.each do |name|
puts "Xin chào #{name}!"
end
else
puts "Xin chào #{@danh_sách_tên}!"
end
end
# Tạm biệt mọi người
def tạm_biệt
if @danh_sách_tên.nil?
puts "..."
elsif @danh_sách_tên.respond_to?("join")
# Gộp các thành phần của danh sách bằng dấu phẩy
puts "Tạm biệt #{@danh_sách_tên.join(", ")}. Hẹn gặp lại!"
else
puts "Tạm biệt #{@danh_sách_tên}. Hẹn gặp lại!"
end
end
end
if __FILE__ == $0
mg = MegaChàoMừng.new
mg.xin_chào
mg.tạm_biệt
# Đổi tên thành "Zeke"
mg.danh_sách_tên = "Zeke"
mg.xin_chào
mg.tạm_biệt
# Đổi tên thành danh sách tên
mg.danh_sách_tên = ["Albert", "Brenda", "Charles",
"Dave", "Engelbert"]
mg.xin_chào
mg.tạm_biệt
# Đổi thành rỗng
mg.danh_sách_tên = nil
mg.xin_chào
mg.tạm_biệt
end
Lưu tập tin này với tên “ri20min.rb”, và chạy nó “ruby ri20min.rb”. Màn hình sẽ hiện như này:
Xin chào Thế giới!
Tạm biệt Thế giới. Hẹn gặp lại!
Xin chào Zeke!
Tạm biệt Zeke. Hẹn gặp lại!
Xin chào Albert!
Xin chào Brenda!
Xin chào Charles!
Xin chào Dave!
Xin chào Engelbert!
Tạm biệt Albert, Brenda, Charles, Dave, Engelbert. Come
back soon!
...
...
Vậy hãy nhìn sâu hơn vào chương tình mới của chúng ta, chú ý các dòng ban đầu, bắt đầu bởi dấu thăng (#). Trong Ruby, bất cứ thứ gì trong một dòng phía sau dấu thăng là một bình luận và trình biên dịch sẽ bỏ qua. Dòng đầu tiên của tập tin là trường hợp đặc biệt, hệ điều hành nhân Unix sẽ cho shell biết cách chạy tập tin. Mục đích của các bình luận là để làm rõ hơn.
Phương thức xin_chao
đã trở nên phức tạp hơn một chút:
# Say hi to everybody
def xin_chao
if @names.nil?
puts "..."
elsif @names.respond_to?("each")
# @names là danh sách tên, lặp đi lặp lại!
@names.each do |name|
puts "Xin chào #{name}!"
end
else
puts "Xin chào #{@names}!"
end
end
Chương trình sẽ dựa vào biến ví dụ @names
để đưa ra quyết định. Nếu nó rỗng thì chỉ in ra ba dấu chấm. Không có lý nào lại đi chào không ai cả, phải vậy chứ?
Chu kỳ và vòng lặp—a.k.a. lặp đi lặp lại
Nếu đối tượng @names
phản hồi each
(mỗi), nó nghĩa là bạn có thể lặp đi lặp lại, vì thế nó lặp đi lặp lại và mỗi lần chào một người. Cuối cùng, nếu @names
là thứ gì đó, tự động chuyển nó thành xâu và thực hiện chào như mặc định.
Chúng ta hãy nhìn sấu hơn vào phép lặp:
@names.each do |name|
puts "Xin chào #{name}!"
end
each
là phương thức cho phép một khối lệnh chạy mỗi lần gặp một thành phần trong danh sách, và đoạn ở giữa do
và end
là khối lệnh. Một khối lệnh giống như một hàm bất định hay lambda
. Biến nằm giữa 2 dấu gạch dọc là tham số cho khối lệnh này.
Điều xảy ra ở đây là với tất cả các mục trong một danh sách, name
ràng buộc với các phần tử của danh sách, và cú pháp puts "Xin chào #{name}!"
sẽ chạy với cái tên đó.
Phần lớn các ngôn ngữ lập trình khác làm việc với một danh sách bằng vòng lặp for
, ví dụ trong C sẽ như này:
for (i=0; i<number_of_elements; i++)
{
do_something_with(element[i]);
}
Nó vẫn hoạt động tuy nhiên không được hay cho lắm. Bạn cần một biến đếm i
, xác định được độ dài của danh sách, và cần phải giải thích làm thế nào để đi hết danh sách. Cách của Ruby hay hơn nhiều, tất cả chi tiết quản lý được ẩn trong phương thức each
, tất cả những gì bạn cần làm là nói với vó cần phải làm gì với các thành phần. Trong đó, phương thức each
về cơ bản sẽ gọi yield "Albert"
, sau đó yeld "Brenda"
rồi yield "Charles"
, vv.
Khối lệnh, ánh sáng lấp lánh trên các cạnh của Ruby
Sức mạnh thực sự của khối lệnh là khi xử lý các đối tượng phức tạp hơn danh sách. Ngoài việc xử lý các chi tiết nội dung đơn giản trong phương thức, bạn còn có thể xử lý thiết lập, teardown và lỗi – tất cả ẩn đi khỏi sự chú ý của người dùng.
# Tạm biệt mọi người
def tam_biet
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Gộp các thành phần của danh sách bằng dấu phẩy
puts "Tạm biệt #{@names.join(", ")}. Hẹn gặp lại!"
else
puts "Tạm biệt #{@names}. Hẹn gặp lại!"
end
end
Phương thức tam_biet
không sử dụng each
, thay vào đó nó kiểm tra xem nếu @names
có đáp ứng phương thức join
không, nếu có thì sử dụng nó. Mặt khác nó chỉ in ra các biến dưới dạng xâu. Phương thức này không quan tâm tới kiểu của biến, chỉ dựa vào phương thức mà nó hỗ trợ được gọi là “Duck Typing”, giống như “nếu nó đi giống con vịt và quạc quạc giống con vịt…”. Lợi ích của điều này là không cần thiết phải hạn chế kiểu biến được hỗ trợ. Nếu ai đó đến với một kiểu danh sách lớp mới, miễn là nó thực thi phương thức join
với cùng một ngữ nghĩa như các danh sách khác, mọi thứ sẽ hoạt động theo đúng kế hoạch.
Bắt đầu kịch bản
Vậy, đó là lớp MegaGreeter, phần còn lại của tập tin chỉ để gọi phương thức trong lớp đó. Có một mẹọ cuối cùng để chú ý, đó là dòng
if __FILE__ == $0
__FILE__
là biến kỳ diệu, nó chứa tên của tập tin hiện tại. $0
là tên của tập tin sử dụng để bắt đầu chương trình. Kiểm tra này nói rằng “Nếu đây là tập tin chính được sử dụng…” nghĩa là nó cho phép một tập tin có thể sử dụng như một thư viện và không phải thực thi mã bên trong, nhưng nếu nó là một tập tin có thể thực thi thì mã sẽ được thực thi.
Xem xét tự giới thiệu
Vì vậy, đó là nó sử dụng cho tour tham quan nhanh về Ruby. Có rất nhiều điều cần khám phá, các cấu trúc điều khiển khác nhau mà Ruby cung cấp; cách sử dụng của các khối lệnh và yield
; các module như mixins; và còn nhiều hơn nữa. Tôi hy vọng những thú vị ban đầu này của Ruby sẽ khiến bạn muốn học thêm nữa.
Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng
Ruby và Python là hai trong số các ngôn ngữ lập trình được sử dụng phổ biến nhất để lập trình ứng dụng. Theo khảo sát hàng năm của Stack Overflow, được đánh giá bởi hơn 90.000 lập trình viên trên toàn thế giới. Ruby và Python nằm trong Top 15 ngôn ngữ lập trình có nhu cầu cao nhất trong năm 2019. Cho bạn nào chưa biết thì trên thế giới có khoảng 700 ngôn ngữ lập trình nhé.

Ruby và Python có rất nhiều điểm chung. Chúng đều là các ngôn ngữ hướng đối tượng bậc cao, tập trung vào sự đơn giản và rõ ràng. Tuy nhiên, như trên tiêu đề của bài viết, hôm nay chúng ta sẽ so sánh hai ngôn ngữ này để tìm ra ngôn ngữ nào tốt hơn cho các dự án lập trình ứng dụng web của bạn.
Ruby vs Python: Những khác biệt chính
Như đã được đề cập, cả Ruby và Python đều là các ngôn ngữ kịch bản hướng đối tượng bậc cao thuộc thế hệ mới. Tuy nhiên, sự khác biệt chính giữa chúng là nằm ở triết lý đằng sau của mỗi ngôn ngữ. Ruby nhằm mục đích làm các lập trình viên hài lòng với cú pháp thanh lịch và đẹp đẽ, trong khi nhiệm vụ chính của Python là làm cho mọi thứ trở nên rõ ràng với các lập trình viên. Ruby cung cấp cho các lập trình viên sự tự do và linh hoạt. Họ có thể giải quyết vấn đề bằng các phương pháp khác nhau, trong khi Python chỉ có một cách chính xác để giải quyết vấn đề. Các cách tiếp cận khác nhau làm cho Ruby và Python phù hợp với các loại ứng dụng web khác nhau.
Dưới đây là bảng so sánh sự khác biệt chính giữa Python và Ruby.

Khi nào nên chọn Ruby?
Ruby sẽ là sự lựa chọn tuyệt vời cho các doanh nghiệp nhỏ và các công ty khởi nghiệp mong muốn lập trình các ứng dụng nhanh. Ruby rất hữu ích khi bạn có nhu cầu xây dựng một nguyên mẫu nhanh ngay cả khi dự án chưa được xác định rõ ràng và sẽ có các thay đổi trong tương lai. Nhìn chung, Ruby được khuyến nghị trong các trường hợp có thời gian ngắn và bị giới hạn về ngân sách.
Nếu bạn cần tìm các ví dụ cụ thể hơn về các loại ứn dụng được xây dựng tốt nhất với Ruby, thì đó là các trang web thương mại điện tử và phát nhạc trực tuyến. Shopify là một ví dụ đầy cảm hứng về giải pháp thương mại điện tử phức tạp được lập trình với sự trợ giúp của framework Ruby on Rails đã có mặt trên thị trường từ năm 2006 và là ngôi nhà chung cho hơn 800 ngàn của hàng trực truyến.
Framework Ruby on Rails hoàn toàn phù hợp với lập trình các ứng dụng web tuỳ chỉnh nhiều chức năng. Ruby còn có một trong những cộng đồng mạnh nhất, đảm bảo tài liệu đầy đủ và chính xác, kèm theo đó là một thư viện rộng lớn được gọi là Ruby gems. Chúng cung cấp các chức năng đặc biệt cho các ứng dụng Ruby và tăng tốc mọi giai đoạn trong quá trình lập trình.
Đồng thời, bạn phải nhớ rằng Ruby không phải là lựa chọn tốt nhất để tạo ra các ứng dụng web đòi hỏi phải kiểm soát toàn bộ kiến trúc sản phẩm, modules chương trình hoặc tích hợp dữ liệu.
Khi nào nên chọn Python?
Python sẽ là lựa chọn tốt hơn cho các giải pháp và ứng dụng khoa học phức tạp trên cloud. Nó cũng được sử dụng để lập trình các ứng dụng có quy mô theo chiều ngang. Các ứng dụng như vậy giúp quản lý khối lượng công việc thay đổi thường xuyên.
Xây dựng các ựng dụng với Python, có thể vượt xa các dự tích lập trình web ban đầu so với khi sử dụng Ruby. Bởi vì Python được sử dụng trong các ngành công nghiệp khác nhau, từ khoa học dữ liệu đến robot. Đó là lý do tại sao cộng đồng Python là một trong những cộng đồng đa dạng nhất. Trên Stack Overflow, cộng đồng trực tuyến lớn nhất và đáng tin cậy nhất dành cho các lập trình viên, có hơn 1.455.817 câu hỏi về Python.
Python, kết hợp với thư viện TensorFlow, đơn giản hoá đáng kể việc lập trình các giải pháp dựa trên AI vì nó có các thuật toán machine learning tích hợp. Python cũng được sử dụng rộng rãi trong xử lý và phân tích dữ liệu. Nó đặc biệt hữu ích trong phân tích âm thanh và video nhờ khả năng hiển thị dữ liệu và khả năng sắp xếp dữ liệu của nó.
Lịch sử
Ruby được tạo ra bởi Yukihiro “Matz” Matsumoto từ 24 tháng 2 năm 1993 và đưa ra phiên bản chính thức 0.95 (Đây là phiên bản công khai đầu tiên của Ruby được công bố tại Nhật Bản) vào ngày 21 tháng 12 năm 1995. Ở phiên bản Ruby 0.95, nó đã có nhiều tính năng quen thuộc trong các phiên bản sau của Ruby, bao gồm thiết kế hướng đối tượng, các lớp với kế thừa, mixin, vòng lặp, xử lý ngoại lệ và thu gom rác.
Sau khi phát hành Ruby 0.95 vào năm 1995, một số phiên bản ổn định của Ruby đã được phát hành trong những năm tiếp theo:
Ruby 1.0: ngày 25 tháng 12 năm 1996.
Ruby 1.2: tháng 12 năm 1998.
Ruby 1.4: tháng 8 năm 1999.
Ruby 1.6: tháng 9 năm 2000.
Tháng 9 năm 2005, phiên bản ổn định mới nhất là 1.8.3. Ruby 1.9 (với một số thay đổi) cũng đang trong quá trình phát triển.
Ruby 1.9
Ruby 1.9 được phát hành vào ngày Giáng sinh năm 2007. Hiệu quả với Ruby 1.9.3, phát hành ngày 31 tháng 10 năm 2011, Ruby chuyển từ việc được cấp phép kép theo Giấy phép Ruby và GPL để được cấp phép kép theo Giấy phép Ruby và giấy phép BSD hai điều khoản. Việc chuyển đổi sang phiên bản 1.9 từ 1.8 đã bị chậm lại do nhiều gems phổ biến cần được viết lại.
Ruby 1.9 giới thiệu nhiều thay đổi đáng kể so với các phiên bản 1.8. Ví dụ:
Giới hạn vùng tham chiếu của các biến cục bộ (các biến cục bộ chỉ được sử dụng ở trong các block mà chúng được khai báo)
Bổ sung cú pháp lambda:
f = ->(a,b) { puts a + b }
Bổ sung cú pháp Hash, sử dụng dấu hai chấm cho các khóa biểu tượng (symbol key):
{symbol_key: “value”} == {:symbol_key => “value”}
Hỗ trợ mã hóa ký tự theo chuỗi.
API socket mới (hỗ trợ IPv6)
require_relative nhập khẩu an ninh
Ruby 1.9 đã lỗi thời kể từ ngày 23 tháng 2 năm 2015, [32] và nó sẽ không còn nhận được bản sửa lỗi và bảo mật nữa. Người dùng nên nâng cấp lên phiên bản mới hơn.
Bảng các phiên bản Ruby
Phiên bản | Phiên bản nâng cấp | Ngày phát hành | Kết thúc giai đoạn hỗ trợ | Kết thúc giai đoạn bảo trì bảo mật |
---|---|---|---|---|
1.0 | Chưa rõ | 25/12/1996 | Chưa rõ | Chưa rõ |
1.8 | 1,8,7-p375 | 04/08/2003 | 06/2012 | 01/07/2014 |
1.9 | 1.9.3-p551 | 25/12/2007 | 23/02/2014 | 23/02/2015 |
2.0 | 2.0.0-p648 | 24/02/2013 | 24/02/2015 | 24/02/2016 |
2.1 | 2.1.10 | 25/12/2013 | 30/03/2016 | 31/01/2017 |
2.2 | 2.2.10 | 25/12/2014 | 28/03/2017 | 31/03/2018 |
2.3 | 2.3.8 | 25/12/2015 | 20/06/2018 | 31/03/2019 |
2.4 | 2.4.8 | 25/12/2016 | 01/04/2019 | 01/04/2020 |
2.5 | 2.5.7 | 25/12/2017 | Chưa được công bố | Chưa được công bố |
2.6 | 2.6.5 | 25/12/2018 | Chưa được công bố | Chưa được công bố |
2.7 | 2.7.0 | 25/12/2019 | Chưa được công bố | Chưa được công bố |
3.0 | 2020 | Chưa được công bố | Chưa được công bố | |
Chú thích:Hiện tại Ruby chỉ hỗ trợ phiên bản: 2.4, 2.5, 2.6 và 2.7. Các phiên bản trước đó đã cũ và không còn được hỗ trợ.2.7 là phiên bản mới nhất của RubyPhiên bản 3.0 sẽ được phát hành trong tương lai. Hiện tại chưa được phát hành. |
Cái tên Ruby
Nguồn gốc của cái tên “Ruby” là từ một phiên chat online giữa Matsumoto và Ishitsuka Keiji vào ngày 24 tháng 2 năm 1993, trước khi bất kỳ đoạn mã nào được viết cho ngôn ngữ này. Ban đầu, “Coral” và “Ruby” là hai cái tên được đề xuất. Matsumoto chọn tên sau trong email gửi đến Ishitsuka. Sau này Matz cũng bất ngờ khi phát hiện ra Pearl là viên đá quý tượng trưng cho những người sinh tháng 6, còn Ruby thì tượng trưng cho những người sinh tháng 7. Anh cho rằng cái tên Ruby như thế là phù hợp vì Ruby kế thừa và phát triển nhiều đặc tính từ Perl
Quan điểm
Quan điểm chính trong việc thiết kế của Matz là nhằm giảm thiểu các công việc nhàm chán mà họ, các nhà lập trình, buộc phải làm; tiếp đến là nguyên tắc thiết kế giao diện người dùng (user interface) hiệu quả.[14] Ông nhấn mạnh rằng việc thiết kế hệ thống cần phải tập trung vào con người, hơn là vào máy tính:
Often people, especially computer engineers, focus on the machines. They think, “By doing this, the machine will run faster. By doing this, the machine will run more effectively. By doing this, the machine will something something something.” They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves.
Ngôn ngữ Ruby được thiết kế nhằm theo nguyên tắc ít gây ngạc nhiên nhất (principle of least surprise-POLS), nghĩa là ngôn ngữ hoạt động theo một cách trực quan hay ít nhất đó cũng là nhận xét mà các nhà lập trình đưa ra. Nguyên tắc này không xuất phát từ Matz và, nói chung, Ruby gần với suy nghĩ ít ngạc nhiên nhất của ‘Matz’ hơn.
Ngữ nghĩa
Ruby là một ngôn ngữ hướng đối tượng: mỗi giá trị đều là một đối tượng (object), bao gồm các kiểu dữ liệu mà đối với các ngôn ngữ khác, chúng là kiểu cơ bản (primitive) như integer. Mỗi hàm (function) là một phương thức (method). Tên biến (variables) chính là tham chiếu (references) đến các đối tượng, bản thân nó không phải là đối tượng. Ruby hỗ trợ kế thừa (inheritance) với dynamic dispatch, mixin và singleton method (thuộc về, và để định nghĩa cho, một instance đơn hơn là định nghĩa dành cho lớp). Mặc dù Ruby không hỗ trợ đa kế thừa, các lớp vẫn có thể được đưa vào các module dưới dạng các mixins. Cú pháp dạng thủ tục (procedural syntax) vẫn còn được hỗ trợ, có vẻ như là ngoài tầm vực của mọi đối tượng, nhưng thực sự là thuộc một thể hiện của class Object tên là ‘main’. Vì class này là cha của mọi class khác, nó trở trên ẩn đối với mọi lớp và đối tượng.
Ruby được xem là một ngôn ngữ lập trình đa mẫu hình (multi-paradigm programming language): nó cho phép bạn lập trình dạng thủ tục (tạo ra các hàm/biến nằm ngoài phạm vi của các lớp và biến chúng thành một phần của đối tượng gốc, ‘self’ Object), với khả năng hướng đối tượng (mọi thứ đều là đối tượng) hay hàm (nó có các hàm không có tên (anonymous functions), closures, và continuations; mọi câu lệnh đều có giá trị trả về, và các hàm đều trả về kết quả ước lượng cuối cùng). Nó hỗ trợ mạnh cho tự định kiểu (type introspection), reflection và meta-programming.
Theo Ruby FAQ, “Nếu bạn thích Perl, bạn sẽ thích Ruby và sẽ thấy thoải mái với cú pháp của nó. Nếu bạn thích Smalltalk, bạn sẽ thích Ruby và sẽ thấy thoải mái với ngữ nghĩa của nó (semantics). Nếu bạn thích Python, bạn có thể hoặc không thể dừng lại bởi sự khác biệt lớn trong triết lý hiện thực giữa Python và Ruby/Perl.
Trình thông dịch
Ruby có hai bản thông dịch chính: bộ thông dịch Ruby ban đầu (viết tắt là MRI), bản được dùng phổ biến nhất, và JRuby, bộ thông dịch dựa trên ngôn ngữ Java. Bộ thông dịch Ruby đã được cài đặt trên nhiều nền tảng khác nhau, bao gồm Unix, Microsoft Windows, DOS, Mac OS X, OS/2, Amiga và một số nền tảng khác. Bản chính thức của Ruby có kèm theo “IRB”, là bộ thông dịch dạng dòng lệnh trực tiếp (interactive command-line interpreter) giúp cho việc kiểm tra code nhanh chóng.
Quy ước bản quyền
Ruby được phân phối tự do theo đăng ký tự do và mã nguồn mở GPL và Ruby License
Tính năng
Hướng đối tượng
Xử lý ngoại lệ
Iterator và closures (dựa vào cách truyền một khối lệnh)
Native, biểu thức chính quy như Perl ở mức độ ngôn ngữ
Chồng toán tử (operator overloading)
Thu hồi rác tự động
Tính khả chuyển cao (portable)
Có thể chạy đa luồng (multi-threading) trên mọi platforms
Khả năng nạp động các DLL/thư viện chia sẻ trên hầu hết mọi platforms.
Tự kiểm tra (introspection), reflection và meta-programming
Rất nhiều thư viện chuẩn
Hỗ trợ dependency injection
Continuation và generator (xem ví dụ tại RubyGarden: continuations và generators)
Dùng khối lệnh (code block)
Ruby hiện tại vẫn chưa hỗ trợ Unicode, dù chỉ mới hỗ trợ tạm thời cho UTF-8.
Những vấn đề mới
Mặc dù việc thiết kế Ruby tuân theo nguyên tắc ít gây ngạc nhiên nhất, nhưng một số tính năng khác với các ngôn ngữ khác như C hay Perl:
Các tên bắt đầu bằng ký tự hoa được xem là hằng, vì thế biến cục bộ nên bắt đầu bằng ký tự thường.
Việc đánh giá Boolean đối với các dữ liệu không phải bool rất chặt chẽ: 0, “” và [] được xem là true: Trong C, biểu thức 0 ? 1: 0 được xem là 0. Trong Ruby, tuy nhiên, nó lại trả về 1, vì số 0 được xem là “một cái gì đó”; chỉ có nil và false mới được xem là bằng false. Một hệ luận đối với quy luật này là theo qui ước, các phương thức của Ruby—ví dụ, biểu thức chính quy tìm kiếm — sẽ trả về các số, chuỗi, danh sách etc. nếu thành công, nhưng lại trả về nil nếu thất bại (ví dụ, không tìm thấy).
Để biểu diễn một số thực dấu chấm động, ta phải theo quy tắc dùng ký số zero (99.0) hay chuyển đổi tường minh (99.to_f). Việc dùng dấu chấm là không đủ (99.) vì các số vẫn có thể nhận cú pháp có phương thức.
Thiếu một kiểu dữ liệu ký tự (“char”). Điều này có thể gây ngạc nhiên khi duyệt qua chuỗi: “abc”[0] cho ra 97 (một số nguyên, biểu diễn mã ASCII của ký tự đầu tiên trong chuỗi); để lấy được “a” dùng “abc”[0,1] (chuỗi con có chiều dài 1) hay “abc”[0].chr.
Một danh sách các lỗi thường gặp (“gotchas”) có thể tra trong cuốn sách của Hal Fulton The Ruby Way, trang 48–64. Tuy nhiên, vì danh sách trong cuốn sách là dựa trên phiên bản cũ của Ruby (version 1.6), một số mục đã được sửa đổi sau khi cuốn sách ấn hành. Ví dụ, retry bây giờ làm việc được với while, until và for, cũng như với iterators.
Ví dụ
Lưu ý: Các ví dụ sử dụng chuỗi ký tự Unicode để chạy được cần đặt một biến môi trường là $KCODE=”u”. Hay là chạy #ruby với tùy chọn là -K u vẫn được. Xem thêm những hạn chế của phiên bản Ruby hiện tại với Unicode tại ruby và unicode
Mọi thứ, kể cả tầm thường nhất, là một đối tượng. Vì thế những ví dụ dưới đều chạy được:
-199.abs # => 199, abs: giá trị tuyệt đối
“ruby is cool”.length # => 12
“Rick”.index(“c”) # => 2
“Nice Day Isn’t It?”.split(//).uniq.sort.join # => ” ‘?DINaceinsty”
Input
print ‘Làm ơn gõ tên >’
name = gets.chomp
puts “Chào #{name}.”
Hội thoại
puts ‘Cho tôi con số của bạn’
number = gets.chomp
puts number.to_i
output_number = number.to_i + 1
puts output_number.to_s + ‘ là một con số lớn hơn.’
Mảng
Khởi tạo và sử dụng một mảng:
a = [1, ‘chào’, 3.14, 1, 2, [4, 5]]
a[2] # => 3.14
a.reverse # => [[4, 5], 2, 1, 3.14, ‘chào’, 1]
a.flatten.uniq # => [1, ‘chào’, 3.14, 2, 4, 5]
Khởi tạo và xây dựng một mảng kết hợp (Ruby gọi là hash):
hash = Hash.new # Tương đương với hash = {}
hash = {:water => ‘wet’,:fire => ‘hot’} # Đoạn mã đầu trở nên dư thừa khi
# đưa cho hash một đối tượng hash riêng biệt mới
puts hash[:fire] # Xuất ra “hot”
hash.each_pair do |key, value| # Hoặc: hash.each do |key, value|
puts “#{key} is #{value}”
end
Trả về {:water => ‘wet’,:fire => ‘hot’} và xuất ra:
water is wet
fire is hot
hash.delete:water # Hủy cặp giá trị:water => ‘wet’ và trả về “wet”
hash.delete_if {|key, value| value == ‘hot’} # Hủy cặp giá trị:fire => ‘hot’ và trả về {}
Cấu trúc rẽ nhánh
Mệnh đề If:
# Tạo ra một số ngẫu nhiên và in ra số đó là chẵn hay lẻ. if rand(100) % 2 == 0 puts "Là số chẵn" else puts "Là số lẻ" end
Block và iterator
2 cách để tạo một đoạn block:
{ puts ‘Xin chào, thế giới!’ } # lưu ý dấu ngoặc
hoặc:
do
puts ‘Xin chào, thế giới!’
end
Một block có thể được truyền đến một hàm (method) như một tham số tùy chọn. Nhiều hàm được cài sẵn có tham số như vậy:
File.open(‘file.txt’, ‘w’) do |file| # ‘w’ biểu thị “chế độ ghi chép”
file.puts ‘Viết gì đó’
end # Tập tin sẽ tự động đóng ở đây
File.readlines(‘file.txt’).each do |line|
puts line
end
=> ‘Viết gì đó’
Thông số đi qua block để trở thành closure (ví dụ):
Trong một biến thể hiện đối tượng (biểu thị bằng ‘@’), hãy lưu block này.
def remember(&p)
@block = p
end
Dùng hàm trên, cho block đó một cái tên.
remember {|ten| puts “Xin chào, #{ten}!”}
Dùng closure (lưu ý rằng điều này không có áp dụng tự do cho các biến khác):!
@block.call(“Tèo”) # Xuất ra “Xin chào, Tèo!”
Tạo ra một hàm ẩn danh:
proc {|arg| puts arg}
Proc.new {|arg| puts arg}
lambda {|arg| puts arg}
->(arg) {puts arg} # được giới thiệu ở Ruby 1.9
Trả về closure từ một hàm:
def create_set_and_get(initial_value=0) # Lưu ý initial_value là 0
closure_value = initial_value
[ Proc.new {|x| closure_value = x}, Proc.new { closure_value } ]
end
setter, getter = create_set_and_get # Trả về hai giá trị
setter.call(21)
getter.call # => 21
Biến tham số cũng có thể được sử dụng như là một liên kết cho closure,
Vậy nên hàm trên có thể được viết lại như sau:
def create_set_and_get(closure_value=0)
[ proc {|x| closure_value = x }, proc { closure_value } ]
end
Trong một hàm, có thể thay đổi block vào lúc gọi hàm:
def bfs(e)
q = []
e.mark
yield e
q.push e
while not q.empty?
u = q.shift
u.edge_iterator do |v|
if not v.marked?
v.mark
yield v
q.push v
end
end
end
bfs(e) {|v| puts v}
Duyệt lần lượt trên enumation và mảng bằng cách dùng block:
a = [1, ‘chào’, 3.14]
a.each {|item| puts item} # Xuất ra toàn bộ phần tử
(3..6).each {|num| puts num} # Xuất ra các số từ 3 đến 6
Block cũng có thể dùng với các hàm dựng sẵn:
File.open(‘taptin.txt’, ‘w+b’) do |taptin|
taptin.puts ‘Viết linh tinh gì đó.’
end # File được tự động đóng lại tại đây
Hay:
IO.readlines(‘taptin.txt’) do |dòng|
# Xử lý từng dòng ở đây.
end
Sử dụng enumeration và block để xuất ra lũy thừa 2 của các số từ 1 đến 10:
(1..10).collect {|x| x*x} => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Lớp
Đoạn mã sau định nghĩa một lớp tên là Person
. Bên cạnh phương thức khởi tạo initialize
, là phương thức được gọi đến khi cần tạo đối tượng mới, lớp này còn có 2 phương thức khác: một là ghi đè lên toán tử so sánh <=> (vì thế Array#sort
có thể sắp xếp theo tuổi) và hai là là ghi đè lên phương thức to_s
(vì thế Kernel#puts
có thể định dạng đầu ra của nó). Ở đây, attr_accessor
là một ví dụ của meta-programming trong Ruby: nó định nghĩa các phương thức dạng getter và setter của biến thực thể, trong khi attr_reader
các phương thức dạng ‘getter’. Và, câu lệnh cuối cùng trong một phương thức là giá trị trả về của nó, điều này cho phép bỏ qua lệnh return
.
class Person attr_reader:name,:age def initialize(name, age) @name, @age = name, age end def <=>(person) # Định nghĩa toán tử so sánh @age <=> person.age end def to_s "#{@name} (#{@age})" end end group = [ Person.new("Bob", 33), Person.new("Chris", 16), Person.new("Ash", 23) ] puts group.sort.reverse
Đoạn mã trên in ra ba tên theo tuổi giảm dần:
Bob (33) Ash (23) Chris (16)
Ngoại lệ
Một trường hợp ngoại lệ được đưa ra với lệnh raise:
raise
Có thể thêm một thông báo tùy chọn:
raise “Đây là một thông báo”
Ngoại lệ cũng có thể xác định bởi các lập trình viên:
raise ArgumentError, “Tranh luận bất hợp pháp!”
Ngoài ra, một thực thể của lớp Ngoại lệ có thể tạo ra được với biến raise như sau:
raise ArgumentError.new(“Tham số không phù hợp!”)
Một vài ví dụ
Có thể tìm thấy các code mẫu của Ruby dưới dạng các thuật toán tại:
Exponentiating by squaring
Linear search
Quicksort
Hệ điều hành
Ruby có thể chạy trên các hệ điều hành sau:
Các họ hàng của Unix
DOS
Microsoft Windows 95/98/XP/NT/2000/2003
Mac OS X
BeOS
Amiga
Acorn RISC OS
OS/2
Syllable
Có thể còn thêm một số platform khác.
Chương trình “Hello world”
viết dòng này vào file hello.rb
puts “chao The gioi”
và chạy thử
~>ruby hello.rb
Cú pháp
Cú pháp trong Ruby tương tự như Perl and Python. Lớp và phương thức được định nghĩa thông qua các từ khóa, ngoài ra khối (block) còn có thể được định nghĩa bằng cặp dấu ngoặc nhọn {}. Khác với Perl, biến số (variable) không nhất thiết phải bắt đầu bằng dấu $, và nếu sử dụng sẽ thay đổi phạm vi của biến số. Các kí tự xuống dòng (line breaks) cũng như dấu chấm phẩy ; phân chia các mệnh đề (statement) với nhau.
Một trong những điểm khác biệt lớn nhất so với Perl và Python là Ruby ẩn hoàn toàn các biến của thực thể (instance) và chỉ có thể truy cập và chỉnh sửa chúng thông qua các phương thức (như attr_writer, attr_reader).
Các ứng dụng
Ruby Application Archive đóng vai trò là một kho lưu trữ đủ loại ứng dụng và các thư viện viết bằng Ruby, với hàng ngàn mục. Mặc dù số lượng ứng dụng sẵn có không lớn bằng với cộng đồng của Perl hay Python, vẫn có đủ loại công cụ và tiện ích nhằm hỗ trợ cho việc phát triển ngôn ngữ trong tương lai.
4 Lý do tại sao Ruby là ngôn ngữ lập trình bạn nên học đầu tiên

Học lập trình là một quá trình rất gian nan và thử thách. Bạn sẽ gặp phải những khái niệm lạ lẫm, những thuật ngữ kỹ thuật, và những lựa chọn khó khăn. Một trong những sự lựa chọn đầu tiên bạn sẽ phải thực hiện là việc nên bắt đầu với ngôn ngữ lập trình nào.
Ngôn ngữ lập trình cũng tương tự như ngôn ngữ nói. Mỗi ngôn ngữ lập trình đều rơi vào một hoặc nhiều thể loại. Một vài loại có thể bạn đã nghe nói đến bao gồm mệnh lệnh (imperative), hướng đối tượng, chức năng, hoặc dựa trên logic. May mắn thay, một khi bạn đã học một ngôn ngữ thì rất dễ dàng để học sang một ngôn ngữ thứ hai trong cùng thể loại. Điều không may là, ngôn ngữ lập trình đầu tiên sẽ rất khó để học.
Ruby là một ngôn ngữ lập trình đa mục đích, được tạo ra vào năm 1990 bởi Yukihiro “Matz” Matsumoto. Nó cũng là một trong những ngôn ngữ tốt nhất để bắt đầu khi bạn mới học lập trình.
Ruby là một trong những ngôn ngữ dễ học nhất
Tôi nhớ khi mình lần đầu tiên bắt đầu học lập trình. Đó là một lớp giới thiệu về Khoa học Máy tính và chương trình đào tạo sử dụng ngôn ngữ lập trình C++. Trong thế giới lập trình, chương trình máy tính đầu tiên của tất cả mọi người là một chương trình hiển thị dòng chữ “Hello, world!”. Nó được gọi là “Hello World Program”.
Dưới đây là nội dung chương trình Hello World được viết bằng C++:

Thật đáng sợ, phải không bạn? Để hiển thị dòng chữ “Hello, world!” lên màn hình máy tính, bạn sẽ phải học nhiều function và từ khóa trong C++. Còn dưới đây là mã nguồn của Ruby trong chương trình tương đương:

Đơn giản hơn nhiều so với phiên bản C++!
Ruby được coi là một ngôn ngữ lập trình cấp cao hơn so với C++. Các tính năng của một ngôn ngữ cấp cao trừu tượng hóa mạnh mẽ từ các chi tiết máy tính. Trong khi các ngôn ngữ cấp thấp là gần gũi hơn với các chi tiết máy (như địa chỉ bộ nhớ hoặc thanh ghi CPU), các ngôn ngữ cấp cao là gần gũi hơn với một ngôn ngữ nói tự nhiên.
Khi bạn lần đầu tiên học lập trình, một ngôn ngữ lập trình cấp cao như Ruby là dễ dàng hơn để sử dụng.
Học Ruby là một bước đệm để học Ruby on Rails
Nếu bạn đang làm việc trong ngành công nghiệp phần mềm hoặc cộng đồng khởi nghiệp startup, thì rất có thể bạn đã nghe nói về Ruby on Rails (thường được gọi tắt là Rails). Rails là một framework để tạo ra các ứng dụng web.
Nhiều sinh viên mới học lập trình không phân biệt được sự khác nhau giữa Ruby và Ruby on Rails. Ruby là một ngôn ngữ lập trình. Ruby on Rails là một framework dùng và phụ thuộc vào ngôn ngữ lập trình Ruby. Hãy nghĩ về một framework như một bộ sưu tập code viết sẵn để giúp các lập trình viên. Trong trường hợp này, framework Rails là một bộ sưu tập code viết sẵn để giúp các lập trình viên tạo ra các website và các ứng dụng web.
Bạn vẫn còn lẫn lộn ư? Nếu vậy thì hãy suy nghĩ về các bước làm một chiếc bánh sandwich. Bạn chỉ cần một miếng thịt, pho mát, rau diếp và hai lát bánh mì. Nhưng bánh mì đến từ đâu? Sẽ dễ dàng hơn để có được những lát bánh mì từ các cửa hàng tạp hóa thay vì bạn phải trộn bột mì với nước và tự nướng lấy. Trong trường hợp này, ngôn ngữ lập trình Ruby là bột và nước. Bánh mì lát thái sẵn chính là framework Ruby on Rails.
Học Ruby là một điều kiện tiên quyết để học Ruby on Rails. Bạn sẽ tiến một bước gần hơn đến việc tạo ra các ứng dụng web như Twitter, Yellow Pages, Hulu, hay Groupon.
Nhu cầu tuyển dụng lập trình viên Ruby ngày càng tăng
Trong danh sách những ngôn ngữ lập trình phổ biến nhất TIOBE thì Ruby là ngôn ngữ đứng thứ 10 ở thời điểm bài viết này. Mặc dù phổ biến là một điều tốt, nhưng việc có nhiều nhu cầu tuyển dụng trên thị trường việc làm thì còn tốt hơn. Hiện nay, Ruby đang có tốc độ tăng trưởng về nhu cầu tuyển dụng đáng kinh ngạc.
Nhu cầu đối với các lập trình viên Ruby có thể gắn liền với framework Ruby on Rails, nó đã giúp đưa ngôn ngữ này trở thành một trong những ngôn ngữ lập trình chính vào năm 2004. Các nhà tuyển dụng đang xây dựng các trang web của họ bằng cách sử dụng Ruby on Rails. Họ cần các lập trình viên Ruby để duy trì code base của họ.

Nhu cầu cho Ruby cũng tồn tại bên ngoài Ruby on Rails. Ruby ngày càng trở nên phổ biến trong các vai trò DevOps. Có phải bạn đang tự hỏi DevOps là gì? Một trang web hay ứng dụng web với số lượng lớn traffic thường sẽ đòi hỏi hàng trăm máy tính để chạy trên đó, gọi là các máy chủ. Các kỹ sư DevOps đảm bảo độ tin cậy và hiệu quả của các máy chủ này. Các kỹ sư DevOps cũng tự động hóa việc triển khai các máy chủ, do đó các trang web có thể nhanh chóng xử lý một lượng lớn lưu lượng truy cập. Ruby là một ngôn ngữ lập trình phổ biến cho các framework DevOps như Puppet và Chef.
Ruby có một hệ sinh thái rất lớn và hữu ích
Hệ sinh thái của một ngôn ngữ lập trình là rất quan trọng vì những lý do sau đây:
Những phần code đã có mà bạn có thể tận dụng – Ruby có những framework và các thư viện được xây dựng sẵn như Ruby on Rails và Chef. Bạn có thể sử dụng những phần code được xây dựng sẵn này cho các dự án của riêng mình. Tại sao lại phải mất thời gian để phát minh lại cái bánh xe khi có ai đó đã thực hiện điều này cho bạn? Ruby thậm chí còn có hệ thống riêng của mình để quản lý các framework và thư viện, được gọi là RubyGems. Hiện tại có hơn 60.000 thư viện để bạn tha hồ lựa chọn!
Tài liệu – các tài liệu hướng dẫn đóng một vai trò rất lớn trong cuộc sống của mọi lập trình viên. Khi bạn đang làm việc trên dự án của mình, bạn sẽ liên tục tìm kiếm thông qua các tài liệu hướng dẫn. Lần đầu tiên kết nối tới một cơ sở dữ liệu? Cách tốt nhất để bắt đầu là tìm tài liệu hướng dẫn. Khi bạn đang lập trình, sẽ có rất nhiều “lần đầu tiên”, nơi bạn sẽ cần phải truy cập vào những tài liệu tốt.
Các tài nguyên học tập – Ruby có một số lượng lớn các nguồn tài nguyên để bạn lựa chọn. Có rất nhiều cuốn sách, screencasts, các khóa học, và các bootcamp dành riêng cho các lập trình viên trong việc học Ruby. Thậm chí có những hướng dẫn miễn phí nằm rải rác khắp nơi trên các trang web.
Cộng đồng – Bạn đang bị mắc kẹt trong một vấn đề lập trình hoặc có một câu hỏi? Hãy tìm một mailing list Ruby, chat room, hoặc diễn đàn để đặt câu hỏi! Cộng đồng Ruby có rất nhiều các nhà phát triển tốt bụng thích giúp đỡ người khác. Bạn hãy đóng góp trở lại cộng đồng một khi có nhiều kinh nghiệm hơn. Thậm chí còn có những Ruby User Groups, nơi các lập trình viên có hứng thú trong Ruby gặp mặt để thảo luận và học hỏi lẫn nhau.

Để lại một phản hồi