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

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

8
Linq มีผลต่อจิตใจที่ทำให้มึนงงโปรแกรมเมอร์ NET หรือไม่?
จำนวนมากเราเริ่มเห็นปรากฏการณ์นี้กับ jQuery เกี่ยวกับปีที่ผ่านมาเมื่อผู้คนเริ่มถามถึงวิธีการทำสิ่งที่บ้าอย่างเช่นดึงสตริงแบบสอบถามกับ jQuery ความแตกต่างระหว่างไลบรารี (jQuery) และภาษา (JavaScript) นั้นหายไปกับโปรแกรมเมอร์จำนวนมากและทำให้โค้ดที่ไม่เหมาะสมและซับซ้อนถูกเขียนขึ้นโดยที่ไม่จำเป็น บางทีมันอาจจะเป็นแค่จินตนาการของฉัน แต่ฉันสาบานฉันเริ่มที่จะเห็น uptick ในจำนวนของคำถามที่คนถามจะทำสิ่งที่บ้าในทำนองเดียวกันกับ Linq เช่นช่วงที่พบในอาร์เรย์เรียง ฉันไม่สามารถเข้าใจได้ว่าส่วนขยายของ Linq ไม่เหมาะสมสำหรับการแก้ไขปัญหานั้นอย่างไร แต่ที่สำคัญกว่านั้นความจริงที่ว่าผู้เขียนคิดว่าทางออกที่ดีที่สุดจะเกี่ยวข้องกับ Linqโดยไม่ต้องคิดอะไรเกี่ยวกับเรื่องนี้ ดูเหมือนว่าเรากำลังทำซ้ำประวัติศาสตร์ผสมโปรแกรมเมอร์รุ่นใหม่ของ. NET ที่ไม่สามารถบอกความแตกต่างระหว่างภาษา (C # / VB.NET) และไลบรารี่ (Linq) อะไรคือสาเหตุของปรากฏการณ์นี้? มันเป็นเพียงแค่โฆษณา แนวโน้มนกกางเขน? Linq ยกชื่อเสียงขึ้นมาในรูปแบบของเวทมนต์แทนที่จะเขียนโค้ดจริง ๆ แล้วคุณแค่ต้องใช้คาถาที่ถูกต้อง? ฉันไม่ค่อยพอใจกับคำอธิบายเหล่านั้น แต่ฉันไม่สามารถคิดถึงสิ่งอื่นได้ ที่สำคัญกว่านั้นคือปัญหาจริงๆและถ้าเป็นเช่นนั้นวิธีที่ดีที่สุดในการช่วยเหลือผู้คนเหล่านี้คืออะไร?

3
การทดสอบการรวมหมายถึงการทดสอบหน่วยทั้งหมดซ้ำหรือไม่?
สมมติว่าฉันมีฟังก์ชั่น (เขียนใน Ruby แต่ทุกคนควรเข้าใจได้): def am_I_old_enough?(name = 'filip') person = Person::API.new(name) if person.male? return person.age > 21 else return person.age > 18 end end ในการทดสอบหน่วยฉันจะสร้างการทดสอบสี่แบบเพื่อให้ครอบคลุมทุกสถานการณ์ แต่ละคนจะใช้ล้อเลียนPerson::APIวัตถุที่มีวิธีการที่ค้างอยู่และmale?age ตอนนี้มันมาถึงการเขียนการทดสอบการรวม ฉันถือว่า Person :: API ไม่ควรถูกเยาะเย้ยอีกต่อไป ดังนั้นฉันจะสร้างกรณีทดสอบสี่ชุดให้เหมือนกัน แต่ไม่มีการจำลองวัตถุ Person :: API ถูกต้องไหม ถ้าใช่แล้วประเด็นของการเขียนการทดสอบหน่วยคืออะไรถ้าฉันสามารถเขียนการทดสอบการรวมซึ่งทำให้ฉันมีความมั่นใจมากขึ้น (ขณะที่ฉันทำงานกับวัตถุจริงไม่ใช่ stubs หรือ mocks)

3
มันเป็น antipattern ที่จะใช้ peek () เพื่อแก้ไของค์ประกอบสตรีม?
สมมติว่าฉันมีกระแสของสิ่งต่าง ๆ และฉันต้องการ "เพิ่มคุณค่า" พวกเขาให้อยู่กลางกระแสฉันสามารถใช้peek()ทำสิ่งนี้ได้เช่น: streamOfThings.peek(this::thingMutator).forEach(this::someConsumer); สมมติว่าการกลายพันธุ์สิ่งต่าง ๆ ณ จุดนี้ในรหัสเป็นการทำงานที่ถูกต้องตัวอย่างเช่นthingMutatorวิธีการอาจตั้งค่าฟิลด์ "lastProcessed" เป็นเวลาปัจจุบัน อย่างไรก็ตามpeek()ในบริบทส่วนใหญ่หมายถึง "มอง แต่ไม่ได้สัมผัส" ใช้peek()เพื่อเปลี่ยนแปลงองค์ประกอบของกระแสข้อมูลที่เป็น antipattern หรือไม่เหมาะสมหรือไม่? แก้ไข: ทางเลือกที่ธรรมดากว่าคือการเปลี่ยนผู้บริโภค: private void thingMutator(Thing thing) { thing.setLastProcessed(System.currentTimeMillis()); } ไปที่ฟังก์ชันที่คืนค่าพารามิเตอร์: private Thing thingMutator(Thing thing) { thing.setLastProcessed(currentTimeMillis()); return thing; } และใช้map()แทน: stream.map(this::thingMutator)... แต่ที่แนะนำรหัสลวก ๆ (คนreturn) และฉันไม่ได้เชื่อว่ามันเป็นที่ชัดเจนเพราะคุณรู้ว่าpeek()ผลตอบแทนที่วัตถุเดียวกัน แต่map()มันไม่ได้ล้างได้อย่างรวดเร็วว่ามันเป็นเดียวกันระดับของวัตถุ นอกจากนี้peek()คุณยังสามารถมีแลมบ์ดาที่กลายพันธุ์ได้ แต่map()คุณต้องสร้างซากรถไฟ เปรียบเทียบ: stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...) …

3
การนำสาขาที่ผสานมาใช้ซ้ำการปฏิบัติที่ดี?
ปัจจุบันฉันเคยสร้างสาขาใหม่ทุกครั้งที่ฉันต้องเพิ่มฟีเจอร์ใหม่ให้กับแอปพลิเคชันของฉัน เมื่อคุณสมบัติของฉันเสร็จสิ้นและใช้งานได้ฉันจะรวมเข้ากับสาขาหลัก แต่ต่อมาเมื่อฉันต้องการอัปเดตฟีเจอร์นี้ (เช่นการปรับปรุง) มันจะดีกว่าถ้าจะสร้างสาขาใหม่หรือฉันต้องรีบูทก่อนหน้านี้กับมาสเตอร์การอัพเดตจะรวมกันอีกครั้งหรือไม่ ตัวอย่างเช่นฉันมีสาขาที่เรียกว่า modeling-member ในแอปพลิเคชัน Ruby on Rails ต่อมาฉันต้องเพิ่มคุณสมบัติบางอย่างในโมเดลสมาชิก (ซึ่งสร้างในสาขานี้) ฉันควรทำอย่างไร? รีบูทสาขานี้ด้วยมาสเตอร์อัปเดตโมเดลและรวมมันอีกครั้งหรือเพียงแค่สร้างสาขาใหม่
36 git  branching 

5
ไฟล์โค้ดมีขนาดใหญ่เกินไป?
ฉันกำลังค้นหาไฟล์บรรทัด 2-3k มากมายและมันก็ไม่ได้รู้สึกว่ามันควรจะใหญ่ขนาดนั้น อะไรคือเกณฑ์ที่ดีในการโทรหาไฟล์ซอร์สโค้ดอย่างออบเจ็กต์ "ใหญ่เกินไป"?

3
มีเหตุผลใดที่จะใช้ varchar บนคอลัมน์ข้อความในฐานข้อมูลหรือไม่?
เป็นvarcharเพียงเศษเล็กเศษน้อยจากก่อนหน้าtextนี้มาหรือมีกรณีการใช้งานที่คุณต้องการใช้varchar? (หรือcharสำหรับเรื่องนั้น .. ) (ฉันใช้ Postgres และ MySQL (MyISAM) ทุกวันดังนั้นนี่คือสิ่งที่ฉันสนใจมากที่สุด แต่คำตอบสำหรับฐานข้อมูลอื่นนั้นยินดีต้อนรับแน่นอน ^ _-)

5
มีกรณีศึกษาจริง ๆ เกี่ยวกับการเขียนอัตราความสำเร็จ / ความล้มเหลวของซอฟต์แวร์ใหม่หรือไม่?
ฉันเคยเห็นหลายโพสต์เกี่ยวกับการเขียนแอปพลิเคชั่นที่ไม่ดีประสบการณ์ของผู้คนที่มีต่อมันที่นี่ในโปรแกรมเมอร์และบทความที่Joel Spolsky เตรียมไว้ในหัวข้อ แต่ไม่มีหลักฐานหรือกรณีศึกษาที่ยาก นอกเหนือจากสองตัวอย่างที่โจเอลให้และโพสต์อื่น ๆ ที่นี่คุณจะทำอย่างไรกับโค้ดเบสที่ไม่ดีและคุณจะตัดสินใจอย่างไรว่าจะทำอย่างไรโดยอ้างอิงจากการศึกษาจริง ในกรณีนี้มีลูกค้าสองคนที่ฉันรู้ว่าทั้งคู่มีรหัสเดิม พวกเขาเดินกะเผลกไปพร้อมกับมันเพราะอย่างหนึ่งที่พวกเขาค้นพบการเขียนซ้ำเป็นหายนะมันมีราคาแพงและไม่ได้ทำงานเพื่อปรับปรุงรหัสมากนัก ลูกค้ารายนั้นมีตรรกะทางธุรกิจที่ซับซ้อนมากเนื่องจากพบผู้เขียนใหม่ได้อย่างรวดเร็ว ในทั้งสองกรณีนี้เป็นแอปพลิเคชั่นที่สำคัญต่อภารกิจซึ่งสร้างรายได้มากมายให้กับ บริษัท สิ่งที่พยายามเขียนใหม่รู้สึกว่าพวกเขาจะชนกำแพงอิฐหากซอฟต์แวร์ดั้งเดิมไม่ได้รับการอัพเกรดในบางจุดในอนาคต สำหรับฉันแล้วความเสี่ยงประเภทนี้รับประกันการวิจัยและการวิเคราะห์เพื่อให้มั่นใจว่าเส้นทางที่ประสบความสำเร็จ มีกรณีศึกษาจริงที่ตรวจสอบเรื่องนี้หรือไม่? ฉันไม่ต้องการทดลองเขียนบทใหม่โดยไม่ทราบวิธีปฏิบัติที่ดีที่สุดข้อผิดพลาดและความสำเร็จจากการศึกษาจริง ควันหลง: โอเคหลังจากค้นหาเพิ่มเติมฉันได้พบสามบทความที่น่าสนใจเกี่ยวกับกรณีศึกษา: เขียนหรือนำมาใช้ใหม่ พวกเขาทำการศึกษาเกี่ยวกับแอป Cobol ที่ถูกแปลงเป็น Java อื่น ๆ ที่อยู่ในซอฟท์แว Reuse: นักพัฒนาประสบการณ์และการรับรู้ การใช้ซ้ำหรือเขียนซ้ำการศึกษาค่าใช้จ่ายในการบำรุงรักษาอีกครั้งกับการเขียนซ้ำ ฉันเพิ่งพบบทความอื่นในเรื่อง: The Great Rewrite ดูเหมือนว่าผู้เขียนจะตีประเด็นสำคัญบางอย่าง นอกจากนี้ยังมีแนวคิดของการสร้างต้นแบบโดยใช้เทคโนโลยีสแต็คใหม่ที่เสนอและการวัดว่า devs หยิบมันได้รวดเร็วแค่ไหน ทั้งหมดนี้เป็นเหมือนโหมโรงของการเขียนซึ่งฉันคิดว่าเป็นความคิดที่ยอดเยี่ยม!

1
ความแตกต่างระหว่างการจัดทำดัชนี btree และ rtree คืออะไร?
ฉันสังเกตเห็นใน MySQLWorkbench ว่าคุณสามารถเลือกวิธีการจัดเก็บดัชนีของคุณก่อนส่งต่อการออกแบบของคุณ ประเภทการจัดเก็บคือ: bTree RTree กัญชา จากการค้นคว้านี้ฉันพบข้อมูลบางอย่างที่อยู่เหนือหัวฉันดังนั้นฉันจึงมองหาข้อมูลที่เป็นประโยชน์เกี่ยวกับความแตกต่างระหว่างสิ่งเหล่านี้และ / หรือสาเหตุที่คุณควรเลือกอย่างใดอย่างหนึ่ง นอกจากนี้ฉันไม่เคยเลือกประเภทการจัดเก็บมาก่อนดังนั้นฉันคิดว่า MySQL กำลังเลือกประเภทการจัดเก็บเริ่มต้น (BTREE?)

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

15
อาร์กิวเมนต์สำหรับหรือต่อต้านการใช้ลอง / จับเป็นตัวดำเนินการเชิงตรรกะ [ปิด]
ฉันเพิ่งค้นพบโค้ดที่น่ารักในแอพ บริษัท ของเราที่ใช้บล็อก Try-Catch เป็นตัวดำเนินการเชิงตรรกะ หมายความว่า "ทำรหัสบางอย่างถ้านั่นทำให้เกิดข้อผิดพลาดนี้ให้ทำรหัสนี้ แต่ถ้านั่นทำให้เกิดข้อผิดพลาดนี้ให้ทำสิ่งที่ 3 แทน" มันใช้ "สุดท้าย" เป็นคำสั่ง "อื่น" ที่ปรากฏ ฉันรู้ว่านี่เป็นความผิดโดยเนื้อแท้ แต่ก่อนที่ฉันจะเลือกการต่อสู้ฉันหวังว่าจะมีข้อโต้แย้งที่คิดออกมาดี และเฮ้ถ้าคุณมีข้อโต้แย้งสำหรับการใช้ลองจับในลักษณะนี้โปรดบอก สำหรับผู้ที่สงสัยภาษาคือ C # และรหัสที่เป็นปัญหานั้นมีประมาณ 30+ บรรทัดและกำลังมองหาข้อยกเว้นเฉพาะมันไม่ได้จัดการข้อยกเว้นทั้งหมด

11
เลขฐานแปดมีประโยชน์ที่ไหน? [ปิด]
ฉันเพิ่งกระแทกหัวของฉันกับโต๊ะประมาณ 20 นาทีเพื่อดูข้อผิดพลาดแปลก ๆ ทั้งหมดใน PHP และจากนั้นฉันก็รู้ว่ามีเลขฐานแปด <% (* & #> ฐานแปด กล่าวโดยย่อคือฉันมีตัวอักษรบางตัวที่มีเลขศูนย์เพื่อให้รหัสนั้นสอดคล้องฉันรู้ว่ามีความผิดพลาดครั้งใหญ่ ลืมเกี่ยวกับเลขฐานแปด คำถามคือไม่มีใครใช้ octals สำหรับสิ่งอื่นนอกจากการอนุญาตให้ใช้ไฟล์? (โดยส่วนตัวแล้วฉันชอบchmod ugo+rwxแต่ฉันเข้าใจว่าถ้าพวกเขาต้องมีการเขียนโปรแกรมแบบเป็นทางการมันมีประโยชน์ที่จะใช้ octals) แต่พวกมันมีประโยชน์ในสถานการณ์อื่นหรือไม่?
36 octal 

7
ทำไมทุกคนถึงนำคอนโทรลเลอร์ไปไว้ในโฟลเดอร์เดียวและอีกมุมมองหนึ่ง?
ฉันพร้อมที่จะโค้งงอจาก asp และเป็นกรอบ mvc, asp.net mvc หรือแนนซี่ เมื่อใดก็ตามที่ฉันไปฉันเห็นโฟลเดอร์สำหรับตัวควบคุม / โมดูลและโฟลเดอร์สำหรับมุมมอง นี่เป็นเพียงภาพเคลื่อนไหวของ pavlovian ในการจัดเรียงสิ่งต่าง ๆ ตามประเภทหรือมีการดำเนินงานอย่างลึกซึ้งยิ่งขึ้น? ฉันมีโปรเจ็กต์การพิสูจน์แนวคิดเล็กน้อยที่ฉันเก็บไฟล์ที่ฉันน่าจะเปิดด้วยกันไว้ด้วยกันซึ่งเป็นความสะดวกสบายที่สำคัญมาก เนื่องจากไฟล์เหล่านี้มีแนวโน้มที่จะเรียกซึ่งกันและกันไฟล์จึงสามารถทำได้โดยใช้ลิงก์ที่สั้นลงและเปราะน้อยกว่า รูปแบบนี้ถูกท้าทายโดย mvc เนื่องจากเส้นทางโฟลเดอร์จะไม่สอดคล้องกับเส้นทาง url โดยอัตโนมัติอีกต่อไปและใน asp.net mvc เทมเพลตโครงการและการกำหนดเส้นทางจะบังคับใช้ views \ controllers \ schism นี้หน้าไมโครซอฟท์แนะนำแนวคิดของพื้นที่ สามารถอ่านได้ว่าเป็นการยอมรับว่าแอพพลิเคชั่นขนาดใหญ่ไม่ใหญ่โตเป็นอย่างไรเนื่องจากการแยกแบบนี้ ผู้คนจะคัดค้าน "การแยกความกังวล" แต่การแยกความกังวลนั้นทำได้โดยการมีไฟล์ต้นฉบับแยกต่างหาก ไม่มีประโยชน์ใด ๆ ที่เป็นรูปธรรมสำหรับฉันจากการใช้ไฟล์ต้นฉบับเหล่านี้ที่เชื่อมโยงกันอย่างแน่นหนาและส่งมันไปยังอีกด้านหนึ่งของโครงสร้างโฟลเดอร์ มีคนอื่นต่อสู้สิ่งนี้หรือไม่? เคล็ดลับใด ๆ
36 mvc  asp.net-mvc 

2
ฉันจะทำให้สัญญา JavaScript ส่งคืนสิ่งอื่นนอกเหนือจากสัญญาได้อย่างไร
ฉันมีสเป็คจากลูกค้าสำหรับการใช้วิธีการในโมดูล: // getGenres(): // Returns a promise. When it resolves, it returns an array. หากได้รับแนวของประเภท ['comedy', 'drama', 'action'] นี่คือวิธีโครงกระดูกพร้อมสัญญา: MovieLibrary.getGenres = function() { var promise = new Promise(function(resolve, reject) { /* missing implementation */ }); return promise; }; สัญญาสามารถส่งคืนข้อมูลที่พบในประเภทได้หรือไม่? มีวิธีที่ดีกว่าเพื่อให้บรรลุคำอธิบายข้อมูลจำเพาะหรือไม่
36 javascript 

3
ความแตกต่างระหว่างฮีปและคิวลำดับความสำคัญ
ผมคิดเสมอว่ากองที่และคิวลำดับความสำคัญเป็นคำพ้อง - โครงสร้างข้อมูลนามธรรมที่สนับสนุนinsert, findMinและdeleteMinการดำเนินงาน วรรณกรรมบางเล่มดูเหมือนจะเห็นด้วยกับฉัน - ตัวอย่างโครงสร้างข้อมูลที่ใช้งานได้อย่างแท้จริงของ Chris Okasaki (บทที่ 3) ในทางกลับกันฮีปเพจของวิกิพีเดียกำหนดว่าเป็นโครงสร้างข้อมูลแบบทรีและระบุว่า heaps เป็นการใช้คิวงานที่มีลำดับความสำคัญสูง ฉันมีความยากลำบากในการคืนดีกับความจริงที่ว่าฉันสามารถคิดถึงการใช้ฮีปมากกว่าหนึ่งครั้ง - กองซ้ายกองซ้อนทวิทวิสเปรย์กอง ... ความจริงง่ายๆที่ heap สามารถนำไปใช้กับโครงสร้างข้อมูลที่แตกต่างกันไม่ได้หมายความว่าตามนิยามแล้วมันเป็นโครงสร้างข้อมูลนามธรรมหรือไม่? และถ้าเป็นเช่นนั้นจะมีความแตกต่างจริงกับลำดับความสำคัญหรือไม่

4
การล่วงละเมิดทั่วไปคืออะไร?
ในขณะที่ตรวจสอบรหัสบางอย่างฉันสังเกตเห็นโอกาสที่จะเปลี่ยนเป็นใช้ชื่อสามัญ โค้ด (obfuscated) ดูเหมือนว่า: public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets) { var someProperty = typeOfTarget.GetProperty(possibleTargets[0]); ... } รหัสนี้อาจถูกแทนที่ด้วย generics เช่น: public void DoAllTheThings<T>(object[] possibleTargets[0]) { var someProperty = type(T).getProperty(possibleTargets[0]); ... } ในการวิจัยถึงประโยชน์และข้อบกพร่องของวิธีการนี้ผมพบว่าในระยะที่เรียกว่าการทำผิดกฎทั่วไป ดู: ปกป้องมือใหม่ (ผู้พัฒนา) จากยาชื่อสามัญ https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics https://codereview.stackexchange.com/q/60695 คำถามของฉันมีสองส่วน: จะมีประโยชน์ใด ๆ ในการย้ายไปยาสามัญเช่นนี้? (ประสิทธิภาพอ่านง่าย) การละเมิดทั่วไปคืออะไร และใช้งานทั่วไปทุกครั้งที่มีพารามิเตอร์ประเภทเป็นการละเมิด ?
35 generics 

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