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

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

1
การจับคู่รูปแบบใน Clojure vs Scala
อะไรคือความแตกต่างที่สำคัญระหว่างการจับคู่รูปแบบในสองภาษานี้ ฉันไม่ได้อ้างถึงไวยากรณ์ แต่ความสามารถรายละเอียดการใช้งานขอบเขตการใช้งานและความจำเป็น แอปพลิเคชัน Scala (เช่น. ยกและเล่น) พูดอย่างภาคภูมิใจเกี่ยวกับรูปแบบภาษาที่ตรงกับความกล้าหาญ ในทางกลับกัน Clojure มีห้องสมุด core.match และสร้างขึ้นในการทำลายซึ่งดูเหมือนว่ามีประสิทธิภาพ * หมายเหตุ: เหตุผลที่ฉันได้รับแรงบันดาลใจในการถามคำถามนี้เป็นเพราะการโพสต์บล็อกที่ฉันเห็นซึ่งโปรแกรมเมอร์ในการทดลองสร้างล่ามเสียงกระเพื่อมโดยใช้ทั้ง Scala และ Clojure เขาบอกว่าการแข่งขัน Clojure แตกหลังจากช่วงระยะเวลาหนึ่ง แต่ไม่สามารถอธิบายได้ว่าทำไม แต่ฉันอยากรู้จริงๆ คุณสามารถค้นหาโพสต์นี้ได้ที่นี่: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

9
โปรแกรมที่ไม่มีข้อผิดพลาดตามหลักวิชา
ฉันได้อ่านบทความมากมายที่ระบุว่ารหัสไม่สามารถปราศจากข้อบกพร่องและพวกเขากำลังพูดถึงทฤษฎีบทเหล่านี้: ปัญหาการหยุดชะงัก ทฤษฎีความไม่สมบูรณ์ของGödel ทฤษฎีบทของข้าว อันที่จริงทฤษฎีบทของไรซ์ดูเหมือนว่ามีความหมายของปัญหาการหยุดชะงักและปัญหาการหยุดชะงักอยู่ในความสัมพันธ์ใกล้ชิดกับทฤษฎีบทที่ไม่สมบูรณ์ของGödel สิ่งนี้หมายความว่าทุกโปรแกรมจะมีพฤติกรรมที่ไม่ตั้งใจอย่างน้อยหนึ่งรายการหรือไม่ หรือหมายความว่าไม่สามารถเขียนรหัสเพื่อยืนยันได้ สิ่งที่เกี่ยวกับการตรวจสอบแบบเรียกซ้ำ? สมมติว่าฉันมีสองโปรแกรม ทั้งคู่มีข้อบกพร่อง แต่ไม่มีข้อผิดพลาดร่วมกัน จะเกิดอะไรขึ้นถ้าฉันเรียกใช้พร้อมกัน และแน่นอนว่าการพูดคุยส่วนใหญ่พูดถึงเครื่องทัวริง สิ่งที่เกี่ยวกับระบบอัตโนมัติเชิงเส้นตรง (คอมพิวเตอร์จริง)?
12 bug  theory 

2
กลยุทธ์ในการแก้ไขข้อผิดพลาดที่เกิดขึ้นกับอุปกรณ์เฉพาะเท่านั้น
ในฐานะนักพัฒนา Android ตลาดเป้าหมายที่ฉันสร้างแอพนั้นมีการแยกส่วนมาก ในขณะที่ฉันสามารถระบุข้อกำหนดบางอย่าง - เช่นแอพของฉันรองรับเฉพาะรุ่น Android xx หรือสูงกว่าบางครั้งข้อผิดพลาดอาจเกิดขึ้นที่เห็นได้ชัดในรุ่นโทรศัพท์รุ่นใดรุ่นหนึ่งเท่านั้น มีกลยุทธ์ใดบ้างที่จะจัดการกับข้อผิดพลาดเฉพาะอุปกรณ์โดยไม่ต้องซื้อโทรศัพท์ที่มีปัญหา? เรามีชุดโทรศัพท์สำหรับการทดสอบ แต่ไม่สามารถออกไปซื้อโทรศัพท์ใหม่ได้เมื่อผู้ใช้ 2 หรือ 3 คนรายงานว่ามีข้อผิดพลาดที่เกิดขึ้นเฉพาะกับรุ่นโทรศัพท์ของพวกเขาเท่านั้น ฉันแน่ใจว่านักพัฒนาซอฟต์แวร์ Android คนอื่น ๆ พบปัญหาที่คล้ายกันในอดีตและฉันอยากรู้ว่ากลยุทธ์ที่ประหยัดต้นทุนมีไว้เพื่อช่วยกำจัดข้อบกพร่องเฉพาะอุปกรณ์ อัปเดตเพื่อเพิ่มรายละเอียดเล็กน้อย: ฉันใช้Bugsenseเพื่อบันทึกรายงานข้อผิดพลาดดังนั้นทุกครั้งที่มีข้อยกเว้นเกิดขึ้นฉันจะทราบรุ่นของโทรศัพท์การติดตามสแต็คจำนวนครั้งที่เกิดขึ้นกับผู้ใช้ของฉันและรายละเอียดอื่น ๆ ผู้ใช้อาจอยู่ในประเทศที่แตกต่างกันดังนั้นฉันไม่สามารถคิดได้ว่าฉันจะสามารถยืมโทรศัพท์ได้ ลองนึกภาพสถานการณ์เช่นนี้:ผู้ใช้ 100 คนได้ติดตั้งแอป แต่มีคนสามคนบ่นว่าปุ่มไม่ทำงานอย่างถูกต้องเมื่อกด ไม่มีรุ่นโทรศัพท์ที่ฉันมีสำหรับการทดสอบพบปัญหา ดูเหมือนจะไม่มีโปรแกรมจำลองสำหรับรุ่นโทรศัพท์ที่มีปัญหา

1
วิธีการเรียนรู้แบบ Heuristic สำหรับการนำ DIFF แบบยืดหยุ่นมาใช้
ฉันได้สร้างการใช้ DIFF เพื่อเปรียบเทียบการแก้ไขเอกสารในที่ทำงาน มันขึ้นอยู่กับมี O (ND) ความแตกต่างขั้นตอนวิธีการและรูปแบบของมัน สิ่งหนึ่งที่มีความสำคัญคือการบันทึกรายการการเปลี่ยนแปลงและตีความให้เป็นข้อความที่มนุษย์อ่านได้ ในขณะที่อัลกอริทึมในปัจจุบันมีประสิทธิภาพมากมันก็มากจนยากที่จะขยาย คำถามสั้น ๆ ฉันคิดถึงการพยายามใช้ A * และฮิวริสติกที่เพิ่มบทลงโทษสำหรับ "การเปลี่ยน" แนวคิดที่จะทำให้เรียบโดยไม่จำเป็น "เพิ่มลบเพิ่มลบเพิ่มลบ" เพื่อให้ง่ายต่อการแยกวิเคราะห์เป็นสิ่งที่มนุษย์สามารถอ่านได้ โดยทั่วไปเปลี่ยนปัญหาเส้นทางที่สั้นที่สุดของฉันให้เป็นปัญหาเส้นทางที่ง่ายที่สุด และแน่นอนไม่สร้างผลลัพธ์ที่ "ลบทุกอย่างเพิ่มทุกอย่าง " เสมอ เสียงนี้สมเหตุสมผลหรือไม่ มีความสำคัญสำหรับการใช้ฮิวริสติกในการนำ DIFF ไปใช้หรือไม่? ฮิวริสติกคืออะไร? ปัญหา: หากมีการลบประโยคยาวและประโยคยาวอื่นถูกลบออก แต่พวกเขาแบ่งปันอย่างน้อยหนึ่งคำให้พูดว่า "with" การออกจากคำทั่วไปเพียงอย่างเดียว (ไม่ใช่ทั้งการเพิ่มและการลบ) จะเป็นการสร้างเส้นทางที่สั้นที่สุด อย่างไรก็ตามนี่เป็นเพียงแค่ทำให้งงงวยบริบทของการเปลี่ยนแปลงกับมนุษย์พยายามอ่านพิมพ์จากการเปลี่ยนแปลง ตัวอย่างด้วย DIFF ปัจจุบัน: ข้อความเก่า: สะอาด: Powerwash และเป่าให้แห้งด้วยอากาศในร้าน ข้อความใหม่: ล้าง: เช็ดด้วยอะซิโตนและผ้าสำลีฟรี เปลี่ยนรายการบันทึกย่อ: เปลี่ยน "Powerwash …

1
จุดประสงค์ของโซนสีแดงคืออะไร?
Red zone เป็นพื้นที่ขนาดคงที่ในหน่วยความจำเกินกว่าตัวชี้สแต็กที่ยังไม่ได้ "จัดสรร" คอมไพเลอร์สร้างแอสเซมบลีเพื่อเข้าถึงพื้นที่นั้นในฟังก์ชันใบไม้แบบง่าย แต่ฉันไม่เห็นข้อได้เปรียบที่แท้จริงของเขตสีแดง หน่วยความจำเข้าถึงเกินตัวชี้สแต็คเป็นสิ่งที่อันตรายมากและสามารถนำไปสู่ความเสียหายของข้อมูล ทำไมถึงทำเช่นนี้? การบันทึกคำสั่งของโปรเซสเซอร์ 2 ตัว (push ebp; mov ebp esp) จะไม่ทำให้ความเร็วเพิ่มขึ้นจริง
12 assembly  stack 

4
ฟังก์ชั่นสมาชิกกับฟังก์ชั่นที่ไม่ใช่สมาชิกสำหรับผู้ประกอบการคณิตศาสตร์
ฉันกำลังเขียนห้องสมุดพีชคณิตเชิงเส้น (เรื่องสั้นสั้น ๆ มันเป็นโรงเรียนที่ได้รับมอบหมาย) ที่เกี่ยวข้องกับเมทริกซ์เวกเตอร์ ฯลฯ ในกระบวนการสร้างห้องสมุดนี้ฉันจะต้องสร้างฟังก์ชั่นที่ดำเนินการทางคณิตศาสตร์กับวัตถุ ตัวอย่างเช่น transpose matrix, invert matrix, normalize vector และอื่น ๆ ฉันสงสัยว่า "วิธีปฏิบัติที่ดีที่สุด" สำหรับฟังก์ชั่นประเภทนี้คืออะไรนั่นคือฉันควรทำให้ฟังก์ชั่นเป็นฟังก์ชันสมาชิกหรือไม่เป็นสมาชิกหรือไม่? (เพื่อความชัดเจน / ใช้ประโยชน์สาเก) ตัวอย่าง: //Member function way: B = A.transpose(); C = A.inverse(); //Non-member function way: B = linalg::transpose(A); //Non-member transpose function in linear algebra namespace C = linalg::inverse(A); มีมาตรฐานเกี่ยวกับการดำเนินการหลายประเภทบ้างไหม? หรืออย่างน้อยก็มีวิธีธรรมดา …
12 c++  libraries  methods 

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

2
วิธีที่ดีที่สุดในการซ่อนรหัส API ในซอร์สโค้ด
ฉันต้องการแนวคิดในการปกป้องคีย์ API ส่วนตัวในแอปพลิเคชันโดยเฉพาะในแอปพลิเคชัน ac # .NET ประการแรกฉันเข้าใจว่าในทางทฤษฎีมันเป็นไปไม่ได้ที่จะซ่อนอะไรในซอร์สโค้ดดังนั้นฉันจึงคิดความคิดอื่น แต่ฉันไม่แน่ใจว่ามันเป็นไปได้จริง อย่างไรก็ตามมีความเป็นไปได้ไหมที่จะสื่อสารกับเว็บเซิร์ฟเวอร์เพื่อตรวจสอบรหัสส่วนตัวจากนั้นพูดคุยกลับไปที่แอปพลิเคชันเพื่อยืนยันว่าเป็นการจับมือที่ถูกกฎหมายหรือไม่ ฉันมีสองปุ่มที่จะทำงานกับ: กุญแจสาธารณะ (ตามชื่อที่แนะนำมันไม่จำเป็นต้องได้รับการดูแลเช่นเดียวกับความเป็นส่วนตัว) และกุญแจส่วนตัวที่ต้องได้รับการรักษาความปลอดภัยจากผู้อื่น ความคิดเห็นใด ๆ เกี่ยวกับวิธีที่ฉันสามารถทำได้จะได้รับการชื่นชมอย่างมาก
12 c#  api  authentication 

3
Python - ยืนยันกับ if & return
ฉันกำลังเขียนสคริปต์ที่ทำบางสิ่งบางอย่างกับไฟล์ข้อความ (สิ่งที่ไม่เกี่ยวข้องกับคำถามของฉัน) ดังนั้นก่อนที่ฉันจะทำบางสิ่งกับไฟล์ฉันต้องการตรวจสอบว่ามีไฟล์อยู่หรือไม่ ฉันสามารถทำสิ่งนี้ได้โดยไม่มีปัญหา แต่ปัญหาคือความสวยงาม นี่คือรหัสของฉันใช้สิ่งเดียวกันในสองวิธีที่แตกต่างกัน def modify_file(filename): assert os.path.isfile(filename), 'file does NOT exist.' Traceback (most recent call last): File "clean_files.py", line 15, in <module> print(clean_file('tes3t.txt')) File "clean_files.py", line 8, in clean_file assert os.path.isfile(filename), 'file does NOT exist.' AssertionError: file does NOT exist. หรือ: def modify_file(filename): if not os.path.isfile(filename): return …

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

4
มีวิธีที่ดีกว่าในการเขียนการทดสอบหน่วยกว่าชุดของ 'AssertEquals' หรือไม่?
นี่คือตัวอย่างพื้นฐานของการทดสอบหน่วยของฉันที่ต้องใช้โดยใช้ qunit: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <link rel="stylesheet" href="qunit/qunit-1.13.0.css"> <script src = "qunit/qunit-1.13.0.js"></script> <script src = "../js/fuzzQuery.js"></script> <script> test("Fuzz Query Basics", function() { equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)"); equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1"); equal(fuzzQuery("Jon"), "Jon~"); //etc } ); </script> </head> <body> …

3
ฉันควรทำเครื่องหมายประเภทในโปรแกรม C และ C ++ อย่างไร
ในคำตอบของฉันฉันใช้_tเมื่อสิ้นสุดประเภทซึ่งจบลงอย่างดีที่สุดแย้ง นี่คือแนวทางปฏิบัติที่ฉันใช้ในโครงการปัจจุบันของฉัน typedef struct { int x; int y; } point_t; ครั้งนี้มีวัตถุประสงค์เพื่อให้สอดคล้องกับประเภท C จากstddef.hชอบหรือsize_t ptrdiff_tอย่างไรก็ตามตามความคิดเห็นบางอย่างในคำถามของฉัน_tpostfix ดูเหมือนจะถูกสงวนไว้สำหรับ POSIX ฉันควรใช้อะไรแทน_t? หรือฉันควรใช้_tต่อไปหรือไม่? คำถามนี้สำหรับทั้ง C และ C ++ หากภาษาเหล่านี้มีการประชุมที่แตกต่างกันอย่าลังเลที่จะตอบคำถาม
12 c++  c  naming 

1
RESTful API ควรแยกกันอย่างไร
ฉันไม่เคยสร้าง RESTful API มาก่อนและฉันสงสัยว่ามันควรแยกออกจากกันอย่างไร ตัวอย่างเช่นสมมติว่าฉันมีลูกค้าที่มีชื่อที่อยู่หมายเลขโทรศัพท์ที่อยู่อีเมลภาษา ฯลฯ มันสมเหตุสมผลหรือไม่ที่มีวิธีอัปเดตแต่ละฟิลด์ (อัปเดตที่อยู่อัปเดตที่อยู่อีเมล ฯลฯ ) หรือควรจะมีการอัปเดตเดียวสำหรับลูกค้าทั้งหมดและแต่ละฟิลด์เป็นฟิลด์เสริมหรือไม่
12 api  rest 

3
มีหลักการวิศวกรรมซอฟต์แวร์ที่เกี่ยวข้องกับการใช้ซ้ำและการทดสอบการถดถอยในระบบการผลิตหรือไม่?
ฉันทำงานกับระบบธุรกรรมทางการเงินขนาดใหญ่สำหรับธนาคารที่ดูแลเงินบำนาญและการลงทุน หลังจากการเปลี่ยนแปลงคุณสมบัติ 15 ปีค่าใช้จ่ายในการทดสอบการถดถอยแบบแมนนวลก็เพิ่มขึ้นเป็น $ 200K ต่อการเปิดตัว (10M LOC ทำธุรกรรม $ 10M ต่อวัน) ระบบนี้ยังเชื่อมต่อกับ 19 ระบบอื่น ๆ ทั่ว บริษัท ที่ย้ายข้อมูลจำนวนมาก ระบบนี้ถูกนำไปใช้ใน Java อย่างไรก็ตามสิ่งที่เราสังเกตคือยิ่งเราใช้ค่าใช้จ่ายในการทดสอบการถดถอยมากขึ้น (เหตุผลที่คุณต้อง "ทดสอบรหัสที่คุณแตะ" - และรหัสที่ใช้ซ้ำ / แชร์จะส่งผลกระทบต่อสถานที่หลายแห่งเมื่อมีการแตะต้องดังนั้นแม้จะมี 'DRY - อย่าทำซ้ำตัวเอง' - นั่นคืออย่าคัดลอกและวางรหัส - เราสังเกตสิ่งจูงใจทางการเงินเพื่อคัดลอกและวางรหัสนี่คือการลดค่าใช้จ่ายในการทดสอบการถดถอยเนื่องจากเราไม่ต้องการแก้ไขรหัสที่สามารถแชร์ได้เพราะจะทำให้เกิดผลกระทบการทดสอบการถดถอยครั้งใหญ่) คำถามของฉันคือมีหลักการวิศวกรรมซอฟต์แวร์ที่อธิบายความสัมพันธ์ระหว่างต้นทุนการทดสอบซ้ำและการถดถอยซ้ำหรือไม่ เหตุผลที่ฉันถามคำถามนี้คือเนื้อหามีประโยชน์ต้นทุนในการย่อยสลายระบบเป็นส่วนเล็ก ๆ ที่จะทดสอบ สมมติฐาน: 'การทดสอบการถดถอย' หมายถึง 'การทดสอบการยอมรับ' - นั่นคืออีกกลุ่มใช้เวลาในการเขียนการทดสอบแบบเก่าและนำมาใช้ซ้ำกับระบบในนามของธุรกิจรวมถึงการตั้งค่าสภาพแวดล้อมและข้อมูล ฉันรู้ว่าปฏิกิริยาการกระตุกเข่าต่อค่าใช้จ่ายในการทดสอบการถดถอยครั้งใหญ่คือ 'การทดสอบอัตโนมัติมากขึ้น' นี่เป็นหลักการที่ดี ในสภาพแวดล้อมนี้มีความท้าทายสองประการ …

1
Open Close Principle (OCP) vs หลักการผกผันการพึ่งพา (DIP)
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างหลักการเปิด (OCP) และหลักการผกผันของการพึ่งพา (DIP) จากการวิจัยที่ฉันได้ทำบนอินเทอร์เน็ตจนถึงตอนนี้ฉันได้ข้อสรุปว่า 'DIP เป็นทางเลือกหนึ่งที่เราสามารถบรรลุ OCP' ฉันถูกใช่ไหม คุณสามารถยกตัวอย่างที่ไม่ทำตามกรมทรัพย์สินทางปัญญา แต่ติดตาม OCP ได้ไหม

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