ฉันไม่ใช่โปรแกรมเมอร์ที่ดี (ในเชิงตรรกะ) ฉันจะแก้ไขได้อย่างไร [ปิด]


50

ตกลงดังนั้นนี่คือปัญหาของฉัน:

ฉันทำงานให้กับ บริษัท ใหญ่บางแห่งมีงานทำอย่างไร (ตรงไปตรงมาเพราะการสัมภาษณ์เป็นเรื่องง่าย) ไม่ใช่ว่าฉันไม่รู้เรื่องของฉันฉันเข้าใจ Java เป็นอย่างดีมันเป็นห้องสมุด ฯลฯ

แต่เมื่อฉันพยายามที่จะแก้ปัญหาตรรกะบางอย่างฉันก็พบว่ามันยากที่จะหาวิธีแก้ปัญหา

ตัวอย่างเช่นconversion of decimal to romanเมื่อฉันเห็นวิธีแก้ปัญหาฉันพบว่ามันเป็นปัญหาง่ายๆ แต่ฉันไม่สามารถใช้งานได้หลังจากผ่านไป 1-2 ชั่วโมง!

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

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

ฉันรู้สึกขวัญเสีย :(

TL: DR: ฉันเข้าใจสิ่งต่าง ๆ จากมุมมองที่ใช้งานได้จริง (การนำคุณลักษณะไปใช้ในผลิตภัณฑ์ของเรา) แต่เมื่อพยายามแก้ไขปัญหาจากการพูดว่า ProjectEuler ฉันรู้สึกแย่มาก! และฉันต้องลับสมองของฉัน!

ดังนั้นคำถามของฉันคือ:

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

PS: ฉันไม่เคยได้รับการศึกษาใน CS (ปริญญาตรีของฉันคือวิชาเลือก) แต่นั่นไม่ใช่ข้ออ้างที่จะเป็นนักพัฒนาที่ขี้ขลาด

ขอบคุณ!


3
ถ้ามันไม่สนุกกับการไขปริศนาสำหรับคุณแล้วทำไมต้องรำคาญ!
V4Vendetta

3
มันไม่สนุกเพราะฉันมีเวลาที่ยากลำบากในการแก้ไข ถ้าฉันทำได้ดีฉันแน่ใจว่าฉันจะชอบมัน!
จอห์น

1
คุณสามารถลองทำสิ่งนี้ได้เสมอ(เตือนติดยาเสพติดอย่างจริงจังหากคุณกำลังไขปริศนาอยู่)
Benjol

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

3
@John ยืนยันแล้ว มันเป็นปัญหาที่ยาก คุณไม่ควรรู้สึกแย่ถ้าคุณแก้ไม่ได้ใน 5 นาที หนึ่งชั่วโมงครึ่งที่จะทำหลังจากอ่าน Wiki เกี่ยวกับตัวเลขโรมันและโดยการเปรียบเทียบผลลัพธ์กับผลลัพธ์ของการใช้งานอื่นฉันสามารถแก้ไขข้อผิดพลาดได้ ฉัน (เหมือนคนอื่น ๆ ) คิดว่า IL เป็นหมายเลขที่ถูกต้อง ไม่ถูกต้อง. XXXIX เป็นหมายเลขที่ถูกต้อง นอกจากนี้ฉันต้องดูการใช้งานอื่น ๆ เพื่อเพิ่มประสิทธิภาพ (ฉัน pre-แคช II, III, XX, XXX และอื่น ๆ แต่มันไร้ประโยชน์) อย่ารู้สึกแย่!
xanatos

คำตอบ:


24

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

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

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

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

  1. กำหนดคำถาม
  2. รวบรวมข้อมูลและทรัพยากร (สังเกต)
  3. สร้างสมมติฐานที่อธิบาย
  4. ทดสอบสมมติฐานโดยดำเนินการทดลองและรวบรวมข้อมูลในลักษณะที่ทำซ้ำได้
  5. วิเคราะห์ข้อมูล
  6. ตีความข้อมูลและทำการสรุปที่ทำหน้าที่เป็นจุดเริ่มต้นสำหรับสมมติฐานใหม่
  7. เผยแพร่ผลลัพธ์
  8. สอบซ่อม (ทำโดยนักวิทยาศาสตร์คนอื่นบ่อยๆ)

ปัญหาทั้งหมดสามารถแก้ไขได้ด้วยวิธีนี้! หลายคนไม่ทำตามขั้นตอนเหล่านี้ มันเหมือนนักพัฒนาซอฟต์แวร์ที่ปฏิเสธที่จะทดสอบรหัสของเขา เลย เขาจะมีปัญหาในการหาข้อผิดพลาด

ในที่สุดเครื่องมือหลักอื่น ๆ สำหรับการแก้ปัญหาคือการทำลายมันด้วยขั้นตอนง่าย ๆ ตัวอย่างเช่นปัญหาแรกในตัวอย่างของโครงการออยเลอร์ :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

เรามีข้อเท็จจริงสองอย่างและมีปัญหาที่นี่ ความจริงข้อหนึ่งแสดงให้เราเห็นถึงวิธีการกำหนดพหุคูณของสามหรือห้าด้านล่าง 10 3 * 1,3 * 2,3 * 3,5 * 1 ถูกต้องทั้งหมด 5 * 2 ไม่ใช่เพราะมันเท่ากับ 10 จากนั้นข้อเท็จจริงที่สองบอกเราว่าเรารวมพวกมันเข้าด้วยกันเพื่อให้ได้ 23

ดังนั้นเราจึงมีวิธีหาค่าอยู่แล้วและเราสามารถรวมมันเข้าด้วยกันเพื่อรับผลรวมของเรา แน่นอนเราสามารถดูข้อเท็จจริงและใช้การกลับคำสั่งง่ายๆ 3, 5, 6 และ 9 เป็นทวีคูณของ 3 หรือ 5 นั่นคือ 3% 3, 5% 5, 6% 3, 9% 3 ทั้งหมดให้ mod เป็นศูนย์ วิธีอื่นก็คือให้ผ่าน 999 ถึง 1 และมอดุลัสแต่ละหมายเลขด้วย 3 และ 5 รวบรวมรายการค่าและเพิ่มเข้าด้วยกัน

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


19

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

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

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

ส่วนตัวผมได้รับของฉันแก้แก้ไขปริศนาโดยการแก้"geocaches ลึกลับ"


แต่ผู้ที่เพิ่งเริ่มต้นร้อนแรงมีเพียงความสามารถในการไขปริศนา ใช้เฟสบุ๊ค หากฉันไม่เก่งในการไขปริศนาฉันก็ไม่มีสิทธิ์สมัครที่นั่น!
จอห์น

6
Facebook มีหุ่นยนต์ตัวต่อเป็นตัวตรวจสอบครั้งแรกเพื่อหลีกเลี่ยงการร่อนผ่าน CV หลายพันตัว หากคุณต้องการทำงานให้กับ FB จริงๆคุณต้องสามารถแก้ไขปัญหาเหล่านั้นได้ แต่มีสถานที่ดีๆอื่น ๆ ให้ทำงานอีกมากมาย
JesperE

คำตอบที่ยอดเยี่ยม ทำให้ฉันสบายใจเช่นกัน ... =]
Hartley Brody

9

ให้ฉันแค่เตือนคุณยิ่งคุณรู้มากเท่าไหร่คุณก็ยิ่งตระหนักได้ว่าคุณรู้น้อยเพียงใด

อย่าเพิ่งท้อใจกับสิ่งนั้น เรียนรู้อย่างต่อเนื่องและพยายามทำงานในพื้นที่ที่คุณรู้ว่ากำลังขาดแคลน

ตอนนี้คำถามของคุณ ข้อเสนอแนะของฉันจะเริ่มทำงานกับปัญหาเกี่ยวกับโครงการ eule r

เหตุผลของฉันคือง่ายเริ่มจากคำถามยอดนิยมซึ่งปกติแล้วเป็นปัญหาที่แก้ง่ายกว่า

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

หากคุณตัดสินใจว่าคุณไม่สามารถแก้ปัญหานี้ได้ให้เริ่มค้นคว้าปัญหา (ไม่ต้องการคำตอบ) ไม่ลองอีกครั้ง

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

ตอนนี้ปิดคำตอบที่พวกเขาให้และลองอีกครั้งด้วยตัวคุณเองจนกว่าคุณจะแก้มันอีกครั้ง

หากคุณฝึกฝนเพียงพอตรรกะและความคิดในการแก้ปัญหาเหล่านี้จะทำให้คุณง่ายขึ้นและง่ายขึ้น


4

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

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

Project Euler มีตัวต่อหลากหลายรูปแบบ สิ่งเหล่านี้จำนวนมากสามารถทำได้อย่างง่ายดายด้วยความรู้พื้นฐานทางคณิตศาสตร์ คนอื่นจะแก้ไขได้ง่ายขึ้นเมื่อคุณรู้ว่าอัลกอริธึมเหล่านี้สองสามอย่าง


2

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

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

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


1

การรู้จุดอ่อนของคุณนั้นเป็นจุดแข็งที่แท้จริงดังนั้นคุณจึงรู้ว่าควรศึกษาอะไรเพื่อให้ได้เกมที่ดีขึ้น

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

ไชโยคาร์โล


1

ฉันรู้สึกว่าฉันควรเพิ่มในสิ่งนี้

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

ในบางวิธีเราแบ่งปันจุดอ่อนเดียวกัน (แม้ว่ามันจะไม่เลวร้ายอย่างที่คุณคิด) เพื่อฝึกทักษะการแก้ปัญหาของฉันฉันมักจะทำงานกับปัญหาโครงการออยเลอร์หรือ HackerRank ถ้าเป็นปัญหาง่าย ๆ ฉันเลือกภาษาการเขียนโปรแกรม 7 ภาษาและลองแก้ปัญหาด้วยภาษาทั้งหมด สำหรับปัญหาที่ยากขึ้นฉันอาจเลือก 3 ภาษาที่แตกต่างจากกันมากเพียงเพื่อให้เวลาที่ฉันใช้กับปัญหานั้นสมเหตุสมผล สำหรับปัญหาทั้งหมดเมื่อฉันหาวิธีแก้ปัญหาแล้วฉันจะค้นหาวิธีแก้ปัญหาที่คนอื่นคิดและทำความเข้าใจกับพวกเขา หากคุณไม่เข้าใจวิธีแก้ปัญหาบางอย่างคุณสามารถโพสต์ไปที่ StackOverflow หรือแม้กระทั่งที่นี่เพื่อเขียนโปรแกรม Stack Exchange หรืออะไรบางอย่างและฉันแน่ใจว่ามีบางคนบนไซต์ที่สามารถตอบคำถามของคุณได้

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

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

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