1
KỸ THUẬT LẬP TRÌNH
ĐẠI HỌC BÁCH KHOA HÀ NỘI
Bộ môn: Kĩ thuật lập trình
TÌM HIỂU VỀ MỘT SỐ MÔ HÌNH LẬP TRÌNH
Giảng viên: Vũ Đức Vượng
Thực hiện:
Sinh viên: Nguyễn Bá Duy
MSSV: 20121397
Lớp: CNTT 1.01
Hà Nội 19/01/2015
2
KỸ THUẬT LẬP TRÌNH
Lời nói đầu
Bất kì một ngôn ngữ lập trình nào cũng đều mang tính logic cao và tuân theo
những quy chuẩn cơ bản về toán học. Tuy vậy, mỗi ngôn ngữ lại có những phương
thức riêng để thực hiện những quy chuẩn đó, đặc biệt là trên các lĩnh vực như
hàm (function), biến (variable), phương thức (method) và đối tượng (object). Bên
cạnh sự đa dạng của ngôn ngữ lập trình, cũng dần có rất nhiều mô hình lập trình
được ra đời, trong đó phổ biến nhất có thể kể đến như: Lập trình hướng đối
tượng (object-oriented programming), lập trình thủ tục(procedural programming)
và lập trình cấu trúc (structured programming). Mỗi một mô hình lập trình lại có
những đặc trưng riêng về cách sử dụng cũng như tính trừu tượng hóa đối với các
quá trình xác định.
Các nhóm khác nhau trong công nghệ phần mềm đề xướng các phương pháp
khác nhau, các ngôn ngữ lập trình khác nhau tức là các mô hình lập trình khác
nhau. Một số ngôn ngữ được thiết kế để hỗ trợ một mô hình đặc thù (Java hỗ trợ
lập trình hướng đối tượng trong khi Haskell hỗ trợ lập trình chức năng). Một số
ngôn ngữ khác lại hỗ trợ nhiều mô hình (như Python và Common Lisp).
Một số mô hình lập trình cấm các thao tác mà chính ngôn ngữ đó có. Chẳng hạn,
lập trình cấu trúc không cho phép sử dụng lệnh goto. Quan hệ giữa các mô hình
lập trình và các ngôn ngữ lập trình có thể phức tạp vì một ngôn ngữ có thể hỗ trợ
nhiều mô hình lập trình. Thí dụ như C++ được thiết kế để hỗ trợ các phần tử của
lập trình thủ tục, lập trình hướng đối tượng và lập trình tiêu bản.
Mặc dù vậy, những người thiết kế và những người lập trình sẽ quyết định làm
thế nào để xây dựng một chương trình dùng các phần tử của mô hình nào đó.
Người ta có thể viết một chương trình hoàn toàn theo kiểu lập trình thủ tục trong
C++, cũng có thể viết chương trình hoàn toàn hướng đối tượng, hay viết chương
trình có các phần tử của cả hai mô hình.
Ở thời kz đầu, công nghệ phần mềm hoàn toàn dựa trên những thao tác lập
trình bằng mã nhị phân hoặc mã máy, mà đại diện là các giá trị 0 và 1. Điều này
khiến cho quá trình thiết kế, kiểm soát sự hoạt động cũng như sửa lỗi đối với một
ứng dụng trở nên vô cùng rắc rối và không hiệu quả. Chúng ta coi những phương
thức lập trình ở thời điểm này thuộc mô hình lập trình bậc thấp (low-level
programming paradigm). Về sau, cùng với sự phát triển của công nghệ, những hạn
chế của giai đoạn đầu tiên dần được xóa bỏ với sự ra đời của các ngôn ngữ lập
trình thế hệ thứ 3 là COBOL, Fortran và BASIC, đồng thời, một mô hình lập trình
mới cũng xuất hiện và vẫn tiếp tục được sử dụng hiệu quả và phổ biến cho đến
ngày nay, đó là mô hình lập trình thủ tục (procedural paradigm). Dần dần, chúng
ta chứng kiến sự phát triển mạnh mẽ về số lượng của các mô hình lập trình, mà
cơ bản có thể kể đến các mô hình sau:
1.
Lập trình cấu trúc - Structured programming.
3
KỸ THUẬT LẬP TRÌNH
2.
3.
4.
5.
6.
7.
8.
9.
….
Lập trình chức năng - Functional programming.
Lập trình logic - Logical paradigm
Lập trình trực quan - Visual programming.
Lập trình song song - Parallel programming.
Lập trình phân tán - Distributed programming.
Lập trình tương tranh - Concurrent programming.
Lập trình định hướng đối tượng - Component-oriented programming .
Lập trình cực độ - Extreme programming.
4
KỸ THUẬT LẬP TRÌNH
SƠ LƯỢC VỀ MỘT SỐ MÔ HÌNH LẬP TRÌNH PHỔ BIẾN
1. Functional programming.
Đặc điểm:
•
•
•
•
•
•
•
Nguyên l{ và { tưởng: Toán học và lý thuyết về hàm.
Các giá trị đã được tạo là không thể biến đổi.
Trừu tượng hóa một biểu thức thành một hàm và ngược lại, một hàm có
thể được tính toán như một biểu thức.
Hàm là lớp giá trị đầu tiên.
Hàm là những giá trị hoàn chỉnh, tương tự như số, danh sách...
Thích hợp với những tính toán theo yêu cầu.
Mở ra những khả năng mới.
Functional Programming là thể loại lâu đời nhất trong ba paradigm lập trình chính.
Ngôn ngữ FP đầu tiên là IFP, được phát minh vào năm 1955, một năm trước khi có
Fortran. Sau đó, LISP ra đời năm 1958, một năm trước khi có COBOL. Cả Fortran
và COBOL đều là những ngôn ngữ imperative (hay còn gọi là procedural). Chúng
đặc biệt thành công khi được ứng dụng vào tính toán khoa học và nghiệp vụ, và trở
thành paradigm thống trị trong suốt 30 năm đầu của kỉ nguyên thông tin. Vào
những năm 1970, Object-Oriented paradigm bắt đầu phát triển. Cùng với sự trưởng
thành của các ngôn ngữ lập trình hướng đối tượng, OO trở thành paradigm được sử
dụng phổ biến nhất cho đến hiện nay.
5
KỸ THUẬT LẬP TRÌNH
2. Logical paradigm
Khi mô tả bài toán dưới dạng logic vị từ, ta có thể yêu cầu hệ thống tìm kiếm các
lời giải liên quan đến các khai báo đó. Bài toán cần giải được xem là “mục tiêu”
mà hệ thống phải chứng minh trên cơ sở các tri thức đã được khai báo.
Như thế, toàn bộ các kí hiệu của ngôn ngữ lập trình suy về một công thức đặc
biệt:
-
Phát sinh từ một yêu cầu.
Nhằm chứng minh một mục tiêu. Để trả lời cho câu hỏi đó hệ thống xem nó
như là một “đích” và cố chứng minh “đích” đó bằng cách tạo những suy
diễn trên cơ sở các tri thức đã khai báo.
Một ngôn ngữ logic có thể được dùng trong giai đoạn đặc tả yêu cầu của quy
trình xây dựng một sản phẩm phần mềm. Hơn thế nữa, logic vị từ cho phép biểu
diễn hầu hết các khái niệm và các định lí trong các bộ môn khoa học.
6
KỸ THUẬT LẬP TRÌNH
3. Visual programing
Trong xu hướng phát triển mạnh mẽ hiện nay của tin học, số người sử dụng
máy tính tăng lên rất nhanh và máy tính được sử dụng trong hầu hết các lĩnh vực
của đời sống nên đòi hỏi các ngôn ngữ lập trình cũng phải đơn giản dễ sử dụng và
mang tính đại chúng cao. Chính vì vậy phương pháp lập trình trực quan ra đời.
Đặc điểm của các ngôn ngữ lập trình trực quan là dễ sử dụng, triển khai các
ứng dụng một cách nhanh chóng.
4. Parallel programming.
Tính toán song (Parallel Computing) là việc chia một công việc ra thành các
công việc nhỏ và cho các công việc này thực hiện đồng thời với nhau bởi các hệ
thống có nhiều bộ vi xử lý (multiprocessor) hay bộ vi xử lý đa nhân (multicore)
nhằm giảm thời gian thực hiện công việc đó xuống. Việc lập trình để tách ra các
công việc nhỏ và sắp xếp để xử lý song song thì được gọi là lập trình song song.
Lập trình song song là một công việc rất phức tạp so với lập trình tuần tự
thông thường, người phát triển phải thực hiện một quá trình “song song hóa”, biến
đổi các chương trình tuần tự thành chương trình song song có khả năng tận dụng
tối đa sức mạnh của hệ thống.
Quá trình song song hóa gồm ba giai đoạn chính:
Phân chia chương trình thành các công việc con (Sub-task
decomposition).
Phân tích sự phụ thuộc (Dependence anlysic)
Định thời các công việc (Task scheduling).
Nói một cách dễ hiểu thì lập trình song song là lập trình để chạy được đa
luồng với các dòng CPU đa nhân hiện nay (core i3, core i5, core i7,…)
7
KỸ THUẬT LẬP TRÌNH
5. Concurrent programming
Lập trình tương tranh là một trong những kỹ thuật quan trọng và cũng là
một thách thức. Một mặt, nó đem lại khả năng sử dụng hiệu quả cho những hệ
thống song song và phân tán. Mặt khác, những rủi ro trong việc tương tác giữa các
tiên trình thực hiện đồng thời có thể gây ra những lỗi phần mềm không dễ dàng để
tìm ra.
Lập trình tương tranh, một số dòng lệnh có thể được thực hiện đồng thời.
Mỗi dòng lệnh là một chương trình tuần tự, ngoại trừ một thực tế là các dòng lệnh
có thể giao tiếp và gây trở ngại lẫn nhau. Mỗi một dòng lệnh là một luồng, các
chương trình tuần tự còn gọi là chương trình đơn luồng, còn chương trình viết theo
phương pháp tương tranh là chương trình đa luồng.
Đặc điểm:
Người dùng có thể tương tác với các ứng dụng khi tiến trình đang thực thi.
Những tiến trình chạy thời gian dài làm trì hoãn các tiến trình ngắn.
Các chương trình phức tạp được thực hiện tốt hơn trên các bọ xử lý đa
luồng
Những tiến trình đòi hỏi điều khiện tiên quyết có thể tạm dừng và đợi đến
khi đáp ứng được để tiếp tục xử lý.
6. Distributed programming.
Lập trình phân tán là một dạng của lập trình song song (tính toán song song).
Lập trình song song tạo ra mối liên hệ giữa máy tính và các đơn vị tính toán, khiến
chúng hoạt động đồng thời đối với một vấn đề cụ thể (dự báo thời tiết chẳng hạn). Các
đơn vị tính toán có thể đặt rất gần nhau hoặc tách rời nhau. Khi các đơn vị tính toán
được đặt tách rời, ta gọi đó là lập trình phân tán. Với mô hình lập trình này, các đơn vị
tính toán thường rất khác nhau, cũng như sự khác nhau giữa các hệ điều hành và thiết
lập mạng máy tính trở nên tương đối phức tạp và khó khăn.
Lập trình mạng phân tán, thường có 2 khái niệm chính: peer to peer và client –
server..peer to peer là lập trình ngang hàng giữa 2 máy tính… còn lập trình client –
server là lập trình cho phép n máy client kết nối tới m máy server – đây cũng là mô
hình chúng ta sẽ gặp nhiều trong thực tế…
8
KỸ THUẬT LẬP TRÌNH
7. Extreme programming.
Extreme Programing là nổi tiến nhất của phương Agile (Agile Method). Nó được
hình thành bởi một tập các thực nghiệm (practice) đơn giản nhưng phụ thuộc lẫn
nhau.Những pactice này làm việc với nhau để hình thành một dạng tổng quát hơn các
thành phần của nó.
Khách hàng là thành viên của nhóm phát triển (Cutomer team member).
Chúng ta mong muốn khách hàng và nhóm phát triển làm việc chung với nhau để
họ hiểu các vấn đề của nhau và cùng giải quyết các vấn đề đó.
Vậy ai là khách hàng? Khách hàng của một nhóm XP là một nhóm người
định nghĩa và xác định độ ưu tiên của chức năng hệ thống (hay sản phẩm). Đôi khi
khách hàng là nhóm nhà phân tích nghiệp vụ hoặc chuyên gia marketing làm việc
cùng một công ty phần mềm với nhóm phát triển. Đôi khi khách hàng là một đâị
diện của người dung. Đôi khi khách hàng cũng chính là người trả tiền. Nhưng
trong một dự án XP, bất kể khách hàng là ai thì họ cũng là một thành viên của
nhóm để phát triển.
Tình huống tốt nhất là khách hàng làm việc với nhóm phát triển trong cùng
một phòng. Hoặc chí ít là làm việc ở nơi nào đó cách độ 100 feet so với phòng làm
việc của nhóm phát triển. Khoảng cách càng xa thì càng khó thỏa mãn điều kiện
“Customer team member”. Nếu khách hàng làm việc trong một tòa nhà khác hoặc
ở một quốc gia khác thì càng khó mà yêu cầu họ tham gia cùng với nhóm.
Chúng ta sẽ làm gì nếu khách hàng không thể ở gần nhóm phát triển? Lời
khuyên của tôi là hãy tìm ai đó sẵn long làm việc chung và có thể đứng ở vai trò
của một khách hàng thực thụ.
Chu kỳ ngắn (Short C cles)
Một dự án XP sẽ giao sản phẩm dở dang (hay dự án đang thực hiện, cùng
dịch từ chữ working project) mỗi 2 tuần. Mỗi bước lặp 2 tuần. Mỗi bước lặp 2 tuần
này sản xuất ra một phần mềm dở dang đáp ứng một số yêu cầu nào đó của khách
hàng. Tại thời điểm cuối của bước lập, hệ thống được demo cho khách hàng xem
và nhận phản hồi của họ.
Kế hoạch bước lặp:
Mỗi bước lặp thường kéo dài 2 tuần. Nó đại diện cho một lần giao hàng thử,
có thể sẽ được hoặc không được them vào sản phẩm chính thức. Nó là một tập các
user story được chọn bởi khách dựa trên chi phí do nhóm phát triển đưa ra.
9
KỸ THUẬT LẬP TRÌNH
Nhóm phát triển đưa ra chi phí cho một bước lặp bằng cách đo chi phí của
các bước lặp họ đã làm trước đó. Khách hàng chọn tùy ý số lượng story cho bước
lặp sao cho tổng chi phí ước lượng vượt quá ngân sách.
Mỗi khi một bước lập được khởi động, khách hàng đồng ý không thay đổi
định nghĩa của story và độ ưu tiên. Trong suốt thời gian này, nhà phát triển tự do
cắt các story thành các nhiệm vụ (task) cà tự do cài đặt các task này tùy theo thuận
lợi về mặt kỹ thuật và kinh doanh.
Kế hoạch phát triển:
Nhóm XP thường tạo ra kế hoạch phát hành tương ứng với mỗi 6 bước lặp.
Một bản phát hàn thường là thành quả của 3 tháng làm việc. Nó đại diện cho 1 lần
giao hàng chính và thường sẽ được đưa vào sản phẩm. Một bản phát hành cũng bao
gồm một tập các story được phân độ ưu tiên bởi khách hàng dựa trên ngân sách mà
nhóm phát triển đưa ra.
Nhóm phát triển xây dựng ngân sách cho 1 bản phát hành bằng cách đo chi
phí tiêu tốn của những phiên bản phát hành trước. Khách hàng có thể chọn số
lượng bất kì các story cho 1 bản phát hành sao cho tổng các chi phí ước lượng
không vượt quá ngân sách. Khách hàng cũng xác định trình tự các story được cài
đặt trong 1 bản phát hành. Nếu muốn, nhóm phát triển cũng có thể đưa ra vài bước
lập đầu tiên và xác định xem story nào sẽ được cài đặt trong bước lặp nào.
Các bản phát hành không cố định, khách hàng có thể thay đổi nội dung bất
kì lúc nào. Họ có thể hủy hoặc viết một story mới hoặc thay đổi độ ưu tiên của các
story.
Các chương trình kiểm tra sự thỏa mãn yêu cầu của sản phẩm
(Acceptance Test)
Chi tiết về user story được thu nhập trong dạng thức của các acceptance test
được đặc tả bởi khách hàng. Các acceptance test của 1 story được viết ngay trước
hoặc cùng lúc với việc cài đặt story đó. Chúng được viết theo một ngôn ngữ kịch
bản bất kì nào cho phép chúng chạy tự động và có thể lặp lại.
Ngôn ngữ của acceptance test được phát triển và tiến hóa cùng với hệ thống.
Khách hàng có thể thuê nhóm phát triển tạo một hệ thống thực thi kịch bản đơn
giản hoặc có thể họ có bộ phận kểm soát chất lượng (A) riêng để phát triển nó.
Nhiều khách hàng nhờ A phát triển công cụ cho việc kiểm tra độ thỏa mãn của sản
phẩm và trực viết các acceptance test.
Mỗi khi một acceptace test thành công, nó được thêm vào nhóm của những
acceptance test đã thành công trước đó, và không bao giờ được phép thất bại.
10
KỸ THUẬT LẬP TRÌNH
Nhóm acceptance test tăng trưởng lên và sẽ được chạy nhiều lần trong ngày, hoặc
chạy mỗi khi build hệ thống. Nếu như các acceptance test thất bại thì build này
được báo cáo là hỏng. Như vậy mỗi khi yêu cầu được gọi là cài đặt xong thì nó sẽ
không bao giờ bị vỡ. Hệ thống chuyển từ trạng thái cũ sang trạng thái mới mà
không bao giờ được phép không làm việc ( nghĩa là phải thỏa mãn các yêu cầu cũ
lẫn mới) lâu hơn vài giờ.
Lập trình theo cặp (Pải Programming)
Mã nguồng sản phẩm được viết bởi các cặp lập trình viên làm việc với nhau
trên cùng một máy tính. Một thành viên của 1 cặp sẽ giữ bàn phím và đánh code.
Thành viên còn lại sẽ quan sát code được đánh và tìm kiếm lỗi và cải tiến mã. Cả 2
tương tác với nhau một cách lien tục và cả 2 cùng bận rộn với công việc viết phần
mềm.
Vai trò được thay đổi thường xuyên. Người giữ bàn phím sẽ mệt mỏi và dẫn
đến dễ sai lầm. Người còn lại sẽ nhận lại bàn phím và điều khiển nó. Bàn phím
được hoán đổi nhiều lần giữa 2 người trong 1 giờ. Mã nguồn kết quả được thiết kế
và được viết bởi cả 2 người. Công sức của cả 2 là như nhau.
Mối quan hệ theo cặp sẽ được thay đổi ít nhất 1 lần trong ngày để mỗi lập
trình viên được làm việc ít nhất với 2 người trong ngày. Xuyên suốt 1 bước lặp của
XP, mỗi thành viên của nhóm phát triển phải làm việc với mọi thành viên khác
trong nhóm. Và họ chỉ làm những công việc của trong nội dung của bước lặp đó
mà thôi.
Điều này tăng cường sự trải rộng kiến thức cho toàn nhóm. Trong khi kỹ
thuật đặc trưng vẫn còn nguyên vẹn và các công việc yêu cầu kỹ thuật đặc trưng
vẫn thường được giao cho các chuyên gia thì các chuyên gia này làm việc với hầu
hết các thành viên còn lại trong nhóm. Điều này sẽ trải rộng kiến thức cho toàn
nhóm để các thành viên khác có thể thay thế cho chuyên gia trong các trường hợp
khẩn cấp.
Nguyên cứu của Laurie Williams và Nosek đã chỉ ra rằng việc theo cặp
không những không giảm hiệu năng của đội ngũ lập trình mà nó còn gia giảm đáng
kể tỉ lệ sai sót.
Sở hữu tập thể (Collective Ownership)
Một cặp có quyền check out và chỉnh sửa, cải tiến một module bất kì. Không
một lập trình viên nào chịu trách nhiệm cá nhân với một module bất kì hoặc một kĩ
thuật bất kì. Mọi người cùng làm việc với GUI. Mọi người cùng làm việc với
11
KỸ THUẬT LẬP TRÌNH
middle ware. Mọi người cùng làm việc với database. Không ai có nhiều quyền lực
hơn người khác về một kỹ thuật hay một module nào đó.
Điều này không có nghĩa là XP phản đối chuyên viên. Nếu bạn có kỹ năng
về lập trình GUI, hẳn bạn thích các nhiệm vụ lien quan tới GUI, nhưng bạn sẽ
được yêu cầu bắt cặp với các nhiệm vụ ở middle ware và database. Nếu bạn quyết
định học một chuyên môn thứ 2, bạn có thể đăng kí các nhiệm vụ và làm việc với
chuyên gia ở chuyên môn đó. Họi sẽ dạy bạn và bạn sẽ không bị giam giữ trong
chuyên môn của mình.
Chạy bền (Sustainable Pace)
Một dự án phần mềm không phải là một cuộc chạy đua nước rút, mà nó là
một cuộc chạy marathon. Nhóm nào vừa rời vạch xuất phát đã chạy thật nhanh thì
sẽ tiêu tốn hết năng lượng trước khi họ về đến đích. Để hoàn tất được nhanh thì
team càng phải kiểm soát được tốc độ, họ phải duy trì năng lượng và sự tỉnh táo.
Họ phải chạy với nhịp độ vừa phải và vững chắc.
Quy luật của XP là nhóm không được phép làm việc quá giờ (Overtime).
Ngoại lệ duy nhát là vào tuần cuối cùng của một phiên bản phát hành. Nếu team
đang phải trong tình huống hoàn tất nhanh chóng kịp tiến độ phát hành thì có thể
overtime.
12
KỸ THUẬT LẬP TRÌNH
Kết luận
Với lượng kiến thức vô cùng hạn chế cũng như chưa có nhiều thời gian để
tìm hiểu sâu, báo cáo này không hi vọng mang đến những gì mới mẻ mà đơn giản
chỉ là sự tổng hợp, lược dịch và chỉnh sửa lại các bài viết đã có trên internet, sách
in và một số tài liệu khác. Sai sót về mặt nội dung cũng như khiếm khuyết trong
cách trình bày chắc chắn không thể tránh khỏi, rất mong nhận được sự thông cảm
và giúp đỡ của thầy để báo các được hoàn thiện hơn!
Em xin chân thành cảm ơn!