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

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

4
เมื่อติดตาม SOLID การอ่านและการเขียนไฟล์มีความรับผิดชอบแยกกันสองอย่างหรือไม่?
ฉันเพิ่งเริ่มสำรวจ SOLID และฉันไม่แน่ใจว่าการอ่านจากไฟล์และการเขียนไปยังไฟล์เป็นความรับผิดชอบเดียวกันหรือไม่ เป้าหมายเป็นไฟล์ประเภทเดียวกัน ฉันต้องการอ่านและเขียน. pdf ในใบสมัครของฉัน แอปพลิเคชันอยู่ใน Python หากสร้างความแตกต่าง

1
สามารถใช้วิธีการ TDD จากบนลงล่างได้หรือไม่
ฉันไม่ชัดเจนว่า TDD วิธีการจัดการกรณีต่อไปนี้อย่างไร สมมติว่าฉันต้องการใช้อัลกอริทึมการรวมใน Python ฉันเริ่มต้นด้วยการเขียน assert mergesort([]) === [] และการทดสอบล้มเหลวด้วย NameError: ไม่ได้กำหนดชื่อ 'การรวม' ฉันเพิ่มแล้ว def mergesort(a): return [] และการทดสอบของฉันผ่าน ต่อไปฉันเพิ่ม assert mergesort[5] == 5 และการทดสอบของฉันล้มเหลวด้วย AssertionError ซึ่งฉันทำไปด้วย def mergesort(a): if not a: return [] else: return a ต่อไปฉันเพิ่ม assert mergesort([10, 30, 20]) == [10, 20, 30] และตอนนี้ฉันต้องพยายามทำบัตรผ่านนี้ ฉัน "รู้" …
13 tdd 

3
กลยุทธ์แพคเกจและรุ่นในสภาพแวดล้อมที่เก็บหลาย
เราเป็น บริษัท เล็ก ๆ ที่มีหลายทีมที่จัดการที่เก็บคอมไพล์ของตัวเอง นี่คือแพลตฟอร์มเว็บและสิ่งประดิษฐ์ของแต่ละทีมจะถูกนำไปใช้ในตอนท้ายของวันสำหรับการทดสอบทุกคืน เรากำลังพยายามทำให้เป็นทางการกระบวนการเกี่ยวกับการกำหนดรุ่นและบรรจุภัณฑ์ ทุกทีมมีสาขาหลักที่พวกเขาทำการพัฒนาแบบวันต่อวัน สมาชิกการประกันคุณภาพของแต่ละทีมต้องการให้สิ่งประดิษฐ์จากการเปลี่ยนแปลงของทีมของพวกเขาถูกนำไปใช้ในห้องทดสอบที่มีการรวมส่วนประกอบทั้งหมดโดยเชฟ Artifacts เป็น tarballs แต่ฉันต้องการแปลงเป็น RPMs เพื่อให้เราสามารถคิดและเหตุผลเกี่ยวกับเวอร์ชันได้อย่างถูกต้อง กระบวนการปล่อยเกี่ยวข้องกับการตัดสาขาที่วางจำหน่ายจากสาขาการพัฒนา (ต้นแบบในกรณีส่วนใหญ่) ของที่เก็บ git แต่ละอัน สิ่งนี้จะมอบให้กับการประกันคุณภาพที่เรียกใช้การทดสอบและลงชื่อออกในชุดของสิ่งประดิษฐ์ ตัวอย่างเช่นนี่เป็นที่เก็บคอมไพล์ทั่วไปที่มีสาขาย่อยที่เกี่ยวข้อง: 0-0-0-0-0-0-0-0-0-0 (master) | | 0 0 (rel-1) | 0 (rel-2) ฉันพยายามที่จะหารูปแบบของแพคเกจที่มาจากสาขาการพัฒนา เราไม่ต้องการติดแท็กสาขาหลักของแต่ละ repo และ จำกัด แท็กเพื่อปล่อยสาขาเท่านั้น แต่เราควรจะสามารถค้นหาแพ็คเกจที่ปรับใช้ในเครื่องทดสอบโดยใช้ซีแมนทิกส์ yum / rpm มาตรฐาน เวอร์ชันการพัฒนาจะมีลักษณะอย่างไรเมื่อสาขาหลักไม่มีแท็ก ฉันเข้าใจว่าgit describeสามารถให้การแสดงเวอร์ชั่นประกอบที่มีประโยชน์แก่ฉันได้ แต่ทำงานได้ดีเมื่อติดแท็กจุดปล่อยต่างๆในสาขา แก้ไข 1: เพื่อตอบสนองต่อคำตอบของ …

4
มีแนวทางที่ยอมรับกันโดยทั่วไปเกี่ยวกับวิธีการเขียน C สมัยใหม่หรือไม่?
ฉันมีพื้นหลัง Java / Groovy ที่แข็งแกร่งและฉันได้รับมอบหมายให้ทำงานกับทีมที่ดูแลฐานรหัส C ที่ค่อนข้างใหญ่สำหรับซอฟต์แวร์การดูแลระบบ บางจุดปวดเช่นการจัดการกับหยดในฐานข้อมูลหรือการสร้างรายงานใน PDF และ Excel ได้รับการส่งไปยังบริการเว็บ java อย่างไรก็ตามในฐานะที่เป็น Java dev ฉันรู้สึกสับสนเล็กน้อยกับบางส่วนของรหัส: มันเป็น verbose (โดยเฉพาะอย่างยิ่งเมื่อจัดการกับ 'ข้อยกเว้น') มีวิธีการขนาดใหญ่มากมาย (วิธีการ 2000 + บรรทัดหลายวิธี) ไม่มีโครงสร้างข้อมูลขั้นสูง (ฉันพลาดรายการตั้งค่าและแผนที่เป็นจำนวนมาก) ไม่มีการแยกข้อกังวล (SQL ผสมปนเปกันอย่างสนุกสนาน) ด้วยเหตุนี้ฉันจึงรู้สึกว่าธุรกิจถูกซ่อนอยู่ในรหัสทางเทคนิคและสมองของฉันที่ถูกสร้างขึ้นด้วย Object Oriented และการเขียนโปรแกรมเชิงฟังก์ชั่น ข้อดีของโครงการคือรหัสตรงไปตรงมา: ไม่มีเฟรมเวิร์กไม่มีการจัดการโค้ดไบต์ที่รันไทม์ไม่มี AOP และเซิร์ฟเวอร์สามารถตอบผู้ใช้มากกว่า 10,000 คนพร้อมกันด้วยเครื่องเดียวโดยใช้หน่วยความจำน้อยกว่าจาวาต้องคาย "hello world" ฉันต้องการเรียนรู้วิธีการเขียนรหัส C ตามหลักการสมัยใหม่ที่เป็นที่ยอมรับกันทั่วไป มีหลักการใด ๆ ที่เป็นที่ยอมรับกันโดยทั่วไปเกี่ยวกับวิธีการเขียนและโครงสร้าง C …
13 c  maintenance 

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

3
การออกแบบ OOP ที่ไม่ดีสำหรับการจำลองที่เกี่ยวข้องกับอินเตอร์เฟสหรือไม่
ฉันกำลังออกแบบโปรแกรม OOP ตัวเล็ก ๆ ของฉันเพื่อจำลอง Vampires, Wolves, Human และ Trucks และกำลังพยายามใช้ความเข้าใจที่ จำกัด ของตัวเองเกี่ยวกับการเชื่อมต่อ ( ฉันยังคงสรุปอยู่ที่นี่และยังไม่มีการติดตั้งโค้ดดังนั้นจึงเป็นคำถามของการออกแบบ OOP ... ฉันคิดว่า!) ฉันกำลังมองหา'พฤติกรรมทั่วไป'ระหว่างชั้นเรียนเหล่านี้และนำไปใช้เป็นส่วนต่อประสานหรือไม่ ตัวอย่างเช่น Vampires and Wolves กัด ... ดังนั้นฉันควรมีส่วนต่อประสานกัดหรือไม่ public class Vampire : Villain, IBite, IMove, IAttack เช่นเดียวกันสำหรับรถบรรทุก ... public class Truck : Vehicle, IMove และสำหรับมนุษย์ ... public class Man : Human, IMove, …

1
เหตุใดอักขระเครื่องหมายวรรคตอนในตาราง ASCII ทั่วทุกที่
ในตาราง ASCII อักขระเครื่องหมายวรรคตอนจะปรากฏขึ้นระหว่างอักขระที่ไม่ได้พิมพ์และก่อนหน้าตัวเลข ( !"#$%&')*+,-./) ระหว่างตัวเลขและตัวอักษรตัวพิมพ์ใหญ่ ( :;<=>?@) ระหว่างตัวอักษรตัวพิมพ์ใหญ่ ( [\]^_`) และตัวอักษรตัวพิมพ์เล็กและหลังตัวอักษรตัวเล็ก ( {|}~) เมื่อมองแวบแรกใครจะคาดหวังว่าสิ่งเหล่านี้จะรวมกลุ่มกัน อาจเป็นได้ทั้งก่อนหน้าตัวอักษรและตัวเลขทั้งหมดหรือด้านหลัง แต่นี่ไม่ใช่กรณี; พวกเขาสนใจในกลุ่มต่าง ๆ เหล่านี้ เหตุใดจึงเป็นเช่นนี้ มีเหตุผลทางประวัติศาสตร์บ้างหรือไม่ที่ทำให้ตัวละครถูกจัดกลุ่มด้วยวิธีนี้?
13 strings  ascii 

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

5
ทำไมวิธีการแบบคงที่ไม่สามารถเขียนทับได้?
ในการตอบคำถามนี้ฉันทามติทั่วไปคือว่าวิธีการแบบสแตติกไม่ได้หมายความว่าจะถูกเขียนทับ (และฟังก์ชันแบบคงที่ใน C # ไม่สามารถเสมือนหรือนามธรรม) นี่ไม่ใช่เฉพาะกรณีใน C # เท่านั้น Java ยังห้ามสิ่งนี้และ C ++ ดูเหมือนจะไม่ชอบเช่นกัน อย่างไรก็ตามฉันสามารถนึกถึงตัวอย่างของฟังก์ชั่นคงที่ที่ฉันต้องการแทนที่ในระดับเด็ก (ตัวอย่างเช่นวิธีการจากโรงงาน) ในทางทฤษฎีมีวิธีการรอบพวกเขาไม่มีพวกเขาสะอาดหรือเรียบง่าย ทำไมฟังก์ชั่นคงที่ไม่สามารถเขียนทับได้?

5
เทคนิคในการตรวจสอบความเข้ากันได้ข้ามแพลตฟอร์ม (C ++)?
ฉันเสร็จหนึ่งในโครงการ C ++ ที่เร็วที่สุดซึ่งก็คือ (ตามกรอบ) ที่ควรจะเป็นข้ามแพลตฟอร์ม ฉันพัฒนาโครงการอย่างสมบูรณ์ใน Windows และ Visual Studio โดยคิดว่าเนื่องจากห้องสมุดเป็นแพลตฟอร์มข้ามแพลตฟอร์มทั้งหมดดังนั้นการทำ OSX build "ในภายหลัง" จึงเป็นเรื่องเล็กน้อย สิ่งนี้กลับกลายเป็นว่าไม่ใช่กรณี แต่ "รหัส Windows" ทำงานไม่ถูกต้องและมีข้อผิดพลาดในการรวบรวมเพื่อแก้ไข เทคนิคใดที่มีอยู่ก่อนเพื่อให้แน่ใจว่ารหัสเข้ากันได้กับทุกแพลตฟอร์ม? การพัฒนาแพลตฟอร์มทั้งหมดพร้อมกันดังนั้นจึงทดสอบโค้ดกับทุกแพลตฟอร์มในเวลาเดียวกันเมื่อมีการเพิ่มฟีเจอร์ใหม่แทนที่จะพัฒนาแพลทฟอร์มรุ่นที่แตกต่างกันหลังจากนั้นหรือไม่ (*) มองหาคำแนะนำเฉพาะที่ไม่ได้ขึ้นอยู่กับเครื่องมือ แต่เป็น "กระบวนการพัฒนา" ที่ช่วยให้สามารถทำงานร่วมกันได้ข้ามแพลตฟอร์มโดยไม่คำนึงถึงเครื่องมือที่ใช้ เช่นเดียวกับ (*) ด้านบน โดยเฉพาะฉันกำลังพัฒนาปลั๊กอิน VST ด้วย WDL-OL ( https://github.com/olilarkin/wdl-ol ) และห้องสมุด DSP ข้ามแพลตฟอร์ม โครงการ WDL-OL มีทั้งโครงการ VS และ Xcode ตั้งค่า แต่ฉันเดาว่าปัญหามาจากไลบรารีและจากนั้นความแตกต่างในคอมไพเลอร์

3
เป็นความคิดที่ดีหรือไม่ที่จะทำการมัลติเพล็กบล็อกการสตรีมในการเชื่อมต่อ TCP?
ฉันต้องการหลายช่องสัญญาณระหว่างสองโฮสต์ มีข้อดีหลายประการในการสร้างการเชื่อมต่อ TCP เดียวเท่านั้น แต่ฉันสงสัยว่าการมัลติเพล็กซ์อาจทำให้เกิดปัญหาที่หลีกเลี่ยงไม่ได้ มันจะเป็นอันตรายต่อประสิทธิภาพการทำงานหรือเพิ่มความล่าช้าอย่างมีนัยสำคัญหรือไม่ แล้วการใช้งานหน่วยความจำและการใช้ CPU ล่ะ มีข้อเสนอแนะหรือคำเตือนใด ๆ ที่คุณต้องการให้?

5
ตามกฎหมายของ Demeter ชั้นเรียนได้รับอนุญาตให้ส่งคืนหนึ่งในสมาชิกหรือไม่
ฉันมีสามคำถามเกี่ยวกับกฎหมายของ Demeter นอกเหนือจากคลาสที่ได้รับการแต่งตั้งเป็นพิเศษเพื่อส่งคืนวัตถุ - เช่นคลาสจากโรงงานและตัวสร้าง - มันไม่เป็นไรสำหรับวิธีการส่งคืนวัตถุเช่นวัตถุที่จัดขึ้นโดยคุณสมบัติอย่างใดอย่างหนึ่งของชั้นเรียนหรือจะละเมิดกฎของ demeter (1) ? และถ้ามันละเมิดกฏหมายของ demeter มันจะสำคัญไหมถ้าวัตถุที่ส่งคืนนั้นเป็นวัตถุที่ไม่เปลี่ยนรูปซึ่งแสดงถึงชิ้นส่วนของข้อมูลและไม่มีอะไรเลยนอกจาก getters สำหรับข้อมูลนี้ (2a) หรือ ValueObject นั้นมีรูปแบบการต่อต้านในตัวเองเพราะทุกอย่างที่ทำกับข้อมูลในคลาสนั้นถูกทำนอกคลาส (2b) หรือไม่ ในรหัสหลอก: class A {} class B { private A a; public A getA() { return this.a; } } class C { private B b; private X x; public void …

4
C โครงสร้างสามารถทำงานเหมือนมันมีฟังก์ชั่นหรือไม่?
ฉันใช้ C และstructs ที่ struct สามารถมีสมาชิก แต่ไม่ใช่ฟังก์ชั่น สมมติว่าสำหรับความเรียบง่ายที่ฉันต้องการที่จะสร้าง struct สำหรับสตริงที่ฉันชื่อstrและฉันต้องการที่จะสามารถที่จะทำstr.replace(int i, char c)ที่iเป็นดัชนีของสตริงและเป็นตัวละครที่จะแทนที่ตัวอักษรที่ตำแหน่งc iสิ่งนี้จะไม่เป็นไปได้หรือไม่เนื่องจาก structs ไม่มีฟังก์ชั่นหรือยังมีวิธีที่เราสามารถใช้พฤติกรรมนี้และเลียนแบบได้ว่าโครงสร้างอาจมีฟังก์ชั่น (ง่าย) ที่จริง ๆ แล้วคือ struct คัดลอกตัวเองไปที่ struct ใหม่ เขตข้อมูลซึ่งจะทำอย่างไร ดังนั้นreplaceอาจเป็นสมาชิกที่สามของโครงสร้างที่ชี้ไปที่โครงสร้างใหม่ที่มีการปรับปรุงเมื่อมีการเข้าถึงหรือคล้ายกัน ทำได้หรือไม่ หรือมีบางอย่างในตัวหรือทฤษฎีหรือกระบวนทัศน์ที่ป้องกันความตั้งใจของฉัน พื้นหลังคือฉันกำลังเขียนรหัส C และฉันพบว่าตัวเองมีฟังก์ชั่นการฟื้นฟูที่ฉันรู้ว่าเป็นตัวสร้างไลบรารีในภาษา OOP และ OOP จะเป็นวิธีที่ดีในการจัดการสตริงและคำสั่ง

2
จะไปเกี่ยวกับการทดสอบรหัสยกเลิกการฉีดได้อย่างไร
ดังนั้นฉันจึงมีรหัสชิ้นส่วนต่อไปนี้ที่ใช้งานได้ทั่วระบบของฉัน ขณะนี้เรากำลังเขียนการทดสอบหน่วยย้อนหลัง (ดีกว่าไม่เป็นอาร์กิวเมนต์ของฉัน) แต่ฉันไม่เห็นว่าสิ่งนี้จะทดสอบได้อย่างไร public function validate($value, Constraint $constraint) { $searchEntity = EmailAlertToSearchAdapter::adapt($value); $queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords()); $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity); $query = $adapter->setupBuilder()->build(); $totalCount = $this->advertType->count($query); if ($totalCount >= self::MAXIMUM_MATCHING_ADS) { $this->context->addViolation( $constraint->message ); } } แนวคิดนี้ควรใช้ได้กับทุกภาษา แต่ฉันใช้ PHP รหัสจะสร้างวัตถุแบบสอบถาม ElasticSearch โดยยึดตามSearchวัตถุซึ่งจะถูกสร้างขึ้นจากEmailAlertวัตถุ สิ่งเหล่านี้SearchและEmailAlertเป็นเพียงของ POPO ปัญหาของฉันที่ฉันไม่เห็นว่าฉันสามารถเยาะเย้ยออกSearcherFactory(ซึ่งใช้วิธีการคง) หรือSearchEntityToQueryAdapterที่ต้องการผลที่ได้จากSearcherFactory::getSearchDirector และSearchอินสแตนซ์ ฉันจะฉีดสิ่งที่สร้างขึ้นจากผลลัพธ์ภายในวิธีการได้อย่างไร อาจมีรูปแบบการออกแบบบางอย่างที่ฉันไม่ทราบ? …

5
วิธีการทำให้ Scrum ทำงานกับทีมที่มีบทบาทที่กำหนดไว้อย่างไร
ข้อมูลพื้นหลังบางส่วน ฉันเป็นส่วนหนึ่งของทีมพัฒนาซอฟต์แวร์ภายในองค์กร มันประกอบด้วย นักพัฒนา 5 คน (ด้วยประสบการณ์ตั้งแต่ 2 ถึง 5 ปีฉันเป็นหนึ่งในนั้น) 3 เจ้าหน้าที่ดำเนินงาน (พวกเขาทำการปรับใช้ซอฟต์แวร์และฝึกอบรม) และผู้จัดการโครงการ 1 คน เราพัฒนาโครงการขนาดเล็กถึงขนาดกลางจำนวนมากและระยะเวลาของโครงการมักจะทับซ้อนกัน การพัฒนาเป็นเช่นนี้: "ลูกค้า" ทำให้เรามีชุดของความต้องการเริ่มต้น เราพัฒนาระบบเพื่อสเปคดังกล่าว นำเสนอระบบดังกล่าวเพื่อ "ลูกค้า" "ลูกค้า" ให้ข้อกำหนดเพิ่มเติมแก่เราตามการนำเสนอดังกล่าว ทำซ้ำ 2-4 จนกระทั่ง "ไคลเอนต์" หมดข้อกำหนดใหม่หรือวันที่เป้าหมายการปรับใช้ใกล้จะหมด ตั้งค่าและปรับใช้ระบบ สิ่งนี้พร้อมกับความจริงที่ว่ามันเป็น "ลูกค้า" ที่จัดการกับกำหนดเวลาส่วนใหญ่ (ซึ่งเป็นธงสีแดงจากสิ่งที่ฉันเห็นที่นี่ในโปรแกรมเมอร์และ PM.SE) และเราไม่ปฏิบัติตามวิธีการพัฒนาที่ชัดเจน เพื่อการเข้ารหัสโคบาลรหัสใกล้เคียงและข้อบกพร่องที่ได้รับจากการผลิตเหนือสิ่งอื่นใด นั่นเป็นเหตุผลที่เราเลือกใช้วิธีการแบบ Agile-based เช่น Scrum ทำไมต้องแย่งชิงกัน? มันเป็นความคิดริเริ่มของผู้จัดการของเราและทุกคนดูเหมือนจะเห็นด้วยกับสถานการณ์ปัจจุบันของเรา มีปัญหากับการแย่งชิงกัน องค์ประกอบบางส่วนของ Scrum มีข้อขัดแย้งกับการตั้งค่าปัจจุบันของเราที่เราไม่สามารถพูดได้อย่างง่ายดาย ทีมการปรับใช้ไม่ทราบวิธีการเขียนโปรแกรมและนักพัฒนามีทักษะการสื่อสารและการฝึกอบรมต่ำกว่าค่าเฉลี่ย …

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