Có thể viết phần mềm không cần phải sửa đổi liên tục không?


23

Tôi đã viết rất nhiều phần mềm bằng nhiều ngôn ngữ khác nhau và tôi cũng đã "viết" phần cứng để sử dụng với các GPU sử dụng Verilog và VHDL.

Tôi có xu hướng thích viết phần cứng hơn phần mềm và tôi nghĩ một trong những lý do chính là có thể viết phần cứng đã "xong" và không bao giờ cần phải sửa đổi: bạn xác định giao diện và chức năng, viết một bài kiểm tra , triển khai mô-đun phần cứng, sau đó kiểm tra cái quái đó bằng cách sử dụng một trình giả lập. Sau đó, bạn có thể dựa vào mô-đun phần cứng đó như một khối xây dựng để tạo ra thứ gì đó lớn hơn và tốt hơn: nếu bạn cần thêm một tính năng cho mô-đun đó, bạn tạo một mô-đun thứ hai và thêm chức năng ở đó. Bạn không bao giờ vứt bỏ mô-đun gốc vì nó hoạt động tốt và vẫn có thể hữu ích.

Một trong những nỗi thất vọng chính của tôi với phần mềm là nó không bao giờ được "thực hiện". Luôn có một tính năng khác để thêm. Thông thường khi thêm một tính năng, nó giới thiệu một lỗi ở một nơi khác đang hoạt động tốt trước đó. Điều này không xảy ra trong phần cứng miễn là các giao diện không bị vi phạm.

Để rõ ràng, tôi không ủng hộ việc xây dựng một phiên bản của một cái gì đó với một danh sách các tính năng và đó là mãi mãi: Tôi ủng hộ việc lặp lại và phát hành nhiều lần theo thời gian để thêm các tính năng mới. Tôi chỉ không muốn chọc mã bên trái và tìm thấy một lỗi bên phải, và điều này dường như xảy ra sau khi thêm một tính năng mới.

Có thể viết phần mềm theo cách tương tự trong đó phần cứng được "viết" không? Có một phương pháp phát triển phần mềm tốt cho phép tiến trình luôn luôn được thực hiện và cho phép thêm chức năng mới mà không cần phải viết lại mã hiện có và giới thiệu các lỗi mới?


8
Bạn dường như đang mô tả OCP
Oded

Công cụ nguyên tắc mở này trông tuyệt vời! Có ai đã sử dụng thành công này?
Nathan Farrington

2
@NathanFarrington: Hầu hết các mẫu thiết kế (như được mô tả bởi GOF ) đều tuân theo OCP. Một ví dụ sẽ là Mẫu Phương thức Mẫu .
Spoike

2
@NathanFarrington Nguyên tắc đóng mở là một nguyên tắc phổ biến được các nhà phát triển phần mềm sử dụng khi thiết kế phần mềm.
Jesper

1
Tôi sẽ tưởng tượng rằng nhiều chương trình chúng ta sử dụng ngày nay được tạo ra bằng cách sử dụng các bit và các mảnh là bản sao carbon để viết mã cách đây 20 năm.
Mallow

Câu trả lời:


16

Có lẽ nó có liên quan đến các giao diện và thử nghiệm được xác định rõ, như phần cứng?

Chính xác là suy nghĩ của tôi!

Các mô-đun được thiết kế tốt với giao diện rõ ràng có xu hướng cơ bản là hoàn hảo. Hãy nghĩ về một cái gì đó giống như Stringlớp của Java. Nó là một chương trình máy tính, nhưng nó có giao diện rõ ràng. Không có lỗi được biết đến trong đó. Nó làm những gì nó phải làm, hoàn hảo. Chắc chắn, nó đã được thử nghiệm rộng rãi trong 15 năm qua và vì hầu như tất cả các chương trình đều sử dụng Strings làm các khối xây dựng cơ bản, bất kỳ lỗi nào trong đó sẽ nhanh chóng được chú ý. Bất kỳ "quirks" nào - không phải là lỗi nghiêm trọng, nhưng các chi tiết thiết kế đáng để nhận biết - chẳng hạn như những điều được mô tả ở đây http://www.jwz.org/doc/java.html hiện đã được biết đến và do đó có thể được đưa vào tài khoản.

Phần mềm bị lỗi một phần là vấn đề văn hóa: mọi người đã quen với phần mềm lỗi và không giống như phần cứng, phần mềm thường có thể dễ dàng sửa chữa sau đó, vì vậy ban đầu nó không phải hoàn thiện (hoặc bao giờ, vì chúng ta phải gửi ngay bây giờ, hãy sửa nó trong phiên bản tiếp theo). Nhưng đối với một phần lớn, đó là một vấn đề phức tạp thực sự: độ phức tạp phần mềm đã tăng đều đặn trong 50 năm qua hoặc lâu hơn, nhưng bộ não con người là như vậy. Khi khó khăn ngày càng tăng để đạt được sự hoàn hảo và ngày càng dễ dàng sửa chữa mọi thứ sau này (nhanh, xây dựng tự động, phân phối internet) kết hợp với áp lực lịch trình và thiếu kỷ luật, kết quả là như vậy.

Có một phương pháp phát triển phần mềm tốt cho phép tiến trình luôn luôn được thực hiện và cho phép thêm chức năng mới mà không cần phải viết lại mã hiện có và giới thiệu các lỗi mới?

Không có viên đạn bạc nào, nhưng có thể là sự kết hợp tốt giữa các thực tiễn tốt nhất, bao gồm nhưng không giới hạn ở:

  • Mô-đun đơn giản, tự chủ. Nói cách khác, khớp nối thấp và độ gắn kết cao.
  • Bất biến. Đặc biệt quan trọng với sự phát triển đồng thời.

Điều đáng chú ý là cả hai điểm đều nhằm mục đích giảm độ phức tạp. Đó là điểm mấu chốt. Entropy luôn có xu hướng tăng lên, và trừ khi chúng ta chống lại điều đó, chúng ta sẽ sớm chìm đắm trong sự phức tạp. Thật thú vị khi thấy rằng trong vài năm qua, các ngôn ngữ lập trình đã phát triển theo hướng khuyến khích hoặc thậm chí thực thi các thực tiễn được đề cập ở trên. Đặc biệt, sự gia tăng của các ngôn ngữ chức năng chỉ là: các hàm thuần túy luôn trả về cùng một giá trị cho cùng một đầu vào, không có trạng thái nào trong chúng. Sau đó, bạn chỉ cần soạn các hàm thuần túy nhận và trả về các giá trị bất biến , và hạn chế khả năng biến đổi không thể tránh khỏi ở những nơi nhỏ được xác định rõ thay vì lan truyền khắp nơi. Kiểm tra này: http://clojure.org/state


1
jwz không hoàn toàn đồng ý rằng lớp String là bugfree - jwz.org/doc/java.html

1
Nó có thể hoạt động như thiết kế, vì vậy câu hỏi là nếu thiết kế cơ bản bị hỏng. Tôi đồng ý, tuy nhiên, String là một lớp rất đáng tin cậy.

1
Câu trả lời tuyệt vời. Bây giờ tôi viết mã gần như độc quyền trong Python và cố gắng tận dụng các cấu trúc lập trình chức năng. Vâng, tôi nghĩ bạn đúng rằng sự bất biến là chìa khóa. Lần đầu tiên tôi tạo một mô-đun phần mềm, ngay cả khi tôi kiểm tra nó, thì có lẽ tôi đã làm hỏng giao diện, hoặc có thể nó có trách nhiệm sai hoặc quá nhiều. Vì vậy, tôi làm một mô-đun thứ hai và để lại cái đầu tiên một mình! Tôi vẫn có thể sử dụng mô-đun đầu tiên trong tương lai nếu tôi muốn, nhưng không bao giờ thay đổi nó, bởi vì mặc dù nó không hoàn hảo, nhưng nó hoạt động. Vì vậy, các ngôn ngữ chức năng với tính bất biến có thể giúp như bạn đề xuất.
Nathan Farrington

1
@JoonasPulakka: Vâng, nếu có một bản tóm tắt một phần mềm, thì đó có thể là "luôn có một lỗi khác". :-) Và tôi nghĩ đó là một trong những điểm của Nathan.
Ross Patterson

1
Joonas, bạn thắng. Tôi đã bắt đầu học Clojure. Có vẻ như cách tốt nhất để làm cho chương trình vui vẻ trở lại.
Nathan Farrington

9

Sự khác biệt là việc sửa đổi phần mềm dễ dàng hơn và rẻ hơn bao nhiêu so với phần cứng. Nếu phần cứng dễ dàng và rẻ tiền để sửa đổi và giao cho khách hàng, họ sẽ làm.

Tôi nghĩ rằng nếu tôi có thể tóm tắt câu hỏi được diễn đạt kém của mình thì đó sẽ là một câu đại loại như "làm thế nào tôi có thể có phần mềm viết thú vị hơn bằng cách không đưa lỗi vào mã làm việc và luôn tiến bộ?" Có lẽ nó có liên quan đến các giao diện và thử nghiệm được xác định rõ, như phần cứng?

Bạn chắc chắn nên kiểm tra phát triển dựa trên thử nghiệm .


Nhiều câu trả lời cho câu hỏi của tôi dường như chứa đựng văn hóa dân gian. Có nhất thiết phải dễ dàng tìm và sửa lỗi phần mềm hơn là thiết kế các lỗi ngay từ đầu không? Chi phí sửa đổi phần mềm là bao nhiêu? Có lẽ không ai thực sự biết. Về phát triển dựa trên thử nghiệm, việc kiểm tra phần mềm có thể được sử dụng lại có ý nghĩa. Phần mềm sau đó trở thành một khối xây dựng thực tế chứ không phải là một quả bóng bùn. Nhưng nó không có ý nghĩa để kiểm tra phần mềm nếu nó sẽ thay đổi vào ngày mai. Tôi đoán tôi đã tự hỏi nếu chúng ta thực sự có thể tạo ra phần mềm từ các khối xây dựng chứ không phải bùn.
Nathan Farrington

1
@NathanFarrington: Tôi tin rằng có một sự khác biệt rất lớn trong cách thiết kế và đặc tả phần cứng / phần mềm. Hầu hết các nhà sản xuất phần cứng có nhiều khả năng có thông số kỹ thuật tốt hơn cho những gì họ tạo ra so với nhà phát triển phần mềm có khách hàng chỉ có thể nói "Tôi muốn một chương trình thực hiện điều này!" Nó được đảm bảo khá nhiều để có được các tính năng mới và những gì không.
RCE

Chắc chắn nếu có nhiều thay đổi, một số thử nghiệm cũng có thể cần thay đổi nhưng không giống như phần mềm thay đổi từ trình xử lý văn bản sang máy chủ web. Tính năng "tài liệu mới" của bạn vẫn sẽ tạo ra một chức năng mới và các thử nghiệm của nó vẫn hợp lệ.
RCE

Bạn đã chỉ ra một nguyên tắc quan trọng khác: thông số kỹ thuật càng tốt thì càng ít thay đổi được yêu cầu. Nhưng đây không phải là chính xác những gì tôi đã nhận được trong câu hỏi của mình vì bạn có thể thêm các tính năng vào phần cứng trước khi nó được thực hiện giống như phần mềm. Tôi nghĩ rằng OCP là câu trả lời thực sự, thật đáng buồn đó là một nhận xét vì vậy tôi không thể đánh dấu nó là câu trả lời. Một điểm khác là luôn luôn tiến bộ và tôi nghĩ rằng TDD có thể giúp điều này bằng cách cung cấp các bài kiểm tra hồi quy.
Nathan Farrington

Thay đổi phần mềm có vẻ dễ dàng và ít tốn kém hơn phần cứng, nhưng nó có thực sự? Vâng, tôi có thể thực hiện một thay đổi và ngay lập tức tạo ra một bản dựng mới chỉ bằng cách ấn ngón tay của tôi. Tuy nhiên, bản dựng vẫn cần thông qua xác nhận / QA. Chi phí cơ hội là gì? Tôi sẽ làm gì thay vì sửa lỗi này. QA sẽ làm gì nếu họ không cần xác nhận lại phần mềm. Là một dự án khác nhau được đẩy ra để đưa bản sửa lỗi này ra thị trường? Có rất nhiều chi phí "ẩn" mà mọi người không nghĩ tới. Nó có thể dễ dàng hơn, nhưng không nhất thiết phải rẻ hơn.
Pemdas

6

Tôi sẽ bình luận về một số nhận xét của bạn, hy vọng bạn nhận được câu trả lời từ những bình luận này.

Một trong những nỗi thất vọng chính của tôi với phần mềm là nó không bao giờ được "thực hiện".

Điều này là do đặc tả giải pháp không đầy đủ hoặc do kế hoạch cung cấp các cải tiến không chính xác. Điều này có thể xảy ra với bất kỳ phần mềm dự án, phần cứng hoặc bất kỳ phần mềm nào khác.

Có một phương pháp phát triển phần mềm tốt cho phép tiến trình luôn luôn được thực hiện và cho phép thêm chức năng mới mà không cần phải viết lại mã hiện có và giới thiệu các lỗi mới?

Tất nhiên, việc tạo các mô-đun độc lập sẽ làm giảm đáng kể sự phụ thuộc. Điều này phải được xem xét khi bạn đang thiết kế phần mềm. Bạn cần xem xét, phân tách các mối quan tâm, lớp, tầng, đối tượng điều khiển, giao diện, v.v.

"làm thế nào tôi có thể có phần mềm viết thú vị hơn bằng cách không đưa lỗi vào mã làm việc và luôn tiến bộ?"

1-Hiểu các yêu cầu cẩn thận. Có thể bạn cần xem xét việc đóng các yêu cầu trước khi thiết kế. Nếu bạn làm phát triển lặp đi lặp lại, không có cơ hội để làm điều này. Một số phương pháp khuyến khích điều này, nhưng cá nhân tôi, tôi nghĩ rằng điều này không tốt cho tất cả các loại dự án. Xây dựng phần mềm theo yêu cầu vững chắc cho phép thiết kế tốt hơn.

2-Làm cho người dùng của bạn hiểu triết lý lâu dài này.

3-Thực hiện kế hoạch cẩn thận

4-Thiết kế trước mã.

5-Sử dụng thiết kế chung khi thích hợp.

6-Sử dụng nguyên mẫu làm công cụ xác nhận thiết kế.


Đây là tất cả những lời khuyên tuyệt vời. Để tóm tắt những suy nghĩ của tôi cho đến thời điểm này: (1) thực hiện phát hành BIG DEAL và thực hiện nhiều thử nghiệm và QA trước khi phát hành, (2) tạo các mô-đun thành BIG DEAL và đảm bảo rằng chúng có các giao diện được xác định rõ bằng các thử nghiệm cho các thử nghiệm đó giao diện và xác nhận để xem giao diện có bị vi phạm hay không và một khi mô-đun được "giải phóng" thì nó không bao giờ được sửa đổi (OCP).
Nathan Farrington

4

Như mọi người thường rất nhanh chóng chỉ ra, một trong những lợi ích của phần mềm là nó được cho là dễ dàng và tương đối rẻ để thay đổi so với phần cứng. Điều này đặc biệt quan trọng khi bạn nhận ra muộn rằng bạn đã có một cái gì đó sai về cơ bản. Làm tương tự với phần cứng và bạn mất một triệu đô la, vì vậy như bạn đã nói, bạn sử dụng trình giả lập của mình, v.v. và bạn kiểm tra bazeda từ nó. Điều này tôi nghĩ là nơi mô hình thất bại phần nào khi bạn chuyển sang phần mềm.

Hãy đi vào đầu của nhà phát triển phần mềm trung bình và những gì bạn có là một người rất bận rộn với thời hạn cực kỳ chặt chẽ. Người quản lý của anh ta nói rằng không sao để lại một vài lỗi vì bạn luôn có thể sửa nó sau. Các thử nghiệm thường là một suy nghĩ, nhưng ngay cả trong kịch bản hướng đến thử nghiệm, các thử nghiệm được giữ ở mức tối thiểu và mã được viết ở mức tối thiểu của các thử nghiệm và thường được thực hiện các phím tắt để có thể bỏ qua nhiều trường hợp ranh giới. Hệ thống có thể được kiểm tra kỹ lưỡng đơn vị nhưng hiếm khi được kiểm tra nghiêm ngặt nói chung, và hiếm khi căng thẳng được kiểm tra ở bất kỳ mức độ lớn nào. Thêm vào đó là bạn viết phần mềm từ đầu, và có rất ít cơ hội để mô phỏng phần mềm trước khi bạn cam kết viết nó, chủ yếu vì chúng tôi hiếm khi viết phần mềm từ cùng một khối xây dựng hạt mịn mà bạn sẽ tìm thấy trong phần cứng.

Quay lại câu hỏi của OP. Bạn có thể định nghĩa một hệ thống các khối xây dựng để lấy toàn bộ phần mềm của mình không? Có thể. Nó sẽ rất hiệu quả chi phí? Có lẽ là không, bởi vì đến lúc bạn bắt đầu phát triển một hệ thống đủ các thành phần, thử nghiệm và các vật liệu khác để hỗ trợ lý tưởng nàyHệ thống lập trình, bạn sẽ thấy rằng sự cạnh tranh của bạn đã đánh bại bạn trên thị trường, và thậm chí tệ hơn, từ quan điểm của lập trình viên trung bình, bạn có thể sẽ thấy một hệ thống lập trình kiểu "cắt cookie" rất hạn chế và rất có thể rất nhàm chán. Cá nhân tôi làm việc trên một API, trong đó phần lớn mã mô-đun đã được tinh chỉnh và chuẩn hóa hoàn toàn, tất cả những gì tôi làm bây giờ là tạo một mẫu mã và điền vào chỗ trống. Hầu hết thời gian của tôi có thể được dành để viết mã trình kết nối đơn giản và đưa các mô-đun ra khỏi cửa càng nhanh càng tốt. Đó là suy nghĩ nghiêm túc. Có rất ít cơ hội để làm nhiều hơn là chỉ viết mã các loại tương tự lặp đi lặp lại, vì vậy khi một cơ hội dự án khác xuất hiện, tôi nhảy vào cơ hội để có thể làm BẤT CỨ điều gì khác.

Vì vậy, làm thế nào bạn có thể nhận được để cung cấp phần mềm chất lượng cao và có nhiều yếu tố, nhưng thực sự thích bản thân bạn làm điều đó? Tôi tin rằng điều này tùy thuộc vào sự lựa chọn của bạn về các công cụ và phương pháp. Đối với tôi, câu trả lời là sử dụng API BDD tốt, bởi vì nó đã cho phép tôi tạo mã rất dễ đọc nhưng rất chi tiết. Tôi có thể xây dựng một bộ thử nghiệm trong số ít phương pháp có thể sử dụng lại và mô tả các thử nghiệm của mình bằng ngôn ngữ của thông số kỹ thuật. Theo cách này, tôi đến gần với cách tiếp cận phát triển nhiều thành phần hơn, ngoại trừ thực tế là tôi chịu trách nhiệm thiết kế và kiểm tra các khối xây dựng. Ngoài ra, đầu ra kiểm tra xác định chính xác phần chính xác của thử nghiệm khi xảy ra lỗi, do đó tôi không phải đoán xem các lỗi đó có nằm trong thiết lập hay xác nhận hay không.

Điều chỉnh phương pháp của bạn cũng giúp. Tôi là một người ủng hộ lớn cho việc áp dụng các hiệu trưởng phát triển tinh gọn, và kết hợp chúng với nhiều kỹ thuật và hiệu trưởng khác mà phong trào Agile đã gây tiếng vang trong nhiều năm nay. Việc loại bỏ hầu hết các thực hành lãng phí mà tôi từng thấy rất bực bội đã giúp ích rất nhiều để phát triển thành một hoạt động thú vị hơn. Đôi khi tôi vẫn gặp phải vấn đề đó - nhưng hy vọng không quá thường xuyên - các lỗi sẽ xuất hiện trong mã của tôi, tuy nhiên giờ đây tôi thấy mình có nhiều thời gian hơn và thậm chí còn có nhiều động lực hơn để dành nhiều thời gian hơn để viết các bài kiểm tra mạnh mẽ hơn và nhắm tới 100 % Kiểm tra vùng phủ sóng. Thậm chí tốt hơn, cảm giác thực sự tuyệt vời khi thấy tất cả những ánh sáng màu xanh lá cây đó xuất hiện vào cuối ngày của tôi,


Tôi tò mò, bạn viết rằng thử nghiệm là quan trọng nhưng cũng gây khó chịu.
Nathan Farrington

@NathanFarrington Cảm ơn bạn đã chỉ ra điều đó. Quan điểm của tôi là nói tích cực về thử nghiệm, nhưng tôi đã suy nghĩ về điều đó trong khi gõ một cái gì đó khác, vì vậy nó đã hoàn toàn sai trong đoạn đó! Tôi đã sửa cho phù hợp với điểm thực tế mà tôi đang cố gắng chiếu sáng!
S.Robins

3

Một trong những nỗi thất vọng chính của tôi với phần mềm là nó không bao giờ được "thực hiện". Luôn có một tính năng khác để thêm.

Nếu điều đó làm bạn thất vọng, hãy xem xét một nghề nghiệp khác. Nghiêm túc.

Các điểm của phần mềm là để có thể thêm các tính năng. Toàn bộ lý do để phát minh ra "phần mềm" ở nơi đầu tiên là để chúng tôi có thể thêm các tính năng.

Thông thường khi thêm một tính năng, nó giới thiệu một lỗi ở một nơi khác đang hoạt động tốt trước đó.

Đó là một vấn đề QA.

Điều này không xảy ra trong phần cứng miễn là các giao diện không bị vi phạm.

Điều đó cũng đúng trong phần mềm.

Có một phương pháp phát triển phần mềm tốt cho phép tiến trình luôn luôn được thực hiện và cho phép thêm chức năng mới mà không cần phải viết lại mã hiện có và giới thiệu các lỗi mới?

Vâng. Bạn phải thực sự thực hành Đảm bảo chất lượng.


1
Nhân tiện, tôi không cố gắng để troll, và vâng, có lẽ tôi không bị cắt ra vì phần mềm. Nhưng bạn nói "điểm của phần mềm là có thể thêm các tính năng." Có thật không? von Neumann đã phát minh ra phần mềm để có thể xây dựng một máy tính có thể tính toán nhiều hơn một hàm toán học mà không cần tua lại các đơn vị logic và số học của nó. Tôi tò mò không biết triết lý tính năng phần mềm này đến từ đâu. Phần cứng có các tính năng, nhưng mục đích của phần cứng không phải là thêm tính năng.
Nathan Farrington

Tôi giả sử bởi Đảm bảo chất lượng, bạn có nghĩa là thử nghiệm. Vâng, trực giác của tôi nói rằng cần phải thử nghiệm rộng rãi để tạo ra phần mềm chất lượng. Nhưng tôi nghĩ rằng nó vượt xa hơn thế. Trong phần cứng, một mô-đun có thể có một lỗi trong đó. Nhưng khi bạn thêm phần cứng mới, nó không đưa các lỗi mới vào mô-đun phần cứng hiện có. Cuối cùng, tất cả các lỗi trong tất cả các mô-đun có thể được tìm thấy và sửa chữa. Nhưng trong phần mềm, thường mã được thay đổi (mô-đun được thay đổi) thay vì được thêm vào, điều này có thể gây ra lỗi. Tôi đoán rằng tôi đang tìm kiếm một phương pháp phát triển phần mềm hoàn toàn là phụ gia.
Nathan Farrington

Bây giờ tôi có một nhận xét thông minh hơn về câu trả lời của bạn. Lý do tôi hiểu về phần mềm không bao giờ được "thực hiện" có lẽ là vì tôi luôn sử dụng một cách tiếp cận rất lờ mờ để phát hành. Một tính năng mới tương đương với bản phát hành tiếp theo, không có kiểm tra hồi quy và rất ít QA. Nếu các bản phát hành là một DEAL LỚN thì tôi cá rằng sự hiểu biết của tôi về phần mềm sẽ không bao giờ được thực hiện sẽ biến mất.
Nathan Farrington

@NathanFarrington: Turing đã phát minh ra phần mềm để phá vỡ các mã Enigma luôn thay đổi. "bởi Đảm bảo chất lượng, bạn có nghĩa là thử nghiệm". Sai. Ý tôi là Đảm bảo chất lượng - mọi khía cạnh của sự phát triển nên có các tiêu chuẩn chất lượng cần được đáp ứng. Kiểm tra là một cách (giới hạn) để đánh giá chất lượng của một loại vật phẩm. "mã được thay đổi ... có thể giới thiệu lỗi". Chính xác. Đó là một sự thất bại của đảm bảo chất lượng - không phải là một tính năng vốn có của phần mềm.
S.Lott

Chúng tôi chắc chắn nhận được chủ đề. Theo liên kết này , Turing's Colossus không phải là Universal (theo nghĩa điện toán) và không sử dụng các chương trình (phần mềm) được lưu trữ.
Nathan Farrington

2

Có thể viết phần mềm theo cách tương tự trong đó phần cứng được "viết" không? Có một phương pháp phát triển phần mềm tốt cho phép tiến trình luôn luôn được thực hiện và cho phép thêm chức năng mới mà không cần phải viết lại mã hiện có và giới thiệu các lỗi mới?

Tôi khuyên bạn nên xem xét " các phương pháp chính thức " để xác minh tính đúng đắn của thiết kế và phần mềm. Các công cụ giả lập bạn sử dụng cho thiết kế phần cứng đang cố gắng thực hiện một cái gì đó gần gũi. Tôi không tin rằng các công cụ cho các phương pháp chính thức là bất cứ nơi nào gần như hữu ích trong ngành công nghiệp vào thời điểm này và các ngành công nghiệp duy nhất có khuyến khích mạnh mẽ không có khuyết tật là hàng khôngy học (thật thú vị, FDA nói rõ "phần mềm là khác nhau từ phần cứng "trên liên kết đó). Hơn nữa, nếu bạn đang phát triển với Verilog / VHDL, thì bạn đang gắn bó với logic nhị phân. Điều này làm giảm đáng kể sự phức tạp. Sẽ không có phần cứng tương đương với sự cố Y2K.

Vấn đề lớn là mọi thứ rất phức tạp. Và bạn không thể loại bỏ sự phức tạp, bạn chỉ có thể di chuyển nó xung quanh.


1

có thể viết phần cứng "đã hoàn thành" và không bao giờ cần phải sửa đổi: bạn xác định các giao diện và chức năng, viết một băng ghế thử nghiệm, thực hiện mô-đun phần cứng, sau đó kiểm tra cái quái đó bằng cách sử dụng một trình giả lập. Sau đó, bạn có thể dựa vào mô-đun phần cứng đó như một khối xây dựng để tạo ra thứ gì đó lớn hơn và tốt hơn: nếu bạn cần thêm một tính năng cho mô-đun đó, bạn tạo một mô-đun thứ hai và thêm chức năng ở đó. Bạn không bao giờ vứt bỏ mô-đun gốc vì nó hoạt động tốt và vẫn có thể hữu ích.

Trong thế giới phần mềm, chúng tôi gọi "mô-đun" đó là một thư viện và chúng tôi sử dụng nó theo cùng một cách. Nhiều thư viện được xây dựng đến mức chúng hoạt động tốt, và sau đó ngồi làm việc một cách hài lòng mà không thay đổi cho đến khi một cái gì đó quan trọng dẫn đến phiên bản tiếp theo. Hãy nghĩ về chúng như phần mềm được đặt trong epoxy :-)

Một trong những nỗi thất vọng chính của tôi với phần mềm là nó không bao giờ được "thực hiện". Luôn có một tính năng khác để thêm. Thông thường khi thêm một tính năng, nó giới thiệu một lỗi ở một nơi khác đang hoạt động tốt trước đó. Điều này không xảy ra trong phần cứng miễn là các giao diện không bị vi phạm.

Chuyện nhảm. Có lẽ cá nhân bạn tốt hơn nhiều người "phần cứng" không hàn khác, nhưng tôi đã thấy bất kỳ số lượng thiết kế mạch xấu nào, lỗi chip ( ví dụ: sự cố Intel "f00f" nổi tiếng), nhưng điều đó không nói chuyện với toàn bộ lĩnh vực. Và khi đồ giả cứng trở nên "mềm hơn", các vấn đề trở nên khó ngăn chặn hơn.

Có thể viết phần mềm theo cách tương tự trong đó phần cứng được "viết" không? Có một phương pháp phát triển phần mềm tốt cho phép tiến trình luôn luôn được thực hiện và cho phép thêm chức năng mới mà không cần phải viết lại mã hiện có và giới thiệu các lỗi mới?

Vâng. Chúng tôi không sử dụng những phương pháp đó nhiều. Chúng có xu hướng cực kỳ tốn kém khi vận hành và hầu hết các lập trình viên không thích làm việc trong giới hạn của họ. Nhưng khi cuộc sống của con người có liên quan, ví dụ, ừ, chúng tôi cố gắng không giết người dùng.

Điểm cuối cùng: Phần mềm có mô hình tài chính khác với phần cứng, thậm chí cả phần cứng được lập trình. Hầu hết các phần mềm không dành cho người tiêu dùng, và một số phần mềm tiêu dùng cũng được bán theo cách khuyến khích thay đổi. Khi bạn có thể nói với một doanh nghiệp "Trả cho chúng tôi 10.000 đô la ngay bây giờ cộng với 18% một năm", về cơ bản bạn có thể bán lại sản phẩm sau mỗi vài năm. Nhưng để biện minh cho khoản phí đó, bạn cần cung cấp cho khách hàng những thay đổi họ muốn. Hmm ... nghĩ về đường cong lỗi thời phần cứng của Apple, có lẽ đây không phải là một sự khác biệt - phần cứng chỉ khiến bạn thực sự mua lại nó!


Không bao giờ nói tôi tốt hơn bất cứ ai. ;-) Khi phần cứng có lỗi, nó sẽ trở thành tin tức. Khi phần mềm có lỗi, ummm, phần mềm chờ luôn có lỗi. Những phương pháp nào chúng ta không sử dụng vì chúng quá đắt và không thú vị?
Nathan Farrington

0

Làm thế nào tôi có thể có phần mềm viết thú vị hơn bằng cách không đưa lỗi vào mã làm việc và luôn tiến bộ?

Tôi rất thích tìm một câu trả lời cuối cùng cho câu hỏi của bạn. Nhưng thực tế là không có cách nào dễ dàng để làm điều đó, đó là lý do tại sao lập trình cực đoan và kỹ thuật TDD đang trở nên phổ biến. Bạn cần nắm lấy sự thay đổi, bởi vì điều đó sẽ xảy ra. Tôi không biết nó có vui hơn theo cách này không, nhưng chắc chắn sẽ bớt căng thẳng hơn rất nhiều ;-)

http://en.wikipedia.org/wiki/Extreme_Programming

Khi bạn tương tác với phần cứng, phần cứng cần x giá trị và đó là tất cả (về lý thuyết), nhưng khi bạn tương tác với mọi người hôm nay họ cần x, và ngày mai họ có thể cần y, v.v ... Đó là cách mà các yêu cầu của mọi người thay đổi . Bởi vì Người! = Máy móc, vì vậy mã KHÔNG BAO GIỜ thay đổi hầu hết thời gian là không thể.

Cũng như tôi đã nói về câu trả lời trước đây / đã xóa của mình, hãy cố gắng tránh những thay đổi không quan trọng bằng cách khiến mọi người suy nghĩ trước khi bắt đầu viết mã. Thu hút người dùng nhiều hơn vào việc ra quyết định, v.v. Làm rõ chi phí thay đổi, lên kế hoạch nhiều hơn, v.v. Đó không phải là "cách mã hóa", là cách "không mã hóa" bởi vì với nhiều yêu cầu hơn sẽ có ít thay đổi và thú vị hơn.


1
Câu trả lời tốt. Tôi đã thực hiện lập trình cực đoan. Có vẻ như hoàn toàn ngược lại với những gì tôi đang tìm kiếm, nơi toàn bộ hướng dự án có thể thay đổi hàng tuần tùy thuộc vào ý thích của khách hàng. Tôi không chống lại các bản phát hành lặp đi lặp lại, tôi chỉ không muốn phiên bản thứ 2 giới thiệu các lỗi không có trong phiên bản 1. Và bạn đã đúng rằng thiết kế phía trước có thể tiết kiệm công sức trong thời gian dài.
Nathan Farrington

Như tôi luôn nói, mã tốt nhất, không có mã. :-)
H27studio

0

Có thể viết phần mềm theo cách tương tự?

Vâng, nó là. Hãy cẩn thận như thể bạn đang phát triển phần cứng, kiểm tra mọi thứ bạn có thể và phần mềm của bạn sẽ có chất lượng tương tự.

Nhân tiện, bạn đã nghe nói về lỗi CTNH chưa? Nhanh hơn nhiều so với bất kỳ lỗi SW nào và khó sửa hơn (không chỉ nâng cấp phần mềm)


1
Có phần cứng cũng có lỗi, thậm chí cả phần cứng được kiểm tra tốt như bộ xử lý. Phần cứng tốt được thiết kế để các lỗi phần cứng có thể được sửa trong phần mềm! Lý do cho câu hỏi ban đầu của tôi là tôi đã viết rất nhiều phần mềm nhưng tôi luôn cảm thấy thất vọng về việc dễ dàng giới thiệu các lỗi và toàn bộ hệ thống lộn xộn như thế nào. Tôi là kiểu người sạch sẽ nên phương pháp phát triển phần cứng luôn có vẻ tự nhiên hơn đối với tôi. Nó cũng có thể có một cái gì đó để làm với phạm vi.
Nathan Farrington

1
@NathanFarrington Phần mềm thường phức tạp hơn một CTNH. CTNH được kiểm tra kỹ lưỡng hơn. SW có thể thay đổi dễ dàng hơn, do đó mọi người có xu hướng không chú ý nhiều.
Bовић

0

Tôi cũng sẽ chỉ ra rằng các lỗi phần mềm trong phần cứng thường có thể giết người. Vì vậy, cần phải cẩn thận hơn để xác định kỹ lưỡng các yêu cầu và kiểm tra rộng rãi chúng lên phía trước. Và những yêu cầu đó không cần thay đổi cho đến khi phần cứng thực hiện. Và vì phần cứng mới có thể yêu cầu viết lại, tôi nghi ngờ chiếc cruft cũng không tích tụ quá nhiều.

Mặt khác, các yêu cầu kinh doanh thay đổi liên tục, đôi khi bạn khó có thể đưa một yêu cầu vào sản xuất trước khi yêu cầu thay đổi. Đôi khi, tôi đã có yêu cầu thay đổi nhiều lần trước khi nó được đưa vào sản xuất. Đây là kết quả của một số điều. Đầu tiên, các bên liên quan của dự án về phía doanh nghiệp thường ít quan tâm đến việc dành thời gian để xác định kỹ lưỡng những gì anh ta muốn vì anh ta "bận rộn" và "quan trọng" và mọi người sẽ không chết và gia đình kiện anh ta hoặc tống anh ta vào tù nếu anh ta thổi bay phần của quá trình. Thứ hai, các bên liên quan của dự án có xu hướng thực sự có một ý tưởng tốt hơn về những gì họ muốn phần cứng làm vì nó ít trừu tượng hơn với họ. Họ thực sự không biết những gì họ muốn cho đến khi họ nhìn thấy nó. Đó là ít lỗi hơn với Phần cứng.


Bạn có một điểm hợp lệ. Các loại thứ mà chúng ta thường làm trong phần cứng được hiểu rõ: bộ xử lý, bộ điều khiển USB, thiết bị đầu cuối PCI Express, bộ điều khiển bộ nhớ, v.v. Sau đó, chúng tôi đẩy tất cả logic kinh doanh ứng dụng đó vào phần mềm. Có lẽ khi chúng ta làm việc theo cách của chúng ta, phần mềm ngăn xếp mọi thứ trở nên lộn xộn và ít được hiểu hơn?
Nathan Farrington

-1

Có những công cụ cấp cao với rất nhiều 'viên gạch', như bạn gọi chúng, bạn có thể kết hợp thành các ứng dụng. Các viên gạch là những mảnh hoàn thành để bạn sử dụng, bạn chỉ cần kết hợp chúng lại với nhau. Có thể bạn nghĩ rằng điều đó dễ dàng hơn ... cho đến khi khách hàng của bạn hỏi bạn về một số thay đổi kỳ lạ và bất ngờ.

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.