สอนตัวเองในฐานะนักฟิสิกส์เพื่อเป็นโปรแกรมเมอร์ที่ดีขึ้น [ปิด]


17

ฉันชอบวิชาฟิสิกส์เสมอและฉันชอบเขียนโปรแกรมเสมอดังนั้นเมื่อฉันได้รับข้อเสนอสำหรับตำแหน่งปริญญาเอกที่ทำวิชาฟิสิกส์เชิงตัวเลข (รายละเอียดไม่เกี่ยวข้องกันมันเป็นโปรแกรมแบบขนานส่วนใหญ่สำหรับกลุ่ม) ที่มหาวิทยาลัย - เครื่องกรองน้ำสำหรับฉัน

อย่างไรก็ตามในฐานะนักฟิสิกส์ส่วนใหญ่ฉันสอนตัวเอง ฉันไม่มีความรู้พื้นฐานในวงกว้างเกี่ยวกับวิธีการโค้ดในลักษณะเชิงวัตถุหรือชื่อของอัลกอริทึมเฉพาะที่ปรับการค้นหาในต้นไม้ kD บางส่วน

เนื่องจากงานทั้งหมดของฉันมีความกังวลเกี่ยวกับฟิสิกส์และผลลัพธ์ทางวิทยาศาสตร์มากขึ้นฉันจึงมีนิสัยที่ไม่ดีอย่างไม่ต้องสงสัยเลยยิ่งไปกว่านั้นเพราะการเข้ารหัสของฉันเป็นของตัวเองและไม่ได้ทำงานเป็นทีมจริงๆ ฉันใช้ C เป็นส่วนใหญ่เนื่องจากมันตรงไปตรงมามากและ "สิ่งที่คุณเขียนคือสิ่งที่คุณได้รับ" - ไม่จำเป็นต้องมี abstractions แฟนซี อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันได้เปลี่ยนไปใช้ C ++ เนื่องจากฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับพลังที่มาพร้อมกับสิ่งที่เป็นนามธรรม

ฉันจะสอนตัวเองให้เขียนโค้ดด้วยวิธีที่ดีและเป็นนามธรรมได้อย่างไรเช่นผู้สำเร็จการศึกษาสาขาวิทยาศาสตร์คอมพิวเตอร์

ฉันรู้ว่าโค้ดของฉันมีประสิทธิภาพ แต่ฉันต้องการให้มันดูดีและอ่านง่าย โปรดจำไว้ว่าฉันไม่มีเวลาอ่านโทมัสจำนวน 1,000 หน้าเกี่ยวกับการเขียนโปรแกรมแบบนามธรรม ฉันต้องใช้เวลาในการวิจัยฟิสิกส์จริง (หัวหน้างานของฉันจะหัวเราะเยาะฉันถ้าเขารู้ว่าฉันใช้เวลาคิดเกี่ยวกับวิธีการโปรแกรมอย่างหรูหรา) ฉันจะประเมินได้อย่างไรว่างานของฉันดีจากมุมมองของโปรแกรมเมอร์หรือไม่


12
คำถาม: คุณรู้ได้อย่างไรว่ารหัสของคุณมีประสิทธิภาพ
Matsemann

ฉันได้เห็นผู้คนมากมายบอกว่าไม่ให้ C ++ เป็นภาษา OO แรก ฉันกำลังเรียนรู้จาวาและฉันพบบทเรียนวิดีโอของ Mark Dexter ที่นี่eclipsetutorial.sourceforge.net/totalbeginner.htmlพวกเขาค่อนข้างดีและจะสอนคุณด้วยวิธี TDD ตรวจสอบ Head First Java มันค่อนข้างดีในการปกปิด Java ในแบบ OO
Garv

4
@DeveloperDon การคำนวณเป็นส่วนสำคัญของฟิสิกส์ก่อนที่จะมีคอมพิวเตอร์อิเล็กทรอนิกส์ การคำนวณทำด้วยมือหรือบนเครื่องคิดเลขเชิงกล นับตั้งแต่นักฟิสิกส์สงครามโลกครั้งที่สองมีส่วนเกี่ยวข้องอย่างลึกซึ้งในซอฟต์แวร์ หากคุณกำลังคำนวณการกลับมาของดาวหาง, การจำลองการผลิตของนิวตรอนในปฏิกิริยาลูกโซ่นิวเคลียร์หรือการวิเคราะห์กิกะไบต์ของข้อมูลกำลังมองหาสัญญาณของ Higgs Boson คุณต้องทำมากของจำนวนกระทืบ ย้อนกลับไปในปี 1974 ครึ่งแรกของห้องแล็บฟิสิกส์ปีแรกของฉันทุ่มเทให้กับการสอนฟอร์แทรน
Charles E. Grant

1
@DeveloperDon เมื่อนักฟิสิกส์ที่ CERN ได้รับข้อมูลพวกเขาจะได้รับข้อมูลจากการชนกันของอนุภาคนับล้าน คุณต้องใช้คอมพิวเตอร์เพื่อจัดการข้อมูลจำนวนนี้ นอกจากนี้ให้พิจารณาพื้นที่เช่นฟิสิกส์สถานะของแข็งซึ่งคุณพยายามที่จะเข้าใจคุณสมบัติของโมเลกุลด้วยวัสดุจากการโต้ตอบด้วยกล้องจุลทรรศน์ของอะตอม ในระบบดังกล่าวอิเล็กตรอนเดี่ยวรู้สึกถึงแรงผลักดัน / แรงดึงดูดจากพันล้านนิวเคลียสและอิเล็กตรอน - และเพื่ออธิบายระบบดังกล่าวอย่างแม่นยำคุณต้องใช้คอมพิวเตอร์ที่รวดเร็วและอัลกอริธึมที่มีประสิทธิภาพ (และการประมาณที่ดีกับสมการพื้นฐาน)
user787267

1
บางทีคุณควรเปลี่ยนภาษาจาก C / C ++ เป็น Python เพื่อให้คุณมีเวลามากขึ้น? งูใหญ่มักจะถูกนำมาใช้โดยนักวิทยาศาสตร์ที่มีโมดูลเช่นNumPy - แพคเกจสำหรับการคำนวณทางวิทยาศาสตร์กับงูหลามหรือSciPy หากคุณต้องการความเร็วของ C / C ++ ใน Python จากนั้นใช้Cythonจะช่วยให้คุณใช้ C / C ++ ประเภทและโครงสร้างเพื่อให้คุณได้รับความเร็วคล้ายกับ C / C ++ นอกจากนี้ยังง่ายต่อการรวมเข้ากับไลบรารี C / C ++ ที่มีอยู่โดยใช้ Cython
Czarek Tomczak

คำตอบ:


20

โปรดจำไว้ว่าฉันไม่มีเวลาอ่านโทมัส 1,000 หน้าหลายหน้าเกี่ยวกับการเขียนโปรแกรมเชิงนามธรรม

ดังนั้นคุณจะขอให้ใครบางคนให้รายการตรวจสอบห้าขั้นตอนที่จะทำให้คุณเป็นโปรแกรมเมอร์ที่มีทักษะหรือไม่ นั่นจะไม่เกิดขึ้น !

เช่นเดียวกับสาขาอื่น ๆ หากคุณต้องการเขียนโปรแกรมให้ดีคุณต้องใช้เวลาและความพยายามฝึกฝนและเรียนรู้ คุณเรียนรู้ที่จะเขียนโค้ดที่ชัดเจนและสง่างามโดยการเขียนโค้ดจำนวนมากและอ่านรหัสของผู้อื่นอย่างระมัดระวัง บางส่วนของหน้า 1,000 หน้าจะช่วยให้คุณประหยัดเวลาโดยสรุปบทเรียนยาก ๆ ที่คนอื่น ๆ ได้เรียนรู้ เป็นเรื่องผิดเพี้ยนที่จะคิดว่าคุณสามารถเป็นโปรแกรมเมอร์ที่มีทักษะในฐานะที่เป็นผลข้างเคียงที่ไม่เจ็บปวดจากการได้รับปริญญาเอกทางฟิสิกส์ ด้วยทักษะการเขียนโปรแกรมที่บ้าคลั่งเพียงว่ามันจะเสียเวลาและปัญหาของคุณ

Code Completeเป็นการแนะนำที่ดีเกี่ยวกับกลไกการพัฒนาซอฟต์แวร์รวมถึงคำแนะนำเกี่ยวกับวิธีการเขียนและโครงสร้างรหัสที่ชัดเจนและบำรุงรักษาได้ ใช่มันเป็นหนังสือเล่มใหญ่ แต่ก็ไม่หนาแน่นอย่างที่พูด "หลักการของกลไกควอนตัม" ของ Dirac หรือ "Gravitation" ของ MTWการกรอกโค้ดนั้นใกล้เคียงกับที่คุณกำลังจะไปถึงรายการตรวจสอบห้าขั้นตอนเพื่อเขียนซอฟต์แวร์ที่ดีขึ้น

Matlab, VIM, C, MPI และ Valgrind เป็นเครื่องมือที่ยอดเยี่ยมที่จะรู้ คุณไม่ได้พูดถึงการใช้ระบบควบคุมเวอร์ชัน ถ้าคุณบังเอิญยังไม่ได้ใช้ระบบควบคุมเวอร์ชันคุณต้องเริ่มใช้งานทันที การควบคุมเวอร์ชันยังเป็นสิ่งที่พระเจ้าส่งมาเพื่อเขียนวิทยานิพนธ์ของคุณ เครื่องมือพื้นฐานอื่น ๆ ที่คุณควรรู้คือตัวดีบั๊กตัวสร้างการเรียกใช้งานเฟรมเวิร์กการบันทึกและกรอบการทดสอบหน่วย คุณไม่ต้องอ่านหนังสือ 1,000 เล่มสำหรับหนังสือเหล่านี้ ทำงานผ่านบทช่วยสอนออนไลน์เพื่อรับข้อมูลพื้นฐานแล้วเริ่มทำงานกับพวกเขา เจาะลึกลงไปในเอกสารมากขึ้นเมื่อความต้องการของคุณซับซ้อนมากขึ้น

การให้คำแนะนำคุณเกี่ยวกับการเรียนรู้พื้นฐานวิทยาศาสตร์คอมพิวเตอร์ (เมื่อเทียบกับพื้นฐานการก่อสร้างซอฟต์แวร์) นั้นยากกว่า คุณไม่ได้ระบุปัญหาที่คุณกำลังทำงานไม่ว่าคุณจะพัฒนาอัลกอริทึมใหม่หรือใช้อัลกอริทึมที่มีอยู่ การสำรวจโครงสร้างข้อมูลพื้นฐานและอัลกอริธึมมาตรฐานอาจขึ้นอยู่กับปัญหาการวิจัยของคุณ ปัญหาอื่น ๆ จะได้รับประโยชน์เพิ่มเติมจากพื้นหลังที่มั่นคงในการวิเคราะห์เชิงตัวเลข หากคุณต้องการที่จะเรียนรู้พื้นฐานของการวิเคราะห์อัลกอริทึมมีข้อความที่ดีหลายอย่าง อัลกอริทึมการออกแบบด้วยตนเองและรู้เบื้องต้นเกี่ยวกับอัลกอริทึมในฤดูใบไม้ผลิในใจ นอกจากนี้ยังมีคู่ของหลักสูตรเบื้องต้นที่ดีพร้อมใช้งานออนไลน์ขณะนี้: การออกแบบและวิเคราะห์ขั้นตอนวิธีการและขั้นตอนวิธี


ขอบคุณสำหรับลิงค์ฉันจะดูมัน ฉันรู้ว่าฉันจะไม่กลายเป็นกูรูเข้ารหัสในช่วงสุดสัปดาห์ แต่ฉันคาดว่าจะค่อยๆดีขึ้นตามเวลา - โดยเฉพาะอย่างยิ่งถ้าฉันแสวงหาแรงบันดาลใจนอกวิชาฟิสิกส์ (เนื่องจากนักฟิสิกส์จำนวนมากที่ฉันรู้จัก
user787267

1
ฉันจะเพิ่มหลามในเครื่องมือตามจำนวนที่อ่านได้
Xavier Combelle

2
+1 สำหรับการแนะนำรหัสเสร็จสมบูรณ์ มันเป็นสิ่งที่ดีที่สุดที่ผู้ใช้งานสามารถอ่านเพื่อแก้ไขปัญหาที่เกิดขึ้นได้
JW01

9

พื้นหลังของฉันคล้ายกับของคุณเล็กน้อย - ฉันเป็นบัณฑิตฟิสิกส์ที่สอนการเขียนโปรแกรมด้วยตนเอง หลังจากที่ฉันเรียนจบฉันก็มีงานด้านไอทีไม่กี่งานและท้ายที่สุดก็กลายเป็นวิศวกรซอฟต์แวร์ รวมถึงเวลาในการทำงานกับ OpenGDA (ซอฟต์แวร์ที่ใช้ในการรันการทดสอบที่ไซต์ซินโครตรอนต่างๆ)

สิ่งสำคัญที่ฉันได้เรียนรู้เกี่ยวกับคำถามที่คุณมีในขณะที่ฉันมาที่นี่คือการได้รับทักษะเหล่านี้จากคนอื่นง่ายกว่าการพยายามหยิบมันมาเอง ผู้ให้คำปรึกษาที่มีประสบการณ์สามารถช่วยคุณระบุตำแหน่งที่รหัสของคุณอ่อนแอหรือรูปแบบและวิธีปฏิบัติทั่วไปสามารถช่วยคุณได้ ในขณะที่ฉันเรียนรู้วิธีการเขียน C และ Objective-C ด้วยตัวเองฉันไม่ทราบว่าสิ่งที่ฉันไม่รู้ (ถ้าคุณเห็นสิ่งที่ฉันหมายถึง) จนกว่าฉันจะทำงานกับคนอื่นในรหัสเดียวกัน ความจริงที่คุณขอจากที่นี่หมายถึงว่าคุณทำได้ดีกว่าที่ฉันทำไปแล้ว :-)

ตอนนี้คุณจะพบวิศวกรซอฟต์แวร์มืออาชีพที่เชื่องได้ที่ไหน ฉันเพิ่งเข้าร่วมMentorNetซึ่งเป็นระบบที่คู่ค้าที่มีประสบการณ์ด้านโปรแกรมเมอร์ด้วยprotégés

แต่คุณไม่ต้องไปหาระบบที่เป็นทางการแบบนั้น การหากลุ่มพบปะโปรแกรมเมอร์ท้องถิ่น (หรือที่แผนกวิศวกรรมซอฟต์แวร์ของมหาวิทยาลัยของคุณไปทำงานหลังวันศุกร์) เป็นจุดเริ่มต้นที่ดี


MentorNet ดูน่าสนใจมาก - ฉันจะดูมัน มันเป็นการยากที่จะเปลี่ยนจากนักฟิสิกส์มาเป็นวิศวกรซอฟต์แวร์?
user787267

@ user787267 เนื่องจากฉันสนใจการเขียนโปรแกรม (และเป็นโปรแกรมเมอร์มือสมัครเล่นอยู่แล้ว) ฉันจึงมีแรงบันดาลใจในการเปลี่ยนแปลงเนื่องจากดูเหมือนว่าคุณเป็นดังนั้นฉันจึงไม่พบด้านเทคนิคยาก สิ่งที่ฉันต้องใช้เวลาในการติดต่อกับอีกต่อไปคือการทำความสะอาดสถานที่ของฉันในทีมโปรเจ็กต์ที่ใหญ่กว่าและผู้ที่มีความเชี่ยวชาญในการเปลี่ยนแปลงครั้งใหญ่จาก "lone wolf" ที่ฉันทำก่อนหน้านี้

5

ไม่มี Royal Road สำหรับซอฟต์แวร์

ในสมัยโบราณ Euclid ถูกถามคำถามเช่นคุณโดย King Ptolemy นักเรียนของเขา คำตอบของเขา: "ไม่มีถนนหลวงสู่เรขาคณิต"

คุณพูดถึงว่าหัวหน้างานของคุณจะหัวเราะถ้าเขารู้ว่าคุณใช้เวลานานแค่ไหนในการพยายามเขียนโค้ดเหมือนนักพัฒนามืออาชีพ คนอื่น ๆ ตอบคำถามของคุณพร้อมรายการสิ่งที่ต้องเรียนรู้ตั้งแต่การควบคุมแหล่งข้อมูลไปจนถึงการออกแบบและการวิเคราะห์อัลกอริทึม

พวกเขาขาดเป้าหมายของคุณ:

"ฉันต้องใช้เวลากับฟิสิกส์จริง ๆ "

นักเปียโนคอนเสิร์ตหรือ One Man Band?

โลกเคลื่อนไหวเร็วเกินไปที่ผู้คนจะตะลุย หากคุณต้องการเป็นนักเปียโนคอนเสิร์ตอย่าแบ่งเวลาการเรียนรู้ของคุณเป็นวงดนตรีชายคนหนึ่ง

แนวคิดของฉันสำหรับบทบาทของปริญญาเอกในสาขาฟิสิกส์ในโครงการขนาดกลางถึงขนาดใหญ่คือในฐานะผู้นำความคิดสำหรับคำจำกัดความของระบบผู้เชี่ยวชาญในทางทฤษฎีผู้เชี่ยวชาญเรื่องระหว่างการสร้างกรณีการใช้งานและผู้ใช้ / ผู้ตัดสินสำหรับผลลัพธ์ที่สร้างขึ้นโดยซอฟต์แวร์ ทำงานอย่างใกล้ชิดกับวิศวกรซอฟต์แวร์ที่ดีที่สุดที่คุณสามารถทำได้

ฉันจะประเมินได้อย่างไรว่างานของฉันดีจากมุมมองของโปรแกรมเมอร์หรือไม่

หากคุณต้องการตั้งค่าแถบสูงเริ่มที่นี่:

สถาปัตยกรรมซอฟต์แวร์ในทางปฏิบัติ Len Bass, Paul Clements, Rick Kazman

มองหาบท "ทำความเข้าใจคุณสมบัติคุณภาพ" นอกเหนือจากรหัสแล้วยังพิจารณาถึงความสามารถในการใช้งานการปรับเปลี่ยนประสิทธิภาพความปลอดภัยความพร้อมใช้งานความน่าเชื่อถือการทดสอบความสามารถในการดูแลรักษาและความสะดวกในการพกพา (ไม่สามารถพกพาได้ แต่คุณสามารถออกแบบพอร์ตจากแพลตฟอร์มหนึ่ง ทุกคนต้องการเป้าหมายที่วัดได้โดยเฉพาะ การอ้างอิงที่คล้ายกันรวมถึง:

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

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

เป้าหมายของคุณกับ C และ C ++

เช่นเดียวกับ FORTRAN ภาษาเหล่านี้ยากและเก่า ตัวชี้วัดในเชิงบวกสำหรับ C / C ++ รวมถึง:

  • แอพพลิเคชั่นกับฮาร์ดแวร์ระบบฝังตัว
  • โครงการที่มีอยู่ที่คุณต้องการเป็นจุดเริ่มต้น

มีคนจำนวนมากที่ทำการพัฒนาเว็บไซต์การสร้างภาพข้อมูลและข้อมูลขนาดใหญ่ หลายคนมีแรงจูงใจที่จะค้นหาหรือสร้างภาษาอื่น ๆ ตัวอย่างเช่นนักฟิสิกส์ Sir Tim Berners-Lee ประสบความสำเร็จในการใช้ HTML (แต่ไม่ค่อยมีความรู้เรื่องฟิสิกส์) ประเมินเป้าหมายของคุณเทียบกับภาษาการเขียนโปรแกรมของคุณ

พิจารณาใช้ Matlab

Matlab มีฐานการติดตั้งที่ยอดเยี่ยมเป็นพิเศษสำหรับคณิตศาสตร์และวิทยาศาสตร์ มันมีเครื่องมือสำหรับการแสดงข้อมูล ช่วยให้นักวิทยาศาสตร์และนักคณิตศาสตร์สามารถแสดงปัญหาในโดเมนปัญหามากกว่าโดเมนวิธีแก้ปัญหา Matlab สร้างกล่องเครื่องมือการคำนวณแบบขนานและผลิตภัณฑ์เซิร์ฟเวอร์การคำนวณแบบกระจาย

ฉันคาดว่าความสำเร็จของ Matlab เกิดจากการใช้ทีมสหสาขาวิชาชีพกับผู้ที่มีความเชี่ยวชาญด้านฟิสิกส์คณิตศาสตร์อิเล็กทรอนิกส์และเครื่องมือระบบปฏิบัติการภาษาการเขียนโปรแกรมการพัฒนาซอฟต์แวร์การทดสอบซอฟต์แวร์สถาปัตยกรรมซอฟต์แวร์และการออกแบบ การเปรียบเทียบอาจจะยืดออกไป แต่ทำไมคุณต้องออกไปยืนอยู่คนเดียวเริ่มด้วยค้อนสิ่วและตะไบเพื่อสร้างบางอย่างเมื่อคุณมีเครื่องพิมพ์ 3D นิวตันอาจถามว่าทำไมไม่ยืนบนบ่าใครบางคน


4

คุณจะสามารถไปไกลในสาขาฟิสิกส์โดยไม่ต้องรู้อะไรเกี่ยวกับสไตล์ "มืออาชีพ" (พูดจากประสบการณ์) แต่ฉันได้เห็นคนจำนวนมากเสียเวลาไม่รู้จบเพราะพวกเขาสูญเสียการติดตามสิ่งที่พวกเขาทำหรือหลังจากที่เติบโตรหัสของพวกเขาไปสองสามปีที่เพิ่งสูญเสียความซับซ้อน (แม้ในสถาบันการศึกษาไม่มีรหัส "ทิ้ง") ติดนานกว่าที่คุณคิดในตอนแรก)

ฉันขอแนะนำให้คุณเริ่มต้นขั้นตอนวิธีและโครงสร้างข้อมูลเช่นกับหลักสูตรนี้ หลังจากนั้นคุณจะสามารถคิดเกี่ยวกับประสิทธิภาพในระดับที่มีประสิทธิผลมากขึ้นและสามารถติดตามด้วยบทความเช่นใน Wikipedia

หลังจากที่ได้รับที่ใช้ในสิ่งที่มีอยู่ในหลักของภาษาของคุณเช่นสำหรับ C ++ cppreference.com ฉันขอแนะนำให้คุณอ่านซีรี่ส์C ++ ที่มีประสิทธิภาพโดย Scott Meyers และAccelerated C ++โดย Koenig & Moe อย่างน้อยสำหรับ C ++ สิ่งนี้จะทำให้คุณมีพื้นฐานที่มั่นคงในด้านภาษา

ในแบบคู่ขนานคุณควรพยายามทำความรู้จักกับเครื่องมือของคุณให้ดี ไม่น่าเป็นไปได้ที่คุณจะพัฒนารหัสของคุณภายใต้ Linux ดังนั้นลองเรียนรู้วิธีรับการวินิจฉัยเพิ่มเติม (คำเตือน) จากคอมไพเลอร์ของคุณ (อย่างน้อย gcc และ clang) ยังได้เรียนรู้เกี่ยวกับเครื่องมือการวิเคราะห์แบบคงเหมือนcppcheckหรือเสียงดังกราวสแกนสร้าง เรียนรู้วิธีทำให้เครื่องมือเหล่านี้เป็นส่วนหนึ่งของกระบวนการพัฒนาของคุณเช่นโดยการรวมไว้ในการตั้งค่าการสร้าง (ใช่คุณควรใช้อย่างน้อย GNU ทำหรืออย่างดีกว่าเช่น GNU autotools / cmake / ... ) คุณควรเพิ่มเครื่องมือการทำโปรไฟล์ให้กับชุดเครื่องมือของคุณ สำหรับ C ++ ฉันขอแนะนำให้คุณเรียนรู้ทุกสิ่งที่คุณสามารถทำได้เกี่ยวกับ valgrind ซึ่งสามารถโพรไฟล์ในระดับต่ำมาก (มันสามารถช่วยคุณค้นหาการรั่วไหลของทรัพยากร)

ทั้งหมดนี้จะช่วยให้คุณมุ่งเน้นไปที่สิ่งที่คุณใส่ใจมากที่สุด (การวิจัยของคุณ) แทนที่จะเสียเวลาในการค้นหาข้อบกพร่องหรือทำการปรับแต่งที่ไร้ประโยชน์ แน่นอนว่านี่เป็นไปไม่ได้ที่จะขายให้กับที่ปรึกษา แต่พวกเขา (และคุณ) จะประทับใจ แต่ความเร็วที่คุณสามารถได้รับผลลัพธ์ที่น่าเชื่อถือ

คุณพูดถึง C และ C ++ แต่สำหรับการคำนวณเชิงตัวเลขฉันไม่สามารถแนะนำ Python ที่มีจำนวนมากและมีจำนวนมากพอ ช่วยให้คุณสามารถเขียนภาษาสะอาดตาสะอาดในระดับสูงมาก (คุณสามารถทำงานได้แบบโต้ตอบ) ในขณะที่ยังคงได้รับประโยชน์จากรูทีนที่ปรับให้เหมาะสมที่สุดที่ใช้ใน C, C ++ และ FORTRAN นอกจากนี้การเชื่อมต่อโค้ด C หรือ C ++ ของคุณเองกับ Python นั้นแทบจะไม่สำคัญเลย


ขอบคุณสำหรับลิงค์! ฉันจะดูมันอย่างแน่นอน (แต่ฉันไม่คิดว่าฉันมีเวลาอ่านหนังสือหลายเล่ม - แม้ว่าฉันจะได้อ่าน C ++ ที่เร่งกลับไปในโรงเรียนมัธยมในบางจุด) ฉันทำงานในสภาพแวดล้อม Unix (ฉันใช้ Vim เป็นตัวแก้ไขและชื่นชอบ) และฉันใช้ make และ Valgrind อย่างกว้างขวาง ฉันได้เรียกใช้ตัวเลือก -pedantic ใน gcc และ -Wall เพราะมันช่วยได้ไม่มาก บางทีฉันควรจะกล่าวว่าฉันใช้คอมพิวเตอร์ประสิทธิภาพสูง (กับห้องสมุด MPI สำหรับการเขียนโปรแกรมแบบขนาน) ในซูเปอร์คอมพิวเตอร์ของมหาวิทยาลัย
user787267

ฉันควรพูดถึง Python ไม่ใช่ตัวเลือกเนื่องจากรหัสของฉันต้องเร็วมาก - แม้ว่าฉันจะชอบมันสำหรับการพล็อตเช่น ฉันเคยใช้ Matlab มาแล้วเช่นกัน
user787267

ฉันมักจะใช้ Python เป็นส่วนหน้าในการพูดคุยกับกิจวัตรที่ใช้ใน C ++ ของฉันเอง ด้วย Boost สิ่งนี้ง่ายมากและคุณจะได้รับความยืดหยุ่นอย่างเต็มที่ของ Python (เช่นสำหรับการประมวลผลข้อมูลสำหรับการลงจุด) นอกจากนี้ Python ค่อนข้างเรียบร้อยสำหรับการสร้างต้นแบบ เมื่อฉันรู้ว่าบางสิ่งบางอย่างมีความสำคัญฉันสามารถย้ายไปที่ C ++ ได้ตลอดเวลา เนื่องจากคุณพูดถึง MPI ฉันขอแนะนำให้คุณใช้เวลาช่วงเย็นกับ IPython ด้วยทำให้เป็นอินเทอร์เฟซที่ดีสำหรับการคำนวณแบบกระจาย
Benjamin Bannier

@ user787267 ไม่จำเป็นต้องเป็นความจริงอีกต่อไปว่า Python ทำงานช้า - ดูที่youtube.com/watch?v=Iw9-GckD-gQเป็นต้น กุญแจสำคัญคือคุณสามารถใช้ Python เพื่อเขียนโค้ดที่ใช้งานได้เร็วขึ้นซึ่งคุณสามารถเพิ่มความเร็วได้ 1) ใช้ numpy / scipy 2) ใช้ Cython หรือ shedskin และ 3) ใส่อัลกอริธึมหลักในโมดูล C / C ++ หรือ FORTRAN เท่านั้น คุณต้องการการปรับปรุง 5% สุดท้าย โปรดจำไว้ว่าเวลาที่คุณใช้ในการเขียนรหัสคือเวลาที่รหัสไม่ทำงานดังนั้นบางครั้งอาจมีประสิทธิภาพมากกว่าที่จะเขียนโค้ดประสิทธิภาพ 80% ในครึ่งเวลา
Tobias Kienzler

โดยทั่วไปฉันสร้างต้นแบบใน Matlab เพื่อทดสอบสิ่งง่าย ๆ แต่ฉันต้องการเปลี่ยนเป็น Python สักพัก ฉันจะดูมัน เนื่องจากส่วนใหญ่ของรหัสของฉันเขียนแล้วใน C ++ ฉันไม่ต้องการเปลี่ยนภาษาไปครึ่งทาง ในขณะที่มันเป็นความจริงคุณยังต้องพิจารณาเวลาการเขียนโปรแกรมตามเวลาจริง (และเชื่อฉันฉัน) ฉันไม่คิดว่าควรจะเป็นข้อแก้ตัวที่จะไม่พัฒนาทักษะการเขียนโปรแกรมของคุณ (ค่อยๆ)
user787267

4

ฉันจะประเมินได้อย่างไรว่างานของฉันดีจากมุมมองของโปรแกรมเมอร์หรือไม่

  • ถูกต้องหรือไม่ มันให้ผลลัพธ์ที่ถูกต้องในทุกกรณีหรือไม่?

  • คนอื่นสามารถอ่านและเข้าใจรหัสของคุณได้ง่ายหรือไม่?

  • เมื่อหัวหน้างานของคุณบอกว่า "เยี่ยมมากตอนนี้ทำให้ X ... " เหมือนกันคุณต้องเขียนรหัสใหม่อีกครั้งหรือไม่?

  • เมื่อคุณเขียนโปรแกรมมันจะกลายเป็นเครื่องมือที่คุณสามารถใช้ซ้ำแล้วซ้ำอีกหรือเป็นโปรแกรมที่ใช้ครั้งเดียวแล้วทิ้งมันไปเลย?

หากคุณสามารถตอบได้ใช่ใช่ไม่ใช่และ 'ใช่ฉันพยายามสร้างเครื่องมือมากกว่าการคำนวณแบบครั้งเดียว' แสดงว่าคุณทำได้ค่อนข้างดีอยู่แล้ว ข้อตกลงที่ดีของสิ่งที่เราทำในฐานะโปรแกรมเมอร์นั้นมีไว้เพื่อช่วยในสิ่งต่าง ๆ ที่กล่าวมาข้างต้น


3

โปรแกรมของคุณจะแตกต่างจากซอร์สโค้ดเชิงพาณิชย์อย่างสมบูรณ์ดังนั้นแนวทางปฏิบัติที่ดีและวิธีการมากมายจะไม่นำไปใช้ในการพัฒนาซอร์สโค้ดแบบวันต่อวันของคุณ แต่มีวิธีที่ดีในการเรียนรู้เคล็ดลับและลูกเล่นบางอย่าง

ให้นักพัฒนาซอฟต์แวร์ที่ดีบางคนตรวจสอบรหัสของคุณและปรับให้เหมาะสมด้วยกัน มันจะให้ประสบการณ์มากขึ้นและจะสอนวิธีปฏิบัติที่ดีให้กับคุณ ตรวจสอบซอร์สโค้ดที่เขียนโดยบุคคลอื่นด้วย ค้นหาโครงการโอเพ่นซอร์สบน sourceforge หรือ GitHub และอ่านซอร์สโค้ดของมัน

แต่ที่สำคัญที่สุดคิดว่าคุณจำเป็นต้องเรียนรู้สิ่งใหม่ ๆ เพื่อให้บรรลุเป้าหมายหรือไม่ การทำสิ่งที่ไม่จำเป็นเพียงเพื่อทำให้โค้ดดูน่ารักขึ้นจะไม่เพิ่มคุณค่าให้กับแอปพลิเคชันของคุณ


การอ่านและการมีส่วนร่วมในโครงการโอเพ่นซอร์สเป็นความคิดที่ดีจริงๆ - แต่สิ่งที่ฉันต้องทำในเวลาว่าง (แต่เนื่องจากฉันชอบการเขียนโปรแกรมที่ไม่ควรมีปัญหามากเกินไป) เหตุผลหนึ่งที่ฉันต้องการเป็นโปรแกรมเมอร์ที่ดีกว่าคือฉันไม่แน่ใจว่าจะอยู่ในสถาบันการศึกษาหรือไม่ เมื่อปริญญาเอกของฉัน เสร็จแล้วฉันอาจจะได้งานในอุตสาหกรรมและที่นี่โปรแกรมเมอร์ที่มีทักษะควรเป็นที่ต้องการสูง อีกเหตุผลหนึ่งคือความพึงพอใจทางปัญญาของการสร้างสิ่งที่สวยงาม / สวยงาม - เหมือนการแก้สมการเชิงอนุพันธ์ที่ยากมาก
user787267

น่าเสียดายที่อุตสาหกรรมต้องการทักษะที่คุณไม่ได้รับจากการพัฒนาด้านวิชาการ สิ่งที่คุณจะเขียนในระหว่างการวิจัยเชิงวิชาการของคุณมักจะน้อยกว่า 5% ของซอร์สโค้ดของโปรแกรมเชิงพาณิชย์
Andrzej Bobak

3

เท่าที่เป็นโปรแกรมเมอร์ที่ดีขึ้นเป็นห่วงไม่มี bullet มายากล หากคุณเรียนรู้ด้วยตนเองกุญแจสำคัญคือการตระหนักในตนเองซึ่งดูเหมือนว่าคุณมี อย่างไรก็ตามการเรียนรู้การเขียนโค๊ดส่วนใหญ่นั้นมาจากการอ่านและการฝึกฝน

การวิจารณ์โค้ดของคุณเองเป็นวิธีที่ดีที่สุดในการทำให้ดีขึ้น ถามตัวเองเสมอว่า:

  • สิ่งนี้จะเปลี่ยนแปลงได้ง่ายหรือไม่?
  • มันทดสอบได้อย่างง่ายดายหรือไม่
  • ฉันจะทำให้มันง่ายขึ้นได้ไหม? ฉันสามารถเข้าใจสิ่งนี้ได้อย่างง่ายดายเมื่อฉันเห็นมันอีกครั้งใน 3 เดือนหรือไม่?

ข้อเสนอแนะอื่น ๆ ของฉันจะไม่ล็อคตัวเองใน C / C ++ ในขณะที่เหล่านั้นเป็นภาษาที่ดีที่ใช้สำหรับเหตุผลพวกเขาต้องการให้คุณทำสิ่งต่าง ๆ มากมายที่ไม่เกี่ยวข้องกับเรื่อง มองไปที่ Matlab ฉันจะแปลกใจถ้ามหาวิทยาลัยไม่มีที่ให้คุณ พิจารณาภาษาสคริปต์เช่น Python พิจารณายกภาษาที่ใช้งานได้ดีอย่าง Haskell - กระบวนทัศน์เป็นคณิตศาสตร์ในธรรมชาติและน่าจะเหมาะกับปัญหาของคุณเช่นถุงมือ ในระยะสั้นสำรวจภาษา / กระบวนทัศน์อื่น ๆ แม้ว่าพวกเขาจะไม่กลายเป็นเครื่องมือถาวรในสายพานของคุณพวกเขาจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น

คุณอาจต้องการพิจารณาการออกแบบอัลกอริธึม ฉันคิดว่าคุณจะได้งานคุณค่อนข้างจะรับมือกับเรื่องนี้แล้ว แต่อัลกอริธึมมีความสำคัญอย่างเหลือเชื่อเมื่อทำการวิเคราะห์เชิงตัวเลข ในความเป็นจริงฉันสงสัยว่ามีทรัพยากรที่มุ่งเน้นไปที่ขั้นตอนวิธีการวิเคราะห์เชิงตัวเลขโดยเฉพาะ

อย่าลืมวัตถุประสงค์หลักของคุณในการเขียนรหัส คุณต้องทำให้เสร็จ การเป็นโปรแกรมเมอร์ที่ดีขึ้นเป็นวิธีหนึ่งในการทำเช่นนั้น การเลือกเครื่องมือที่เหมาะสมสำหรับงานนั้นเป็นอีกเรื่องหนึ่ง


2

ครั้งแรก "สง่างาม" เป็นคำที่เกี่ยวข้อง สิ่งที่เป็นนามธรรมอาจดูสง่างามสำหรับคุณ แต่สำหรับแฟนเพลง C คนอื่นมันอาจไม่จำเป็น อย่างไรก็ตามเพื่อตอบคำถามของคุณคุณควรลองโพสต์รหัสของคุณเพื่อรับการตรวจทานที่http://codereview.stackexchange.com http://codereview.stackexchange.com
คำแนะนำที่ไม่พึงประสงค์บางคำจากประสบการณ์ของฉัน หากคุณสามารถทำให้งานทั้งหมดของคุณเสร็จสิ้นด้วย C เพียงอย่างเดียวทำไมคุณถึงต้องการโค้ดในลักษณะที่เป็นนามธรรม? คุณต้องการให้ผู้อื่นใช้รหัสของคุณซ้ำได้หรือไม่ หากคุณมีเหตุผลที่ชัดเจนในการเปลี่ยนไปใช้ C ++ ไปที่แนวคิดนามธรรมและการเรียนรู้ C ++ และ OO ไม่อย่างนั้นก็ปล่อยความคิด ในความเห็นที่ต่ำต้อยของฉันคุณไม่ควรตั้งรหัสของคุณให้อ่านง่ายขึ้นและผลลัพธ์ทางวิทยาศาสตร์ของคุณจะทำซ้ำได้มากกว่าให้ OO เป็นนามธรรม ฉันเองมีความหลงใหลในการเรียนรู้ OOPS และรหัส "สง่างาม" เหมือนกัน แต่ C ++ จะใช้เวลาในการ master คุณจะต้องเรียนรู้การจัดการหน่วยความจำเนื่องจากการรวบรวมขยะไม่ได้เป็นไปโดยอัตโนมัติใน C ++ รับคำแนะนำของฉันตั้งแต่ฉันทำงานวิจัยในห้องปฏิบัติการด้วยตัวเองและเสียเวลาเรียนรู้ C ++ และ OO ไปมาก


1
แต่ C ไม่มีการจัดการที่ดียิ่งกว่า C ++ ใน C ++ มีอย่างน้อย RAII
Benjamin Bannier

ฉันชอบโค้ดดังนั้นฉันต้องการเป็นโปรแกรมเมอร์ที่ดีขึ้น ฉันเป็นนักฟิสิกส์คนแรกและโปรแกรมเมอร์คนที่สอง แต่นั่นไม่ได้หมายความว่าฉันไม่ควรพัฒนาทักษะการเขียนโปรแกรมของฉัน - ถ้าฉันตัดสินใจที่จะเผยแพร่โค้ดของฉันพร้อมกับผลทางวิทยาศาสตร์มันจะดีกว่าไหม รหัสที่อ่านได้
user787267

2

พิจารณาถึงการที่คุณไม่มีเวลาศึกษาทฤษฎี

หากคุณมองย้อนกลับไปที่รหัสเก่าของคุณหลังจากสองสามเดือนและสงสัยว่า "คนโง่คนไหนที่เขียนโค้ดนั้น" คุณก็กำลังดำเนินการอยู่

คุณก้าวหน้าอย่างไร โดยการเห็นโค้ดที่ดีกว่าที่คนอื่นเขียน บุคคลไม่เคยรู้คุณค่าของรหัส 'ความสง่างาม' หรือ 'ดี' เว้นแต่ว่าพวกเขาเห็นว่าเป็นการเพิ่มคุณค่าให้กับงานของพวกเขา แทนที่จะอ่านทฤษฎีฉันจะสนับสนุนให้คุณเปิดตาให้โค้ดที่เขียนโดยคนอื่น ๆ ในสาขาการทำงานของคุณ อย่าลืมนึกถึงแนวคิดที่ถูกกล่าวถึงใน stackoverflow (แท็ก C ++) การใช้เวลาเพียงสิบห้านาทีต่อวันของการค้นหาดังกล่าวสามารถนำคุณสู่แนวคิดที่สามารถช่วยคุณได้ มันสามารถแสดงรหัสที่เขียนได้ดีกว่ารหัสของคุณ นั่นคือเมื่อคุณติดตาม Wikipedia และค้นหาเพิ่มเติมเกี่ยวกับมัน การเรียนรู้เช่นนี้ซึ่งมาจากความอยากรู้อยากเห็นจะยั่งยืนและเป็นประโยชน์กับคุณมากกว่าทฤษฎีที่คุณจะลืมเมื่อคุณตื่นขึ้นในวันถัดไป

ลองใช้ภาษาอื่นเช่น MATLAB หรือ Python


ฉันใช้เวลาค่อนข้างมากในการแลกเปลี่ยนสแต็ค - เป็นทรัพยากรที่มีค่าสำหรับฉันในการทำงานประจำวัน ฉันใช้ Matlab บ่อยครั้ง แต่มันง่ายมากที่จะพัฒนานิสัยที่ไม่ดีเช่นไม่ได้จัดสรรอาร์เรย์ไว้ล่วงหน้าเนื่องจากเป็นการให้อภัย
787267

+1 สำหรับ python @ user787267 ฉันไม่เข้าใจว่าทำไมการไม่จัดสรรล่วงหน้าเป็นนิสัยที่ไม่ดี
Xavier Combelle

2

ในฐานะที่เป็นนักฟิสิกส์หันมาเป็นโปรแกรมเมอร์ฉันพบว่าภูมิหลังทางฟิสิกส์ของฉันมีประโยชน์มากที่สุดในการสร้างคำอุปมาอุปมัยที่เหมาะสมสำหรับการทำความเข้าใจแนวคิดซอฟต์แวร์ มุมมองนี้ทำให้การเรียนรู้การเขียนโปรแกรมสนุกยิ่งขึ้นสำหรับฉันและช่วยฉันพัฒนาความรู้สึกสำหรับ "ความสง่างาม" ในซอฟต์แวร์ซึ่งคุณดูเหมือนจะพยายาม

ผมได้อธิบายที่สำคัญและอยู่ภายใต้การชื่นชมบทบาทของอุปมาอุปมัยและซอฟแวร์ในคอลัมน์ CUJ ของฉัน"รูปแบบของการคิด - ชื่อคำอุปมาอุปมัยการเขียนโปรแกรมที่ดีขึ้นและการเมืองของภาษา" ตัวอย่างเช่นแนวคิด OO ของการสืบทอดชั้นมักจะถูกเปรียบเทียบกับการส่งผ่านลักษณะจากผู้ปกครองไปยังลูกหลานในครอบครัว นี่เป็นการเปรียบเทียบที่ไม่ถูกต้อง การเปรียบเทียบที่ถูกต้องสำหรับการสืบทอดคลาสคือการจำแนกประเภททางชีวภาพของสิ่งมีชีวิต (เช่นคลาส RedRose เป็นดอกไม้ชนิดหนึ่งและดอกไม้เป็นพืชชนิดหนึ่ง)

หรือตัวอย่างเช่นแนวคิดซอฟต์แวร์ของเครื่องสถานะแบบลำดับชั้น อุปมาที่ดีที่นี่คือแนวคิดของระบบควอนตัมที่ถูกผูกไว้เช่นอะตอมไฮโดรเจน ในขณะที่คุณเรียกคืนสถานะของอะตอมจะถูกกำหนดหมายเลขโดยควอนตัมตัวเลขสามตัว | n, l, m> เนื่องจากเป็น "ซ้อน" (ลำดับชั้น) คำอุปมานี้แสดงให้คุณเห็นว่าจะเข้าใจได้อย่างไรว่ารังของสหรัฐฯอยู่ในสถานะ (เช่นเดียวกับสถานะของโมเมนตัมเชิงมุม (l) รังในสถานะพลังงาน (n)) และคุณทันทีที่เห็นว่าการซ้อนของสถานะนั้นจะสะท้อนถึงความสมมาตรของระบบ

การเปรียบเทียบที่น่าสนใจอีกอย่างหนึ่งจากฟิสิกส์คือ "แบบจำลองการคำนวณของนักแสดง" ซึ่งได้รับการค้นพบครั้งใหม่เนื่องจากซีพียูแบบมัลติคอร์และการคำนวณแบบกระจายใน "คลาวด์" ฉันพบว่ามันมีประโยชน์และสนุกกับการคิดเหตุการณ์ที่แลกเปลี่ยนโดยนักแสดงที่มีสถานะ (หรือที่รู้จักว่าวัตถุที่ใช้งาน) เป็น bosons เสมือนเช่นโฟตอนใน QED หรือกลูออนใน QCD คำอุปมานี้อธิบายถึงลักษณะพื้นฐานของการสื่อสารแบบอะซิงโครนัสการประมวลผลเหตุการณ์แบบเรียกใช้ให้เสร็จสิ้น (การกระโดดแบบควอนตัม) และการห่อหุ้มอย่างเข้มงวดของวัตถุที่ใช้งานอยู่ซึ่งสามารถโต้ตอบกับวัตถุอื่น

อย่างไรก็ตามการพัฒนาคำอุปมาระบบเป็นแนวทางปฏิบัติที่แนะนำใน XP (eXtreme Programming) และในฐานะนักฟิสิกส์คุณจะมีความได้เปรียบในการคิดคำอุปมาอุปมัยที่ดี นอกจากนี้คุณยังจะได้รับ "ความสง่างาม" เพราะซอฟต์แวร์ของคุณจะสืบทอดความสมบูรณ์ทางแนวคิดจากคำอุปมาอุปมัยที่คุณใช้


แม้ว่าฟิสิกส์อาจเป็นแหล่งที่มาของอุปมาอุปมัย แต่เจตนาใน XP ก็คือการค้นหาคำอุปมาที่เอื้อต่อการสื่อสารกับลูกค้าในสถานที่และสมาชิกในทีมอื่น ๆ ดังนั้นโดยทั่วไปมักจะเลือกอุปมาอุปมัยที่เข้าใจกันมากกว่า
Pete Kirkham

2

ฉันสามารถบอกคุณได้ว่าสิ่งที่ยิ่งใหญ่ที่สุดที่ฉันได้รับในแง่ของวิธีการแก้ไขปัญหานั้นเกิดขึ้นได้จากการเรียนรู้ภาษาและตัวแยกวิเคราะห์ การค้นพบทั้งสองเกิดขึ้นโดยบังเอิญ ดังนั้นฉันจะบอกคุณตอนนี้ถ้าคุณจริงจังกับการเป็นโปรแกรมเมอร์ที่ดีกว่าคุณต้องเรียนรู้เกี่ยวกับเทคนิคต่าง ๆ ที่เกี่ยวข้องกับการเขียนคอมไพเลอร์เช่น parsers และ parser generators และคุณต้องเรียนรู้วิธีการเขียนคำนวณด้วยลำดับที่สูงขึ้น ฟังก์ชั่น.

ทรัพยากรที่ดีเยี่ยมสำหรับตัวแยกวิเคราะห์และเรียบเรียงสิ่งที่เป็นPL101: สร้างเองภาษาเขียนโปรแกรมของคุณ ผมยังไม่ได้พบบทนำที่ดีในการเขียนโปรแกรมการทำงาน แต่ผมได้ยินสิ่งที่ดีมากเกี่ยวกับSICP


-5

ผู้สำเร็จการศึกษาสาขาวิทยาศาสตร์คอมพิวเตอร์ไม่ทราบว่าจะใช้รหัสอย่างไรเมื่อสำเร็จการศึกษา พวกเขาไม่ต้องการมากนักเมื่อพวกเขาออกจากมหาวิทยาลัย เฉพาะในกรณีที่พวกเขาได้รับประสบการณ์

คำตอบสำหรับคำถามของคุณคือคุณต้องเรียนรู้รูปแบบการออกแบบ ฉันตั้งโปรแกรมใน Java, .NET และตอนนี้ฉันทำงานเป็นโปรแกรมเมอร์ PHP, Javascript และ MySQL . NET โดยวิธีการที่มีระดับที่เป็นนามธรรมสูงเช่น ASP.NET หมายความว่าคุณสามารถข้ามการเรียนรู้ที่เป็นนามธรรม ภาษาเช่น Perl, PHP, ฯลฯ มีระดับความเป็นนามธรรมต่ำ

อ่าน Head First ลวดลายการออกแบบมันเป็นหนังสือที่ดี มันเป็นหนังสือที่ค่อนข้างครอบคลุม นั่นคือทั้งหมดที่คุณต้องการ


ฉันมีความคิดว่าเพราะเหตุใดคำตอบนี้จึงถูกลดระดับลง แต่อาจจะมีประโยชน์หากผู้ลงคะแนนพูดว่าทำไม
Pierre Arlaud
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.