Dạy bản thân, là một nhà vật lý, để trở thành một lập trình viên tốt hơn [đóng]


17

Tôi luôn thích vật lý, và tôi luôn thích mã hóa, vì vậy khi tôi nhận được đề nghị cho vị trí tiến sĩ làm vật lý số (chi tiết không liên quan, chủ yếu là lập trình song song cho một cụm) tại một trường đại học, nó không -brainer cho tôi.

Tuy nhiên, như hầu hết các nhà vật lý, tôi tự dạy. Tôi không có kiến ​​thức nền tảng rộng rãi về cách viết mã theo cách hướng đối tượng hoặc tên của thuật toán cụ thể đó để tối ưu hóa tìm kiếm trong một số cây kD.

Vì tất cả các công việc của tôi cho đến nay đều quan tâm nhiều hơn đến vật lý và kết quả khoa học, tôi chắc chắn có một số thói quen xấu - hơn nữa bởi vì mã hóa của tôi là của riêng tôi, và không thực sự làm việc theo nhóm. Tôi đã sử dụng C chủ yếu vì nó rất đơn giản và "những gì bạn viết là những gì bạn nhận được" - không cần phải trừu tượng hóa. Tuy nhiên, gần đây tôi đã chuyển sang C ++ vì tôi muốn tìm hiểu thêm về sức mạnh đi kèm với sự trừu tượng hóa và nó khá giống C (ít nhất là theo cú pháp).

Làm thế nào để tôi dạy bản thân viết mã theo cách tốt, trừu tượng như tốt nghiệp ngành khoa học máy tính?

Tôi biết mã của tôi là hiệu quả, nhưng tôi muốn nó cũng thanh lịch và dễ đọc. Hãy nhớ rằng tôi không có thời gian để đọc một số cuốn sách 1000 trang về lập trình trừu tượng. Tôi cần dành thời gian cho nghiên cứu thực tế, liên quan đến vật lý (người giám sát của tôi sẽ cười tôi nếu anh ấy biết tôi dành thời gian suy nghĩ về cách lập trình một cách thanh lịch). Làm thế nào để tôi đánh giá nếu công việc của tôi cũng tốt từ quan điểm của một lập trình viên?


12
Một câu hỏi: Làm thế nào để bạn biết mã của bạn là hiệu quả?
Matsemann

Tôi đã thấy rất nhiều người nói không với C ++ như ngôn ngữ OO đầu tiên. Tôi đang học java và tôi đã tìm thấy các video hướng dẫn của Mark Dexter ở đây eclipsetutorial.sourceforge.net/totalbeginner.html , chúng khá hay và sẽ dạy bạn theo cách TDD. Ngoài ra, hãy kiểm tra Head First Java, nó khá tốt trong việc che đậy Java theo cách OO.
Garv

4
@DeveloperDon, tính toán là một phần trung tâm của vật lý ngay cả trước khi có máy tính điện tử. Các tính toán được thực hiện bằng tay, hoặc trên máy tính cơ học. Kể từ khi các nhà vật lý trong Thế chiến II đã tham gia sâu vào phần mềm. Nếu bạn đang tính toán sự trở lại của sao chổi, mô phỏng việc sản xuất neutron trong phản ứng chuỗi hạt nhân hoặc phân tích hàng gigabyte dữ liệu để tìm kiếm dấu hiệu của Higgs Boson, bạn phải thực hiện nhiều thao tác khủng hoảng. Trở lại năm 1974, nửa đầu của phòng thí nghiệm vật lý năm đầu tiên của tôi được dành cho việc dạy FORTRAN.
Charles E. Grant

1
@DeveloperDon Khi các nhà vật lý tại CERN, ví dụ, lấy dữ liệu, họ nhận được dữ liệu từ hàng triệu va chạm hạt. Bạn cần một máy tính để xử lý lượng thông tin này. Cũng xem xét một khu vực như vật lý trạng thái rắn nơi bạn cố gắng tìm hiểu các tính chất vĩ mô của vật liệu từ các tương tác vi mô của các nguyên tử. Trong một hệ thống như vậy, một điện tử đơn lẻ cảm nhận được lực đẩy / lực hút từ hàng tỷ hạt nhân và electron - và để mô tả chính xác một hệ thống như vậy, bạn cần một máy tính nhanh và các thuật toán hiệu quả (và một số xấp xỉ tốt cho các phương trình cơ bản).
dùng787267

1
Có lẽ bạn nên thay đổi ngôn ngữ của mình từ C / C ++ sang Python để bạn có thể có nhiều thời gian hơn? Python thường được các nhà khoa học sử dụng , có các mô-đun như NumPy - gói để tính toán khoa học với Python hoặc SciPy . Nếu bạn cần tốc độ của C / C ++ trong Python thì hãy sử dụng Cython , nó cho phép bạn sử dụng các kiểu và cấu trúc C / C ++ để bạn có tốc độ tương tự như C / C ++, cũng dễ dàng tích hợp với các thư viện C / C ++ hiện có bằng Cython.
Czarek Tomczak

Câu trả lời:


20

Hãy nhớ rằng tôi không có thời gian để đọc một số cuốn sách 1000 trang về lập trình trừu tượng.

Vì vậy, bạn đang yêu cầu ai đó cung cấp cho bạn một danh sách kiểm tra năm bước sẽ làm cho bạn một lập trình viên lành nghề? Điều đó sẽ không xảy ra !

Như với bất kỳ ngành học nào khác, nếu bạn muốn giỏi lập trình, bạn phải dành thời gian và công sức để thực hành và học tập. Bạn học cách viết mã rõ ràng, tao nhã bằng cách viết nhiều mã và đọc kỹ mã của người khác. Một vài trong số 1000 trang đó thực sự sẽ giúp bạn tiết kiệm thời gian bằng cách tóm tắt những bài học khó mà những người khác đã học. Thật là ảo tưởng khi nghĩ rằng bạn có thể trở thành một lập trình viên lành nghề như một tác dụng phụ không đau của việc lấy bằng tiến sĩ vật lý .. Không phải là bạn không thể ra khỏi bằng tiến sĩ vật lý. với các kỹ năng lập trình điên rồ, chỉ là nó sẽ khiến bạn tốn thời gian và rắc rối.

Code Complete là phần giới thiệu tốt về các cơ chế phát triển phần mềm, bao gồm tư vấn về cách viết và cấu trúc mã rõ ràng, có thể duy trì. Vâng, nó là một cuốn sách lớn, nhưng nó chắc chắn không dày đặc như nói, "Nguyên tắc cơ học lượng tử" của Dirac hay "Trọng lực" của MTW. Code Complete gần giống như bạn sẽ có một danh sách kiểm tra năm bước để viết phần mềm tốt hơn.

Matlab, VIM, C, MPI và Valgrind là những công cụ tuyệt vời để biết. Bạn không đề cập đến việc sử dụng một hệ thống kiểm soát phiên bản. Nếu bởi một số sán mà bạn chưa sử dụng hệ thống kiểm soát phiên bản, bạn phải bắt đầu sử dụng ngay lập tức. Kiểm soát phiên bản cũng là một gửi thần để viết luận án của bạn. Các công cụ cơ bản khác mà bạn nên biết là trình gỡ lỗi, trình lược tả thực thi, khung ghi nhật ký và khung kiểm tra đơn vị. Bạn không cần phải đọc một cuốn sách 1000 trang cho mỗi cuốn sách này. Làm việc thông qua các hướng dẫn trực tuyến để có được những điều cơ bản và sau đó bắt đầu làm việc với chúng. Đi sâu hơn vào tài liệu khi nhu cầu của bạn trở nên tinh vi hơn.

Tư vấn cho bạn về việc học các nguyên tắc khoa học máy tính (trái ngược với các nguyên tắc xây dựng phần mềm) là khó khăn hơn. Bạn không chỉ định vấn đề gì bạn đang làm việc, cho dù bạn đang phát triển các thuật toán mới hoặc áp dụng các thuật toán hiện có. Tùy thuộc vào vấn đề nghiên cứu của bạn, một cuộc khảo sát về cấu trúc dữ liệu cơ bản và thuật toán tiêu chuẩn có thể hữu ích. Các vấn đề khác sẽ được hưởng lợi nhiều hơn từ một nền tảng vững chắc trong phân tích số. Nếu bạn muốn tìm hiểu những điều cơ bản về phân tích thuật toán, có một số văn bản tốt. Hướng dẫn thiết kế thuật toángiới thiệu về thuật toán xuất hiện trong tâm trí. Hiện tại cũng có một vài khóa học giới thiệu tốt có sẵn trực tuyến: Thiết kế và phân tích thuật toánthuật toán .


Cảm ơn các liên kết, tôi sẽ xem xét nó. Tôi biết rằng tôi sẽ không trở thành một bậc thầy về mã hóa vào cuối tuần, tuy nhiên tôi hy vọng sẽ dần dần cải thiện theo thời gian - đặc biệt là nếu tôi tìm cảm hứng bên ngoài vật lý (vì nhiều nhà vật lý mà tôi biết không thể quan tâm ít hơn đến các thực hành mã hóa tốt).
dùng787267

1
Tôi sẽ thêm python trong các công cụ dưới dạng đếm có thể đọc được
Xavier Combelle

2
+1 để đề xuất Mã hoàn thành. Nó thực sự là điều tốt nhất mà op có thể đọc để giải quyết vấn đề đang đề cập.
JW01

9

Hoàn cảnh của tôi hơi giống với bạn - Tôi đã tốt nghiệp ngành vật lý, người đã tự học lập trình. Sau khi tôi tốt nghiệp mặc dù tôi đã đảm nhận một vài công việc CNTT và cuối cùng trở thành kỹ sư phần mềm; bao gồm một chút thời gian làm việc trên OpenGDA (phần mềm được sử dụng để chạy thử nghiệm tại các trang web synchrotron khác nhau).

Điều chính tôi đã học được về những câu hỏi mà bạn có khi tôi đến đây là việc có được những kỹ năng này từ người khác dễ dàng hơn nhiều so với việc cố gắng tự mình tiếp nhận chúng. Một người cố vấn có kinh nghiệm có thể dễ dàng giúp bạn xác định nơi mã của bạn yếu hoặc nơi các mô hình và thực tiễn phổ biến có thể giúp bạn. Trong khi tôi tự học cách viết C và Objective-C, tôi không biết chính xác những gì tôi không biết (nếu bạn hiểu ý tôi) cho đến khi tôi làm việc với những người khác trên cùng một mã. Thực tế bạn đang hỏi lời khuyên ở đây có nghĩa là bạn đang làm tốt hơn tôi đã làm :-).

Bây giờ, bạn tìm một kỹ sư phần mềm chuyên nghiệp ở đâu? Gần đây tôi đã tham gia MentorNet , một hệ thống hợp tác với các lập trình viên có kinh nghiệm với các protégés.

Nhưng bạn không cần phải có một hệ thống chính thức như thế. Tìm một nhóm gặp gỡ lập trình viên địa phương (hoặc nơi bộ phận kỹ thuật phần mềm của trường đại học của bạn đi làm sau ngày thứ Sáu) là một nơi tuyệt vời để bắt đầu.


MentorNet trông rất thú vị - tôi sẽ xem xét nó. Đó có phải là một quá trình chuyển đổi khó khăn từ nhà vật lý sang kỹ sư phần mềm?
dùng787267

@ user787267 Vì tôi thích lập trình (và đã là lập trình viên sở thích), tôi đã có động lực để thực hiện quá trình chuyển đổi vì nghe có vẻ như bạn nên tôi không gặp khó khăn về mặt kỹ thuật. Điều khiến tôi mất nhiều thời gian hơn để hiểu rõ hơn về vấn đề thời trang: hiểu được vị trí của tôi trong một nhóm dự án lớn hơn và là chuyên gia về sự thay đổi lớn từ mã hóa "sói đơn độc" mà tôi đang làm trước đây.

5

Không có con đường hoàng gia đến phần mềm

Vào thời cổ đại, Euclid đã được vua Ptolemy hỏi một câu hỏi giống như câu hỏi của bạn. Câu trả lời của ông: "Không có con đường hoàng gia nào đến hình học."

Bạn đề cập rằng người giám sát của bạn sẽ cười nếu anh ta biết bạn dành bao nhiêu thời gian để cố gắng viết mã như một nhà phát triển chuyên nghiệp. Những người khác trả lời câu hỏi của bạn với một danh sách những thứ cần học, từ kiểm soát nguồn đến Thiết kế và Phân tích Thuật toán.

Họ không đạt được mục tiêu của bạn:

"Tôi cần dành thời gian cho vật lý thực tế"

Hòa nhạc Pianist hay One Man Band?

Thế giới di chuyển quá nhanh để con người lao vào. Nếu bạn muốn trở thành một nghệ sĩ piano hòa nhạc, đừng phân chia thời gian học các nhạc cụ để trở thành một ban nhạc một người đàn ông.

Khái niệm của tôi về vai trò của một tiến sĩ vật lý trong các dự án vừa và lớn là một nhà lãnh đạo ý tưởng cho định nghĩa hệ thống, chuyên gia về lý thuyết, chuyên gia về chủ đề trong quá trình tạo trường hợp sử dụng và người dùng cuối / thẩm phán cho các kết quả được tạo ra bởi các tạo phẩm phần mềm. Làm việc chặt chẽ với các kỹ sư phần mềm tốt nhất bạn có thể.

Làm thế nào để tôi đánh giá nếu công việc của tôi cũng tốt từ quan điểm của một lập trình viên?

Nếu bạn muốn đặt thanh cao, bắt đầu ở đây:

Kiến trúc phần mềm trong thực tiễn, Len Bass, Paul Clements, Rick Kazman

Hãy tìm chương "Tìm hiểu các thuộc tính chất lượng". Ngoài mã, nó xem xét khả năng sử dụng, có thể sửa đổi, hiệu suất, bảo mật, tính sẵn sàng, độ tin cậy, khả năng kiểm tra, bảo trì và tính di động (bạn không thể mang nó, nhưng bạn có thể chuyển thiết kế từ nền tảng này sang nền tảng khác). Tất cả đều cần các mục tiêu đo lường cụ thể. Tài liệu tham khảo tương tự bao gồm:

http://msdn.microsoft.com/en-us/l Library / ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

Mục tiêu của bạn so với C và C ++

Giống như FORTRAN, đây là những ngôn ngữ cứng và cũ. Các chỉ số tích cực cho C / C ++ bao gồm:

  • Ứng dụng với phần cứng, hệ thống nhúng.
  • Dự án hiện tại bạn muốn làm điểm khởi đầu.

Có rất nhiều người làm phát triển web, trực quan hóa dữ liệu và dữ liệu lớn. Nhiều người có động lực để tìm hoặc làm cho các ngôn ngữ khác. Ví dụ, nhà vật lý Sir Tim Berners-Lee đã thành công với HTML (nhưng ít biết về vật lý). Đánh giá mục tiêu của bạn so với ngôn ngữ lập trình của bạn.

Cân nhắc sử dụng Matlab

Matlab có một cơ sở được cài đặt tuyệt vời, chuyên về toán học và khoa học. Nó có các công cụ để trực quan hóa dữ liệu. Nó cho phép nhà khoa học và nhà toán học thể hiện các vấn đề trong miền vấn đề hơn là miền giải pháp. Matlab tạo ra một hộp công cụ tính toán song song và các sản phẩm máy tính phân tán.

Tôi hy vọng thành công của Matlab là nhờ sử dụng các nhóm đa ngành với những người là chuyên gia về vật lý, toán học, điện tử và thiết bị, hệ điều hành, ngôn ngữ lập trình, phát triển phần mềm, kiểm thử phần mềm, kiến ​​trúc và thiết kế phần mềm. Sự tương tự có thể là một sự kéo dài, nhưng tại sao bạn lại đặt mình ra ngoài một mình, bắt đầu với một cái búa, cái đục và cái rìu để tạo ra thứ gì đó khi bạn có sẵn máy in 3D? Như Newton có thể hỏi, tại sao không đứng trên vai ai đó?


4

Bạn sẽ có thể đi một chặng đường dài trong Vật lý mà không biết gì về phong cách "chuyên nghiệp" (nói từ kinh nghiệm). Nhưng tôi đã thấy nhiều người lãng phí thời gian vô tận vì họ mất dấu vết về những gì họ làm hoặc sau khi đã phát triển mã của họ trong một vài năm chỉ bị mất trong sự phức tạp của nó (ngay cả trong học viện không có mã "vứt đi", nhưng mọi thứ gắn bó lâu hơn nhiều so với bạn nghĩ ban đầu).

Tôi sẽ đề nghị bạn bắt đầu vào các thuật toán và cấu trúc dữ liệu, ví dụ như với khóa học này . Sau đó, bạn sẽ có thể suy nghĩ về hiệu suất ở mức độ năng suất cao hơn và có thể theo dõi với các bài viết ví dụ trên Wikipedia.

Sau đó, hãy làm quen với những gì có sẵn trong cốt lõi ngôn ngữ của bạn, ví dụ như đối với C ++ cppreference.com . Tôi cũng rất muốn giới thiệu bạn đọc loạt C ++ hiệu quả của Scott Meyers và Gia tốc C ++ của Koenig & Moe. Ít nhất là đối với C ++, điều này sẽ cung cấp cho bạn một nền tảng vững chắc về mặt ngôn ngữ.

Song song, bạn nên cố gắng làm quen với các công cụ của mình. Không có khả năng là bạn sẽ phát triển mã của mình trong Linux, vì vậy hãy thử tìm hiểu cách nhận thêm chẩn đoán (cảnh báo) từ trình biên dịch của bạn (ít nhất là gcc và clang). Ngoài ra, hãy tìm hiểu về các công cụ phân tích tĩnh như cppcheck hoặc clang 's scan-build . Tìm hiểu cách làm cho các công cụ này trở thành một phần không thể thiếu trong quá trình phát triển của bạn, ví dụ: bằng cách tích hợp chúng vào thiết lập bản dựng của bạn (vâng, bạn nên sử dụng ít nhất GNU make, hoặc thậm chí tốt hơn như GNU autotools / cmake / ...). Bạn cũng nên thêm các công cụ định hình vào bộ công cụ của bạn. Đối với C ++, tôi thực sự khuyên bạn nên tìm hiểu mọi thứ bạn có thể về valgrind có thể cấu hình ở mức rất thấp (nó cũng có thể giúp bạn tìm ra rò rỉ tài nguyên).

Tất cả điều này sẽ giúp bạn tập trung vào những gì bạn quan tâm nhất (nghiên cứu của bạn) thay vì lãng phí thời gian để tìm lỗi hoặc thực hiện tối ưu hóa vô ích. Tất nhiên điều này gần như không thể bán cho một cố vấn, nhưng họ (và bạn) sẽ rất ấn tượng nhưng tốc độ mà bạn có thể nhận được kết quả đáng tin cậy.

Bạn đã đề cập đến C và C ++, nhưng đối với các phép tính số, tôi không thể đề xuất Python với đủ numpy và scipy . Nó cho phép bạn viết bằng một ngôn ngữ khá sạch sẽ ở mức rất cao (thậm chí bạn có thể làm việc tương tác), trong khi vẫn tận dụng các thói quen cực kỳ tối ưu được thực hiện trong C, C ++ và FORTRAN. Ngoài ra, việc giao tiếp mã C hoặc C ++ của riêng bạn với Python gần như không đáng kể.


Cảm ơn các liên kết! Tôi chắc chắn sẽ xem xét nó (nhưng tôi không nghĩ rằng mình có thời gian để đọc một vài cuốn sách - mặc dù tôi đã đọc được C ++ tăng tốc ở trường trung học vào một lúc nào đó). Tôi đang làm việc trong môi trường Unix (Tôi đang sử dụng Vim làm biên tập viên của mình và thích nó), và tôi sử dụng make và Valgrind một cách rộng rãi. Tôi cũng đã kích hoạt tùy chọn -pedantic trong gcc và -Wall vì nó giúp khá nhiều. Có lẽ tôi nên đề cập rằng tôi làm điện toán hiệu năng cao (với thư viện MPI để lập trình song song) trên siêu máy tính của trường đại học.
dùng787267

Tôi cũng nên đề cập đến Python không thực sự là một tùy chọn vì mã của tôi cần phải rất nhanh - mặc dù tôi rất thích nó để vẽ đồ thị chẳng hạn. Tôi đã sử dụng Matlab rất nhiều là tốt.
dùng787267

Tôi thường sử dụng Python làm giao diện người dùng để nói chuyện với các thói quen được thực hiện trong C ++ của riêng tôi. Với Boost, điều này thực sự dễ dàng và bạn có được sự linh hoạt hoàn toàn của Python (ví dụ: để xử lý dữ liệu cho âm mưu). Ngoài ra, Python khá gọn gàng cho việc tạo mẫu. Khi tôi biết điều gì đó rất quan trọng, tôi luôn có thể chuyển nó sang C ++. Vì bạn đề cập đến MPI, tôi khuyên bạn nên dành một buổi tối với IPython để tạo ra một giao diện đẹp cho điện toán phân tán.
Benjamin Bannier

@ user787267 Không còn đúng nữa khi Python hoạt động chậm - hãy xem youtube.com/watch?v=Iw9-GckD-gQ chẳng hạn. Điều quan trọng là bạn có thể sử dụng Python để viết nhanh hơn mã làm việc mà sau đó bạn có thể tăng tốc lên 1) bằng cách sử dụng numpy / scipy 2) bằng Cython hoặc shed leather và 3) chỉ đưa thuật toán lõi vào mô-đun C / C ++ hoặc FORTRAN nếu bạn thực sự cần cải thiện 5% cuối cùng. Cũng cần nhớ rằng, thời gian bạn dành cho mã hóa là thời gian mã không chạy, do đó, đôi khi có thể hiệu quả hơn khi có mã hiệu suất 80% được viết trong một nửa thời gian
Tobias Kienzler

Tôi thường tạo các nguyên mẫu trong Matlab để kiểm tra những thứ dễ dàng, nhưng tôi đã muốn thay đổi thành Python trong một thời gian. Tôi sẽ xem nó. Do phần lớn mã của tôi đã được viết bằng C ++, tuy nhiên tôi không muốn thay đổi ngôn ngữ giữa chừng. Mặc dù đúng là bạn cũng phải xem xét thời gian lập trình thời gian thực tế (và tin tôi đi, tôi làm vậy), tôi không nghĩ đó nên là một cái cớ để không cải thiện kỹ năng lập trình của bạn (dần dần).
dùng787267

4

Làm thế nào để tôi đánh giá nếu công việc của tôi cũng tốt từ quan điểm của một lập trình viên?

  • Nó có đúng không? Liệu nó tạo ra kết quả chính xác trong tất cả các trường hợp?

  • Những người khác có thể đọc và dễ dàng hiểu mã của bạn không?

  • Khi người giám sát của bạn nói "Tuyệt vời, bây giờ làm cho nó cũng làm X ..." bạn có phải viết lại rất nhiều mã không?

  • Khi bạn đã viết một chương trình, nó có trở thành một công cụ mà bạn có thể sử dụng nhiều lần hay là sử dụng nó một lần và vứt nó đi?

Nếu bạn có thể trả lời có, có, không, và 'có, tôi cố gắng tạo ra các công cụ thay vì tính toán một lần', thì bạn đã làm khá tốt rồi. Một phần lớn những gì chúng tôi làm là lập trình viên có nghĩa là để giúp với các loại điều được liệt kê ở trên.


3

Các chương trình của bạn sẽ hoàn toàn khác với mã nguồn thương mại, do đó, nhiều cách tiếp cận và cách tiếp cận tốt sẽ không được áp dụng trong quá trình phát triển mã nguồn hàng ngày của bạn. Nhưng có một cách tốt để tìm hiểu một vài mẹo và thủ thuật.

Hãy để một số nhà phát triển phần mềm tốt xem xét mã của bạn và tối ưu hóa nó cùng nhau. Nó sẽ cung cấp cho bạn nhiều kinh nghiệm hơn và sẽ dạy cho bạn những thực hành tốt. Cũng xem lại mã nguồn được viết bởi người khác. Tìm kiếm các dự án nguồn mở trên sourceforge hoặc github và đọc mã nguồn của chúng.

Nhưng trên hết, hãy suy nghĩ xem bạn có thực sự cần phải học bất cứ điều gì mới để hoàn thành mục tiêu của mình không. Làm những thứ không cần thiết chỉ để làm cho mã trông đẹp hơn sẽ không thêm bất kỳ giá trị nào vào ứng dụng của bạn.


Đọc và tham gia vào các dự án nguồn mở thực sự là một ý tưởng rất tốt - nhưng tôi sẽ phải làm gì đó trong thời gian rảnh rỗi (nhưng vì tôi thích lập trình nên không có quá nhiều vấn đề). Một lý do tôi muốn trở thành một lập trình viên tốt hơn là tôi không chắc mình có ở lại học viện hay không. Khi tiến sĩ của tôi được thực hiện Tôi có thể chỉ cần có một công việc trong ngành - và ở đây một lập trình viên lành nghề nên có nhu cầu cao. Một lý do khác là sự thỏa mãn trí tuệ trong việc tạo ra thứ gì đó thanh lịch / đẹp đẽ - như giải một phương trình vi phân thực sự khó khăn.
dùng787267

Thật không may, ngành công nghiệp đòi hỏi những kỹ năng bạn thường không đạt được trong phát triển học thuật. Những thứ bạn sẽ viết trong các nghiên cứu học thuật của bạn thường ít hơn 5% mã nguồn của ứng dụng thương mại.
Andrzej Bobak

3

Theo như trở thành một lập trình viên giỏi hơn thì không có viên đạn ma thuật nào. Nếu bạn tự học, chìa khóa là sự tự nhận thức, có vẻ như bạn có. Tuy nhiên, học cách viết mã tốt chủ yếu là đọc và thực hành.

Chỉ trích mã của riêng bạn là một trong những cách tốt nhất để cải thiện. Hãy luôn tự hỏi:

  • Điều này sẽ dễ dàng thay đổi?
  • Đây có phải là dễ dàng kiểm tra?
  • Tôi có thể đơn giản hóa điều này? Tôi có thể dễ dàng hiểu điều này khi tôi nhìn thấy nó sau 3 tháng nữa không?

Đề nghị khác của tôi sẽ không tự khóa mình vào C / C ++. Mặc dù đó là những ngôn ngữ tốt được sử dụng vì một lý do, chúng yêu cầu bạn phải làm rất nhiều thứ không liên quan đến chủ đề. Nhìn vào Matlab, tôi sẽ ngạc nhiên nếu trường đại học không có sẵn thứ đó cho bạn. Hãy xem xét một ngôn ngữ kịch bản như Python. Cân nhắc mạnh mẽ chọn một ngôn ngữ chức năng như Haskell - mô hình có tính chất toán học rất cao và có thể sẽ phù hợp với các vấn đề của bạn như găng tay. Tóm lại khám phá một số ngôn ngữ / mô hình khác. Ngay cả khi chúng không trở thành một công cụ vĩnh viễn trong vành đai của bạn, chúng sẽ giúp bạn trở thành một lập trình viên tốt hơn.

Bạn cũng có thể muốn xem xét một số thiết kế thuật toán. Tôi nghi ngờ đã nhận được công việc, bạn đã tương đối khó khăn trong việc này, nhưng thuật toán cực kỳ quan trọng khi thực hiện phân tích số. Trong thực tế, tôi sẽ nghi ngờ, có những tài nguyên đặc biệt hướng đến các thuật toán phân tích số.

Không bao giờ đánh mất mục đích chính của bạn trong việc viết mã. Bạn cần phải hoàn thành công việc. Trở thành một lập trình viên tốt hơn là một phương pháp để làm điều đó. Chọn các công cụ phù hợp cho công việc là một công việc khác.


2

Đầu tiên, "thanh lịch" là một thuật ngữ tương đối. Trừu tượng có vẻ thanh lịch đối với bạn nhưng với một người hâm mộ C khác, nó có vẻ không cần thiết. Dù sao, để trả lời câu hỏi của bạn, bạn nên thử đăng mã của mình để xem xét trên http://codereview.stackexchange.com .
Lạc đề từ quan điểm chính, một số lời khuyên không được yêu cầu dựa trên kinh nghiệm của riêng tôi. Nếu bạn có thể hoàn thành tất cả công việc của mình chỉ bằng C, thì tại sao bạn muốn mã hóa nó theo một cách trừu tượng? Bằng cách này, bạn có muốn cho phép người khác sử dụng lại mã của mình không? Nếu bạn thực sự có một lý do chắc chắn để chuyển sang C ++, hãy tìm hiểu trừu tượng và học các khái niệm C ++ và OO. Nếu không thì bỏ ý tưởng. Theo ý kiến ​​khiêm tốn của tôi, bạn có nên nhắm vào mã của mình dễ đọc hơn và kết quả khoa học của bạn có thể lặp lại hơn là cho nó trừu tượng không? Bản thân tôi đã có nỗi ám ảnh khi học OOPS và viết mã "thanh lịch". Nhưng C ++ sẽ mất thời gian để thành thạo. Bạn sẽ phải học quản lý bộ nhớ vì bộ sưu tập rác không tự động trong C ++. Hãy nghe lời khuyên của tôi vì tôi đã làm việc cho một phòng thí nghiệm nghiên cứu và mất rất nhiều thời gian để học C ++ và OO,


1
Nhưng C thậm chí còn không được quản lý hơn C ++. Trong C ++ có ít nhất RAII.
Benjamin Bannier

Tôi thích viết mã, vì vậy tôi muốn trở thành một lập trình viên tốt hơn. Tôi là nhà vật lý đầu tiên và là lập trình viên thứ hai, nhưng điều đó không có nghĩa là tôi không nên cải thiện kỹ năng lập trình của mình - sau tất cả, nếu tôi quyết định xuất bản mã của mình cùng với kết quả khoa học, sẽ tốt hơn nếu có, mã có thể đọc được.
dùng787267

2

Xem xét đề cập của bạn về việc thiếu thời gian để nghiên cứu lý thuyết.

Nếu bạn đã nhìn lại mã cũ của mình sau một vài tháng và tự hỏi "loại ngốc nào đã viết mã đó", thì bạn đang tiến bộ.

Bạn đã tiến bộ như thế nào? Bằng cách xem mã tốt hơn được viết bởi người khác. Một người không bao giờ biết giá trị của mã 'thanh lịch' hoặc 'tốt' trừ khi họ thấy nó tăng thêm giá trị cho công việc của họ. Thay vì đọc lý thuyết, tôi sẽ khuyến khích bạn để mắt đến mã được viết bởi những người khác trong lĩnh vực công việc của bạn. Hãy để mắt đến các khái niệm đang được thảo luận trên stackoverflow (thẻ C ++). Dành chỉ mười lăm phút mỗi ngày cho việc tìm kiếm như vậy có thể ngẫu nhiên đưa bạn đến các khái niệm có thể giúp bạn. Nó có thể hiển thị cho bạn mã được viết tốt hơn mã của bạn. Đó là khi bạn theo dõi trên Wikipedia và tìm hiểu thêm về nó. Việc học như vậy xuất phát từ sự tò mò, sẽ lâu dài và hữu ích hơn cho bạn so với lý thuyết mà bạn sẽ quên khi thức dậy vào ngày hôm sau.

Cũng xem xét thử các ngôn ngữ như MATLAB hoặc Python.


Tôi dành khá nhiều thời gian cho Stack Exchange - đó là một nguồn tài nguyên vô giá đối với tôi trong công việc hàng ngày. Tôi đã sử dụng Matlab rất nhiều, nhưng rất dễ phát triển các thói quen xấu như không phân bổ trước các mảng vì nó rất dễ tha thứ.
dùng787267

+1 cho python @ user787267 Tôi không thực sự nắm bắt được tại sao không khai thác mảng là một thói quen xấu
Xavier Combelle

2

Là một nhà vật lý tự biến lập trình viên, tôi thấy nền tảng vật lý của mình hữu ích nhất trong việc hình thành các phép ẩn dụ phù hợp để hiểu các khái niệm phần mềm. Quan điểm này cũng làm cho việc học lập trình trở nên thú vị hơn đối với tôi và giúp tôi phát triển ý thức về "sự thanh lịch" trong phần mềm, điều mà bạn dường như đang phấn đấu.

Tôi đã mô tả vai trò quan trọng và được đánh giá thấp của ẩn dụ và tương tự trong phần mềm trong cột CUJ của tôi "Các kiểu suy nghĩ - tên, ẩn dụ, lập trình tốt hơn và chính trị của ngôn ngữ" . Ví dụ, các khái niệm OO về thừa kế giai cấp thường được so sánh với các đặc điểm truyền từ cha mẹ sang con cái trong một gia đình. Đây là một sự tương tự không chính xác. Sự tương đồng chính xác cho sự kế thừa lớp là phân loại sinh học của các sinh vật (ví dụ, một lớp RedRose là một loại Hoa và Hoa là một loại Thực vật).

Hoặc lấy ví dụ về khái niệm phần mềm của một máy trạng thái phân cấp. Một phép ẩn dụ tốt ở đây là khái niệm về một hệ lượng tử ràng buộc như nguyên tử hydro. Khi bạn nhớ lại, các trạng thái của một nguyên tử được đánh số bằng ba số lượng tử | n, l, m>, chính xác bởi vì chúng được "lồng" (phân cấp). Ẩn dụ này chỉ cho bạn cách hiểu rằng các trạng thái làm tổ trong các trạng thái (giống như trạng thái của động lượng góc (l) làm tổ ở trạng thái năng lượng (n)) và bạn cũng thấy ngay rằng trạng thái lồng nhau luôn phản ánh một số đối xứng của hệ.

Một sự tương tự thú vị khác từ vật lý là "mô hình tính toán diễn viên", gần đây đã được phát hiện lại do CPU đa lõi và điện toán phân tán trong "đám mây". Tôi thấy thật hữu ích và thú vị khi nghĩ về các sự kiện được trao đổi bởi các tác nhân trạng thái (còn gọi là các đối tượng hoạt động) dưới dạng các boson ảo, chẳng hạn như photon trong QED hoặc gluon trong QCD. Ẩn dụ này giải thích bản chất không đồng bộ cơ bản của giao tiếp, xử lý sự kiện chạy đến hoàn thành (bước nhảy lượng tử) và đóng gói chặt chẽ các đối tượng hoạt động, chỉ có thể tương tác với nhau thông qua các tạo tác trung gian rõ ràng.

Dù sao, phát triển một phép ẩn dụ hệ thống là một cách thực hành được khuyến nghị trong XP (Lập trình eXtreme), và là một nhà vật lý, bạn sẽ có lợi thế trong việc đưa ra những ẩn dụ tốt. Bạn cũng sẽ có được cảm giác về "sự thanh lịch", bởi vì phần mềm của bạn sẽ kế thừa tính toàn vẹn về mặt khái niệm từ các phép ẩn dụ tốt mà bạn áp dụng.


Mặc dù vật lý có khả năng là một nguồn ẩn dụ phong phú, ý định trong XP là tìm một phép ẩn dụ tạo điều kiện giao tiếp với khách hàng tại chỗ và các thành viên khác trong nhóm, do đó thường có xu hướng chọn các ẩn dụ thường được hiểu hơn.
Pete Kirkham

2

Tôi có thể nói với bạn rằng những lợi ích lớn nhất mà tôi đã đạt được về cách tôi tiếp cận giải quyết vấn đề đều đã đạt được thông qua việc học các ngôn ngữ chức năng và trình phân tích cú pháp. Cả hai khám phá được thực hiện một cách tình cờ. Vì vậy, bây giờ tôi đang nói với bạn nếu bạn thực sự nghiêm túc về việc trở thành một lập trình viên giỏi hơn thì bạn cần tìm hiểu về các kỹ thuật khác nhau liên quan đến việc viết một trình biên dịch, ví dụ như trình phân tích cú pháp và trình phân tích cú pháp, và bạn cần học cách tính toán với thứ tự cao hơn chức năng.

Một tài nguyên tuyệt vời cho trình phân tích cú pháp và trình biên dịch là PL101: Tạo ngôn ngữ lập trình riêng của bạn . Tôi vẫn chưa tìm thấy phần giới thiệu tốt về lập trình chức năng nhưng tôi nghe thấy những điều thực sự hay về SICP .


-5

Một sinh viên tốt nghiệp ngành Khoa học Máy tính không biết cách viết mã tốt khi họ tốt nghiệp; họ không có nhiều nhu cầu khi họ rời trường đại học. Chỉ khi họ có được kinh nghiệm.

Câu trả lời cho câu hỏi của bạn là bạn cần học Mẫu thiết kế. Tôi đã lập trình bằng Java, .NET và bây giờ tôi làm việc như một lập trình viên PHP, Javascript và MySQL. Nhân tiện, .NET có mức độ trừu tượng rất lớn, ví dụ ASP.NET. Nó có nghĩa là bạn có thể bỏ qua việc học trừu tượng. Các ngôn ngữ như Perl, PHP, v.v có mức độ trừu tượng thấp.

Đọc Head First Design Forms, nó là một cuốn sách hay. Nó là một cuốn sách toàn diện. Đó là tất cả những gì bạn sẽ cần.


Tôi có một ý tưởng tại sao câu trả lời này đã bị hạ cấp, nhưng có lẽ nó sẽ hữu ích nếu những người downvoters nói tại sao?
Pierre Arlaud
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.