วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

5
ฟังก์ชั่นกลับจริง / เท็จเทียบกับเป็นโมฆะเมื่อประสบความสำเร็จและโยนข้อยกเว้นเมื่อล้มเหลว
ฉันกำลังสร้าง API ซึ่งเป็นฟังก์ชันที่อัปโหลดไฟล์ ฟังก์ชั่นนี้จะไม่ส่งคืน / เป็นโมฆะหากไฟล์ถูกอัปโหลดอย่างถูกต้องและส่งข้อยกเว้นเมื่อเกิดปัญหา ทำไมมีข้อยกเว้นและไม่ใช่แค่ของเท็จ? เพราะภายในข้อยกเว้นฉันสามารถระบุสาเหตุของความล้มเหลว (ไม่มีการเชื่อมต่อชื่อไฟล์หายไปรหัสผ่านผิดรายละเอียดไฟล์หายไป ฯลฯ ) ฉันต้องการสร้างข้อยกเว้นที่กำหนดเอง (ด้วย enum บางอย่างเพื่อช่วยผู้ใช้ API ในการจัดการข้อผิดพลาดทั้งหมด) นี่เป็นวิธีปฏิบัติที่ดีหรือเป็นการส่งคืนวัตถุที่ดีกว่า (ภายในบูลีนข้อความแสดงข้อผิดพลาดเพิ่มเติมและ enum สำหรับข้อผิดพลาด) หรือไม่?

9
เป็นเรื่องปกติ / ยอมรับได้ที่จะจดบันทึกความคิดอัลกอริธึมการตัดสินใจระหว่างการเข้ารหัสและการบำรุงรักษาหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา บางคนมีปัญหานี้ที่พวกเขาไม่สามารถคิดได้หากไม่มีคำพูด และการจดบันทึกความคิดและการตัดสินใจเป็นวิธีที่มีประสิทธิภาพที่สุดในการดำเนินการ ดังนั้น - เป็นเรื่องปกติและเป็นที่ยอมรับหรือไม่ที่ฉันจะเขียนความคิดและการตัดสินใจลงในไฟล์ Notepad ++ บางไฟล์ระหว่างการเข้ารหัส? บางครั้งควรเป็นที่ยอมรับได้เช่นเมื่อสร้างเอกสารทางเทคนิคขึ้นใหม่หรือให้เหตุผลเกี่ยวกับอัลกอริธึมที่ซับซ้อนมากขึ้น แต่บางครั้งมันอาจแปลกเช่นเมื่อฉันกำลังพิจารณาตัวเลือกการออกแบบและพยายามตัดสิน ผลกระทบของการฝึกนี้ต่อผลผลิตไม่ชัดเจน จากด้านหนึ่ง - การใช้เหตุผลกับคำภายในอาจเร็วกว่าคำที่เขียน จากอีกด้านหนึ่ง - ปัญหาที่ซับซ้อนมากขึ้นจำเป็นต้องมีการเขียน นอกจากนี้หากใครมีตัวเลือกการออกแบบมากขึ้นความรู้สึกนั้นดีกว่าเมื่อมีการตัดสินใจเขียนดังนั้นมันจึงเพิ่มขวัญกำลังใจ

1
“ exit (-1)” มาจากไหน?
ฉันเห็นในจำนวนมากซอฟต์แวร์เดิมและบทเรียนที่ไม่ดีบนอินเทอร์เน็ตที่แนะนำให้ใช้exit(-1), return -1หรือคล้ายกันที่จะเป็นตัวแทน "เลิกผิดปกติ" ปัญหาคือใน POSIX อย่างน้อย-1ไม่เคยมีมาก่อนและไม่ใช่รหัสสถานะที่ถูกต้อง man 3 exitแสดงให้เห็นว่าexit()ผลตอบแทนที่คุ้มค่าของการstatus & 0377ไปยังผู้ปกครองที่มีความหมายว่าจะกลายเป็น-1 255สำหรับระบบที่ไม่ใช่ POSIX EXIT_FAILUREขอแนะนำให้พกพาได้ แต่ฉันไม่เคยเห็น "-1 หมายถึงการสิ้นสุดที่ผิดปกติ" ร่วมกับ "EXIT_FAILURE อาจเป็นสิ่งที่นอกเหนือจาก 1" ซึ่งบ่งชี้ว่าพวกเขาเชื่ออย่างชัดเจนว่า "-1" นั้นเป็นเรื่องปกติแม้ในระบบที่ไม่ใช่ POSIX ต่อไปนี้เป็นตัวอย่างของคำถาม StackOverflowที่ทำให้เกิดปัญหานี้ ซอฟต์แวร์ "unrealircd" เป็นตัวอย่างของโปรแกรมที่ใช้exit(-1)ในการยกเลิกโปรแกรม systemdในทางปฏิบัตินี้ทำให้ยากที่จะติดต่อกับ รูปแบบการต่อต้านนี้มาจากไหน มันถูกต้องในบางบริบท?


7
อะไรคือ“ วิธีที่ถูกต้อง” ในการใช้ DI ใน. NET
ฉันต้องการใช้การฉีดพึ่งพาในแอพพลิเคชั่นที่ค่อนข้างใหญ่ แต่ไม่มีประสบการณ์ ฉันศึกษาแนวคิดและการใช้งาน IoC และหัวฉีดพึ่งพาบางอย่างเช่น Unity และ Ninject อย่างไรก็ตามมีสิ่งหนึ่งที่ทำให้ฉันหลุดพ้น ฉันจะจัดระเบียบการสร้างอินสแตนซ์ในแอปพลิเคชันของฉันได้อย่างไร สิ่งที่ฉันคิดคือฉันสามารถสร้างโรงงานเฉพาะไม่กี่แห่งซึ่งจะมีตรรกะในการสร้างวัตถุสำหรับชั้นเรียนเฉพาะบางประเภท โดยทั่วไปคลาสสแตติกที่มีเมธอดที่เรียกใช้เมธอด Ninject Get () ของอินสแตนซ์เคอร์เนลแบบสแตติกในคลาสนี้ มันจะเป็นวิธีที่ถูกต้องในการใช้งานการฉีดพึ่งพาในใบสมัครของฉันหรือฉันควรจะใช้มันตามหลักการอื่น ๆ ?

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

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

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

8
คุณจะได้รับไฟล์ซึ่งมีตัวเลขที่เป็นไปได้ทั้งหมดในสถาปัตยกรรม 32 บิต หมายเลข 4 หายไปจากไฟล์นั้น ค้นหา 4 หมายเลขที่หายไป
นี่เป็นคำถามสัมภาษณ์ที่ฉันวิ่งข้ามไปสองสามครั้งและฉันไม่แน่ใจว่าจะแก้ปัญหาอย่างไรเพราะตัวเลขสี่ตัวนั้นหายไป ฉันคุ้นเคยกับอัลกอริธึมในการค้นหาตัวเลขหนึ่งหรือสองตัวที่หายไป แต่ฉันไม่เห็นวิธีที่จะทำให้เป็นหนึ่งในสี่
22 algorithms 

3
รหัสที่อยู่เบื้องหลังรหัสคือ 'สำนวน' เพื่อลดค่าใช้จ่ายทางปัญญาหรือไม่?
ฉันพยายามอธิบายให้คนฟังว่าวิธีที่พวกเขาเขียนรหัสนั้นยากที่จะเข้าใจและถ้าคุณปรับโครงสร้างใหม่มันจะง่ายต่อการอ่าน รหัสรูปแบบนี้ที่ฉันกำลังขับขี่อยู่มักเรียกว่า 'สำนวน' รหัส ' แต่วลีรหัสสำนวนนำมาพร้อมกับกระเป๋าของความถูกต้องทางศีลธรรมซึ่งไม่ได้เป็นแรงจูงใจที่ดีในการรับคนที่จะเปลี่ยนรูปแบบการเข้ารหัสของพวกเขา วิธีที่ดีกว่าในการบอกว่านี่คือโค้ดที่เป็นไปตามสไตล์ทั่วไป - แต่สำหรับนักคิดที่สำคัญซึ่งคิดเป็นเหตุผลในการคิดแบบฝูง วิธีที่ฉันอธิบายความคิดนี้ในแบบที่กระตุ้นให้ผู้คนเปลี่ยนรหัสคือ: การเขียนโค้ดในลักษณะที่ลดค่าใช้จ่ายด้านความคิดของผู้อ่าน (เช่นฉันจำไม่ได้ว่านี่เป็นเวกเตอร์ชนิดแรก - หรือเวกเตอร์ชนิดที่ 5) รหัสที่ทำให้เข้าใจเจตนาได้ง่ายขึ้น (เช่น vector นี้มีไว้เพื่ออะไร) (นอกเหนือจากนี้ฉันทราบว่าหนังสือ The Joy of Clojure ก่อนการตีพิมพ์ครั้งแรกมีร่างชื่อ Idiomatic Clojure ดังนั้นจึงดูเหมือนว่าเหตุผลในการสร้างรหัส 'สำนวน' เพื่อ 'นำความสุข' มาให้ผู้อ่าน ) คำถามของฉันคือ: จุดประสงค์เบื้องหลังรหัสคือ 'สำนวน' เพื่อลดค่าใช้จ่ายทางปัญญาหรือไม่?
22 idioms 

4
ในโฟลว์ GitHub มันตกลงหรือไม่ที่จะแยกสาขาฟีเจอร์ในสาขาฟีเจอร์อื่น?
เราใช้GitHub ไหลในโครงการของเราและส่วนใหญ่เวลาที่เราเปิดสาขาคุณลักษณะใหม่จากต้นแบบ , ทำงานบางอย่างมีเปิด PR ตรวจสอบรหัสและการผสานกลับเข้าไปในต้นแบบ feature-branch-Aแต่การทำงานในปัจจุบันของฉันขึ้นอยู่กับปัญหาที่กำลังทำงานอยู่ในการควบคุม มันเป็นโคเชอร์ที่จะสร้างสาขาของฉันจากสาขาอื่นหรือต่อต้านวิญญาณของ GitHub Flow หรือไม่? ทางเลือกอื่นคือการยึดสาขาของฉันไว้ที่หลักและผสานการเปลี่ยนแปลงจากfeature-branch-A(บ่อยครั้ง) ต้องการตัวเลือกใดในโฟลว์ GitHub?
22 git  github  gitflow 

2
เป็นการดีหรือไม่ที่จะเก็บหมายเลขเวอร์ชันของซอฟต์แวร์ใน VCS?
เวอร์ชันผลิตภัณฑ์เช่นv1.0.0.100ไม่เพียงแสดงถึงการผลิตซอฟต์แวร์ที่ไม่ซ้ำใคร แต่ช่วยระบุชุดคุณลักษณะและขั้นตอนการแก้ไขด่วนสำหรับผลิตภัณฑ์ดังกล่าว ตอนนี้ฉันเห็นสองวิธีในการรักษาแพ็กเกจ / build / ไบนารีเวอร์ชันสุดท้ายของผลิตภัณฑ์: การควบคุมเวอร์ชัน ไฟล์ที่เก็บหมายเลขรุ่น เซิร์ฟเวอร์การสร้างการรวมต่อเนื่อง (CI) จะมีสคริปต์เพื่อสร้างซอฟต์แวร์ที่ใช้หมายเลขรุ่นที่เช็คอินนี้เพื่อใช้กับทุกพื้นที่ของซอฟต์แวร์ที่ต้องการ (ไบนารีแพคเกจการติดตั้งหน้าช่วยเหลือเอกสาร ฯลฯ ) สภาพแวดล้อมและ / หรือสร้างพารามิเตอร์ สิ่งเหล่านี้ได้รับการดูแลรักษาไว้นอกการควบคุมเวอร์ชัน (เช่นไม่ได้เชื่อมโยงกับสแน็ปช็อต / แท็ก / สาขา) สคริปต์การสร้างกระจายและใช้หมายเลขในลักษณะเดียวกัน แต่พวกเขาเพิ่งได้รับค่าที่แตกต่างกัน (มันมีให้กับสคริปต์การสร้างแทนที่จะให้สคริปต์รู้ว่าจะรับได้ที่ไหนเทียบกับต้นไม้แหล่งที่มา) ปัญหาที่เกิดขึ้นกับวิธีแรกคือมันสามารถทำให้เกิดการผสมข้ามสาขาได้ยาก หากคุณยังคงรักษาซอฟต์แวร์รุ่นเดียวกันไว้ 2 ขนานคุณจะแก้ไขข้อขัดแย้งเมื่อรวมระหว่างการฉีดสองครั้งหากเวอร์ชันมีการเปลี่ยนแปลงทั้งคู่ตั้งแต่การรวมครั้งล่าสุด ปัญหาเกี่ยวกับวิธีการที่สองคือการกระทบยอด เมื่อคุณกลับไปที่การวางจำหน่าย 1 ปีที่ผ่านมาคุณจะพึ่งพาข้อมูลแท็กเพียงอย่างเดียวเพื่อระบุหมายเลขรุ่น ในทั้งสองกรณีอาจมีบางแง่มุมของหมายเลขเวอร์ชันที่ไม่ทราบก่อนสร้าง CI ตัวอย่างเช่นการสร้าง CI โดยทางโปรแกรมอาจใส่องค์ประกอบที่ 4 ซึ่งเป็นหมายเลขบิลด์อัตโนมัติ (เช่นบิลด์ที่ 140 ในสาขา) อาจเป็นหมายเลขการแก้ไขใน VCS วิธีที่ดีที่สุดในการติดตามหมายเลขเวอร์ชันของซอฟต์แวร์คืออะไร ควรรักษาชิ้นส่วน "รู้จัก" …

8
ฉันจะโปรโมตการใช้รูปแบบเครื่องมือสร้างในทีมของฉันได้อย่างไร
codebase ของเรานั้นเก่าและโปรแกรมเมอร์ใหม่อย่างฉันเรียนรู้ที่จะทำอย่างที่มันทำเพื่อความสม่ำเสมอ เมื่อคิดว่าเราจะต้องเริ่มต้นที่ไหนสักแห่งฉันก็เลยทำมันเองเพื่อสร้างคลาสของตัวยึดข้อมูลอีกครั้ง: ลบเมธอด setter และสร้างฟิลด์ทั้งหมดfinal(ฉันใช้ " finalดี" ตามหลักการ) ตัวตั้งค่าถูกใช้เฉพาะในตัวสร้างเมื่อมันปรากฏออกดังนั้นสิ่งนี้จึงไม่มีผลข้างเคียง แนะนำคลาส Builder คลาส Builder นั้นจำเป็นเนื่องจากตัวสร้าง (ซึ่งเป็นสิ่งที่ให้การรีแฟคเตอร์ใหม่ในตอนแรก) ครอบคลุมโค้ดประมาณ 3 บรรทัด แต่ก็มีจำนวนมากของพารามิเตอร์ โชคดีที่มีมันเพื่อนร่วมทีมของฉันกำลังทำงานในโมดูลอื่นและเกิดขึ้นเพื่อต้องการผู้ตั้งค่าเนื่องจากค่าที่เขาต้องการนั้นมีอยู่ในจุดต่าง ๆ ในการไหล ดังนั้นรหัสดูเหมือนว่านี้: public void foo(Bar bar){ //do stuff bar.setA(stuff); //do more stuff bar.setB(moreStuff); } ฉันเป็นที่ถกเถียงกันอยู่ว่าเขาควรจะใช้ผู้สร้างแทนเพราะการกำจัด setters ทำให้ทุ่งนาไม่สามารถเปลี่ยนแปลงได้ (พวกเขาเคยได้ยินว่าฉันโกรธมากเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้ก่อนหน้านี้) และเพราะผู้สร้างอนุญาตให้สร้างวัตถุ ฉันร่างรหัสเทียมต่อไปนี้: public void foo(Bar bar){ try{ bar.setA(a); //enter exception-throwing …

4
เมื่อพูดฉันจะพูดได้อย่างไรว่าลำดับความซับซ้อนของเวลาของอัลกอริทึมคือ O (N log N)
คำใดที่ฉันสามารถใช้เพื่ออธิบายบางสิ่งบางอย่างที่มีความซับซ้อน O (N log N) ตัวอย่างเช่น: O (1): คงที่ O (บันทึก N): ลอการิทึม O (N): เป็นเส้นตรง O (N log N): ?????? O (N 2 ): กำลังสอง O (N 3 ): ลูกบาศก์

4
ทำไมไม่เพียงแค่สร้างแบบสอบถามที่ไม่ใช่พารามิเตอร์ส่งคืนข้อผิดพลาด?
การฉีด SQL เป็นปัญหาด้านความปลอดภัยที่ร้ายแรงเป็นส่วนใหญ่เพราะง่ายต่อการเข้าใจผิด: วิธีที่ชัดเจนและใช้งานง่ายในการสร้างแบบสอบถามที่มีการป้อนข้อมูลของผู้ใช้ทำให้คุณมีความเสี่ยงและวิธีที่ถูกต้องในการลดความแปรปรวน แบบสอบถามและการฉีด SQL ก่อน ดูเหมือนกับฉันว่าวิธีที่ชัดเจนในการแก้ไขปัญหานี้ก็คือการปิดตัวเลือกที่ชัดเจน (แต่ผิด): แก้ไขเอ็นจิ้นฐานข้อมูลเพื่อให้แบบสอบถามใด ๆ ที่ได้รับซึ่งใช้ค่าตายตัวในส่วนคำสั่ง WHERE แทนที่จะเป็นพารามิเตอร์ ข้อความแสดงข้อผิดพลาดแจ้งให้คุณใช้พารามิเตอร์แทน สิ่งนี้จะต้องมีตัวเลือกในการยกเลิกเพื่อให้สิ่งต่าง ๆ เช่นแบบสอบถาม ad-hoc จากเครื่องมือการดูแลระบบจะยังคงทำงานได้อย่างง่ายดาย แต่ควรเปิดใช้งานตามค่าเริ่มต้น การมีสิ่งนี้จะทำให้การฉีด SQL เย็นลงเกือบข้ามคืน แต่เท่าที่ฉันรู้ไม่มี RDBMS ทำสิ่งนี้ได้จริง มีเหตุผลที่ดีทำไมไม่
22 security  sql  rdbms 

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