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

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

3
วิธีการนำคิวข้อความไปใช้กับ Redis
ทำไม Redis ถึงเข้าคิว? ฉันอยู่ภายใต้ความประทับใจที่ Redis สามารถสร้างผู้สมัครที่ดีสำหรับการนำระบบคิวเข้ามาใช้ จนถึงตอนนี้เราได้ใช้ฐานข้อมูล MySQL กับโพลหรือ RabbitMQ ด้วย RabbitMQ เรามีปัญหามากมาย - ห้องสมุดลูกค้านั้นแย่มากและบั๊กกี้และเราไม่ต้องการลงทุนชั่วโมงนักพัฒนามากเกินไปในการแก้ไขปัญหาเหล่านี้ปัญหาบางอย่างเกี่ยวกับคอนโซลการจัดการเซิร์ฟเวอร์ ฯลฯ และในเวลานั้น อย่างน้อยเราก็ไม่ได้จับเป็นมิลลิวินาทีหรือผลักดันประสิทธิภาพอย่างจริงจังดังนั้นตราบใดที่ระบบมีสถาปัตยกรรมที่รองรับคิวอย่างชาญฉลาดเราอาจมีรูปร่างที่ดี ตกลงนั่นคือพื้นหลัง โดยพื้นฐานแล้วฉันมีโมเดลคิวที่เรียบง่ายคลาสสิกผู้ผลิตหลายรายผลิตงานและบริโภคผู้บริโภคจำนวนมากและทั้งผู้ผลิตและผู้บริโภคต้องสามารถปรับขนาดได้อย่างชาญฉลาด ปรากฎว่าไร้เดียงสาPUBSUBไม่ทำงานเนื่องจากฉันไม่ต้องการให้สมาชิกทั้งหมดใช้งานฉันแค่ต้องการสมาชิกหนึ่งคนเพื่อรับงาน ที่ผ่านครั้งแรกมันดูเหมือนฉันชอบBRPOPLPUSHคือการออกแบบที่ชาญฉลาด เราสามารถใช้ BRPOPLPUSH ได้หรือไม่? การออกแบบพื้นฐานด้วยBRPOPLPUSHคือคุณมีคิวงานหนึ่งคิวและคิวความคืบหน้า เมื่อผู้บริโภคได้รับการทำงานมันอะตอมผลักดันรายการลงในคิวความคืบหน้าและเมื่อเสร็จสิ้นการทำงานมันLREMเป็นมัน สิ่งนี้จะช่วยป้องกันไม่ให้เกิดการปิดกั้นการทำงานหากลูกค้าตายและทำการตรวจสอบได้อย่างง่ายดาย - ตัวอย่างเช่นเราสามารถบอกได้ว่ามีปัญหาที่ทำให้ผู้บริโภคต้องใช้เวลานานในการปฏิบัติงานนอกเหนือจากการบอกว่ามีงานจำนวนมากหรือไม่ มันทำให้มั่นใจ ส่งมอบงานให้กับผู้บริโภคเพียงรายเดียว ทำงานช้าลงในคิวที่กำลังดำเนินการอยู่ดังนั้นจึงไม่สามารถปิดกั้นผู้บริโภคได้ ข้อเสียเปรียบ มันค่อนข้างแปลกสำหรับฉันที่การออกแบบที่ดีที่สุดที่ฉันพบไม่ได้ใช้จริงPUBSUBเนื่องจากนี่เป็นสิ่งที่บล็อกโพสต์ส่วนใหญ่เกี่ยวกับการรอคิว Redis ดังนั้นฉันรู้สึกว่าฉันขาดอะไรบางอย่างที่ชัดเจน วิธีเดียวที่ฉันเห็นการใช้งานPUBSUBโดยไม่ต้องเสียงานสองครั้งคือเพียงแค่ส่งการแจ้งเตือนว่างานมาถึงแล้วซึ่งผู้บริโภคสามารถไม่ปิดกั้นRPOPLPUSHได้ เป็นไปไม่ได้ที่จะขอมากกว่าหนึ่งรายการงานในแต่ละครั้งซึ่งดูเหมือนว่าจะเป็นปัญหาด้านประสิทธิภาพ ไม่ใช่เรื่องใหญ่สำหรับสถานการณ์ของเรา แต่เห็นได้ชัดว่าการดำเนินการนี้ไม่ได้ถูกออกแบบมาสำหรับปริมาณงานสูงหรือสถานการณ์นี้ ในระยะสั้น: ฉันไม่มีอะไรที่โง่หรือเปล่า? เพิ่มแท็ก node.js ด้วยเพราะนั่นคือภาษาที่ฉันใช้เป็นหลัก โหนดอาจเสนอการทำให้เรียบง่ายบางอย่างในการดำเนินการเนื่องจากลักษณะแบบเธรดเดียวและไม่มีการปิดกั้น แต่ยิ่งไปกว่านั้นฉันใช้ไลบรารี่ node-redis และวิธีแก้ปัญหาควรหรืออาจอ่อนไหวต่อจุดแข็งและจุดอ่อนของมัน

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

7
ความแตกต่างระหว่าง "การซ่อนข้อมูล" และ "การห่อหุ้มข้อมูล" คืออะไร?
ฉันกำลังอ่าน "การทำงานพร้อมกันของ Java ในทางปฏิบัติ" และมีการกล่าวว่า: "โชคดีที่เทคนิคเชิงวัตถุเดียวที่ช่วยให้คุณเขียนคลาสที่มีการจัดการที่ดีและบำรุงรักษาได้เช่น encapsulation และการซ่อนข้อมูล - สามารถช่วยคุณสร้าง thread-safe ชั้นเรียน." ปัญหา # 1 - ฉันไม่เคยได้ยินเกี่ยวกับการซ่อนข้อมูลและไม่รู้ว่ามันคืออะไร ปัญหา # 2 - ฉันคิดเสมอว่า encapsulation ใช้ private vs public และจริงๆแล้วคือการซ่อนข้อมูล คุณช่วยอธิบายการซ่อนข้อมูลคืออะไรและแตกต่างจากการห่อหุ้มข้อมูลได้อย่างไร

5
มาตรฐานสำหรับการบรรจุซอร์สโค้ด Linux กลายเป็น. tar.gz เมื่อใด
เมื่อเรียกดูโปรเจ็กต์โอเพนซอร์สที่พัฒนาเป็นหลักสำหรับระบบ Linux และการดาวน์โหลดแพ็คเกจล่าสุดซอร์สโค้ดจะถูกเก็บไว้ในไฟล์. tar.gz หรือ. tar.bz2 เสมอ มีเหตุผลใดบ้างสำหรับการใช้. tar.gz หรือ. tar.bz2 แทนที่จะเป็น. zip หรือ. rar หรืออัลกอริทึมการบีบอัดอื่น ๆ (หรือปล่อยให้ไม่มีการบีบอัดหากโครงการมีขนาดเล็ก)

3
Schema.org กับไมโครฟอร์แมต
พวกเขาทั้งสองตอบสนองวัตถุประสงค์เดียวกัน: ให้คำศัพท์สำหรับความหมายมาร์กอัป สคีมาได้รับการยอมรับและเป็นมาตรฐาน ... แต่มาตรฐานไมโครฟอร์แมตเป็นกระบวนการชุมชนเปิด Schema ใช้ประโยชน์จาก microdata ในเอกสารในขณะที่ไมโครฟอร์แมตใช้งานได้ในชั้นเรียน (หมายเหตุ: microdata หมายความว่าองค์ประกอบจะต้องเป็นแบบเดี่ยวitemtypeในขณะที่ไมโครฟอร์แมตอนุญาตให้หลายคลาสใช้กับองค์ประกอบเดียวกันฉันสามารถทำเครื่องหมาย xFolk + hAtom ด้วยคลาส แต่ไม่ใช่ microdata) นี่เป็นสถานการณ์ขาวดำหรือไม่? Google บอกว่าฉันไม่สามารถใช้ทั้ง "เพราะอาจทำให้โปรแกรมแยกวิเคราะห์สับสน" ฉันทามติเกี่ยวกับสิ่งเหล่านี้คืออะไร?

9
เว็บเบราเซอร์ Pure Java มันใช้งานได้จริงหรือ? [ปิด]
ฉันรู้ว่าเว็บเบราว์เซอร์ Java เป็นไปได้ แต่จริงหรือ? ฉันเคยเห็นโครงการ Loboและต้องยอมรับว่าฉันประทับใจ แต่จากสิ่งที่ฉันรวบรวมมันดูเหมือนว่าการพัฒนาหยุดชะงักในปี 2009 เบราว์เซอร์ที่เข้ารหัสใน Java บริสุทธิ์ (ไม่มีการผูก WebKit ทุกประเภท) สามารถแข่งขันกับ ผู้ที่อยู่ในอันดับต้น ๆ ของ Chrome หรือ Firefox หรือจะช้ากว่าเดิมขัดขวางผู้ใช้?
29 java  web  browser 

11
การประกาศอินเตอร์เฟสในไฟล์เดียวกับคลาสพื้นฐานมันเป็นการปฏิบัติที่ดีหรือไม่?
เพื่อให้สามารถเปลี่ยนได้และทดสอบได้ปกติบริการที่มีตรรกะต้องมีส่วนต่อประสานเช่น public class FooService: IFooService { ... } การออกแบบที่ชาญฉลาดฉันเห็นด้วยกับสิ่งนี้ แต่หนึ่งในสิ่งที่รบกวนฉันด้วยวิธีนี้คือสำหรับบริการเดียวคุณจะต้องประกาศสองสิ่ง (คลาสและส่วนต่อประสาน) และในทีมของเราโดยปกติสองไฟล์ (หนึ่งไฟล์ สำหรับคลาสและอีกอันสำหรับอินเตอร์เฟส) ความไม่สะดวกสบายอีกประการคือความยากลำบากในการนำทางเนื่องจากการใช้ "ไปที่คำจำกัดความ" ใน IDE (VS2010) จะชี้ไปที่อินเทอร์เฟซ (เนื่องจากคลาสอื่นอ้างอิงถึงอินเทอร์เฟซ) ไม่ใช่คลาสจริง ฉันคิดว่าการเขียน IFooService ในไฟล์เดียวกับ FooService จะลดความแปลกประหลาดข้างต้น ท้ายที่สุด IFooService และ FooService มีความเกี่ยวข้องกันมาก นี่เป็นวิธีปฏิบัติที่ดีหรือไม่? มีเหตุผลที่ดีที่ IFooService จะต้องอยู่ในไฟล์ของตัวเองหรือไม่?

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

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

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

1
เมื่อใดที่คุณควรใช้ฐานข้อมูลเทียบกับเอกสารเทียบกับกราฟ? [ปิด]
สำหรับวัตถุประสงค์ของการสนทนาลองพิจารณาสถานการณ์จำลองของ FourSquare สถานการณ์ หน่วยงาน: ผู้ใช้ สถานที่ ความสัมพันธ์: Checkins: ผู้ใช้ <-> สถานที่หลายแห่งไปมาก เพื่อน: ผู้ใช้ <-> ผู้ใช้หลายต่อหลายคน การออกแบบฐานข้อมูล สิ่งเหล่านี้มักจะมีข้อผิดพลาดโปรดชี้ให้พวกเขาเห็น RDBMS โต๊ะ: ผู้ใช้ สถานที่ เช็คอิน (แยก) เพื่อน (แยก) ข้อดี: CAP: ความสอดคล้องความพร้อมใช้งาน จุดด้อย: CAP: ความอดทนต่อการแบ่งพาร์ทิชัน schemes = โครงสร้างที่ไม่ยืดหยุ่น การจำลองแบบไม่ดี? กราฟ วัตถุที่: ผู้ใช้ สถานที่ ขอบ: เพื่อน: ผู้ใช้ <-> ผู้ใช้ เช็คอิน: ผู้ใช้ -> สถานที่ มีการประทับเวลา ข้อดี: …

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

12
ทำไมชั้นเรียนควรเป็นอย่างอื่นนอกจาก“ นามธรรม” หรือ“ สุดท้าย / ปิดผนึก”
หลังจาก 10 ปีของการเขียนโปรแกรม java / c # ฉันพบว่าตัวเองกำลังสร้าง: คลาสนามธรรม : สัญญาที่ไม่ได้มีไว้เพื่อสร้างอินสแตนซ์ ชั้นเรียนสุดท้าย / ปิดผนึก : การนำไปปฏิบัติไม่ได้หมายถึงการใช้เป็นคลาสพื้นฐานให้กับสิ่งอื่น ฉันไม่สามารถนึกถึงสถานการณ์ใด ๆ ที่ "คลาส" ง่าย ๆ (เช่นไม่เป็นนามธรรมหรือสุดท้าย / ปิดผนึก) จะเป็น "การเขียนโปรแกรมที่ชาญฉลาด" ทำไมชั้นเรียนควรเป็นอย่างอื่นนอกจาก "นามธรรม" หรือ "ขั้นสุดท้าย / ปิดผนึก" แก้ไข บทความที่ดีนี้อธิบายถึงความกังวลของฉันได้ดีกว่าที่ฉันสามารถทำได้

3
วิธีต่าง ๆ ในการดู monad
ในขณะที่เรียนรู้ Haskell ฉันได้พบกับบทเรียนมากมายที่พยายามอธิบายสิ่งที่ monads และทำไม monads มีความสำคัญใน Haskell แต่ละคนใช้การเปรียบเทียบดังนั้นการจับความหมายได้ง่ายขึ้น ในตอนท้ายของวันฉันได้จบลงด้วยมุมมองที่แตกต่างกัน 3 แบบว่า monad คืออะไร: ดู 1: Monad เป็นป้ายกำกับ บางครั้งฉันคิดว่า monad เป็นป้ายชื่อประเภทเฉพาะ ตัวอย่างเช่นฟังก์ชั่นของประเภท: myfunction :: IO Int myfunction เป็นฟังก์ชันที่เมื่อใดก็ตามที่มีการดำเนินการมันจะให้ค่า Int ชนิดของผลลัพธ์ไม่ใช่ Int แต่เป็น IO Int ดังนั้น IO จึงเป็นเลเบลของค่า Int เตือนผู้ใช้ให้รู้ว่าค่า Int เป็นผลลัพธ์ของกระบวนการที่ได้ทำการกระทำของ IO ดังนั้นค่า Int นี้จึงถูกทำเครื่องหมายเป็นค่าที่มาจากกระบวนการที่มี IO ดังนั้นค่านี้จึงเป็น "สกปรก" กระบวนการของคุณไม่บริสุทธิ์อีกต่อไป ดู …

8
มีเหตุผลที่จะเรียกใช้กระบวนการด้วยเครื่องมือ CI หรือไม่
ที่ บริษัท ของฉันเรามีปัญหาของงาน cron ที่แตกต่างกัน (ในหลาย ๆ ระบบ) และเริ่มกระบวนการด้วยตนเองซึ่งทำให้การทำงานทางธุรกิจของเราเป็นผลมาจากการพัฒนาที่รวดเร็วและการละเลยในเวลาต่อมา สักวันเราจะต้องหาวิธีแก้ปัญหาแบบรวมศูนย์ด้วยเหตุผลที่ชัดเจน ความคิดหนึ่งที่เราได้เริ่มต้นกันคือการใช้ซอฟต์แวร์การรวมอย่างต่อเนื่องของเรา (เจนกินส์) เพื่อเรียกใช้กระบวนการเหล่านี้ซึ่งดูเหมือนว่ามีเหตุผล คำถามของฉันคือ: บริษัท อื่น ๆ กำลังทำเช่นนี้หรือไม่? นี่เป็นวิธีปฏิบัติที่ยอมรับกันโดยทั่วไปหรือไม่ สิ่งนี้ขัดแย้งกับคำจำกัดความของเครื่องมือ CI โดยนัยในชื่อหรือไม่? มีตัวเลือกอื่น ๆ อีกไหม? หมายเหตุ: https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins เจนกินส์อ้างว่ามันมุ่งเน้นไปที่ "การตรวจสอบการดำเนินการของงานที่ดำเนินการจากภายนอกเช่นงาน cron และงาน procmail" ฉันไม่แน่ใจว่านี่เป็นสิ่งที่ฉันกำลังพูดถึงหรือไม่

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