Những nhà khoa học tính toán nên có những kỹ năng cốt lõi nào? [đóng cửa]


52

Mỗi nhà khoa học cần biết một chút về thống kê: ý nghĩa của mối tương quan, khoảng tin cậy là gì, v.v. Tương tự, mọi nhà khoa học nên biết một chút về điện toán: câu hỏi là gì? Điều gì là hợp lý để mong đợi mọi nhà khoa học làm việc biết về xây dựng và sử dụng phần mềm? Danh sách các kỹ năng cốt lõi của chúng tôi --- những điều mọi người nên biết trước khi họ giải quyết bất cứ điều gì với "đám mây" hoặc "peta" trong tên của nó --- là:

  • lập trình cơ bản (vòng lặp, điều kiện, danh sách, hàm và tệp I / O)
  • kịch bản shell / shell cơ bản
  • kiểm soát phiên bản
  • bao nhiêu để kiểm tra chương trình
  • SQL cơ bản

Có rất nhiều thứ không có trong danh sách này: lập trình ma trận (MATLAB, NumPy và tương tự), bảng tính khi được sử dụng tốt, chúng mạnh mẽ như hầu hết các ngôn ngữ lập trình), các công cụ tự động hóa nhiệm vụ như Make, v.v.

Vì vậy: những gì trong danh sách của bạn ? Bạn nghĩ gì khi công bằng để mọi nhà khoa học biết đến những ngày này? Và những gì bạn sẽ lấy ra khỏi danh sách trên để nhường chỗ cho nó? Không ai có đủ thời gian để học mọi thứ.


1
Câu hỏi tuyệt vời! Nhưng tôi không rõ về một điều: ý của nhà khoa học tính toán là gì? Bất kỳ nhà khoa học sử dụng tính toán? Hay nhóm nhỏ hơn NHIỀU người coi danh hiệu chuyên môn của họ là "nhà khoa học tính toán"?
David Ketcheson

9
Đặt câu hỏi danh sách không tốt trong định dạng Stack Exchange. Chúng ta có thực sự phải trải qua điều này trên mỗi trang web không?
dmckee

4
@Dan Community Wiki không phải là lý do để cho phép các câu hỏi không thuộc về trang web. Tôi cũng muốn khuyến khích những người trả lời lấy một ví dụ từ Jed và ít nhất là thử và giải thích lý do tại sao bạn cần một số kỹ năng nhất định hoặc không cần người khác
Ivo Flipse

5
@IvoFlipse: Đây là một câu hỏi thuộc về trang web dưới một số hình thức. Có thể không như hiện tại đã nêu; có lẽ nó cần phải được đưa vào các câu hỏi nhỏ hơn và được sắp xếp lại, nhưng vấn đề về công nghệ phần mềm kém trong khoa học tính toán là một vấn đề cực kỳ quan trọng, đặc biệt là vì khoa học tính toán như một ngành học vẫn đang trong giai đoạn hình thành. Bài viết này trong Tự nhiên chỉ ra lý do tại sao. Greg đang làm một dịch vụ tuyệt vời cho cộng đồng khoa học tính toán thông qua trang web của mình.
Geoff Oxberry

5
Tôi không đồng ý với câu hỏi này được đóng lại. Vui lòng xem (và bỏ phiếu trên) meta.scicomp.stackexchange.com/questions/179/ mẹo
David Ketcheson

Câu trả lời:


46

"Nhà khoa học tính toán" có phần rộng vì nó bao gồm những người thực hiện phân tích số bằng giấy / LaTeX và triển khai bằng chứng khái niệm, mọi người viết thư viện mục đích chung và những người phát triển ứng dụng giải quyết các lớp vấn đề nhất định và người dùng cuối sử dụng chúng các ứng dụng. Các kỹ năng cần thiết cho các nhóm này là khác nhau, nhưng có một lợi thế lớn để có một số quen thuộc với "ngăn xếp đầy đủ". Tôi sẽ mô tả những gì tôi nghĩ là những phần quan trọng của ngăn xếp này, những người làm việc ở cấp độ đó tất nhiên nên có kiến ​​thức sâu hơn.

Kiến thức tên miền (ví dụ: vật lý và nền tảng kỹ thuật)

Mọi người nên biết những điều cơ bản của lớp các vấn đề họ đang giải quyết. Nếu bạn làm việc trên PDE, điều này có nghĩa là một số quen thuộc chung với một vài loại PDE (ví dụ: Poisson, độ đàn hồi, và Navier-Stokes không thể nén và nén được), đặc biệt là những tính chất nào quan trọng để nắm bắt "chính xác" và những gì có thể bị phân biệt lỗi (điều này thông báo lựa chọn phương pháp liên quan đến bảo tồn cục bộ và tích hợp đối xứng). Bạn nên biết về một số chức năng và loại phân tích quan tâm đến các ứng dụng (tối ưu hóa nâng và kéo, dự đoán lỗi, đảo ngược tham số, v.v.).

toán học

Mọi người nên có một số hiểu biết chung về các lớp phương thức liên quan đến miền vấn đề của họ. Điều này bao gồm các đặc điểm cơ bản của đại số tuyến tính thưa thớt so với mật độ dày đặc, tính sẵn có của "phương pháp nhanh", tính chất của các kỹ thuật phân biệt không gian và thời gian và cách đánh giá các tính chất của một vấn đề vật lý cần thiết cho một kỹ thuật rời rạc phù hợp. Nếu bạn chủ yếu là người dùng cuối, kiến ​​thức này có thể rất cao.

Kỹ thuật phần mềm và thư viện

Một số quen thuộc với các kỹ thuật trừu tượng và thiết kế thư viện là hữu ích cho hầu hết mọi người trong khoa học tính toán. Nếu bạn làm việc trên các phương pháp bằng chứng khái niệm, điều này sẽ cải thiện việc tổ chức mã của bạn (giúp người khác dễ dàng "dịch" nó thành một triển khai mạnh mẽ). Nếu bạn làm việc trên các ứng dụng khoa học, điều này sẽ giúp phần mềm của bạn mở rộng hơn và giúp giao diện với các thư viện dễ dàng hơn. Hãy phòng thủ khi phát triển mã, sao cho các lỗi được phát hiện càng sớm càng tốt và các thông báo lỗi càng nhiều thông tin càng tốt.

Công cụ

Làm việc với phần mềm là một phần quan trọng của khoa học tính toán. Thành thạo ngôn ngữ bạn đã chọn, hỗ trợ trình soạn thảo (ví dụ: thẻ, phân tích tĩnh) và các công cụ gỡ lỗi (trình gỡ lỗi, valgrind) cải thiện đáng kể hiệu quả phát triển của bạn. Nếu bạn làm việc trong môi trường hàng loạt, bạn nên biết cách gửi công việc và nhận các phiên tương tác. Nếu bạn làm việc với mã được biên dịch, một kiến ​​thức làm việc về trình biên dịch, trình liên kết và các công cụ xây dựng như Make sẽ tiết kiệm rất nhiều thời gian. Kiểm soát phiên bản là cần thiết cho tất cả mọi người, ngay cả khi bạn làm việc một mình. Tìm hiểu Git hoặc Mercurial và sử dụng nó cho mọi dự án. Nếu bạn phát triển thư viện, bạn nên biết các tiêu chuẩn ngôn ngữ hoàn toàn hợp lý để bạn hầu như luôn viết mã di động ngay lần đầu tiên, nếu không bạn sẽ bị chôn vùi trong các yêu cầu hỗ trợ người dùng khi mã của bạn không xây dựng trong môi trường sôi nổi của họ.

Mủ cao su

LaTeX là tiêu chuẩn thực tế cho xuất bản khoa học và hợp tác. Thành thạo với LaTeX rất quan trọng để có thể truyền đạt kết quả của bạn, cộng tác trên các đề xuất, v.v. Kịch bản tạo ra các số liệu cũng rất quan trọng đối với khả năng tái tạo và xuất xứ dữ liệu.


7
Tôi đồng ý với Jed. LaTeX là hoàn toàn cần thiết! :)
Paul

1
Tôi sẽ thay đổi "Vật lý và Kỹ thuật" thành chuyên môn. Rốt cuộc, chúng ta không phải là tất cả các nhà vật lý hay kỹ sư. Tinh thần của phần đó của câu trả lời là ở đúng nơi, nhưng có một giả định khá rõ ràng.
Fomite

Cảm ơn @EpiGrad, tôi đã thay đổi nó thành "kiến thức tên miền" với những ví dụ này.
Jed Brown

Danh sách tốt. Một sự hiểu biết cơ bản về các vấn đề hiệu suất cũng nên có trong đó. Tôi đã gặp quá nhiều người không hiểu khái niệm đơn giản về mã hồ sơ. NB: hiệu suất nên được sử dụng có nghĩa là không chỉ vấn đề tốc độ mà còn cả việc sử dụng bộ nhớ.
Faheem Mitha

Typose: "probelms" và "burried". SE sẽ không để tôi sửa chúng - một chỉnh sửa quá nhỏ.
Faheem Mitha

26

Nền tảng của riêng tôi là về Khoa học Máy tính, vì vậy ý ​​kiến ​​của tôi có thể hơi thiên vị. Phải nói rằng, tôi đã thêm "thuật toán cơ bản và cấu trúc dữ liệu" vào danh sách. Ý tôi là với những điều cơ bản về cơ bản là tìm kiếm và sắp xếp tuyến tính, và các cấu trúc dữ liệu như cây cân bằng, đống và bảng băm.

Tại sao? Vâng, trong hầu hết các thuật toán tính toán, cuối cùng bạn sẽ dành một lượng thời gian và nỗ lực phi thường để chuyển dữ liệu xung quanh và không thực sự tính toán bất cứ điều gì. Bao giờ thực hiện mã Phần tử hữu hạn? Đó là khoảng 90% tổ chức dữ liệu. Sự khác biệt giữa việc này được thực hiện và hoàn thành tốt có thể là một thứ tự lớn trong hiệu quả tính toán.

Một điểm nhỏ liên quan đến Khoa học Máy tính mà tôi cũng muốn nói thêm là phần giới thiệu ngắn về cách thức bộ xử lý thực sự hoạt động và những gì nó tốt và những gì không. Ví dụ:

  • Bổ sung và nhân là nhanh, chức năng phân chia hoặc siêu việt không. Tôi đã thấy những người đàn ông trưởng thành thay thế một hoạt động căn bậc hai bằng một cái gì đó đòi hỏi ba bộ phận và nghĩ rằng họ đã làm một cái gì đó tuyệt vời (bộ phận và căn bậc hai cũng đắt như vậy).
  • Bộ nhớ cache cấp 3 đang ngày càng lớn hơn mỗi năm, vâng, nhưng bộ đệm cấp 0, tức là bộ nhớ cache thực sự nhanh, vẫn chỉ còn vài kilobyte.
  • Trình biên dịch không phải là phép thuật. Họ có thể hủy các vòng lặp nhỏ hoặc véc tơ hóa các hoạt động cực kỳ đơn giản, nhưng họ sẽ không biến bong bóng đó thành một ống khoan.
  • Gọi các phương thức trên các đối tượng đa hình có nhiều kế thừa trong vòng lặp trong cùng của bạn có thể là khái niệm ngọt ngào, nhưng nó sẽ khiến CPU của bạn muốn tự chết.

Đây là một công cụ nhàm chán khó chịu, nhưng chỉ mất vài phút để giải thích và hãy ghi nhớ nó sẽ cho phép bạn viết mã tốt từ việc sử dụng hoặc thuật toán thiết kế không dựa vào các tính năng phần cứng không tồn tại.

Về những gì cần loại bỏ khỏi danh sách, tôi nghĩ rằng SQL là một chút cho các nhà khoa học tính toán. Ngoài ra, kiểm thử phần mềm rất quan trọng, nhưng bản thân nó là một khoa học. Kiểm thử đơn vị và các loại dữ liệu trừu tượng chính xác là những điều nên được dạy với lập trình cơ bản và không yêu cầu chương trình thạc sĩ hai năm.


2
Không nhàm chán chút nào. Tôi sẽ tham gia một khóa học như thế, nếu nó được cung cấp. :-)
Faheem Mitha

18

Tôi có thể thêm vào điều này sau, nhưng để bắt đầu, tôi sẽ loại bỏ "shell scripting" và thay thế nó một cách cụ thể bằng "Python scripting". Python dễ mang theo hơn so với kịch bản lệnh shell và dễ đọc hơn các ngôn ngữ shell và script tương đương. Thư viện tiêu chuẩn lớn và sự phổ biến của nó trong các ngành khoa học (ngoại trừ có thể là sinh học, cũng sử dụng Perl) làm cho nó trở thành một ngôn ngữ tính toán tuyệt vời , chưa kể đến một ngôn ngữ đầu tiên tốt cho việc học lập trình. Bây giờ nó là ngôn ngữ đầu tiên được dạy cho các chuyên ngành EECS tại MIT, và nó phổ biến trong thị trường việc làm, đặc biệt là trong điện toán khoa học. Tài liệu trực tuyến của nó rất phong phú và cũng có một số văn bản lập trình dựa trên Python có sẵn trực tuyến.

Sử dụng Python, bạn có thể dạy các cấu trúc lập trình cơ bản, cũng như kịch bản. Ngoài ra, Python còn hỗ trợ tuyệt vời cho kiểm tra đơn vị, do đó Python cũng có thể được sử dụng để dạy kiểm thử đơn vị. Python cũng có API cơ sở dữ liệu mở rộng (có thể thay thế hoặc tăng cường phải học SQL) và một vài tiện ích xây dựng cung cấp chức năng Make-like. Cá nhân tôi thích SCons hơn Make, vì tôi thấy Python dễ dàng ghi chép và kiểm tra hơn các shell script.

Cuối cùng, nguyên tắc thúc đẩy đằng sau sự run rẩy trắng trợn của tôi đối với Python là hiệu quả. Việc sắp xếp công việc của bạn trở nên dễ dàng hơn rất nhiều nếu bạn có thể thực hiện hầu hết công việc của mình bằng một ngôn ngữ hoặc một công cụ, đặc biệt khi công cụ đó là ngôn ngữ kịch bản biểu cảm. Chắc chắn, tôi có thể làm mọi thứ trong C, nhưng chương trình của tôi sẽ dài gấp 5 lần và rất có thể, tôi không cần tốc độ. Thay vào đó, tôi có thể sử dụng Python để nhập dữ liệu từ tệp văn bản, vẽ sơ đồ, gọi các thói quen tối ưu hóa, tạo các biến thể ngẫu nhiên, vẽ kết quả của tôi, viết kết quả vào tệp văn bản và kiểm tra đơn vị mã của tôi. Nếu Python quá chậm, bạn có thể bọc Python xung quanh mã C, C ++ hoặc Fortran để xử lý các tác vụ tính toán chuyên sâu. Python, đối với tôi, là một cửa cho hầu hết các nhu cầu tính toán khoa học của tôi.

Python chưa chính xác MATLAB; SciPy và NumPy vẫn có cách đi về chức năng, nhưng về mặt tiện ích chung, tôi sử dụng Python cho nhiều nhiệm vụ rộng hơn MATLAB.


7
Tôi không thể giúp nhưng hoàn toàn không đồng ý với điều này. Python là vấn đề đau đầu đối với các nhà bảo trì hệ thống vì đó là một mục tiêu di động. Các nhà khoa học tính toán nên có hiểu biết cơ bản về bash hoặc csh để dán các công cụ thô sơ nhất và chạy các công việc trên các hệ thống mà họ có khả năng sử dụng. Python rất tuyệt, và tôi ủng hộ bạn ủng hộ những người tính toán học nó, nhưng không phải trả giá bằng một số vỏ thô sơ.
Bill Barth

7
@BillBarth: Tôi nghĩ rằng mọi nhà khoa học tính toán đều phải học bash hoặc csh cơ bản cho các kịch bản rất, rất cơ bản. Lý do tôi ủng hộ việc sử dụng Python cho kịch bản shell ngoài các tác vụ cơ bản đó là vì tôi đã thừa hưởng một tập lệnh bash hàng nghìn giờ về cơ bản chạy một chương trình . Nó chuyển các tập tin qua lại dưới dạng semaphores, liên tục gọi PBS và không có cách nào để kiểm tra điều đó cả. Shell scripting là tuyệt vời cho các nhiệm vụ nhỏ, nhưng không phải cho các nhiệm vụ lớn, và cơn ác mộng ống băng và bong bóng này đã khiến tôi mất vài năm cho luận án của mình, đó là lý do tại sao tôi khăng khăng.
Geoff Oxberry

2
Như tôi đã nói, tôi không đồng ý rằng "học trăn" có thể phù hợp với danh sách này. Tôi chỉ không muốn làm điều đó với chi phí "shell scripting". Cả hai đều quan trọng và không ai sẽ cho phép bạn chạy ipython làm vỏ của bạn, vì vậy kịch bản shell là cực kỳ quan trọng.
Bill Barth

3
@BillBarth: Không ở đâu tôi đề nghị Python thay thế shell. Tôi chỉ đề xuất rằng Python thay thế bash cho kịch bản; Tôi tin rằng nếu bạn học bash cơ bản, bạn biết đủ để viết các tập lệnh mà không cần cấu trúc điều khiển, vì vậy không cần phải đi sâu vào "bash scripting". Ngay khi bạn muốn bao gồm một cấu trúc điều khiển, bạn nên chuyển sang một ngôn ngữ khác, bởi vì lập trình trong bash là vấn đề đau đầu đối với những người bảo trì phần mềm và thư viện.
Geoff Oxberry

1
+1. Python đã là ngôn ngữ lập trình chính của tôi trong một thời gian. Nó không hoàn hảo, nhưng nó sẽ làm cho đến khi ai đó phát minh ra ngôn ngữ lập trình hoàn hảo.
Faheem Mitha

14

Điểm nổi toán. Hầu hết các giao dịch khoa học với các giá trị trong thế giới thực và các giá trị trong thế giới thực thường được biểu diễn dưới dạng điểm nổi trong thế giới máy tính. Có rất nhiều vấn đề tiềm năng với những chiếc phao có thể tàn phá ý nghĩa của kết quả.

Tài liệu tham khảo yêu thích cho chủ đề này dường như là "Điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động (1991)" của David Goldberg http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768


1
Tài liệu này đã được đề cập rất nhiều lần trên các diễn đàn trực tuyến. Nhưng đó là một bài viết rất dài và dày đặc, và tôi không chắc có bao nhiêu người thực sự có thể lấy đi thứ gì đó hữu ích từ việc này.
johngreen

12

Một nhà khoa học tính toán phải có đủ sự quen thuộc trong khoa học máy tính, toán học và một lĩnh vực ứng dụng trong khoa học / kỹ thuật. Tôi sẽ bao gồm các kỹ năng trong từng lĩnh vực sau:

Toán học:

  1. Phân tích số
  2. Đại số tuyến tính
  3. Phương trình vi phân thông thường, một phần và / hoặc ngẫu nhiên
  4. Tối ưu hóa
  5. Thống kê và / hoặc Xác suất
  6. Lý thuyết nghịch đảo

Khoa học máy tính:

  1. Thuật toán
  2. Cấu trúc dữ liệu
  3. Lập trình song song (MPI, OpenMP, CUDA, v.v.)
  4. Trực quan khoa học
  5. Kiến trúc máy tính
  6. Sử dụng môi trường Linux

Khoa học / Kỹ thuật - phụ thuộc vào ứng dụng mà bạn muốn chuyên môn. Trong trường hợp cụ thể của tôi (kỹ thuật), tôi sẽ thêm những thứ như cơ học liên tục, truyền nhiệt, động lực học chất lỏng, phương pháp phần tử hữu hạn, v.v. Tôi sẽ nói rằng càng quen thuộc hơn bạn có nhiều lĩnh vực khoa học, bạn càng trở nên linh hoạt như một nhà khoa học tính toán.


Bạn có thể giải thích về "Lý thuyết nghịch đảo" không?
Faheem Mitha

1
@FaheemMitha: Theo truyền thống, chúng tôi đặt các tham số của mô hình trước tiên (ví dụ: phương trình vi phân từng phần), sau đó quan sát hành vi của hệ thống. Một "vấn đề nghịch đảo" đang làm ngược lại. Chúng tôi bắt đầu với các quan sát đầu ra của hệ thống và cố gắng xác định các tham số của mô hình tạo ra các quan sát này. Lý thuyết nghịch đảo mô tả các phương pháp để hoàn thành nhiệm vụ này.
Paul

Cảm ơn đã giải thích. Bạn có một liên kết / tài liệu tham khảo tốt cho chủ đề này?
Faheem Mitha

2
vi.wikipedia.org/wiki/Inverse_propet là một nơi tốt để bắt đầu. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf cũng có một cái nhìn tổng quan đẹp. Nhưng để hiểu sâu sắc hơn, tôi muốn giới thiệu một cuốn sách như amazon.com/Parameter-Estimation-Inverse-Probols-Second/dp/ Lỗi
Paul

4

Câu hỏi tuyệt vời tiếp theo là câu trả lời hấp dẫn! Tôi muốn mông chỉ với một bổ sung nhỏ. Theo như tôi đã trải nghiệm (bản thân và gián tiếp), một công cụ Tất cả trong một thường thực sự tốt để biết. Một công cụ như vậy có thể là MATLAB, Octave hoặc thậm chí Python (với các thư viện). Bất cứ khi nào bạn gặp vấn đề trên "vùng thoải mái" của mình, một ý tưởng hay (theo như tôi biết và nghĩ) sẽ là thử dùng công cụ All-in-One. Bạn có thể thử viết mã của riêng bạn sau này. Cái hay của các gói như vậy là việc lập trình không can thiệp vào sự hiểu biết về những gì bạn đang làm.

Lấy một ví dụ về Đồ họa máy tính. Viết mã để dịch, xoay hoặc chia tỷ lệ của một hình là 10 dòng mã trong MATLAB (ngọn) nhưng nó có thể chạy cho các trang trong C. Tôi không nói C không tốt. Tất cả những gì tôi đang nói là nếu bạn không có lý do chính đáng để viết mã bằng C, MATLAB sẽ là cách đơn giản hơn, tốt hơn và trực quan hơn.

Một số người có thể không đồng ý và nói rằng lập trình giống như C là một cách tuyệt vời để xây dựng trực giác. Có thể nó là. Nhưng khi bạn không phải đối phó với một vấn đề trong hơn một vài lần, hầu như không được bảo đảm ngồi và viết mã của riêng bạn bằng ngôn ngữ như C.


-1

Cảm giác thông thường và cảm giác ruột thịt ... Cái sau chỉ đến với thời gian và sau khi "sống sót" một vài trải nghiệm đáng xấu hổ trong thế giới tồi tệ lớn.


3
Tôi không biết "cảm giác ruột" có thực sự là một kỹ năng hay không. Đó không chỉ là một phản ứng bản năng đối với trải nghiệm trước đó.
ness101
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.