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

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

2
การควบคุมการเข้าถึงตามบทบาทที่ได้รับอนุญาต
ฉันพยายามที่จะเข้าใจถึงการแลกเปลี่ยนระหว่างบทบาทและสิทธิ์ต่าง ๆ เมื่อพูดถึงการควบคุมการเข้าถึง (การอนุญาต) เริ่มจากสิ่งที่กำหนดไว้: ในระบบของเราการอนุญาตจะเป็นหน่วยการเข้าถึงที่ละเอียด (" แก้ไขทรัพยากร X ", " เข้าถึงหน้าแดชบอร์ด " ฯลฯ ) บทบาทจะเป็นคอลเลกชันของ 1+ สิทธิ์ ผู้ใช้สามารถมีบทบาท 1+ ความสัมพันธ์เหล่านี้ทั้งหมด (ผู้ใช้, บทบาท, การอนุญาต) จะถูกเก็บไว้ในฐานข้อมูลและสามารถเปลี่ยนแปลงได้ทันทีและตามความจำเป็น ความกังวลของฉัน: (1) "เลวร้าย" เกี่ยวกับการตรวจสอบบทบาทสำหรับการควบคุมการเข้าถึงอย่างไร จะได้ประโยชน์อะไรบ้างจากการตรวจสอบการอนุญาตแทน กล่าวอีกนัยหนึ่งอะไรคือความแตกต่างระหว่างตัวอย่างโค้ดด้านล่าง: if(SecurityUtils.hasRole(user)) { // Grant them access to a feature } // vs. if(SecurityUtils.hasPermission(user)) { // Grant them access to …

9
ฐานข้อมูลเชิงสัมพันธ์อะไรที่ได้รับจากการตั้งค่าชนิดข้อมูลที่กำหนดไว้ล่วงหน้าสำหรับแต่ละคอลัมน์
ฉันกำลังทำงานกับฐานข้อมูล SQL อยู่ในขณะนี้และสิ่งนี้ทำให้ฉันสงสัยอยู่เสมอ แต่การค้นหาของ Google ไม่ได้เกิดอะไรขึ้น: ทำไมประเภทข้อมูลที่เข้มงวด ฉันเข้าใจว่าทำไมคุณต้องการมีไม่กี่ชนิดข้อมูลที่แตกต่างกันตัวอย่างเช่นวิธีการแตกต่างระหว่างข้อมูลที่เป็นข้อความธรรมดาไบนารีและเป็นสิ่งสำคัญ แทนที่จะเก็บข้อมูลไบนารี 1 และ 0s เป็นข้อความธรรมดาตอนนี้ฉันเข้าใจว่ามันมีประสิทธิภาพมากกว่าในการจัดเก็บข้อมูลไบนารีเป็นรูปแบบของตัวเอง แต่สิ่งที่ฉันไม่เข้าใจคือสิ่งที่ประโยชน์คือการมีประเภทข้อมูลที่แตกต่างกันมากมาย : ทำไมmediumtext, longtextและtext? ทำไมdecimal, floatและint? เป็นต้น ประโยชน์ของการบอกฐานข้อมูลคืออะไร "จะมีเพียง 256 ไบต์ของข้อมูลข้อความธรรมดาในรายการในคอลัมน์นี้" หรือ "คอลัมน์นี้สามารถมีรายการข้อความได้ถึง 16,777,215 ไบต์" มันเป็นผลประโยชน์ด้านประสิทธิภาพหรือไม่? ถ้าใช่ทำไมรู้ขนาดของรายการก่อนมือช่วยประสิทธิภาพ? หรือค่อนข้างเป็นอย่างอื่นทั้งหมด?

4
ทำไมโครงสร้างและคลาสแยกแนวคิดใน C #
ในขณะที่การเขียนโปรแกรมใน C # ฉันสะดุดกับการตัดสินใจออกแบบภาษาแปลก ๆ ที่ฉันไม่เข้าใจ ดังนั้น C # (และ CLR) มีชนิดข้อมูลรวมสองประเภท: struct(ค่าประเภทเก็บไว้ในสแต็กไม่มีการสืบทอด) และclass(อ้างอิงประเภทเก็บไว้ในกองมีมรดก) การตั้งค่านี้ฟังดูดีในตอนแรก แต่จากนั้นคุณสะดุดวิธีที่ใช้พารามิเตอร์ของชนิดรวมและเพื่อหาว่าจริง ๆ แล้วเป็นประเภทค่าหรือประเภทอ้างอิงคุณต้องค้นหาการประกาศของประเภทนั้น บางครั้งอาจทำให้สับสนได้ วิธีแก้ปัญหาที่เป็นที่ยอมรับโดยทั่วไปดูเหมือนว่าจะประกาศstructว่า "ไม่เปลี่ยนรูป" (ตั้งค่าเขตข้อมูลไว้readonly) เพื่อป้องกันความผิดพลาดที่อาจเกิดขึ้นโดย จำกัดstructประโยชน์ของ ตัวอย่างเช่น C ++ ใช้โมเดลที่สามารถใช้งานได้มากขึ้น: ช่วยให้คุณสร้างอินสแตนซ์ของวัตถุบนสแต็กหรือบนฮีปและส่งผ่านตามค่าหรือโดยการอ้างอิง (หรือโดยตัวชี้) ฉันได้ยินอยู่เสมอว่า C # ได้รับแรงบันดาลใจจาก C ++ และฉันก็ไม่เข้าใจว่าทำไมมันไม่ใช้เทคนิคนี้ การรวมclassและสร้างstructเป็นหนึ่งเดียวกับตัวเลือกการจัดสรรที่แตกต่างกันสองตัว (ฮีปและสแต็ค) และส่งต่อให้เป็นค่าหรือ (อย่างชัดเจน) เนื่องจากการอ้างอิงผ่านทางrefและoutคำหลักดูเหมือนเป็นสิ่งที่ดี คำถามคือทำไมclassและstructกลายเป็นแนวคิดที่แยกต่างหากใน C # และ CLR แทนที่จะเป็นประเภทรวมหนึ่งที่มีสองตัวเลือกการจัดสรร?

2
ทำไมบางภาษาปัดเศษเป็นจำนวนเต็ม EVEN ที่ใกล้ที่สุด
ภาษาโปรแกรมเช่น Scheme (R5RS) และ Python ( ดูคำถามนี้ ) ไปทางเลขจำนวนเต็มคู่ที่ใกล้ที่สุดเมื่อค่าอยู่ระหว่างจำนวนเต็มโดยรอบ อะไรคือเหตุผลเบื้องหลังสิ่งนี้ มีแนวคิดทางคณิตศาสตร์ที่ทำให้การคำนวณต่อไปนี้ง่ายขึ้นด้วยเหตุผลหรือไม่ (R5RS อ้างอิงมาตรฐานจุดลอยตัว IEEE เป็นแหล่งที่มาของพฤติกรรมนี้)

7
เพราะเหตุใดจึงมีการสรุปขั้นสุดท้ายใน Java?
ตามโพสต์นี้เราไม่ควรพึ่งพาวิธีสุดท้ายที่จะเรียกว่า ดังนั้นทำไม Java จึงรวมไว้ในภาษาการเขียนโปรแกรมเลย? ดูเหมือนว่าการตัดสินใจที่จะรวมไว้ในภาษาการเขียนโปรแกรมใด ๆ ฟังก์ชั่นที่อาจได้รับการเรียก

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

11
ตัวแปรข้อผิดพลาดเป็นการต่อต้านรูปแบบหรือการออกแบบที่ดีหรือไม่?
เพื่อจัดการข้อผิดพลาดที่เป็นไปได้หลายอย่างที่ไม่ควรหยุดการทำงานฉันมีerrorตัวแปรที่ลูกค้าสามารถตรวจสอบและใช้เพื่อโยนข้อยกเว้น นี่เป็น Anti-Pattern หรือไม่ มีวิธีที่ดีกว่าในการจัดการกับเรื่องนี้? ตัวอย่างของสิ่งนี้คุณสามารถดูmysqli API ของ PHP สมมติว่าปัญหาการมองเห็น (ผู้เข้าถึงขอบเขตสาธารณะและส่วนตัวเป็นตัวแปรในคลาสหรือระดับโลกหรือไม่) ได้รับการจัดการอย่างถูกต้อง

11
วิธีปฏิบัติที่ดีที่สุดหรือรูปแบบการออกแบบสำหรับการดึงข้อมูลสำหรับการรายงานและแดชบอร์ดในแอปพลิเคชันที่มีโดเมนมากมาย
ก่อนอื่นฉันอยากจะบอกว่านี่เป็นคำถาม / ประเด็นที่ถูกทอดทิ้งดังนั้นหากคำถามนี้ต้องการการปรับปรุงให้ช่วยฉันทำสิ่งนี้ให้เป็นคำถามที่ดีที่จะเป็นประโยชน์ต่อผู้อื่น! ฉันกำลังมองหาคำแนะนำและความช่วยเหลือจากผู้ที่ใช้งานโซลูชันที่แก้ไขปัญหานี้ไม่ใช่แค่แนวคิดที่จะลอง จากประสบการณ์ของฉันมีแอพพลิเคชั่นสองด้าน - ด้าน "งาน" ซึ่งส่วนใหญ่ขับเคลื่อนด้วยโดเมนและเป็นที่ที่ผู้ใช้โต้ตอบอย่างล้นหลามกับโมเดลโดเมน ("เอ็นจิ้น" ของแอปพลิเคชัน) และด้านการรายงาน รับข้อมูลตามสิ่งที่เกิดขึ้นในงาน ในด้านงานเป็นที่ชัดเจนว่าแอปพลิเคชันที่มีรูปแบบโดเมนที่หลากหลายควรมีตรรกะทางธุรกิจในรูปแบบโดเมนและฐานข้อมูลควรใช้เป็นหลักในการคงอยู่เป็นส่วนใหญ่ การแยกข้อกังวลหนังสือทุกเล่มเขียนเกี่ยวกับเรื่องนี้เรารู้ว่าต้องทำอะไรดีเลิศ แล้วด้านรายงานล่ะ คลังข้อมูลยอมรับได้หรือไม่หรือมีการออกแบบที่ไม่ดีเพราะรวมตรรกะทางธุรกิจไว้ในฐานข้อมูลและข้อมูลเอง ในการรวบรวมข้อมูลจากฐานข้อมูลลงในข้อมูลคลังข้อมูลคุณต้องใช้ตรรกะทางธุรกิจและกฎกับข้อมูลและตรรกะและกฎนั้นไม่ได้มาจากรูปแบบโดเมนของคุณมาจากกระบวนการรวบรวมข้อมูลของคุณ มันผิดหรือเปล่า? ฉันทำงานกับแอปพลิเคชันการจัดการทางการเงินและโครงการขนาดใหญ่ซึ่งมีตรรกะทางธุรกิจที่กว้างขวาง เมื่อรายงานข้อมูลนี้ฉันมักจะมีการรวมจำนวนมากที่ต้องทำเพื่อดึงข้อมูลที่จำเป็นสำหรับรายงาน / แดชบอร์ดและการรวมมีตรรกะทางธุรกิจจำนวนมาก เพื่อประสิทธิภาพฉันได้ทำกับตารางรวมที่สูงและขั้นตอนการจัดเก็บ ตัวอย่างเช่นสมมติว่ารายงาน / แดชบอร์ดจำเป็นต้องแสดงรายการของโครงการที่ใช้งานอยู่ (จินตนาการ 10,000 โครงการ) แต่ละโครงการจะต้องมีชุดของตัวชี้วัดที่แสดงพร้อมตัวอย่างเช่น: งบประมาณรวม ความพยายามในวันที่ อัตราการเผาไหม้ วันหมดงบประมาณที่อัตราการเขียนปัจจุบัน เป็นต้น แต่ละรายการเกี่ยวข้องกับตรรกะทางธุรกิจจำนวนมาก และฉันไม่เพียงแค่พูดถึงการคูณตัวเลขหรือตรรกะง่ายๆ ฉันกำลังพูดถึงเพื่อที่จะได้รับงบประมาณคุณต้องใช้แผ่นอัตราที่มี 500 อัตราที่แตกต่างกันหนึ่งรายการสำหรับเวลาพนักงานแต่ละคน (ในบางโครงการโครงการอื่น ๆ มีตัวคูณ) ใช้ค่าใช้จ่ายและมาร์กอัปที่เหมาะสม ฯลฯ ตรรกะนั้นกว้างขวาง การรวบรวมและการปรับแต่งแบบสอบถามใช้เวลามากในการรับข้อมูลนี้ในเวลาที่เหมาะสมสำหรับลูกค้า ควรดำเนินการผ่านโดเมนก่อนหรือไม่ แล้วประสิทธิภาพล่ะ …


10
ทำไมไม่มีระบบปฏิบัติการภาษาระดับสูง? ภาษาระดับต่ำมีประสิทธิภาพมากขึ้นหรือไม่
โดยไม่ต้องเกรงใจฉันอยากให้คุณพิจารณาความเป็นไปได้ของสิ่งนี้ ระบบปฏิบัติการส่วนใหญ่ในปัจจุบันนี้ใช้ภาษาระดับต่ำ (ส่วนใหญ่ C / C ++) แม้แต่ภาษาใหม่เช่น Android ใช้ JNI และการใช้งานพื้นฐานอยู่ใน C ในความเป็นจริง (นี่เป็นการสังเกตการณ์ส่วนตัว) หลายโปรแกรมที่เขียนใน C ทำงานเร็วกว่าโปรแกรมระดับสูง (เช่น: การส่ง (ไคลเอนต์ bittorrent บน Ubuntu) เป็นจำนวนมากเร็วกว่า Vuze (Java) หรือ Deluge (Python) ) แม้แต่คอมไพเลอร์ไพ ธ อนก็เขียนด้วยภาษา C ถึงแม้ว่า PyPy จะเป็นข้อยกเว้น ดังนั้นมีเหตุผลพิเศษสำหรับเรื่องนี้หรือไม่? ทำไมมันจึงเรียกว่า "ภาษาระดับสูง" ของเราที่มีแนวคิด "OOP" ที่ยอดเยี่ยมไม่สามารถใช้ในการสร้างระบบปฏิบัติการที่มั่นคง? ดังนั้นฉันมี 2 คำถามโดยทั่วไป เหตุใดแอปพลิเคชันที่เขียนด้วยภาษาระดับต่ำจึงมีประสิทธิภาพมากกว่า HLL ที่เป็นคู่กัน …

8
มีวิธีใดบ้างที่จะหลีกเลี่ยงการโอเวอร์โฟลว์สแต็กในอัลกอริทึมแบบเรียกซ้ำได้
คำถาม มีวิธีใดที่เป็นไปได้ในการแก้ปัญหาการล้นสแต็กที่เกิดจากอัลกอริทึมแบบเรียกซ้ำ ตัวอย่าง ฉันกำลังพยายามแก้ปัญหาProject Euler 14และตัดสินใจลองใช้อัลกอริทึมแบบเรียกซ้ำ อย่างไรก็ตามโปรแกรมหยุดทำงานด้วย java.lang.StackOverflowError เข้าใจได้. อัลกอริทึมโอเวอร์โฟลว์สแต็คจริง ๆ เพราะฉันพยายามสร้างลำดับ Collatz สำหรับจำนวนมาก โซลูชั่น ดังนั้นฉันจึงสงสัยว่า: วิธีการมาตรฐานแบบใดที่จะแก้ปัญหาสแต็คโอเวอร์โฟลว์โดยสมมติว่าอัลกอริธึมวนซ้ำของคุณเขียนอย่างถูกต้องและจะจบลงด้วยการล้นสแต็กเสมอ แนวคิดสองประการที่อยู่ในใจคือ: หางเรียกซ้ำ การย้ำ แนวคิด (1) และ (2) ถูกต้องหรือไม่ มีตัวเลือกอื่น ๆ อีกไหม? แก้ไข มันจะช่วยให้เห็นบางรหัสโดยเฉพาะอย่างยิ่งใน Java, C #, Groovy หรือ Scala อาจจะไม่ใช้ปัญหา Project Euler ที่กล่าวมาข้างต้นดังนั้นมันจะไม่ทำให้ผู้อื่นเสีย แต่ใช้อัลกอริทึมอื่น ๆ แฟกทอเรียลอาจหรือสิ่งที่คล้ายกัน

7
นักพัฒนารุ่นน้องควรคาดหวังอะไรจากหัวหน้าทีมอาวุโส [ปิด]
คำเตือน: ความคิดเห็นที่แสดงเป็นของฉันเท่านั้นและไม่ได้แสดงความคิดเห็นหรือความคิดเห็นของนายจ้างของฉัน ฉันทำงานให้กับ บริษัท ขนาดเล็กซึ่งมีเพียงไม่กี่คนที่เป็นนักพัฒนาและคนอื่น ๆ คือ QA / Test และ 1 เป็นผู้จัดการ ฉันเข้าร่วม บริษัท นี้เมื่อ 1.5 ปีที่แล้ว นักพัฒนาอาวุโส 3 คนมีประสบการณ์มากกว่า 8 ปี นี่คือข้อสังเกตที่ฉันทำเกี่ยวกับหัวหน้าทีม (คิดว่าฉันเป็นคนที่มีประสบการณ์น้อยกว่าเมื่อเทียบกับพวกเขาในทุกด้าน) พวกเขาไม่เคยพูดถึง 1: 1 หรือพวกเขาไม่พิจารณาข้อเสนอแนะของผู้อยู่ใต้บังคับบัญชา (ฉันเห็นด้วยว่าขึ้นอยู่กับพวกเขาไม่ว่าพวกเขาจะยอมรับหรือไม่อย่างน้อยพวกเขาควรพิจารณาความเห็น) ในฐานะหัวหน้าทีมอาวุโสพวกเขาสามารถพยายามปรับโครงสร้าง codebase ด้วยเทคโนโลยีใหม่ (รวมถึงปัจจัยในการเปิดตัวเทคโนโลยีใหม่ที่เป็นไปได้และผู้พัฒนาและโครงสร้างพื้นฐานอื่น ๆ ก็พร้อม) แต่ผู้นำทีมเหล่านี้รู้สึกไม่ปลอดภัยในการทำงานกับเทคโนโลยีใหม่ พวกเขาไม่ทันสมัย (เหตุผลที่ฉันบอกพวกเขาไม่ทราบว่าแนวโน้มการเขียนโปรแกรมปัจจุบัน * (เช่นโครงการโอเพ่นซอร์สยอดนิยมเช่น modernizr, bootstrap และอื่น ๆ อีกมากมาย) ใน codebase ของเรามากขึ้นกว่า 10000+ …

2
วัตถุประสงค์ของ NaN Boxing คืออะไร?
การอ่านศตวรรษที่ 21 Cฉันมาที่บทที่ 6 ในหัวข้อ"การทำเครื่องหมายตัวเลขที่เป็นตัวเลขที่ยอดเยี่ยมกับ NaNs"ซึ่งอธิบายการใช้บิตในแมนทิสซาเพื่อเก็บรูปแบบบิตโดยพลการเพื่อใช้เป็นเครื่องหมายหรือพอยน์เตอร์ WebKit ใช้เทคนิคนี้) ฉันไม่แน่ใจจริงๆฉันเข้าใจประโยชน์ของเทคนิคนี้ว่าฉันเห็นว่าเป็นแฮ็ค (ขึ้นอยู่กับฮาร์ดแวร์ที่ไม่สนใจคุณค่าของ mantissa ใน NaN) แต่มาจากพื้นหลัง Java ที่ฉันไม่คุ้นเคย ความหยาบของ C. นี่คือตัวอย่างของรหัสที่ตั้งและอ่านเครื่องหมายใน NaN #include <stdio.h> #include <math.h> //isnan double ref; double set_na(){ if (!ref) { ref=0/0.; char *cr = (char *)(&ref); cr[2]='a'; } return ref; } int is_na(double in){ if (!ref) return 0; …

5
เหตุใด Java จึงไม่พิมพ์ข้อสรุป
ฉันสงสัยอยู่เสมอว่าทำไม Java ไม่พิมพ์ข้อสรุปเนื่องจากภาษาเป็นสิ่งที่มันเป็นและ VM เป็นผู้ใหญ่มาก Google's Go เป็นตัวอย่างของภาษาที่มีการอนุมานประเภทที่ยอดเยี่ยมและลดจำนวนการพิมพ์ที่ต้องทำ มีเหตุผลพิเศษเบื้องหลังคุณสมบัตินี้หรือไม่ที่ไม่ได้เป็นส่วนหนึ่งของ Java?

4
Python ให้อภัยเทียบกับการอนุญาตและการพิมพ์ดีดเป็ด
ใน Python ฉันมักจะได้ยินว่าเป็นการ "ให้อภัย" ดีกว่า (ยกเว้นการจับ) แทนที่จะดีกว่า "ขออนุญาต" (การตรวจสอบประเภท / เงื่อนไข) ในเรื่องที่เกี่ยวกับการบังคับใช้การพิมพ์เป็ดใน Python มันคือสิ่งนี้ try: x = foo.bar except AttributeError: pass else: do(x) ดีกว่าหรือแย่กว่า if hasattr(foo, "bar"): do(foo.bar) else: pass ในแง่ของประสิทธิภาพการอ่าน "pythonic" หรือปัจจัยสำคัญอื่น ๆ

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