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

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

3
มีคำศัพท์สำหรับ OOP ที่ซับซ้อนเกินไปหรือไม่
หรือสองปีที่ผ่านมาผมเห็นบทความที่ดีใน OOP (Java) ซึ่งแสดงให้เห็นความก้าวหน้าของคนตัดไม้คอนกรีตที่เรียบง่ายของสองหรือสามบรรทัดของรหัสและทฤษฎีกระบวนการคิดที่มากเกินไปโดยนักพัฒนาที่ไม่มีประสบการณ์ที่พื้นกล่าวว่าโอ้ฉันควร เพิ่มในกรณีที่เราต้องการ! ในตอนท้ายของบทความคนตัดไม้ธรรมดานี้เป็นระเบียบขยะขนาดใหญ่ที่นักพัฒนาดั้งเดิมแทบจะไม่เข้าใจตัวเอง ... มีคำศัพท์ทั่วไปสำหรับการเกิดภาวะแทรกซ้อนเกินประเภทนี้หรือไม่ บทความนั้น (ซึ่งฉันหวังว่าจะได้พบอีกครั้ง) แสดงให้เห็นถึงแนวคิดที่ยอดเยี่ยมสำหรับกรณีที่โดดเดี่ยว แต่ฉันเจอโครงการทั้งหมดที่ผู้พัฒนาได้ตั้งโปรแกรมตัวเองเป็นปมโดยใช้รูปแบบกรอบห้องสมุดและ ปัญหาอื่น ๆ ในทางของตัวเองสิ่งนี้เลว (หรือแย่กว่า) กว่าแอปสปาเก็ตตี้ VB6 ดั้งเดิมที่เราสืบทอดมา สิ่งที่ฉันกำลังมองหาคือการทำให้เรื่องนี้เกิดขึ้นเมื่อทำการสัมภาษณ์ ฉันต้องการทราบว่ามีใครรู้และรู้ตัวหรือไม่ว่ามันง่ายแค่ไหนที่จะตกอยู่ในสถานการณ์นี้โดยขาดสถาปัตยกรรม / การวางแผนล่วงหน้า (และลดลงไม่ว่าพวกเขาจะมีความสมดุลที่ถูกต้องหรือไม่) ฉันสามารถหาข้อมูลจำนวนมากได้

5
เหตุผลที่ต้องชอบ RIGHT JOIN มากกว่า LEFT JOIN
ถ้าฉันเข้าใจถูกต้องทุกคนRIGHT JOIN: SELECT Persons.*, Orders.* FROM Orders RIGHT JOIN Persons ON Orders.PersonID = Persons.ID สามารถแสดงเป็นLEFT JOIN: SELECT Persons.*, Orders.* FROM Persons LEFT JOIN Orders ON Persons.ID = Orders.PersonID ความคิดเห็นส่วนตัวของฉันคือเจตนาของแถลงการณ์: ก่อนได้รับ Persons จากนั้นขยาย / ทำซ้ำPersonsตามที่จำเป็นเพื่อให้ตรงกับOrders แสดงได้ดีกว่าโดยคำสั่งของPersons LEFT JOIN Ordersกว่าสั่งย้อนกลับOrders RIGHT JOIN Persons(และฉันไม่เคยใช้RIGHT JOINเป็นผล) มีสถานการณ์ใดบ้างที่RIGHT JOINเป็นที่ต้องการ? หรือมีกรณีการใช้งานที่RIGHT JOINสามารถทำสิ่งที่LEFT JOINไม่สามารถ?

7
ควรใช้ "อย่างอื่น" ในสถานการณ์ที่การควบคุมการไหลทำให้ซ้ำซ้อนหรือไม่?
บางครั้งฉันสะดุดกับรหัสที่คล้ายกับตัวอย่างต่อไปนี้ (สิ่งที่ฟังก์ชั่นนี้ทำไม่ตรงกับขอบเขตของคำถามนี้): function doSomething(value) { if (check1(value)) { return -1; } else if (check2(value)) { return value; } else { return false; } } ในขณะที่คุณสามารถดูif, else ifและelseงบที่ใช้ร่วมกับreturnคำสั่ง ดูเหมือนว่าจะใช้งานง่ายสำหรับผู้สังเกตการณ์ทั่วไป แต่ฉันคิดว่ามันจะดูสง่างามกว่า (จากมุมมองของนักพัฒนาซอฟต์แวร์) เพื่อวางelse-s และทำให้รหัสง่ายขึ้นดังนี้: function doSomething(value) { if (check1(value)) { return -1; } if (check2(value)) { return value; } return false; } …

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

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

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

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

7
DevOps หมายถึงนักพัฒนาในขณะนี้รับผิดชอบโครงสร้างพื้นฐานและการวางจำหน่าย แต่อะไรคือไดรเวอร์ที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้?
DevOps หมายถึงนักพัฒนาในขณะนี้รับผิดชอบโครงสร้างพื้นฐานและการวางจำหน่าย แต่อะไรคือไดรเวอร์ที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้? ฉันจะวางไพ่ไว้บนโต๊ะ: ฉันเป็นนักพัฒนาและทำงานทั้งใน "DevOps" และไม่ใช่วัฒนธรรม ต้องกังวลเกี่ยวกับโครงสร้างพื้นฐานและการเผยแพร่และ QA และพิธีที่เกี่ยวข้องเป็นสิ่งที่ทำให้ไขว้เขวจากการเขียนรหัสที่ดี แต่อุตสาหกรรมกำลังเคลื่อนไปในทิศทางนี้ดังนั้นเหตุผลนี้คืออะไร รูปแบบของ "ความเชี่ยวชาญเฉพาะทาง" ทำให้เกิดปัญหาอะไรขึ้น?
18 process  devops 

1
แตกต่างระหว่าง ES6 และ Javascript [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ES6 คืออะไร มันเป็นจาวาสคริปต์หรือไม่ หรือผู้สนับสนุนหลายภาษา ฉันค้นหา แต่ไม่สามารถเข้าใจได้โดยเฉพาะอย่างยิ่งหน้าใน Wikipedia มันดีกว่า Javascript หรือเปล่า? และฉันจะทำอย่างไรในการพัฒนาเว็บไซต์ด้วยภาษานี้ ดังนั้น ES6 คืออะไรและฉันจะใช้มันอย่างไรในการพัฒนาแอปพลิเคชันบนเว็บของฉัน
18 javascript  es6 

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

5
ควรตรวจสอบความถูกต้องของเลเยอร์ใด
ฉันกำลังสร้าง Rest API โดยใช้ Spring Boot และฉันกำลังใช้การตรวจสอบความถูกต้องของไฮเบอร์เนตเพื่อตรวจสอบอินพุตคำขอ แต่ฉันยังต้องการการตรวจสอบความถูกต้องประเภทอื่นเช่นเมื่ออัปเดตข้อมูลจำเป็นต้องตรวจสอบหากไม่มีรหัส บริษัท ฉันต้องการส่งข้อยกเว้นที่กำหนดเอง การตรวจสอบความถูกต้องนี้ควรอยู่ที่ชั้นบริการหรือชั้นควบคุมหรือไม่ ชั้นบริการ: public Company update(Company entity) { if (entity.getId() == null || repository.findOne(entity.getId()) == null) { throw new ResourceNotFoundException("can not update un existence data with id : " + entity.getId()); } return repository.saveAndFlush(entity); } เลเยอร์ควบคุม: public HttpEntity<CompanyResource> update(@Valid @RequestBody Company …

2
เป็นความคิดที่ดีหรือไม่ที่จะกำหนดฟังก์ชั่นส่วนตัวขนาดใหญ่หนึ่งตัวในคลาสเพื่อรักษาสถานะที่ถูกต้องนั่นคือเพื่ออัพเดทข้อมูลสมาชิกของวัตถุ?
แม้ว่าในรหัสด้านล่างจะใช้การซื้อรายการเดียวอย่างง่ายในไซต์อีคอมเมิร์ซคำถามทั่วไปของฉันคือการอัปเดตข้อมูลสมาชิกทั้งหมดเพื่อให้ข้อมูลของวัตถุอยู่ในสถานะที่ถูกต้องตลอดเวลา ฉันพบว่า "ความสอดคล้อง" และ "สถานะเป็นสิ่งที่ชั่วร้าย" เป็นวลีที่เกี่ยวข้องซึ่งได้กล่าวถึงที่นี่: https://en.wikibooks.org/wiki/Object_Oriented_Programming#.22State.22_is_Evil.21 <?php class CartItem { private $price = 0; private $shipping = 5; // default private $tax = 0; private $taxPC = 5; // fixed private $totalCost = 0; /* private function to update all relevant data members */ private function updateAllDataMembers() { $this->tax …

3
มันดีไหมที่จะมีหลายคลาสในไฟล์เดียวกันใน Python?
ฉันเพิ่งเข้ามาสู่โลก Python หลังจากหลายปีของ Java และ PHP ในขณะที่ภาษานั้นค่อนข้างตรงไปตรงมาฉันกำลังดิ้นรนกับปัญหา 'เล็กน้อย' บางอย่างที่ฉันไม่สามารถคาดหัวได้ - และฉันไม่สามารถหาคำตอบในเอกสารและแบบฝึกหัดมากมายที่ฉันอ่านมาได้ . สำหรับผู้ปฏิบัติงาน Python ที่มีประสบการณ์คำถามนี้อาจดูไร้สาระ แต่ฉันต้องการคำตอบจริงๆเพื่อที่ฉันจะได้ไปต่อด้วยภาษา: ใน Java และ PHP ( แม้ว่าจะไม่จำเป็นอย่างเคร่งครัด ) คุณคาดว่าจะเขียนแต่ละclassไฟล์ของตัวเองโดยมีชื่อไฟล์ว่าclassเป็นแนวทางปฏิบัติที่ดีที่สุด แต่ใน Python หรืออย่างน้อยในแบบฝึกหัดที่ฉันตรวจสอบมันก็โอเคที่จะมีหลายคลาสในไฟล์เดียวกัน กฎนี้มีไว้ในการผลิตรหัสพร้อมใช้หรือไม่หรือทำเพื่อความกะทัดรัดในรหัสที่ให้ความรู้เท่านั้น

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

1
ยังคงเป็น antipattern หรือไม่ถ้าเราบันทึกข้อความแสดงข้อผิดพลาดและส่งข้อยกเว้นอื่น?
WebApplication ของเราคือการใช้เพื่อแมข้อยกเว้นบางประการExceptionMapper Responseเราบันทึกข้อความข้อยกเว้นก่อนที่จะส่งข้อยกเว้นใหม่ดังนี้: catch (SomeException ex) { LOG.error(ex.getMessage()); throw new MyException(ex.getMessage()); } เราจะไม่ได้อีกครั้งการขว้างปายกเว้นเดียวกันดังนั้นคำถามของฉันคือถ้าเรื่องนี้จะได้รับการพิจารณาเข้าสู่ระบบและโยน antipattern และจะเป็นการดีกว่าถ้าจะลบการบันทึกในสถานที่ที่คล้ายกันและย้ายไปยังExceptionMapperคลาสต่างๆดังนี้: @Provider public class MyExceptionMapper implements ExceptionMapper<MyException> { // bla bla @Override public Response toResponse(final MyException ex) { LOG.error(ex.getMessage()); return Response.status(400).entity("something").build(); } }

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