Làm thế nào tính toán và đại số tuyến tính có thể hữu ích cho một lập trình viên hệ thống? [đóng cửa]


10

Tôi tìm thấy một trang web nói rằng tính toán và đại số tuyến tính là cần thiết cho Lập trình hệ thống.

Lập trình hệ thống, theo như tôi biết, là về osdev, trình điều khiển, tiện ích, v.v. Tôi chỉ không thể hiểu làm thế nào tính toán và đại số tuyến tính có thể hữu ích về điều đó. Tôi biết rằng giải tích có một số ứng dụng trong khoa học, nhưng trong lĩnh vực lập trình cụ thể này, tôi không thể tưởng tượng được tính toán có thể quan trọng như thế nào.

Thông tin có trên trang web này: http://www.wikihow.com/Become-a-Programmer

Chỉnh sửa: Một số câu trả lời ở đây đang giải thích về độ phức tạp và tối ưu hóa thuật toán. Khi tôi đặt câu hỏi này, tôi đã cố gắng cụ thể hơn về lĩnh vực Lập trình của Hệ thống. Độ phức tạp và tối ưu hóa thuật toán có thể được áp dụng cho bất kỳ lĩnh vực lập trình nào, không chỉ lập trình của Hệ thống. Đó có thể là lý do tại sao tôi không thể nghĩ ra suy nghĩ như vậy tại thời điểm câu hỏi.


6
Nó không quá nhiều ứng dụng trực tiếp như thay đổi quá trình suy nghĩ của bạn.
Một số chú mèo

3
Tôi không làm nhiều chương trình hệ thống (ok - tôi không làm gì cả), nhưng tôi tưởng tượng rằng nếu bạn đang chạy một loạt các bài kiểm tra hiệu suất và bạn muốn phân tích thống kê về kết quả, phép tính và đại số tuyến tính có thể nhập cuộc. Chúng cũng có thể cần thiết khi thực hiện phân tích độ phức tạp của các thuật toán.
Thất vọngWithFormsDesigner

2
@Telastyn: Thật sao? Nó thật thú vị. Làm thế nào mà làm việc?
Thất vọngWithFormsDesigner

2
Bạn có thể cung cấp một liên kết đến trang web? Nó có thể thêm một số ngữ cảnh sẽ giúp bạn có câu trả lời cụ thể hơn.
Caleb

2
@FrustratedWithFormsDesigner - Sự tương tự là từ một giá trị đến một con trỏ giống như đạo hàm. Bạn bắt đầu với một hàm và lấy nó để lấy một hàm mới có nghĩa là một thứ khác (một int đề cập đến một địa chỉ bộ nhớ hơn là một số). Bạn thậm chí có thể lấy đạo hàm thứ hai (một con trỏ đến một con trỏ) có nghĩa là cùng một thứ nhưng khác nhau. Sau đó, để hoàn tác điều đó, bạn cần tích hợp (bỏ qua con trỏ), có một số cảnh báo (hằng số bị mất khi lấy hàm so với cắt đối tượng). Hy vọng rằng điều đó có ý nghĩa, nó đã có từ lâu ...
Telastyn

Câu trả lời:


6

Tôi sẽ tưởng tượng nó không quan trọng lắm nếu bạn đang viết các tiện ích không phải GUI trên hệ điều hành hiện đại mà không làm việc với các phần bên trong của nó. Đây có lẽ là một câu chuyện khác nếu bạn đang thay đổi một hệ điều hành hiện đại hoặc phát triển một hệ thống mới.

Nếu bạn đang làm việc với phần cứng video hoặc hệ thống cửa sổ bằng kim loại trần, bạn sẽ cần kiến ​​thức về đại số tuyến tính để cập nhật đồ họa hiệu quả. Tôi đã không nhìn vào bản thân mình, nhưng tôi cá là bạn có thể tìm thấy các ví dụ trong mã nguồn cho X, KDE và Gnome.

Nếu bạn đang làm việc với phần cứng liên quan đến xử lý tín hiệu số thì tính toán sẽ rất quan trọng. Tôi tưởng tượng có một số thiết bị thực hiện công việc nặng nề với CPU của hệ thống thay vì bộ vi xử lý cục bộ và những thiết bị này thường giao tiếp với các hệ thống điện tương tự.

Ngoài ra tính toán đóng một vai trò quan trọng trong phân tích hiệu suất bên cạnh chỉ đại số tuyến tính khi cố gắng khớp đường cong với dữ liệu.


Thậm chí chỉ cần thực hiện lập trình directx hoặc opengl sẽ đòi hỏi một số hiểu biết về đại số tuyến tính.
Giàn

@Rig: Học khi bạn đi, đó là cách tôi đã làm. Học từ phía toán học, IMHO, là bass-ackwards.
Coder

8

Nhận xét của một số chú mèo là đúng về tiền: Bạn cần tính toán và đại số tuyến tính vì những khóa học đó thay đổi cách bạn nghĩ và cách bạn hiểu thế giới. Đại số tuyến tính là tất cả về ánh xạ từ miền này sang miền khác; tính toán bao gồm các chức năng hành xử. Bản thân chúng là những công cụ mạnh mẽ, nhưng những kỹ thuật bạn học được khi nghiên cứu những lĩnh vực đó cũng trở thành một phần trong bức tranh tinh thần của bạn về thế giới.

Bạn cũng cần những khóa học đó bởi vì mọi người sẽ mong đợi bạn có thể suy nghĩ theo những điều khoản đó. Tôi thường không thấy các đồng nghiệp của mình lấy đạo hàm của một đa thức trên bảng trắng của họ, nhưng tôi thường thấy các bản phác thảo các hàm với tiếp tuyến được vẽ ở một điểm thú vị hoặc khu vực dưới đường cong được tô bóng. Chúng tôi không quan tâm đầy đủ về các giá trị thực tế để bận tâm tính toán chúng, nhưng hiểu về cách các giá trị thay đổi là điều cần thiết và đó là một phần của các cuộc trò chuyện hàng ngày.

Bất kỳ bằng đại học khoa học máy tính nào cũng sẽ yêu cầu tính toán, đại số tuyến tính, thống kê, logic và các khóa học toán khác không phải vì các lập trình viên cần áp dụng các kỹ thuật trực tiếp một cách thường xuyên (mặc dù họ có thể, tùy thuộc vào những gì họ làm), nhưng bởi vì bạn cần điều đó kiến thức để hiểu các tài liệu mà đến sau.


2
Nếu tôi có thể nâng cao điều này hơn một lần tôi sẽ làm.
Mr.Mindor

Mặc dù một câu trả lời hữu ích, nhưng không trả lời câu hỏi. Ví dụ, tôi đến đây vì gần đây tôi đã thực hiện một số hack trên trình điều khiển r600g để giải trí và cũng quan tâm đến việc cải thiện nền toán học, vốn yếu. Sẽ rất tốt để tìm một ý tưởng để thực hiện trong trình điều khiển yêu cầu mở rộng kiến ​​thức toán học của tôi, tốt nhất là một cái gì đó ngoài đại số trừu tượng, cấu trúc liên kết, nhưng không nhất thiết phải giới hạn. Một loạt các truy vấn như "toán học phát triển trình điều khiển" không đưa ra một bài báo nào, trang này là trang gần nhất tôi có thể nhận được.
Hi-Angel

@ Hi-Angel tôi không đồng ý. Nó có thể không trả lời câu hỏi theo cách bạn mong đợi, và nó có thể không trả lời riêng của bạn "những gì tôi có thể làm việc để cải thiện kỹ năng toán học của tôi" câu hỏi, nhưng tôi cho rằng toán học tiên tiến là hữu ích cho một hệ thống lập trình chủ yếu ở chỗ nó thay đổi quan điểm của bạn và cung cấp sự hiểu biết sâu sắc hơn. Lập trình viên đồ họa thực sự sử dụng tính toán và đại số tuyến tính một cách thường xuyên, lập trình viên hệ thống ít như vậy. Nhưng hiểu những chủ đề đó vẫn quan trọng.
Caleb

6

Tôi sẽ tiếp tục và nói rằng tôi không nghĩ phép tính hoặc đại số tuyến tính có thể quan trọng đối với lập trình hệ thống.

Tôi chắc chắn nghĩ rằng tính toán và đại số tuyến tính nói chung đáng để học hỏi - Tôi là một người toán học! Và, như các câu trả lời khác chỉ ra, có một số liên quan gián tiếp, vì phân tích hiệu suất và thiết kế thuật toán có thể sử dụng toán học nâng cao. Tuy nhiên, tôi không nghĩ lập trình hệ thống phụ thuộc nhiều vào các loại toán đó hơn hầu hết các lĩnh vực khác thường không được coi là toán học.


Bạn đã bao giờ nhìn thấy GPU chưa? :) Đó là một chút toán học, đặc biệt. để viết trình điều khiển cho nó ... nhưng đó là sự thật: nếu bạn bị mắc kẹt, bạn luôn có thể sử dụng math.stackexchange.com :))
Aadaam

Tôi cũng là một anh chàng đồ họa máy tính; Tôi giống như nhận xét đó! Và bạn đã đúng: bất kỳ ai muốn viết trình điều khiển card đồ họa đều cần hiểu đồ họa máy tính (và đại số tuyến tính và phép tính cơ bản đòi hỏi) cũng như lập trình hệ thống.
sắp tới

Theo như tôi có thể thấy, người ta cần biết lượng giác và đại số tuyến tính để làm một cái gì đó hữu ích ngoài API đồ họa, nhưng không triển khai API này trong trình điều khiển đồ họa. Ở đó bạn chủ yếu đối phó với việc chuyển đổi một loạt các thanh ghi dựa trên các yêu cầu ứng dụng. Nơi duy nhất để áp dụng toán học trong trình điều khiển đồ họa mà tôi có thể tưởng tượng là tối ưu hóa cho trình biên dịch của nó. Sửa tôi nếu tôi sai - tôi muốn được. Tôi thực sự đã đến đây vì tôi muốn cải thiện nền tảng toán học của mình và cũng không bị hack chút nào trên r600g, và thật tuyệt khi kết hợp cả hai.
Hi-Angel

4

Tôi nghi ngờ đó là sự thật xung quanh các cạnh. Các lập trình viên hệ thống phải quan tâm nhiều hơn đến hiệu suất và độ tin cậy, do đó phân tích thuật toán có thể quan trọng và đôi khi tính toán là cần thiết cho bằng chứng phân tích Big-Oh. Các môn học như lý thuyết xếp hàng và tối ưu hóa rời rạc (đó là tối ưu hóa toán học chứ không phải tối ưu hóa mã) cũng có thể đóng vai trò. Tuy nhiên, tôi nghĩ rằng những điều đó chủ yếu sẽ áp dụng cho những người làm việc trên các hệ điều hành và giao thức mạng, chứ không phải nhiều người làm việc trên trình điều khiển USB 3.0.


Để tối ưu hóa riêng biệt, dường như là thú vị và liên quan.
Hi-Angel

1

Định nghĩa của bạn về Lập trình hệ thống khá phù hợp với câu trả lời trong Wikipedia.

Nếu bạn nghĩ về những gì nó cung cấp - tức là. một giao diện phần mềm thành phần cứng, sau đó nó bắt đầu có ý nghĩa tại sao phép tính và đại số tuyến tính là những kỹ năng tiện dụng cần có.

Tóm tắt rằng giao diện cấp thấp yêu cầu bạn hiểu cách thức hoạt động của thiết bị. Các thiết bị điện tử vẫn bị ràng buộc bởi các định luật vật lý. Giải tích và đại số tuyến tính cung cấp một phương tiện để mô hình hóa hành vi của thiết bị. Mô hình hóa thiết bị cho phép bạn cung cấp một dịch vụ vào chức năng của nó.

Điều đó đã được nói, hai lĩnh vực đó không phải là tất cả cuối cùng cho Lập trình hệ thống. Tôi biết khá nhiều EE không làm tốt với tính toán và đại số tuyến tính nhưng vẫn có thể giải thích những gì thiết bị đang làm khá ngắn gọn.


Là định nghĩa về lập trình hệ thống đúng hay sai?
Victor

2
Điều đó không chính xác lắm. Giao diện với CPU chỉ yêu cầu kiến ​​thức về các hướng dẫn được cung cấp.
DeadMG

@DeadMG - Tôi không thể tranh luận trong trường hợp CPU. Tôi đã suy nghĩ nhiều hơn về các điều khoản của phần cứng thô như gia tốc kế hoặc giao diện IO trực tiếp. Điều đó đã được nói, hầu hết trong số đó được đặt trước một loại chip để cung cấp giao diện. Tôi nghĩ rằng nhận xét của tôi phù hợp với logic bên trong chip hơn có lẽ là lớp trình điều khiển thiết bị.

1

Ứng dụng web nói chung và / hoặc lập trình hành chính không liên quan đến nhiều ứng dụng của đại số tuyến tính hoặc phép tính, nhưng nhiều lĩnh vực chuyên môn thì có. Nếu bạn đối phó với hình học, bạn nhất định sẽ chạy vào đại số tuyến tính. Hầu hết các chương trình vật lý cũng liên quan đến cả đại số và giải tích. Cũng như bất cứ điều gì phải làm với thao tác dạng sóng, chẳng hạn như lập trình âm thanh và radio. Nói chung, điều quan trọng hơn là phải hiểu toán học rời rạc, trong số những thứ khác, liên quan đến lý thuyết tập hợp, lý thuyết đồ thị và logic chính thức (boolean) hữu ích trong nhiều ứng dụng như quản lý thông tin, cơ sở dữ liệu và các nơi khác kết hợp dữ liệu và / hoặc logic . Trong trường hợp lập trình Hệ thống, tôi không thấy nhiều ứng dụng.


2
Tôi nghĩ rằng bạn có thể "có được" mà không bao giờ sử dụng phép tính hoặc đại số tuyến tính trong hầu hết các lĩnh vực lập trình. Tuy nhiên, nếu bạn cảm thấy thoải mái với các khái niệm, bạn sẽ ngạc nhiên về số lượng vấn đề khác nhau mà bạn có thể áp dụng chúng. Đo lường và dự đoán độ trôi của đồng hồ, thời gian duy trì pin xuất hiện trong tâm trí của những thứ tôi vừa sử dụng tính toán gần đây. Phép đo tam giác và dự đoán đường đi liên quan đến đại số tuyến tính cho một vấn đề tôi đã làm vào năm ngoái. Không có vấn đề nào được yêu cầu khi sử dụng các chủ đề đó như các phương pháp xấp xỉ cực kỳ phức tạp và kém phức tạp trước đây mà những người khác đã sử dụng đã chứng minh ...
Dunk

2
(tiếp) ... nhưng việc sử dụng toán học tiên tiến hơn đã tạo ra những triển khai chính xác và ngắn gọn hơn nhiều, hoạt động theo cách chúng được yêu cầu. IOW, giải tích và đại số tuyến tính là những công cụ mạnh mẽ khi bạn học cách áp dụng chúng và chúng sẽ giúp bạn vươn lên dẫn đầu so với hầu hết mọi lập trình viên khác, vì hầu hết không quan tâm đến việc học toán đủ khi còn đi học. Đối với tôi, nó có nghĩa là được làm việc trong các dự án thực sự tuyệt vời so với trần tục.
Dunk

0

Như những người khác đã đề cập, bất kỳ khóa học toán học nào trong trường đại học đều có thể mài giũa kỹ năng giải quyết vấn đề và suy luận của bạn. Đây là những điều quan trọng đối với hầu hết mọi người.

Nhưng đôi khi biết một số đại số tuyến tính có thể hữu ích, đặc biệt đối với một số ý tưởng kinh doanh khá tốt .


0

Lập trình hệ thống, theo như tôi biết, là về osdev, trình điều khiển, tiện ích, v.v. Tôi chỉ không thể hiểu làm thế nào tính toán và đại số tuyến tính có thể hữu ích về điều đó.

Với tính toán, nó khá dễ, ngay khi người ta xem kỹ nội dung khóa học . Nó liên quan chặt chẽ đến độ phức tạp thuật toán, ký hiệu Big-O - những thứ như thế, khá cơ bản trong lập trình.

Phương trình là những gì bạn nhận được khi ước tính độ phức tạp của thuật toán. Các vòng lặp lồng nhau ba cấp độ từ 0đến NN 3 , các vòng lặp lồng nhau hai cấp độ là N 2 , một vòng là N. Đánh giá bạn có thể trông giống như (N 3 + 2 * N 2 + N) - đó là một phương trình.

Bây giờ, nếu bạn muốn hiểu rõ hơn về thời gian thực hiện sẽ tăng nhanh như thế nào khi N tăng, điều này có liên quan chặt chẽ đến các dẫn xuất / sự khác biệt. Các phần khác của tính toán bạn có thể thấy hữu ích là các giới hạn và phân tích tiệm cận - những điều này sẽ dẫn bạn đến việc hiểu ký hiệu Big-O, ghi điểm tốt hơn trong các cuộc phỏng vấn lập trình và có thể, làm lập trình hệ thống tốt hơn.

  • Bạn được chỉ định thiết kế bảng cấp phát tệp, bạn sẽ sử dụng cấu trúc dữ liệu nào? Giả sử có nhiều tệp nhỏ hiếm khi được sửa đổi, cái gì sẽ thích hợp hơn? Giả sử một lượng tương đối nhỏ các tệp lớn luôn được nối vào cuối, bạn sẽ sử dụng cùng một cấu trúc chứ? Làm thế nào bạn sẽ quyết định?

Đối với Đại số tuyến tính , ở đây các ứng dụng lập trình bắn vào bạn từ bức ảnh đầu tiên.

http://pad1.whstatic.com/images/thumb/c/c4/LaTeX-2m.jpg/251px-LaTeX-2m.jpg

Nếu bạn từng phải đối phó với đồ họa raster (ví dụ như trong trình điều khiển video), những hình ảnh như trên sẽ đến với bạn trong những cơn ác mộng tồi tệ nhất.

  • Làm thế nào mà bài kiểm tra # 12345 cho thấy thiếu pixel? tôi đã làm gì sai khi thực hiện Bresenham ? nó có thể chỉ là một lỗi trong thiết kế thử nghiệm không đúng kế toán cho các lỗi làm tròn?

Có một xu hướng mà CS ở mọi trường đại học mà tôi biết đang tách ra khỏi các khoa toán. Tôi nghĩ rằng đó là một động thái rất thông minh. Hơn nữa, sinh viên CS được cho là tìm ra giải pháp từ việc sử dụng các giải pháp hiện có. Một sinh viên CS giỏi sẽ đọc tài liệu trên container, sẽ thấy chữ O (ns Something), mở wikipedia, xem biểu đồ và quyết định xem container có phù hợp không. Điều đó sẽ mất 2 phút, giống như kiểm tra các yêu cầu tham số và tham số cho một số lệnh gọi hàm API. Và, IMHO, một hồ sơ gần như luôn luôn là một giải pháp tốt hơn so với toán lý thuyết.
Coder

2
@Coder, tất nhiên một số sinh viên khoa học máy tính cuối cùng là những người phải thiết kế các thùng chứa và thuật toán ngay từ đầu. Đối với họ toán học và trình lược tả là các công cụ bổ trợ: toán học sẽ không cung cấp triển khai hoạt động và trình lược tả sẽ không cảnh báo bạn rằng dữ liệu kiểm tra của bạn chỉ là một sự cố.
Charles E. Grant
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.