โปรแกรมเมอร์ที่มีความสามารถควรจะสามารถคิดอัลกอริธึมพา ธ สั้นที่สุดของเขาเองได้หรือไม่?


58

ฉันประสบวิกฤตความเชื่อมั่นในความสามารถของฉันในฐานะโปรแกรมเมอร์คอมพิวเตอร์

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

นี่เป็นสิ่งที่โปรแกรมเมอร์ที่ดีควรจะสามารถ "นำกลับมาใช้ใหม่" ได้ภายในสองชั่วโมงหรือว่าฉันไม่สมจริง?

โอ้อย่างน้อยฉันก็สามารถสร้างการเรียงลำดับฟองได้: D


7
คนที่ทำ UI เป็นเวลา 20 ปีอาจมีปัญหาในการค้นหาวิธีแก้ไขปัญหาจากโดเมนอื่นในเวลาอันสั้น
Coder

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

2
ฉันไม่สามารถบูรณาการตัวเองใหม่ แต่ฉันพยายามที่จะจำวิธีการทำงาน ทำให้แน่ใจว่าคุณเข้าใจภาพเคลื่อนไหวนี้: upload.wikimedia.org/wikipedia/commons/2/23/…
งาน

6
@Brian โศกนาฏกรรมของอัจฉริยะในท้องถิ่น คุณแทบจะไม่สามารถทำสิ่งที่ดีที่สุดได้อีกต่อไป
Rei Miyasaka

7
นักวิทยาศาสตร์คอมพิวเตอร์ที่ดีควร แต่ไม่จำเป็นต้องเป็นโปรแกรมเมอร์คอมพิวเตอร์หรือวิศวกรซอฟต์แวร์
Neil McGuigan

คำตอบ:


118

โปรแกรมเมอร์ที่ดีควรตระหนักว่าอัลกอริทึมที่ยอดเยี่ยมนั้นถูกเขียนขึ้นเพื่อแก้ไขปัญหาและไม่ต้องเสียเวลาในการสร้างล้อใหม่

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


25
@Nakilon - โปรแกรมเมอร์ที่เพิกเฉยต่อโซลูชันที่มีอยู่นั้นกำลังเสียเวลาและหากพวกเขาไม่เสียเวลา ดู: ทุกคนสร้างรหัสผ่านการแฮชของรหัสผ่านของตัวเองเทียบกับ bcrypt
Reinstate Monica

10
@ GSto: ตามวิกิพีเดีย, Dijkstra มาพร้อมกับอัลกอริทึมในเวลาน้อยกว่าหนึ่งชั่วโมง: 20 นาที, ตามบันทึกแรกของวิกิพีเดีย: en.wikipedia.org/wiki/Dijkstra%27s_algorithm
woliveirajr

9
มันเป็นอัลกอริทึมแบบสัมพัทธ์ แต่ Dijkstra มีความสามารถมากและได้รับการฝึกฝนด้านฟิสิกส์เชิงทฤษฎีและคณิตศาสตร์ขั้นสูง ไม่มีอะไรที่เหมือนกับการเขียนหลักฐานมาสองสามปีเพื่อปรับปรุงความสามารถในการออกแบบอัลกอริทึม
วินไคลน์

19
@woliveirajr - ดีฉันแน่ใจว่านิวตันใช้เวลาเท่ากันในการคิดกฎการเคลื่อนไหว หลังจากคิดถึงเรื่องนี้มา 20 ปีก่อน
โกง

6
@Nakilon - ใช่นั่นเป็นเหตุผลที่ทุกคนเขียนทุกอย่างใน C เพราะมิฉะนั้นคุณก็เป็นแค่ผู้เขียนโค้ดโดยใช้ภาษาระดับสูงของคนอื่น โอ้เดี๋ยวก่อนฉันหมายถึงการชุมนุมไม่อย่างนั้นคุณแค่ใช้ภาษาระดับต่ำของคนอื่น โอ้รอฉันหมายถึงสวิตช์พลิกเพื่อเปลี่ยนวงจรไฟฟ้ามิฉะนั้นคุณแค่ใช้ชุดคำสั่งของคนอื่น หรือคุณรู้ว่าคุณก็สามารถใช้สิ่งที่มีอยู่แล้วและมีการทำงานในการสร้างสิ่งใหม่ เหตุใดจึงต้องเสียเวลาคิดค้นอัลกอริทึมของ Dijkstra ใหม่เมื่อคุณสามารถประดิษฐ์สิ่งใหม่ ๆ เช่นโปรแกรมที่ใช้งานได้
Reinstate Monica

54

นี่เป็นสิ่งที่โปรแกรมเมอร์ที่ดีควรจะสามารถ "นำกลับมาใช้ใหม่" ได้ภายในสองชั่วโมงหรือว่าฉันไม่สมจริง?

ก่อนอื่นคุณอาจสับสนในการเขียนโปรแกรมด้วยวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎี โปรแกรมเมอร์ที่ยอดเยี่ยมต้องการพื้นฐานที่ดีในด้านวิทยาศาสตร์คอมพิวเตอร์ แต่เขาไม่จำเป็นต้องยอดเยี่ยม Dijkstra นั้นยอดเยี่ยมทางวิทยาศาสตร์คอมพิวเตอร์

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

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

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


56
ไม่ต้องกังวลหากกำลังดุร้ายไม่ทำงานคุณก็ไม่ได้ใช้กำลังมากพอ
Robbie

2
+1 สำหรับช่วงชิงความแตกต่างระหว่าง CS เชิงทฤษฎีและการเขียนโปรแกรม การเขียนโปรแกรมคือการแก้ปัญหาในโลกแห่งความเป็นจริงและในทางทฤษฎี CS มีไว้เพื่อสนับสนุนการเขียนโปรแกรม อย่างไรก็ตามทฤษฎี CS ไม่จำเป็น 100% ในการเขียนโปรแกรมประจำวันของคนส่วนใหญ่
ฟิล

17

นี่เป็นสิ่งที่โปรแกรมเมอร์ที่ดีควรจะสามารถ "นำกลับมาใช้ใหม่" ได้ภายในสองชั่วโมงหรือว่าฉันไม่สมจริง?

ไม่สมจริงอย่างแน่นอน ผู้คนไม่เพียงแค่ "คิด" ด้วยอัลกอริทึมในเวลาไม่กี่ชั่วโมง ต้องใช้ความพยายามและทำงานอย่างมาก หากต้องการอ้างอิงบล็อกนี้ :

ในการเขียนโปรแกรม Pearls เบนท์ลีย์อ้างถึง Donald Knuth กล่าวว่า "ในขณะที่การค้นหาไบนารีครั้งแรกได้รับการเผยแพร่ในปี 1946 การค้นหาไบนารีครั้งแรกที่ทำงานอย่างถูกต้องสำหรับค่าทั้งหมดของ n ไม่ปรากฏขึ้นจนกระทั่งปี 1962"

และเวอร์ชั่นของเบนท์ลีย์ก็มีปัญหาเช่นกันเมื่อนำไปใช้กับชุดใหญ่

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


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

8
@ Richard - ความคิดเห็นคือ "ในการเขียนโปรแกรม Pearls, Bentley พูดว่า .. " Knuth เป็นคนแรกที่พูด แต่ที่มาของฉันคือ Programming Pearls ไม่ใช่ TAoCP ดังนั้นฉันจึงเขียนสิ่งที่ Bentley เขียน ฉันไม่ได้อ้างว่าเบนท์ลีย์เป็นผู้ริเริ่ม - ฉันแค่อ้างถึงสิ่งที่พูดในหนังสือ เนื้อหาส่วนใหญ่ในหนังสือไม่ได้ถูกแต่งขึ้นโดยผู้แต่งเองดังนั้นฉันจึงไม่เห็นว่าทำไมคุณถึงเห็นแบบนั้น
BlackJack

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

3
@Richard - คำพูดที่ฉันระบุไว้นั้นโดยตรงจากบล็อกซึ่งอ้างอิงโดยตรงจากหนังสือ (จริงๆแล้วฉันคิดว่ามันเป็นหน้า 57 ของฉบับพิมพ์ครั้งแรก) หากคุณมีปัญหามากมายเกี่ยวกับคำสั่งนี้โปรดติดต่อผู้เขียนบล็อกและขอให้เขาแก้ไข
BlackJack

1
@Richard และ BlackJack: คุณทั้งคู่ถูกต้อง แต่การระบุแหล่งที่มาของผู้เขียนต้นฉบับเพิ่มความน่าเชื่อถือและบริบทให้กับคำสั่ง การแก้ไขของฉันควรเพียงพอ
Steven Evers

9

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

ออกมาพร้อมอัลกอริทึมที่ดีกว่าที่คิดว่า "ดีที่สุด" (ในกรณีของคุณสั้นที่สุด) ไม่ใช่สิ่งที่ทุกคนสามารถทำได้ อาจเป็นไปไม่ได้

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

(s) เขาควรจะรู้ด้วยเช่นกันว่าเป็นวิธีที่ดีที่สุดในการแก้ไขปัญหานั้นหรือไม่

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


6

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

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

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

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


โอ้ผู้ประชด ... ตอนนี้ที่ฉันสามารถแสดงความคิดเห็นได้ทุกที่ฉันควรลบคำตอบที่ได้รับสิทธิ์นั้นหรือไม่ ควรมีตราสำหรับสิ่งนั้น
Keith Layne

มี - วินัยแต่ถ้าชื่อเสียงของคุณได้รับการคำนวณใหม่คุณจะกลับไปที่ 1
ChrisF

ใช่นั่นคือจุดของฉัน ... ฉันจะไปด้านบนและเกินวินัยที่จุดนั้น IMO หากฉันแปลงคำตอบเป็นความคิดเห็นก่อนที่จะลบฉันสามารถทำได้ทั้งหมด ... ฉันแนะนำป้ายใหม่ที่เรียกว่า UberDisciplined สำหรับการลบใด ๆ ที่ทำให้คุณกลับสู่สถานะผู้ใช้ใหม่ :)
Keith Layne

3

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

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

ไอน์สไตน์ที่โด่งดังกว่าที่คุณคิดว่าจะเป็นผู้เชี่ยวชาญในทฤษฎีปมไม่สามารถผูกเชือกรองเท้าของตัวเองได้จนกว่าเขาจะอายุประมาณสิบปี

โอกาสที่ดีที่คุณได้คิดค้นสิ่งใหม่โดยไม่รู้ตัวหลายๆ อย่างที่คนอื่น ๆ ไม่เคยคิดมาก่อนถ้าไม่ได้รับการสอนอย่างชัดเจน


3

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

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

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

ฉันคิดว่าฉันฟังดูรุนแรงขึ้นกว่าที่ฉันต้องการจริงๆ แต่ประเด็นของฉันคือ: ฉันคาดหวังว่าโปรแกรมเมอร์จะมีความคิดสร้างสรรค์มากพอที่จะคิดหาวิธีแก้ปัญหาแม้ว่าวิธีแก้ปัญหาจะยุ่งเหยิงหรือยุ่งเหยิงก็ตาม


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

(BTW การอนุมัติของฉันนับตามลำดับความสำคัญเช่นเดียวกับคูปองล้างรถฟรี)


3
ฉันยอมรับว่าใช่โปรแกรมเมอร์ที่มีความสามารถน่าจะสามารถจัดเรียงฟองหรือเทียบเท่าได้ อาจเป็นการใช้เวลาอย่างมีประสิทธิภาพเพื่อนำไปใช้จริงและลองใช้งานบางทีอาจจะเข้าใจปัญหาได้ดีขึ้น แต่ฉันคิดว่าต้องมีการกล่าวว่าไม่มีโปรแกรมเมอร์คนใดที่จะสามารถใช้งานได้จริงในรหัสการผลิต การทำเช่นนั้นเป็นสิ่งที่ทำให้ลูกค้าของคุณกลับมาในปีหน้าและบ่นว่าตอนนี้พวกเขามีข้อมูลมากขึ้นในการประมวลผลอัลกอริทึม O (n!) ของคุณจะใช้เวลาสองเท่าของอายุของจักรวาลที่จะเสร็จสมบูรณ์ ...
Thomas Padron-McCarthy

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

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

2

ใช่เขา / เธอควรจะ

มันอาจจะเทียบเท่ากับการจัดเรียงฟองสบู่ แต่ฉันคิดว่าโปรแกรมเมอร์ที่ดีควรสามารถสร้างสิ่งที่ได้ผลอย่างน้อยที่สุดอย่างไรก็ตามมันอาจจะไม่มีประสิทธิภาพ

ไม่จำเป็นต้องพูดว่าถ้าปัญหานั้นจะเกิดขึ้นกับโปรแกรมเมอร์ที่ดีจะต้องดูก่อนว่ามีไลบรารี่สำหรับเขาหรือไม่

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


1

ไม่ต้องกังวล

ในฐานะที่เป็นโปรแกรมเมอร์ Perl ฉันทุกคนเกี่ยวกับไม่เคย reinventing ล้อ นั่นคืองานของ CPAN หากมีอัลกอริทึมหรือโมดูลที่ได้รับการสนับสนุนอย่างง่ายเราจะใช้มัน ถ้าไม่มีโมดูลดีแล้วเราคิดค้นล้อ นั่นเป็นหนึ่งในสิ่งที่ยิ่งใหญ่ที่สุดเกี่ยวกับ Perl

ดังนั้นสิ่งที่ฉันพูดคือ:

  1. ฉันไม่แนะนำให้ปรับแต่งล้อ แต่เมื่อคุณทำ ...
  2. พยายามอย่าบูรณาการใหม่และ ...
  3. ไม่ต้องกังวลหากคุณไม่สามารถทำได้ นั่นเป็นเหตุผลที่เรามีชุมชนการเขียนโปรแกรม :-)

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

0

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


0

นี่เป็นสิ่งที่โปรแกรมเมอร์ที่ดีควรจะสามารถ "นำกลับมาใช้ใหม่" ได้ภายในสองชั่วโมงหรือว่าฉันไม่สมจริง?

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

มันหมายความว่าคุณไม่สนใจประวัติเกี่ยวกับปัญหาเส้นทางที่สั้นที่สุดไปจาก algoritm O (| V | ^ 4) ที่ตีพิมพ์ในปี 1955 ถึงอัลกอริทึม O (E + V log V) ที่ตีพิมพ์ในปี 1984 (ซึ่งเป็น Dijkstra's อัลกอริทึมกับต้นไม้ฟีโบนักชี) คุณเกือบรับประกันว่าจะทำสิ่งที่แย่กว่าอัลกอริทึมที่ได้วางแผนไว้แล้ว ยังมีโอกาสที่อัลกอริทึมของคุณมีช่องว่างหรือข้อผิดพลาดทำให้ไม่ถูกต้อง นอกจากนี้คุณจะต้องใช้เวลามากขึ้นในการคิดอัลกอริทึมของคุณใช้งานและทดสอบมากกว่าเวลาที่ใช้ในการใช้อัลกอริทึมที่มีอยู่อีกครั้ง

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

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


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

ฉันคิดมากขึ้นตามแนวของการโจมตีเวลา ฯลฯ สิ่งที่เกือบจะไม่มีโปรแกรมเมอร์รู้ มันไม่ได้เป็นปัญหาเสมอไป แต่เป็นสิ่งที่สำคัญ นอกจากนี้การรวมการเข้ารหัสดั้งเดิมมักจะไม่ทำงานอย่างที่คาดไว้นี่เป็นส่วนที่ปลอดภัยอย่างยิ่ง
Alex ten Brink

ในขณะที่ระยะเวลาการโจมตี ฯลฯ แน่นอนเป็นกังวลที่ถูกต้อง (และไม่เพียง แต่ในการเข้ารหัส) ผมขอยืนยันว่าความไวต่อการดำเนินงานของดังกล่าวมีผลกระทบต่อการที่ไม่ถูกต้อง และมีหลายวิธีในการทำให้เสียวิธีการเข้ารหัสมากกว่าเพียงแค่การเปิดใช้การโจมตีเวลา Bruce Schneier เคยทำงานในซีรี่ส์Doghouseของเขา ฉันไม่ได้เห็นอะไรเลยในช่วงนี้ แต่มีตัวอย่างเตือนมากมายอยู่ที่นั่น google.com/search?q=site%3Aschneier.com+%22the+doghouse%22
CVN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.