Nếu bạn đã học các phương pháp chính thức cho phần mềm, bạn đã tìm thấy nó hữu ích như thế nào?


17

Nếu bạn đã được đào tạo về việc sử dụng các phương pháp chính thức (FM) để lập trình:

  • Làm thế nào hữu ích bạn đã tìm thấy nó?
  • Việc đào tạo FM của bạn liên quan đến điều gì (ví dụ như một khóa học, một cuốn sách)?
  • Bạn sử dụng công cụ FM nào?
  • Những lợi thế về tốc độ / chất lượng đã mang lại cho bạn so với việc không sử dụng FM?
  • Bạn tạo loại phần mềm nào với FM?
  • Và nếu bây giờ bạn không trực tiếp sử dụng FM, thì nó có đáng để học không ??

Tôi tò mò muốn nghe nhiều kinh nghiệm / ý kiến ​​về FM như có thể tìm thấy trong cộng đồng này; Tôi đang bắt đầu đọc nó và muốn biết thêm.

Lý lịch

Lập trình và phát triển phần mềm / kỹ thuật là một số kỹ năng / nghề nghiệp mới nhất của con người trên Trái đất, vì vậy không có gì đáng ngạc nhiên, lĩnh vực này còn non nớt - thể hiện trong đầu ra chính của lĩnh vực của chúng tôi, vì mã thường bị trễ và dễ bị lỗi. Sự non nớt trong ngành cũng được thể hiện bằng tỷ lệ lợi nhuận cao (ít nhất 10: 1) về năng suất giữa các lập trình viên trung bình và hàng đầu. Những sự thật ảm đạm như vậy được đề cập rất rõ trong các tài liệu, và được giới thiệu bởi những cuốn sách như Code Complete của Steve McConnell .

Việc sử dụng các phương thức chính thức (FM) đã được đề xuất bởi các nhân vật chính trong phần mềm / CS (ví dụ: E. Dijkstra ) để giải quyết (một trong) nguyên nhân gốc của lỗi: thiếu tính chặt chẽ toán học trong lập trình. Dijkstra, ví dụ, ủng hộ cho sinh viên phát triển một chương trình và bằng chứng của nó cùng nhau .

FM dường như phổ biến hơn nhiều trong chương trình giảng dạy CS ở châu Âu so với Mỹ. Nhưng trong vài năm qua, các phương pháp và công cụ FM "nhẹ" mới như Alloy đã thu hút được một số sự chú ý. Tuy nhiên, FM không được sử dụng phổ biến trong công nghiệp và tôi hy vọng sẽ có một số phản hồi ở đây về lý do.

Cập nhật

Tính đến thời điểm hiện tại (14/10/2010), trong số 6 câu trả lời dưới đây, không ai tranh luận rõ ràng về việc sử dụng FM trong công việc "thế giới thực". Tôi thực sự tò mò nếu ai đó có thể và sẽ; hoặc có lẽ FM thực sự minh họa sự phân chia giữa giới hàn lâm (FM là tương lai!) và ngành công nghiệp (FM chủ yếu là vô dụng).


Về cập nhật của bạn, có lẽ không ai tranh cãi về việc sử dụng FM trong công việc "thế giới thực" vì có rất ít trường hợp sử dụng chúng trong công việc trong thế giới thực
Richard

Câu trả lời:


8

Hoàn toàn vô dụng cho bất cứ điều gì không cần thiết.

Tôi đã có một khóa học được gọi là "Phương pháp chính thức" tập trung vào Alloy - tôi không thể thấy việc sử dụng nó ở bất cứ đâu. Có một lớp khác tập trung vào mô hình hóa đồng thời với LTSA - cũng vô dụng không kém.

Vấn đề là hầu hết các lỗi và sự cố trong phần mềm (ít nhất là theo kinh nghiệm của tôi) phát sinh từ sự phức tạp xảy ra dưới mức độ trừu tượng của các công cụ đó.


Cám ơn vì đã chia sẻ; Bạn có nói rằng việc đào tạo về FM ít nhất là hữu ích cho công việc sau này của bạn, ví dụ như đã giúp bạn suy nghĩ rõ ràng hơn? Hay không?
limist

@limist: Tôi thực sự không nghĩ như vậy. Ý tôi là, tôi khá thích Alloy, nhưng tôi không nghĩ nó hữu ích ngay cả khi mở rộng cách tôi nghĩ.
Fishtoaster

2
Đây chính xác là câu trả lời tôi sẽ đưa ra. Lớp học hoàn toàn dư thừa nhất mà tôi học ở trường đại học và không phải là thứ tôi từng nhìn lại và rất vui vì tôi đã học được nó. Tôi nghĩ rằng gốc rễ của vấn đề là Đặc tả hình thức phải phức tạp hơn mã để mô hình chính xác, vì vậy đối với bất kỳ mã phức tạp từ xa nào, đó là một nhiệm vụ khó khăn ồ ạt tạo ra một mô hình chính thức của nó, đến mức tôi có thể 'Hãy tưởng tượng bất cứ ai bên ngoài thiết kế phần cứng hoặc công việc tương tự không thể hủy bỏ muốn hoặc có thể làm điều đó.
glenatron

1
Điều đó thật đáng thất vọng. Tôi đã tưởng tượng nó có thể hữu ích để kiểm tra rằng bạn có một mô hình hoàn chỉnh hợp lý; trong khi các lỗi thực tế thường nằm dưới mô hình (vặn vẹo các biến thể hoặc bất cứ điều gì), tôi cho rằng sẽ rất hữu ích khi sử dụng Alloy để tìm lỗ hổng trong chính mô hình. (Theo trực giác có vẻ ít hữu ích hơn khi cố gắng sử dụng trợ lý chứng minh; tôi hy vọng các mẫu phản ứng sẽ hữu ích hơn, và điều đó dường như nhiều hơn trong lĩnh vực của những thứ như Alloy (mặc dù lý tưởng tôi đoán nó sẽ tốt khi có thể để tiếp cận cả hai trong cùng một hệ thống).)
Bruce Stephens

7

Tôi có một nền tảng về CSP (Giao tiếp các quy trình tuần tự). Không tự mình lấy sừng, nhưng tôi đã viết luận án thạc sĩ về CSP thời gian, đặc biệt là "biên dịch" các thông số kỹ thuật được viết bằng các phương thức chính thức thành C ++ thực thi. Tôi có thể nói rằng tôi có một số kinh nghiệm với các phương pháp chính thức. Khi tôi đã hoàn thành bằng cấp của mình và có một công việc trong ngành, tôi đã không sử dụng các phương pháp chính thức nào cả. Phương pháp chính thức vẫn còn quá lý thuyết để được áp dụng trong ngành. Các phương pháp chính thức đã tìm thấy một số ứng dụng thực tế trong lĩnh vực hệ thống nhúng. Ví dụ, NASA sử dụng các phương pháp chính thức trong các dự án của họ. Tôi sẽ suy đoán rằng các phương pháp chính thức rất xa được áp dụng rộng rãi trong ngành. Đơn giản là không có ý nghĩa khi viết các đặc tả phần mềm theo các phương thức chính thức và sau đó "diễn giải con người" chúng theo khung lựa chọn của bạn. Tiếng Anh đơn giản và sơ đồ hoạt động tốt hơn cho điều đó, trong khi các bài kiểm tra đơn vị và tích hợp đã làm rất tốt việc "xác minh" tính chính xác của mã. tôi nghĩphương pháp chính thức sẽ vẫn còn trong thế giới của học viện trong một thời gian .


Cảm ơn bạn đã chia sẻ, tôi sẽ hỏi một lần theo dõi lặp đi lặp lại thường xuyên trên Q này: Bạn có nói rằng việc đào tạo về FM ít nhất là hữu ích cho công việc sau này của bạn, ví dụ như đã giúp bạn suy nghĩ rõ ràng hơn? Hay không?
limist

Chúc mừng các bậc thầy của bạn!
Chris

@limist: Tôi sẽ nói rằng đó là một kinh nghiệm lý thuyết rất tốt, nhưng tôi tìm thấy rất ít ứng dụng thực tế trong ngành.
ysolik

4

Sơ đồ trạng thái và lưới Petri rất hữu ích để mô hình hóa và phân tích các giao thức và hệ thống thời gian thực. Đầu tiên họ giúp thiết kế một giải pháp. Thứ hai họ giúp tìm các trường hợp thử nghiệm cho phần mềm thú vị trong các tình huống rất cụ thể.


4

Tôi đã đọc một vài cuốn sách về các phương pháp chính thức và áp dụng một số. Phản ứng ngay lập tức của tôi là "Gee, những cuốn sách này cho tôi biết làm thế nào để trở thành một lập trình viên giỏi, miễn là tôi là một nhà toán học hoàn hảo." Một điểm yếu khác là bạn chỉ có thể chứng minh sự tương đương với một mô tả chính thức khác. Viết một đặc tả chính thức cho một chương trình tương đương với việc viết một chương trình bằng ngôn ngữ cấp cao hơn và không có cách nào bạn có thể tránh giới thiệu các lỗi trong một thông số kỹ thuật lớn.

Tôi chưa bao giờ làm cho các phương pháp chính thức hoạt động trên quy mô lớn. Chúng có thể hữu ích trong việc có được một cái gì đó nhỏ và chính xác, và trong việc thuyết phục tôi rằng chúng đúng. Theo cách đó, tôi có thể làm việc với các khối xây dựng lớn hơn một chút và đôi khi hoàn thành nhiều hơn một chút.

Một điều tôi đã nhận được nói chung là hữu ích hơn là khái niệm về bất biến, một tuyên bố về một chương trình và trạng thái của nó luôn luôn đúng. Bất cứ điều gì bạn có thể lý do từ là tốt.

Như đã nói ở trên, tôi không phải là một nhà toán học hoàn hảo, và do đó, bằng chứng của tôi đôi khi có lỗi. Tuy nhiên, theo kinh nghiệm của tôi, những xu hướng này là những sai lầm ngớ ngẩn lớn, dễ bị bắt và sửa chữa.


4

Tôi đã tham gia một khóa học sau đại học về phân tích chương trình chính thức, nơi chúng tôi tập trung vào ngữ nghĩa hoạt động. Tôi đã làm bài báo cuối cùng về nỗ lực seL4, xem xét các phương pháp chính thức mà họ đã sử dụng. Điểm yếu chính của tôi về mặt thực tiễn là nó có giá trị cận biên. Bạn không chỉ phải viết chương trình, bạn còn phải viết bằng chứng. Ồ Hai nguồn lỗi. Không chỉ là một. Hơn nữa, có một số lượng lớn các hạn chế được đặt trên mã thực tế. Rất khó để mô tả chính thức một máy tính vật lý, bao gồm cả I / O.


Tôi đã từng thấy một cú đâm khi mô tả I / O kiểu băng. Tác giả không có giải pháp nào để mô tả chính thức các tệp truy cập ngẫu nhiên, và tự hài lòng với việc nói xấu chúng.
David Thornley

1
@David: Những tệp truy cập ngẫu nhiên. Tin xấu. Bạn không muốn sử dụng chúng. =)
Paul Nathan

3

Tự học TLA + năm ngoái, đã sử dụng nó kể từ đó. Đó là một trong những công cụ đầu tiên tôi tiếp cận mỗi khi bắt đầu một dự án. Sai lầm mà hầu hết mọi người mắc phải là họ cho rằng các phương thức chính thức là một thứ hoàn toàn hoặc không có gì: hoặc bạn không sử dụng các phương thức chính thức hoặc bạn đã xác minh đầy đủ. Tuy nhiên, có một cái gì đó giữa chúng: đặc tả chính thức , nơi bạn kiểm tra xem một đặc tả trừu tượng của dự án của bạn không phá vỡ bất biến của bạn. Không giống như xác minh, đặc điểm kỹ thuật là đủ thực tế để sử dụng trong công nghiệp.

Ngôn ngữ đặc tả có nhiều ý nghĩa hơn ngôn ngữ lập trình. Ví dụ: đây là một thông số PlusCal đơn giản (rất) cho kho lưu trữ dữ liệu phân tán:

process node \in 1..5 \* Nodes
variables online = TRUE,
          stored \in SUBSET data; \* Some set
begin 
  Transfer:
    either
      with node \in Nodes, datum \in stored do
        node.stored := node.stored \union {datum};
      end
    or \* crash
      online := FALSE;
    end either;
end process;

Đoạn mã này chỉ định năm nút chạy đồng thời, chạy chuyển theo thứ tự tùy ý, trong đó mỗi lần chuyển là một phần dữ liệu tùy ý đến một nút tùy ý. Ngoài ra, chúng tôi đã chỉ định rằng mọi chuyển khoản đã cho có thể không thành công và khiến nút bị sập. Và chúng ta có thể mô phỏng tất cả các hành vi này trong trình kiểm tra mô hình TLA +! Bằng cách đó, chúng tôi có thể kiểm tra rằng bất kể thứ tự, tỷ lệ thất bại, vv, các yêu cầu của chúng tôi vẫn giữ. Nói về điều đó, hãy thêm một vài yêu cầu. Đầu tiên, chúng tôi không bao giờ chuyển dữ liệu sang nút ngoại tuyến:

[][\A node \in Nodes: ~online => UNCHANGED node.stored]_vars

Trong phiên bản đơn giản hóa của chúng tôi, trình kiểm tra mô hình sẽ tìm thấy trạng thái lỗi. Chúng tôi cũng có thể chỉ định "mọi phần dữ liệu đã cho nằm trong ít nhất một nút trực tuyến":

\A d \in data: \E n \in Nodes: n.online /\ d \in n.stored

Mà cũng sẽ thất bại. Chúc may mắn kiểm tra những điều này với một bài kiểm tra đơn vị!

Giới hạn chính của đặc tả là nó tồn tại độc lập với mã thực tế của bạn. Nó chỉ có thể cho bạn biết rằng thiết kế của bạn là chính xác, không phải là bạn thực hiện nó đúng. Nhưng nó nhanh hơn để xác định hơn là xác minh và nó bắt các lỗi quá tinh vi để thử nghiệm, vì vậy tôi thấy nó đáng để nỗ lực. Khá nhiều mã liên quan đến đồng thời hoặc nhiều hệ thống là một nơi tốt cho một thông số chính thức.


1

Tôi đã từng làm việc trong một bộ phận tại ICL, trước khi chúng được Fujitsu mua lại. Họ đã có một số hợp đồng lớn của chính phủ yêu cầu bằng chứng rằng phần mềm hoạt động như quảng cáo, vì vậy họ đã chế tạo một cỗ máy lấy thông số chính thức được viết bằng Z và xác thực mã khi nó chạy, với đèn xanh hoặc đỏ lớn để vượt qua / Thất bại.

Đó là một điều tuyệt vời, nhưng, như @FishToaster quý trọng chỉ ra, nó vô dụng đối với bất cứ điều gì không tầm thường.


0
  1. " Làm thế nào hữu ích bạn đã tìm thấy nó? "

Việc áp dụng Petri Nets vào lập trình máy tính rất hữu ích. Tôi đã tạo ra các yếu tố mạng Net và chú thích, một phương pháp dựa trên Petri Nets (Chionglo, 2014). Tôi đã áp dụng phương pháp này từ năm 2014 để viết các chương trình JavaScript sử dụng API Acrobat / JavaScript cho các ứng dụng mẫu PDF.

  1. Đã đào tạo FM của bạn bao gồm những gì (ví dụ như một khóa học, một cuốn sách)? Mùi

Tôi đã đào tạo được điểm số trên Petri Nets thông qua việc tự học. Tôi đọc các chương về Petri Nets từ sách giáo khoa Petri Nets và Grafcet: Công cụ để mô hình hóa các hệ thống sự kiện rời rạc (David và Alla, 1992). Tôi cũng đã được đọc các tài liệu nghiên cứu về Petri Nets. Sau khi tạo và ghi lại các yếu tố Net Net và chú thích, tôi đã thực hành áp dụng phương pháp này trong vài tuần.

  1. Công cụ gì FM nào bạn sử dụng? Mùi

Tôi vẽ sơ đồ Petri Net bằng PowerPoint. Tôi tạo dạng xem biểu mẫu của các chú thích bằng Word. Tôi cũng tạo các trò chơi mã thông báo dưới dạng các ứng dụng dạng PDF bằng Acrobat và Notepad. Sau khi thêm các mục vào mẫu, bản dịch của các mục này thành mã JavaScript là có hệ thống. Do đó, nó có thể tự động hóa bản dịch. Nếu các mục nhập trong danh sách của người dùng, thì các mục nhập đồ họa trong PowerPoint cũng có thể dịch một cách có hệ thống chúng thành mã JavaScript và cũng tự động hóa bản dịch này. Tôi cũng sử dụng một bộ công cụ đang thực hiện để thực hiện các bản dịch này và để tạo thêm tài nguyên để tạo các ứng dụng biểu mẫu PDF (Chionglo, 2018; 2017).

  1. Có gì lợi thế về tốc độ / chất lượng đã nó đưa cho bạn so với không sử dụng FM? Mùi

Tôi có thể viết các chương trình JavaScript bằng cách sử dụng các yếu tố và chú thích mạng Net nhanh hơn tôi có thể viết một chương trình JavaScript mà không cần sử dụng các yếu tố và các chú thích mạng Net. Và đối với các chương trình lớn, tôi có thể ngừng mã hóa và quay lại mã hóa sau (hoặc muộn hơn nhiều) mà không cần biết tiếp tục ở đâu (Chionglo, 2019). Trong một số trường hợp, tôi có thể viết các chương trình JavaScript bằng cách sử dụng các phần tử và chú thích của Net Net nhưng không thể viết các chương trình JavaScript mà không cần sử dụng các phần tử và các chú thích của Net. Ví dụ, tôi không thể tạo ra các triển khai các hàm đệ quy không đệ quy nếu không sử dụng các yếu tố Net Net và chú thích Hồi (Chionglo, 2019b; 2018b; 2016). Đây là đúng với hoặc không có các công cụ đang tiến hành.

  1. " Bạn tạo ra loại phần mềm nào với FM? "

Tôi sử dụng các yếu tố và chú thích của Net Net để tạo các chương trình JavaScript sử dụng API Acrobat / JavaScript cho các ứng dụng mẫu PDF. Tôi cũng có thể áp dụng phương pháp để tạo các chương trình JavaScript cho các tài liệu HTML và để tạo Arduino Phác thảo (Chionglo, 2019c; 2019d).

  1. " Và nếu bây giờ bạn không trực tiếp sử dụng FM, thì nó có đáng để học không? " Không áp dụng.

Người giới thiệu

Chionglo, JF (2019b). Tính toán thuật ngữ thứ N của một mối quan hệ đệ quy: Sử dụng hàm không đệ quy - Trả lời một câu hỏi tại Trao đổi ngăn xếp toán học. < Https://www.academia.edu/38496025/Computing_the_N-th_Term_of_a_Recursive_Relation_Using_a_Non-Recursive_Function_A_Reply_to_a_Question_at_Mathematics_Stack_Exchange >.

Chionglo, JF (2019c). Logic, mô phỏng và phác thảo điều khiển hiệu ứng ngọn lửa: Trả lời yêu cầu tại Diễn đàn cộng đồng Arduino. https://www.academia.edu/40342956/Flame_Effect_Control_Logic_Simulation_and_Sketch_A_Reply_to_a_Request_at_the_Arduino_Community_Forum .

Chionglo, JF (2019). Làm thế nào tôi tiếp tục mã hóa một ứng dụng sau khi nghỉ dài? Trả lời câu hỏi Làm thế nào để bạn biết bạn đã dừng mã ở đâu sau khi nghỉ 2 tuần? - - Trao đổi ngăn xếp kỹ thuật phần mềm. https://www.academia.edu/39705042/How_I_Continue_Coding_an_Application_after_a_Long_Break_Reply_to_How_do_you_know_where_you_stopped_in_your_codes_after_a_2-week_break_Software_Engineering_Stack_Exchange .

Chionglo, JF (2019d). Logic điều khiển hiển thị và ẩn: Lấy cảm hứng từ một câu hỏi tại Stack Overflow. < https://www.academia.edu/40283015/Show-and-Hide_Control_Logic_Inspired_by_a_Question_at_Stack_Overflow >.

Chionglo, JF (2018b). Mô hình mạng Petri cho nhân tố số: Và hàm JavaScript không đệ quy để tính toán nó. <>.

Chionglo, JF (2018). Tạo Hyper Form ™ - Tiến trình công việc đang tiến hành: Cập nhật về nghiên cứu lập trình mạng. https://www.academia.edu/37697498/Create_Hyper_Form_-A_Workflow_in_ProTHER_Update_on_the_Net_Programming_Research .

Chionglo, JF (2017). Lập trình Net: Đề xuất nghiên cứu: Để phát triển các ứng dụng biểu mẫu PDF với PowerPoint và Acrobat. https://www.academia.edu/33374809/Net_Programming_A_Research_Proposal_For_Developing_PDF_Form_Appluggest_with_PowerPoint_and_Acrobat. .

Chionglo, JF (2016). Một mô hình mạng Petri để tính toán số Fibonacci. https://www.academia.edu/31748108/A_Petri_Net_Model_for_Computing_the_Fiborie_Number.

Chionglo, JF (2014). Các yếu tố và chú thích ròng cho lập trình máy tính: Tính toán và tương tác trong PDF. https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interilities_in_PDF .

David, R. và H. Alla. (1992). Petri Nets và Grafcet: Công cụ để mô hình hóa các hệ thống sự kiện rời rạc. Thượng yên, NJ: Hội trường Prentice.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.