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

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

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

3
CSS มีการปรับขนาดของรูปภาพหรือไม่
มันถูกมองเสมอว่าการใช้คุณลักษณะความกว้าง / ความสูงของภาพซึ่งไม่ใช่สิ่งที่ภาพต้นฉบับที่แท้จริงเป็นความคิดที่ไม่ดี มันอาจหมายถึงรูปภาพที่มีขนาดผิดเพี้ยนหรือขนาดการดาวน์โหลดที่ใหญ่กว่า nessary แต่นี่ยังคงเป็นปัญหาหรือไม่? ฉันจะไม่แนะนำการปรับขนาดรูปภาพ แต่การลดขนาดไม่ควรเป็นปัญหาหากว่ามันไม่แตกต่างจากของจริงมากเกินไป ตัวอย่างเช่นฉันมีรูปถ่ายที่ 600x400 และฉันติดความกว้าง 400px ไว้ เบราว์เซอร์ที่ทันสมัยส่วนใหญ่ปรับขนาดภาพลงและดูเหมือนว่าการแสดงผลยังคงเหมาะสม ดังนั้นมุมมองของทุกคนคืออะไร

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

7
การแฮชรหัสผ่านและการสนับสนุนผู้ใช้ของคุณ
เมื่อเร็ว ๆ นี้เราได้ย้ายไปใช้กลยุทธ์การจัดเก็บรหัสผ่านที่ดีขึ้นด้วยสิ่งที่ดีทั้งหมด: รหัสผ่านจะถูกเก็บไว้หลังจากผ่าน bCrypt ผู้ใช้จะได้รับลิงค์เปิดใช้งานในการสร้างบัญชีเพื่อยืนยันความเป็นเจ้าของที่อยู่ ลืมรหัสผ่านโดยไม่มีคำถามเพื่อความปลอดภัยลิงค์จะถูกส่งไปยังอีเมลของพวกเขา ลิงค์จะหมดอายุหลังจาก 24 ชั่วโมง ณ จุดที่พวกเขาจะต้องขอใหม่ หากบัญชีถูกสร้างขึ้นจากพนักงานของเราอีเมลจะถูกส่งด้วยรหัสผ่านที่รัดกุมแบบสุ่ม เมื่อเข้าสู่ระบบในผู้ใช้จะต้องรีเซ็ตเป็นสิ่งที่เราไม่รู้จักและนั่นคือ bCrypt'd ขณะนี้เป็นไปตาม "แนวปฏิบัติที่ดีที่สุด" แต่นี่เป็นการเพิ่มจำนวนการสนับสนุนของเราจากผู้ใช้ทั่วไปที่ไม่เข้าใจทั้งหมดพวกเขาต้องการเข้าสู่ระบบ เรามักจะได้รับการร้องขอจากผู้ใช้ที่บ่นเกี่ยวกับ: รหัสผ่านไม่ถูกต้อง (จากรหัสที่ต้องรีเซ็ตพวกเขามักจะวางด้วยช่องว่างในตอนท้าย) พวกเขาบอกเราว่าพวกเขากำลังใช้อะไรอยู่ แต่เราไม่มีวิธีบอกพวกเขาว่ารหัสผ่านจริงของพวกเขาคืออะไร บอกว่าพวกเขาไม่ได้รับอีเมลที่เราส่งไป (การเปิดใช้งานการรีเซ็ต ฯลฯ ) นี่ไม่ใช่กรณีหลังจากแก้ไขปัญหาเรามักพบว่าพวกเขาพิมพ์ผิดในอีเมลว่าพวกเขาไม่ได้ตรวจสอบบัญชีอีเมลที่ถูกต้องหรือว่ามันไปในโฟลเดอร์สแปม แน่นอนว่าเราไม่สามารถทดลองใช้ได้สำหรับพวกเขาเนื่องจากเราไม่มีรหัสผ่าน เรากำลังบันทึกความพยายามที่ล้มเหลว แต่เรายังล้างรหัสผ่านที่ใช้เนื่องจากน่าจะเป็นรหัสผ่านที่ใช้สำหรับบัญชีอื่นและเราไม่ต้องการเก็บไว้ในไฟล์บันทึกข้อความธรรมดา สิ่งนี้ทำให้เราไม่มีอะไรจะช่วยพวกเขาเมื่อพวกเขารายงานปัญหา ฉันอยากรู้ว่าคนส่วนใหญ่จัดการกับปัญหาเช่นนี้ได้อย่างไร

3
วิธีการที่มากไปเหมาะสมเมื่อใด
สมมติว่าฉันกำลังทำงานกับระบบที่มีอยู่และมีขนาดใหญ่พอสมควร ฉันมีวัตถุmyObjectของคลาสMyClass(เพื่อประโยชน์ของตัวอย่างสมมติว่าฉันทำงานใน Java) myObjectเป็นองค์ประกอบที่ประกอบด้วย a Collection, say, a Listและวัตถุอื่น ๆ ที่ (ฉันคิดว่า) ไม่เกี่ยวข้อง มันมีวิธีการมอบหมายซึ่งเพียงแค่ให้บริการที่จะเรียกร้องให้วิธีการของListมันประกอบด้วยเพื่อให้แน่ใจว่าListมันจะไม่ได้สัมผัส (ขออภัยถ้าฉันมีคำศัพท์ของฉันผิด) Let 's พูดที่ว่านี้Listเป็นแต่ด้วยเหตุผลบางอย่างที่วิธีการเข้าถึงหลักเป็นวิธีหน้ากากสำหรับการเรียนList<String> SomeOtherClassถ้าผมอยากจะใส่คู่ค่าใหม่เข้าไปในของฉันListแล้วฉันมีวัตถุของที่เรียกว่าSomeOtherClass someObjectฉันต้องการโทรmyObject.insert(someObject)และภายในinsertวิธีการจะมีความมหัศจรรย์บางอย่างที่จะดึงข้อมูลที่จะใส่ลงไปในStringList<String> สมมติว่าตอนนี้ฉันมีStringค่าและไม่มีSomeOtherClassวัตถุที่จะแทรก สมมติว่าฉันไม่สามารถปรับเปลี่ยนinsertวิธีการเพราะมันจะทำลายทุกอย่างในระบบนี้ จากนั้นฉันควรใช้insertวิธีมากเกินไปหรือไม่ หรือฉันควรสร้างวัตถุใหม่ของSomeOtherClassเวลาที่ฉันต้องการที่จะเรียกทุกคนinsert? ฉันเดาว่าถ้าฉันทำมากไปมันจะมีลักษณะเช่นนี้ ... public void insert(String s) { ... } public void insert(SomeOtherObject obj) { this.insert(obj.magicStringMethod()); } (ตัวอย่างนี้เป็นจิ๊กซอว์ที่ออกแบบมาตามสถานการณ์ที่คล้ายกัน (ซับซ้อนกว่าเล็กน้อย) เกี่ยวกับการบรรทุกเกินพิกัดที่ฉันพบเมื่อวานนี้ฉันจะขยายมันหากมีสิ่งใดที่ไม่ชัดเจน) นี่เป็นสถานที่ที่เหมาะสมในการโอเวอร์โหลดเมธอดหรือไม่? ถ้าไม่ฉันควรโอเวอร์โหลดเมธอดเมื่อใด

5
อินเทอร์เฟซและการสืบทอด: สุดยอดของทั้งสองโลก
ฉันค้นพบอินเทอร์เฟซและฉันเริ่มรักพวกเขา ความสวยงามของอินเทอร์เฟซคือมันเป็นสัญญาและวัตถุใด ๆ ที่ตอบสนองสัญญานั้นสามารถใช้ได้ทุกที่ที่ต้องการอินเตอร์เฟส ปัญหาของอินเทอร์เฟซคือมันไม่สามารถมีการใช้งานเริ่มต้นซึ่งเป็นคุณสมบัติที่เจ็บปวดสำหรับคุณสมบัติทางโลกและกำจัด DRY สิ่งนี้ก็เป็นสิ่งที่ดีเพราะมันทำให้การใช้งานและระบบแยกจากกัน ในทางกลับกันมรดกยังคงรักษาคัปปลิ้งที่แน่นกว่าและมีศักยภาพที่จะทำลายการห่อหุ้ม กรณีที่ 1 (การสืบทอดกับสมาชิกส่วนตัวการห่อหุ้มที่ดีเข้าด้วยกันอย่างแน่นหนา) class Employee { int money_earned; string name; public: void do_work(){money_earned++;}; string get_name(return name;); }; class Nurse : public Employee: { public: void do_work(/*do work. Oops, can't update money_earned. Unaware I have to call superclass' do_work()*/); }; void HireNurse(Nurse *n) …

4
มาตรฐานและการปรับปรุงกระบวนการควรนำมาใช้กับองค์กรที่ไม่มีพวกเขาอย่างไร
ฉันได้รับมอบหมายให้ปรับปรุงกระบวนการพัฒนาซอฟต์แวร์ผ่านการดำเนินการปรับปรุงกระบวนการซึ่งส่วนใหญ่เราจะใช้CMMI เพื่อการพัฒนาเวอร์ชัน 1.3เป็นแนวทางและนำแนวทางปฏิบัติที่ดีที่สุดมาใช้ทั้งหมดหรือบางส่วน อะไรคือวิธีที่ดีที่สุดในการแนะนำมาตรฐานและการปรับปรุงกระบวนการเพื่อให้ระดับการผลักกลับและการต่อต้านจากนักพัฒนาลดลง?

4
ทำไมเว็บแอปพลิเคชันสาธารณะไม่ใช้ไฟล์ ini สำหรับการกำหนดค่า
CMS สาธารณะเกือบทุกตัวในนั้นใช้ไฟล์. php สำหรับการตั้งค่าฐานข้อมูลและอื่น ๆ ตัวอย่างเช่น WordPress สร้างไฟล์. php config โดยอัตโนมัติเมื่อคุณติดตั้ง ทำไมพวกเขาไม่เพียงแค่ใช้ไฟล์. ini PHP มีparse_ini_file ()อยู่แล้วและฉันแน่ใจว่าภาษาอื่นมีฟังก์ชั่นที่คล้ายกัน
10 php  cms  configuration 

12
QA ควรค้นหาสถานการณ์จำลองได้หรือไม่
บางครั้งทีมงาน QA ของฉันรายงานข้อบกพร่อง แต่ฉันหรือพวกเขาไม่มีความคิดเกี่ยวกับวิธีการทำซ้ำ สิ่งนี้นำไปสู่เซสชันการดีบักที่ยาวและน่าผิดหวังซึ่งบางครั้งไม่ได้ผลลัพธ์ ซอฟต์แวร์ของฉันเชื่อมโยงอย่างหนักกับฮาร์ดแวร์ที่เป็นกรรมสิทธิ์ดังนั้นข้อบกพร่องอาจมาจากหลายทิศทางพร้อมกัน ฉันควรคาดหวังจากพวกเขามากกว่า "ซอฟต์แวร์ของคุณล้มเหลวเมื่อฉันกดปุ่ม" หรือฉันควรจะคิดเองว่าเกิดอะไรขึ้น? แก้ไข: เพื่อนร่วมงานคนหนึ่งของฉันชี้ให้เห็นว่าเราอาจเป็นนักพัฒนาซอฟต์แวร์ทั้งหมดที่นี่ดังนั้นผลลัพธ์อาจได้รับอคติเล็กน้อย
10 testing  bug  qa  reporting 

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

9
ทำไมตัวแปรจึงต้องมีประเภท
ดังนั้นเราจึงเขียน: Customer c = new Customer(); ทำไมการออกแบบไม่ใช่แบบที่เราเขียน: c = new Customer(); c.CreditLimit = 1000; คอมไพเลอร์สามารถคำนวณคะแนน c ให้กับลูกค้าและอนุญาตให้สมาชิกของลูกค้าเรียกใช้บน c? ฉันรู้ว่าเราอาจต้องการเขียน: IPerson c = new Customer(); IPerson e = new Employee(); เพื่อที่จะสามารถเขียน: public string GetName(IPerson object) { return object.Name } string name = GetName(c); // or GetName(e); แต่ถ้าเราเขียนว่า: c = new Customer(); …

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

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

2
ฉันจะป้องกันโปรแกรมเมอร์จากการบันทึกข้อมูลที่ผู้ใช้ป้อนได้อย่างไร
ฉันกำลังพัฒนาเว็บแอปพลิเคชันโดยมุ่งเน้นที่ความปลอดภัย มาตรการใดบ้างที่สามารถป้องกันผู้ที่ทำงานกับแอปพลิเคชั่น (โปรแกรมเมอร์, DBAs, เจ้าหน้าที่ประกันคุณภาพ) ไม่ให้จับภาพค่าที่ผู้ใช้ป้อนซึ่งควรได้รับการปกป้องอย่างดีเช่นรหัสผ่านหมายเลขประกันสังคมและอื่น ๆ
10 security 

3
การควบคุมแหล่งที่มา: บทบาทและความรับผิดชอบ - แนวทางปฏิบัติที่ดีที่สุด
ฉันกำลังมองหา "วิธีปฏิบัติที่ดีที่สุด" เกี่ยวกับบทบาทและความรับผิดชอบโดยเฉพาะผู้ที่รับผิดชอบในการผสานจากสาขาการพัฒนาไปสู่การเริ่มต้น (หรือหลัก) โดยทั่วไปฉันกำลังมองหากระสุนเพื่อช่วยเหลือต้นเหตุของฉัน ให้ฉันอธิบายสิ่งที่ฉันกำลังเผชิญ ฉันเป็นผู้พัฒนานำ (เจ้าของ) ของแอปพลิเคชันเฉพาะ บริษัท ของเราเพิ่งย้ายจาก VSS (ที่ฉันเป็นผู้ดูแลระบบฐานข้อมูล VSS ที่เก็บใบสมัครของฉัน) เป็น TFS (ที่ฉันมีสิทธิ์ในสาขาการพัฒนาที่สร้างขึ้นโดยทีม "การดำเนินงาน" ของเรา) ในงานก่อนหน้านี้ฉันเป็นผู้ดูแลระบบ TFS ดังนั้นฉันรู้วิธีของฉันเกี่ยวกับ TFS และ MSBuild ฉันไม่ได้มีปัญหากับการใช้กลยุทธ์การรวมสาขาและการผสาน (สาขาหลักที่มีสาขาการพัฒนาข้อบกพร่อง / โครงการที่สร้างขึ้นตามความจำเป็นผสานกลับไปที่หลักแล้วเลื่อนไปยังสาขาที่วางจำหน่าย) ปัญหาที่ฉันมีคือ: ฉันไม่สามารถสร้างสาขาของตัวเอง ฉันต้องสร้างงาน TFS เพื่อให้สมาชิกในทีม "ปฏิบัติการ" สร้างสาขาให้ฉัน ฉันไม่สามารถผสานจากหลักไปยังสาขาการพัฒนาของฉัน ฉันต้องสร้างงาน TFS เพื่อให้สมาชิกในทีม "การดำเนินการ" ทำการผสานและหวังว่าเขาจะไม่ "ก้าวเข้าสู่" การเปลี่ยนแปลงใด ๆ ในทีมของฉันตั้งแต่ "ops guy" อาจหรืออาจไม่ใช่นักพัฒนาและแน่นอนมี …

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