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

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

4
ทำไมการพัฒนาขับเคลื่อนทดสอบจึงขาดหายไปจากการทดสอบของ Joel
ผมอ่านบล็อกนี้โดยโจ Spolsky เกี่ยวกับ12 ขั้นตอนในการรหัสที่ดีกว่า การขาดการทดสอบพัฒนาขับเคลื่อนทำให้ฉันประหลาดใจจริงๆ ดังนั้นฉันต้องการส่งคำถามไปยังปรมาจารย์ TDD ไม่คุ้มค่ากับความพยายามหรือไม่?

2
เป็นความคิดที่ดีหรือไม่ที่จะให้ลายเซ็นฟังก์ชันที่แตกต่างกันซึ่งทำสิ่งเดียวกัน
นี่คือคลาส C ++ ที่สร้างขึ้นด้วยค่าสามค่า class Foo{ //Constructor Foo(std::string, int, char); private: std::string foo; char bar; int baz; }; ชนิดพารามิเตอร์ทั้งหมดแตกต่างกัน ฉันสามารถสร้างคอนสตรัคเตอร์มากเกินไปเพื่อให้ลำดับนั้นไม่สำคัญ class Foo{ //Constructors Foo(std::string, char, int); Foo(std::string, int, char); Foo(char, int, std::string); Foo(char, std::string, int); Foo(int, std::string, char); Foo(int, char, std::string); private: std::string foo; char bar; int baz; }; แต่นั่นเป็นความคิดที่ดี? …

5
การทดสอบหน่วยในโลก“ ไม่มีตัวตั้ง”
ฉันไม่คิดว่าตัวเองเป็นผู้เชี่ยวชาญ DDD แต่ในฐานะสถาปนิกโซลูชันพยายามใช้แนวทางปฏิบัติที่ดีที่สุดเท่าที่จะทำได้ ฉันรู้ว่ามีการถกเถียงกันอย่างมากมายเกี่ยวกับ "สไตล์" setter ของมือโปรและผู้ต่อต้านใน DDD และฉันสามารถเห็นการโต้แย้งทั้งสองด้าน ปัญหาของฉันคือฉันทำงานเป็นทีมที่มีทักษะความรู้และประสบการณ์ที่หลากหลายซึ่งหมายความว่าฉันไม่สามารถไว้วางใจได้ว่านักพัฒนาทุกคนจะทำสิ่งที่ "ถูกต้อง" ตัวอย่างเช่นหากวัตถุโดเมนของเราได้รับการออกแบบเพื่อให้การเปลี่ยนแปลงสถานะภายในของวัตถุดำเนินการโดยวิธีการ แต่ให้ผู้ตั้งค่าทรัพย์สินสาธารณะบางคนจะหลีกเลี่ยงไม่ได้ตั้งค่าคุณสมบัติแทนการเรียกวิธีการ ใช้ตัวอย่างนี้: public class MyClass { public Boolean IsPublished { get { return PublishDate != null; } } public DateTime? PublishDate { get; set; } public void Publish() { if (IsPublished) throw new InvalidOperationException("Already published."); PublishDate = DateTime.Today; …

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

3
ทำไมมัลติเธรดถึงเป็นที่ต้องการสำหรับการปรับปรุงประสิทธิภาพ?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 6 ปีที่แล้ว ฉันมีคำถามเกี่ยวกับสาเหตุที่โปรแกรมเมอร์ดูเหมือนว่าจะรักการทำงานพร้อมกันและโปรแกรมแบบมัลติเธรดโดยทั่วไป ฉันกำลังพิจารณา 2 วิธีหลักที่นี่: โดยทั่วไปแล้ววิธีการแบบอะซิงก์นั้นขึ้นอยู่กับสัญญาณหรือเพียงแค่วิธีการแบบอะซิงก์ที่ถูกเรียกโดยเอกสารและภาษาจำนวนมากเช่น C # 5.0 ใหม่และ "ด้ายร่วม" ที่จัดการนโยบายการส่งข้อมูลของคุณ วิธีการทำงานพร้อมกันหรือวิธีการหลายเธรด ฉันแค่จะบอกว่าฉันกำลังคิดเกี่ยวกับฮาร์ดแวร์ที่นี่และสถานการณ์กรณีที่เลวร้ายที่สุดและฉันได้ทดสอบกระบวนทัศน์ทั้งสองนี้ด้วยตัวเองกระบวนทัศน์แบบ async เป็นผู้ชนะ ณ จุดที่ฉันไม่เข้าใจว่าทำไมคนถึง 90% พูดคุยเกี่ยวกับมัลติเธรดเมื่อพวกเขาต้องการเพิ่มความเร็วของสิ่งต่าง ๆ หรือใช้ทรัพยากรให้เกิดประโยชน์ ฉันได้ทดสอบโปรแกรมแบบมัลติเธรดและโปรแกรม async บนเครื่องเก่าด้วย Intel quad-core ที่ไม่ได้มีตัวควบคุมหน่วยความจำภายในซีพียูหน่วยความจำได้รับการจัดการทั้งหมดโดยเมนบอร์ดในกรณีนี้การแสดงที่น่ากลัวกับ แอ็พพลิเคชันแบบมัลติเธรดแม้จำนวนเธรดที่ค่อนข้างต่ำเช่น 3-4-5 อาจเป็นปัญหาแอ็พพลิเคชันไม่ตอบสนองและเป็นเพียงช้าและไม่เป็นที่พอใจ วิธี async ที่ดีคือในอีกทางหนึ่งอาจไม่เร็วขึ้น แต่ก็ไม่ได้แย่ที่สุดแอปพลิเคชันของฉันรอผลและไม่แฮงค์มันตอบสนองและมีการปรับขนาดที่ดีขึ้นมาก ฉันได้ค้นพบว่าการเปลี่ยนแปลงบริบทในโลกของเธรดนั้นไม่ได้ราคาถูกในสถานการณ์โลกแห่งความเป็นจริงมันค่อนข้างแพงโดยเฉพาะอย่างยิ่งเมื่อคุณมีเธรดมากกว่า 2 เธรดที่ต้องวนรอบและสลับระหว่างกันเพื่อคำนวณ ในซีพียูสมัยใหม่สถานการณ์มันไม่ได้แตกต่างกันจริงๆตัวควบคุมหน่วยความจำที่รวมเข้าด้วยกัน แต่ประเด็นของฉันคือซีพียู …

5
ทำไมผู้ใช้ Git ถึงบอกว่าการโค่นล้มไม่มีซอร์สโค้ดทั้งหมดในเครื่อง?
ฉันแค่ทำตามที่ฉันอ่านดังนั้นยกโทษให้ฉัน แต่ทั้งหมดที่ฉันอ่านบอกว่าข้อดีอย่างหนึ่งที่สำคัญของ Git over Subversion คือ Git มอบโค้ดต้นฉบับทั้งหมดให้กับนักพัฒนาในพื้นที่โดยไม่ต้องทำอะไรเลย เซิฟเวอร์. ด้วยการใช้ SVN และ TortoiseSVN ที่ จำกัด ของฉันฉันมีซอร์สโค้ดทั้งหมดหรืออย่างน้อยฉันก็คิดว่าฉันทำ ตัวอย่างเช่นฉันมีเว็บไซต์ ฉันอัปโหลดไปยัง SVN ฉันยังคงเปิดใช้งานเว็บไซต์ของฉันอยู่ภายในเครื่องใช่ไหม หากมีคนส่งการเปลี่ยนแปลง แต่ฉันไม่ได้เชื่อมต่อจะไม่เป็นไรถ้าฉันมี Git หรือไม่จนกว่าฉันจะเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้ง ฉันไม่เข้าใจ. ฉันไม่ได้ขอให้มีการรีบาวด์หนึ่งกับอีกอันหนึ่งยกเว้นจุดนี้
23 git  svn 

1
seq ใช้บ่อยแค่ไหนในรหัสการผลิต Haskell
ฉันมีประสบการณ์ในการเขียนเครื่องมือขนาดเล็กใน Haskell และฉันพบว่ามันใช้งานง่ายมากโดยเฉพาะการเขียนตัวกรอง (โดยใช้interact) ที่ประมวลผลอินพุตมาตรฐานและไพพ์ไปยังเอาต์พุตมาตรฐาน เมื่อเร็ว ๆ นี้ฉันพยายามใช้ตัวกรองดังกล่าวกับไฟล์ที่มีขนาดใหญ่กว่าปกติประมาณ 10 เท่าและฉันพบStack space overflowข้อผิดพลาด หลังจากอ่านบางส่วน (เช่นที่นี่และที่นี่ ) ฉันได้ระบุแนวทางสองข้อเพื่อประหยัดพื้นที่สแต็ก (Haskellers ที่มีประสบการณ์โปรดแก้ไขให้ฉันถ้าฉันเขียนสิ่งที่ไม่ถูกต้อง): หลีกเลี่ยงการเรียกฟังก์ชั่นแบบเรียกซ้ำที่ไม่ใช่แบบเรียกซ้ำ (ใช้ได้กับทุกภาษาที่ใช้งานได้ซึ่งรองรับการปรับให้เหมาะสมแบบหางเรียก) แนะนำseqให้บังคับให้มีการประเมินผลก่อนของนิพจน์ย่อยเพื่อให้นิพจน์ไม่ใหญ่เกินไปก่อนที่จะถูกลดขนาดลง (นี่เป็นลักษณะเฉพาะของ Haskell หรืออย่างน้อยก็สำหรับภาษาที่ใช้การประเมินแบบขี้เกียจ) หลังจากแนะนำการseqโทรห้าหรือหกครั้งในรหัสของฉันเครื่องมือของฉันจะทำงานได้อย่างราบรื่นอีกครั้ง (เช่นเดียวกับข้อมูลขนาดใหญ่) อย่างไรก็ตามฉันพบว่ารหัสต้นฉบับอ่านง่ายขึ้นอีกเล็กน้อย เนื่องจากฉันไม่ใช่โปรแกรมเมอร์ Haskell ที่มีประสบการณ์ฉันต้องการถามว่าการแนะนำseqด้วยวิธีนี้เป็นวิธีปฏิบัติทั่วไปหรือไม่และบ่อยครั้งที่บุคคลทั่วไปจะเห็นseqในรหัสการผลิต Haskell หรือมีเทคนิคใดบ้างที่อนุญาตให้หลีกเลี่ยงการใช้seqบ่อยเกินไปและยังคงใช้พื้นที่สแต็กน้อย?

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

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

3
การตั้งชื่อวิธีการ "ทำ X ถ้าจำเป็น"
เป็นวิธีที่ดีในการตั้งชื่อวิธีการที่ตรวจสอบว่า X จะต้องทำคืออะไรและ X มันถ้าจำเป็น? ตัวอย่างเช่นวิธีตั้งชื่อวิธีการที่จะอัพเดทรายชื่อผู้ใช้หากผู้ใช้ใหม่ได้เข้าสู่ระบบ? UpdateListIfNeededดูเหมือนจะนานเกินไปในขณะที่ความเรียบง่ายUpdateListหมายถึงการดำเนินการที่อาจมีราคาแพงและไม่จำเป็นทุกครั้ง EnsureListUpdatedเป็นตัวแปรเช่นกัน C # มีbool TryXXX(args, out result)รูปแบบ (เช่นint.TryParse(str, out num)) เพื่อตรวจสอบว่า X เป็นไปได้และทำมัน แต่นั่นแตกต่างอย่างละเอียด

5
สำเร็จ: / ล้มเหลว: บล็อก vs เสร็จสมบูรณ์: บล็อก
ฉันเห็นรูปแบบทั่วไปสองแบบสำหรับบล็อกใน Objective-C หนึ่งคือคู่ของความสำเร็จ: / ความล้มเหลว: บล็อกอื่น ๆ คือความสมบูรณ์เดียว: บล็อก ตัวอย่างเช่นสมมติว่าฉันมีงานที่จะส่งคืนวัตถุแบบอะซิงโครนัสและงานนั้นอาจล้มเหลว -taskWithSuccess:(void (^)(id object))success failure:(void (^)(NSError *error))failureรูปแบบแรกคือ -taskWithCompletion:(void (^)(id object, NSError *error))completionรูปแบบที่สองคือ ความสำเร็จ: / ความล้มเหลว: [target taskWithSuccess:^(id object) { // W00t! I've got my object } failure:^(NSError *error) { // Oh noes! report the failure. }]; เสร็จ: [target taskWithCompletion:^(id object, NSError …

5
วิธีใช้ประวัติรหัสผ่านที่ปลอดภัย
รหัสผ่านไม่ควรถูกจัดเก็บในข้อความล้วนเพื่อเหตุผลด้านความปลอดภัยที่ชัดเจน: คุณต้องเก็บแฮชและคุณควรสร้างแฮชอย่างระมัดระวังเพื่อหลีกเลี่ยงการโจมตีตารางรุ้ง อย่างไรก็ตามโดยปกติคุณมีข้อกำหนดในการจัดเก็บรหัสผ่านnล่าสุดและบังคับใช้ความซับซ้อนน้อยที่สุดและเปลี่ยนแปลงเล็กน้อยระหว่างรหัสผ่านที่แตกต่างกัน (เพื่อป้องกันผู้ใช้จากการใช้ลำดับเช่น Password_1, Password_2, ... , Password_ n ) นี่จะเป็นเรื่องไม่สำคัญกับรหัสผ่านแบบข้อความธรรมดา แต่คุณจะทำเช่นนั้นได้อย่างไรโดยการเก็บเฉพาะแฮช ในคำอื่น ๆ : วิธีการใช้กลไกประวัติรหัสผ่านที่ปลอดภัย?

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

9
การปรับปรุงโดยไม่มีที่ปรึกษา [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว แม้ว่าฉันจะคิดว่าตัวเองไม่ค่อยมีประสบการณ์ แต่ฉันยังคงลงจอดในตำแหน่งผู้นำ แต่อย่างใด (ในปัจจุบันฉันเป็นผู้อำนวยการด้านเทคโนโลยีของ บริษัท ในอดีตที่ผ่านมาฉันเป็นหัวหน้าแผนกวิจัยและพัฒนา) ฉันเข้าใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น (ฉันมีชุดทักษะเฉพาะบางอย่างและฉันใช้ภาษาการเขียนโปรแกรมผิดปกติบางอย่าง) ปัญหาของฉันคือ: ฉันไม่สามารถหาที่ปรึกษา ... ฉันรู้ว่าจะต้องมีสิ่งที่ฉันเรียนรู้และฉันสังเกตเห็นว่าในขณะที่ฉันทำงานในช่วงหลายปีที่ฉันเรียนรู้ช้าลงเรื่อย ๆ แต่ฉันเชื่อว่ามีวิธีที่จะทำให้เร็วกว่าการเข้ารหัส ... ดังนั้นฉันจะปรับปรุงอย่างไรเมื่อไม่มีบุคคลอื่นใน บริษัท สอนฉันหรือให้ฉันอ่านรหัสของพวกเขา (หรือแก้ไขรหัสได้แม้ ... ) ฉันคิดว่าฉันเป็นมากกว่าหนังสือ แต่อยู่ต่ำกว่าระดับ "ปรมาจารย์" ดังนั้นฉันจึงไม่ทราบว่าจะเรียนรู้เพิ่มเติมได้ที่ไหน

11
เหตุใดจึงจำเป็นต้องทดสอบแอพ iPhone ของฉันบนอุปกรณ์ iPhone จริง
ฉันพัฒนาแอปพลิเคชั่นหนึ่งสำหรับ iPhone และตอนนี้ฉันต้องการมันบน App Store เพื่อน iOS ที่มีปัญหาทางด้านวิทยาศาสตร์ของฉันบอกให้ฉันทดสอบบนอุปกรณ์จริงเช่นบน iPhone ดังนั้นฉันจึงสงสัยว่าเหตุใดจึงจำเป็นต้องทดสอบแอพ iPhone ของฉันบนอุปกรณ์ iPhone จริง ๆ (แม้ว่าพวกเขา (Apple) จะให้ "simulator" ซึ่งใกล้เคียงกับอุปกรณ์ของฉันหรือไม่
23 testing  iphone  ios 

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