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

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

4
การต่อสู้ - สมาชิกในทีมกำลังยุ่งกับอะไรในระหว่างการวิ่ง
ดังนั้นการวิ่งการต่อสู้เป็นช่วงเวลาที่แน่นอนในระหว่างที่ควรใช้ชุดคุณลักษณะเฉพาะ และทีมการต่อสู้ประกอบด้วยคนทุกคนที่มุ่งมั่นที่จะส่งมอบคุณสมบัติเหล่านั้นส่วนใหญ่พวกเขามักจะเป็นนักพัฒนาและทดสอบ เมื่อมีการจัดตั้งกฎเหล่านี้ขึ้นมาแล้วเราอาจสงสัยว่าคนเหล่านี้จะไม่ว่างในระหว่างการวิ่ง ในตอนต้นของการวิ่งนั้นยังไม่มีอะไรให้ทดสอบและในตอนท้ายของการวิ่งจะไม่มีอะไรเหลือหรือน้อยมากที่จะพัฒนา / แก้ไข ฉันได้เห็น 2 วิธีในการจัดการกับสิ่งนี้ แต่ดูเหมือนว่าไม่มีวิธีใดที่จะแก้ปัญหาได้อย่างเหมาะสม 1) ให้สมาชิกในทีมตัดสินใจว่าจะทำอย่างไรเมื่อใดก็ตามที่พวกเขาไม่ทำงาน จุดด้อย: หากสิ่งที่พวกเขาทำไม่ได้วางแผนอย่างทั่วถึง (เช่นการปรับโครงสร้างครั้งใหญ่การเปลี่ยนไปใช้กรอบการทดสอบใหม่) งานของพวกเขาอาจไร้ประโยชน์หรือติดอยู่ครึ่งทางผ่าน ในทางกลับกันการวางแผนงานดังกล่าวอาจใช้เวลานานและลูกค้าอาจรู้สึกผิดหวังที่เห็นทีมเสียเวลากับบางสิ่งที่ไม่ทำให้เกิดคุณค่าในทันที งานดังกล่าวมักไม่สามารถประมาณการได้อย่างทั่วถึงดังนั้นจึงเป็นเรื่องง่ายสำหรับคนที่ไม่มีหลักการจะใช้เวลาในการดูแมว YouTube โดยที่ไม่ต้องถูกสะท้อนบนกระดานต่อสู้หรือที่อื่น ๆ 2) ทำให้ห้องใน sprint เท่านั้นสำหรับการพัฒนาและเริ่มการทดสอบหลังจาก sprint เสร็จสิ้น (เมื่อนักพัฒนาเริ่มทำงานกับคุณสมบัติจาก sprint ถัดไป) จุดด้อย: ในขณะที่การพัฒนาฟีเจอร์สำหรับ sprint ปัจจุบันนักพัฒนาได้ฟุ้งซ่านโดยการแก้ไขบั๊กจากอันก่อนหน้านี้และพวกเขาสามารถล้มเหลวในการทำงานตามจำนวนที่คาดว่าจะทำได้ระหว่าง sprint ปัจจุบัน จำเป็นต้องมีบอร์ดต่อสู้สองอัน: หนึ่งอันสำหรับคุณสมบัติการวิ่งแบบปัจจุบันและอีกอันสำหรับข้อบกพร่องการวิ่งครั้งก่อน ดังนั้นคำถามของฉันคือ: วิธีแจกจ่ายงานอย่างถูกต้องระหว่างการวิ่งระหว่างผู้พัฒนาและผู้ทดสอบเพื่อให้ไม่มีใครทำงานมากเกินไปหรือจบลงโดยไม่มีงานทำ ณ จุดใด มีวิธีในการปรับปรุงวิธีการที่อธิบายข้างต้นหรือไม่ หรือมีวิธีใดที่ดีกว่า
33 agile  scrum  sprint 

5
ฉันจะสร้างและบังคับใช้สัญญาเพื่อการยกเว้นได้อย่างไร
ฉันพยายามโน้มน้าวให้ทีมของฉันอนุญาตให้ใช้ข้อยกเว้นใน C ++ แทนการส่งคืนบูลisSuccessfulหรือ enum ด้วยรหัสข้อผิดพลาด อย่างไรก็ตามฉันไม่สามารถตอบโต้คำวิจารณ์ของเขาได้ พิจารณาห้องสมุดนี้: class OpenFileException() : public std::runtime_error { } void B(); void C(); /** Does blah and blah. */ void B() { // The developer of B() either forgot to handle C()'s exception or // chooses not to handle it and let it go …
33 c++  exceptions 

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

6
การรักษาความปลอดภัยที่ดีสำหรับการจัดเก็บฐานข้อมูลที่สำคัญในแล็ปท็อปของนักพัฒนาคืออะไร?
เรามี givens ไม่กี่: นักพัฒนาต้องการจำลองฐานข้อมูลการผลิตบนเครื่องของพวกเขา นักพัฒนามีรหัสผ่านเพื่อกล่าวว่าฐานข้อมูลในไฟล์ App.config เราไม่ต้องการให้ข้อมูลในฐานข้อมูลดังกล่าวถูกบุกรุก แนวทางแก้ไขปัญหาที่แนะนำและข้อเสีย: เต็มรูปแบบดิสก์เข้ารหัส วิธีนี้จะช่วยแก้ปัญหาทั้งหมด แต่ลดประสิทธิภาพของแล็ปท็อปลงและเรากำลังเริ่มต้นขึ้นดังนั้นอย่ามีเงินสำหรับนักเขียน การสร้าง VM ด้วยฮาร์ดดิสก์ที่เข้ารหัสและเก็บฐานข้อมูลไว้ มันใช้งานได้ดี แต่ก็ไม่ได้ช่วยอะไรมากนักเนื่องจากมีรหัสผ่านใน Web.Config โซลูชันหมายเลข 2 + ต้องการให้ผู้พัฒนาพิมพ์รหัสผ่านฐานข้อมูลทุกครั้งที่เขารันอะไร มันแก้ปัญหาทั้งหมด แต่มันยุ่งยากสำหรับนักพัฒนาที่บางครั้งไฟแอพพลิเคชั่นหลายครั้งต่อนาที นอกจากนี้เรายังมีแอพพลิเคชั่นหลายตัวที่เชื่อมต่อกับฐานข้อมูลเดียวกันและการใช้งานหน้าจอรหัสผ่านจะต้องแตกต่างกันไปในแต่ละโปรแกรม ดังนั้นคำถามของฉันคือหากมีวิธีแก้ไขปัญหาดังกล่าวร่วมกันหรือข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการแก้ปัญหาข้างต้นใช้งานได้?

8
ทำไม Java ไม่อนุญาตให้ใช้เงื่อนไขตัวเลขเช่นถ้า (5) {…} ถ้า C ทำ?
ฉันมีโปรแกรมเล็ก ๆ สองโปรแกรมนี้: C #include <stdio.h> int main() { if (5) { printf("true\n"); } else { printf("false\n"); } return 0; } ชวา class type_system { public static void main(String args[]) { if (5) { System.out.println("true"); } else { System.out.println("false"); } } } ซึ่งรายงานข้อผิดพลาด: type_system.java:4: error: incompatible types: int cannot be …
33 java  c  type-systems 

5
ฉันควรเริ่มต้น C structs ผ่านพารามิเตอร์หรือโดยค่าตอบแทน? [ปิด]
บริษัท ที่ฉันทำงานอยู่นั้นกำลังเริ่มต้นโครงสร้างข้อมูลทั้งหมดผ่านฟังก์ชันเตรียมใช้งานเช่น: //the structure typedef struct{ int a,b,c; } Foo; //the initialize function InitializeFoo(Foo* const foo){ foo->a = x; //derived here based on other data foo->b = y; //derived here based on other data foo->c = z; //derived here based on other data } //initializing the structure Foo foo; InitializeFoo(&foo); …

9
เจ้าหน้าที่ QA จะทดสอบตรรกะการแคชที่พวกเขามองไม่เห็นได้อย่างไร
ฉันเพิ่งนำเลเยอร์แคชไปใช้ในเว็บแอปพลิเคชันของฉันและตอนนี้ฉันสงสัยว่า QA นั้นควรทดสอบอย่างไรเนื่องจากการแคชนั้นโปร่งใสสำหรับผู้ใช้ หนึ่งความคิดที่ฉันมีคือการใส่การบันทึกในวิธีการที่เรียกใช้รหัสที่เติมแคชและบันทึกเมื่อวัตถุถูกดึงออกมาจากแคชและเมื่อมันต้องการนันทนาการจากฐานข้อมูลจากนั้นผู้ทดสอบสามารถดูบันทึกเพื่อดูว่า ตัวอย่างเช่นวัตถุบางอย่างถูกโหลดใหม่จาก db ทุก ๆ 10 นาทีแทนที่จะดูทุกหน้า แต่ทุกคนสามารถแนะนำวิธีปฏิบัติที่ดีกว่าสำหรับสถานการณ์นี้ได้ไหม
33 testing  caching 

1
raw, weak_ptr, unique_ptr, shared_ptr ฯลฯ ... วิธีการเลือกอย่างชาญฉลาด?
มีพอยน์เตอร์จำนวนมากใน C ++ แต่จะซื่อสัตย์ใน 5 ปีหรือมากกว่านั้นในการเขียนโปรแกรม C ++ (โดยเฉพาะกับ Qt Framework) ฉันใช้พอยน์เตอร์พอยต์แบบเก่าเท่านั้น: SomeKindOfObject *someKindOfObject = new SomeKindOfObject(); ฉันรู้ว่ามีคำแนะนำ "ฉลาด" อื่น ๆ อีกมากมาย: // shared pointer: shared_ptr<SomeKindofObject> Object; // unique pointer: unique_ptr<SomeKindofObject> Object; // weak pointer: weak_ptr<SomeKindofObject> Object; แต่ฉันไม่มีความคิดเพียงเล็กน้อยเกี่ยวกับสิ่งที่พวกเขาทำและสิ่งที่พวกเขาสามารถเสนอให้ฉันได้เปรียบเทียบตัวชี้แบบดิบ ตัวอย่างเช่นฉันมีส่วนหัวของชั้นนี้: #ifndef LIBRARY #define LIBRARY class LIBRARY { public: // Permanent list …

6
วิธีจัดการสถานะเริ่มต้นในสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ได้อย่างไร
ในสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์แต่ละองค์ประกอบจะทำหน้าที่เฉพาะเมื่อเหตุการณ์ถูกส่งผ่านระบบ ลองนึกภาพรถยนต์สมมุติกับแป้นเบรกและไฟเบรก ไฟเบรคจะเปิดขึ้นเมื่อได้รับเหตุการณ์brake_onและปิดเมื่อได้รับเหตุการณ์brake_off แป้นเบรกส่งเหตุการณ์brake_onเมื่อมันถูกกดลงและเหตุการณ์brake_offเมื่อมันถูกปล่อยออกมา ทั้งหมดนี้เป็นสิ่งที่ดีและดีจนกระทั่งคุณมีสถานการณ์ที่รถเปิดอยู่โดยเหยียบแป้นเบรกลงไปแล้ว เนื่องจากไฟเบรกไม่เคยได้รับเหตุการณ์brake_onมันจะหยุดอยู่ - เป็นสถานการณ์ที่ไม่พึงประสงค์อย่างชัดเจน การเปิดไฟเบรคตามค่าเริ่มต้นจะเป็นการพลิกกลับสถานการณ์เท่านั้น สิ่งที่สามารถทำได้เพื่อแก้ไข 'ปัญหาสถานะเริ่มต้น' นี้ แก้ไข:ขอบคุณสำหรับคำตอบทั้งหมด คำถามของฉันไม่เกี่ยวกับรถยนต์จริง ในรถยนต์ที่พวกเขาแก้ไขปัญหานี้โดยการส่งรัฐอย่างต่อเนื่อง - ดังนั้นจึงไม่มีปัญหาการเริ่มต้นในโดเมนนั้น ในโดเมนซอฟต์แวร์ของฉันโซลูชันนั้นจะใช้รอบ CPU ที่ไม่จำเป็นจำนวนมาก แก้ไข 2:นอกเหนือจากคำตอบของ @ gbjbaanbฉันจะใช้ระบบที่: แป้นเหยียบเบรกหลังจากการเตรียมใช้งานส่งเหตุการณ์ด้วยสถานะของมันและ ไฟเบรกตามสมมุติฐานหลังจากการเตรียมข้อมูลเบื้องต้นจะส่งเหตุการณ์ที่ขอให้เกิดเหตุการณ์สถานะจากแป้นเหยียบเบรก ด้วยโซลูชันนี้ไม่มีการพึ่งพาระหว่างคอมโพเนนต์ไม่มีสภาวะการแข่งขันไม่มีคิวข้อความให้ค้างและไม่มีคอมโพเนนต์ 'ต้นแบบ'

8
การขว้างข้อยกเว้นเป็นการต่อต้านแบบที่นี่หรือไม่?
ฉันเพิ่งพูดคุยเกี่ยวกับตัวเลือกการออกแบบหลังจากการตรวจสอบโค้ด ฉันสงสัยว่าความคิดเห็นของคุณคืออะไร มีPreferencesคลาสนี้ซึ่งเป็นที่เก็บข้อมูลสำหรับคู่คีย์ - ค่า ค่า Null นั้นถูกกฎหมาย (สำคัญมาก) เราคาดหวังว่าค่าบางอย่างอาจยังไม่ถูกบันทึกและเราต้องการจัดการกับกรณีเหล่านี้โดยอัตโนมัติโดยเริ่มต้นด้วยค่าเริ่มต้นที่กำหนดไว้ล่วงหน้าเมื่อมีการร้องขอ วิธีแก้ปัญหาที่กล่าวถึงใช้รูปแบบต่อไปนี้ (หมายเหตุ: นี่ไม่ใช่รหัสจริงแน่นอน - มันง่ายสำหรับจุดประสงค์ในการอธิบาย): public class Preferences { // null values are legal private Map<String, String> valuesFromDatabase; private static Map<String, String> defaultValues; class KeyNotFoundException extends Exception { } public String getByKey(String key) { try { return getValueByKey(key); } catch …

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

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

1
ทำไมฐานข้อมูลเป็นคิวไม่ดี? [ปิด]
ฉันเพิ่งอ่านบทความนี้และฉันสับสน ลองจินตนาการ 1 webapp และ 1 แอพลิเคชันที่แตกต่างกันทำหน้าที่เป็น "คนงาน" ทั้งสองร่วมกันฐานข้อมูลเดียวกัน โอ้ฉันพูดว่า "การแบ่งปัน" .. แต่บทความจะเตือนอะไร : ประการที่สี่การแบ่งปันฐานข้อมูลระหว่างแอปพลิเคชัน (หรือบริการ) เป็นสิ่งที่ไม่ดี มันเป็นการล่อลวงเกินไปที่จะทำให้รัฐร่วมอสัณฐานอยู่ในนั้นและก่อนที่คุณจะรู้ว่าคุณจะมีสัตว์ประหลาดคู่ขนานอย่างมหาศาล => ไม่เห็นด้วย มีบางกรณีที่แอปพลิเคชันที่แตกต่างยังคงเป็นส่วนหนึ่งของหน่วยเดียวกันดังนั้นแนวคิดของ "ปัญหาการมีเพศสัมพันธ์" จึงไม่มีเหตุผลในกรณีนี้ มาดำเนินการต่อ: เว็บแอปจัดการคำขอ HTTP ของไคลเอ็นต์และอาจอัปเดตเมื่อใดก็ได้ที่มีการรวม (คำศัพท์ DDD) เพื่อสร้างกิจกรรมโดเมนที่สอดคล้องกัน เป้าหมายของผู้ปฏิบัติงานคือการจัดการกิจกรรมโดเมนเหล่านั้นโดยการประมวลผลงานที่ต้องการ ประเด็นก็คือ: ข้อมูลเหตุการณ์ควรส่งผ่านไปยังผู้ปฏิบัติงานอย่างไร วิธีแรกในการส่งเสริมการอ่านบทความคือการใช้ RabbitMQ เป็นมิดเดิลแวร์ที่มุ่งเน้นข้อความ เวิร์กโฟลว์จะง่าย: เมื่อใดก็ตามที่เว็บไดโนสร้างเหตุการณ์มันจะเผยแพร่ผ่าน RabbitMQ ซึ่งฟีดคนงาน ข้อเสียเปรียบก็คือไม่มีสิ่งใดรับประกันความสอดคล้องทันทีระหว่างการคอมมิชชันของการอัพเดตแบบรวมและการเผยแพร่เหตุการณ์โดยไม่ต้องจัดการกับความล้มเหลวในการส่งที่เป็นไปได้ ... หรือปัญหาฮาร์ดแวร์; นั่นเป็นอีกประเด็นหลัก ตัวอย่าง: เป็นไปได้ว่าเหตุการณ์ถูกเผยแพร่โดยไม่ประสบความสำเร็จในการอัปเดตรวม ... ส่งผลให้เกิดเหตุการณ์ที่แสดงถึงการแสดงโมเดลโดเมนที่ผิดพลาด คุณสามารถยืนยันได้ว่า XA …

1
ฉันรู้ว่า JavaScript ดีจริงๆ แต่ฉันวางระเบิดการสัมภาษณ์ [ปิด]
ดังนั้นฉันกำลังตามล่าหาตำแหน่งใหม่ในฐานะนักพัฒนา Front-End ฉันรู้ว่าจาวาสคริปต์เป็นอย่างดีและสามารถแว็กซ์เกี่ยวกับการปิด, Currying, การสืบทอดต้นแบบ, รูปแบบการออกแบบ, ประสิทธิภาพของแอพและสถาปัตยกรรม Front-End โดยรวม แต่ถึงกระนั้นฉันยังคงจบลงด้วยการสัมภาษณ์งานวางระเบิด (FYI งานส่วนใหญ่ที่ฉันสัมภาษณ์อยู่สำหรับการสร้าง SPA ด้วยกรอบ MVC บางประเภท) โดยปกติแล้วการทดสอบการเข้ารหัสเป็นตัวอย่างโค้ดขนาดเล็กของสิ่งที่ฉันไม่เคยเจออย่างมืออาชีพ เช่นเขียนฟังก์ชั่นเพื่อแก้ปัญหาคณิตศาสตร์บางอย่าง นอกเหนือจากความเชื่องช้าในการรับรหัสขณะถือโทรศัพท์ด้วยมือเดียวและมีคนแปลกหน้าดูหน้าจอของคุณและดูตัวละครทุกตัวที่คุณพิมพ์ฉันมักจะไม่เห็นสิ่งนี้ในโลกแห่งความเป็นจริง นี่เป็นทักษะที่ร้ายแรงที่ฉันขาดหรือเป็นผู้สัมภาษณ์ถามคำถามที่ไม่เกี่ยวข้องหรือไม่ ฉันเดาว่าฉันควรทำงานกับการเขียนโปรแกรมฟังก์ชั่นและอัลกอริทึมของฉัน แต่ฉันไม่ได้พบแหล่งข้อมูลที่ดีมากมายบนเว็บ (หรือในการพิมพ์) ข้อเสนอแนะใด ๆ ?

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

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