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

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

4
ฉันจะออกแบบเว็บเซอร์ RESTful ให้ใช้บุคคลที่สาม (เช่น Google, Facebook, Twitter) สำหรับการตรวจสอบได้อย่างไร
สำหรับงานของฉันเรามี webservice สงบดีที่เราสร้างขึ้นที่เราใช้ในการขับเคลื่อนเว็บไซต์สองสามที่เรามี โดยทั่วไปเว็บเซอร์วิซให้คุณสร้างและทำงานกับตั๋วสนับสนุนและเว็บไซต์รับผิดชอบส่วนหน้า การร้องขอบริการเว็บเซอร์ใด ๆ ใช้ส่วนหัวรับรองความถูกต้องซึ่งเราใช้ในการตรวจสอบผู้ใช้และรหัสผ่านสำหรับการโทรแต่ละครั้ง ในปีนี้เราต้องการขยายตัวเลือกการเข้าสู่ระบบของเราเพื่อให้ผู้ใช้บนเว็บไซต์สามารถเข้าสู่ระบบผ่านทาง Google, Twitter และ Facebook อย่างไรก็ตามฉันมีปัญหามากมายในการหาวิธีการออกแบบสิ่งนี้ดังนั้นเว็บเซอร์วิซจึงสามารถใช้ผู้ให้บริการการพิสูจน์ตัวตนบุคคลที่สามเพื่อให้แน่ใจว่าผู้ใช้เป็นคนที่พวกเขาพูด มีวิธีปฏิบัติที่ดีที่สุดในการทำเช่นนี้หรือไม่? ขณะนี้เรากำลังคิดที่จะให้เว็บไซต์จัดการกับการรับรองความถูกต้องของผู้ใช้แล้วใช้การเรียก setSessionId ใหม่ที่ลงทะเบียนเซสชันปัจจุบันด้วยเว็บเซอร์แบ็กเอนด์ คำขอเพิ่มเติมแต่ละรายการไปยังเว็บเซอร์วิซจะส่งผ่าน sessionId นั้นและจะตรวจสอบความถูกต้อง สิ่งเหล่านี้ดูเหมือนจะโอเค แต่ฉันมีความรู้สึกที่ด้านหลังของหัวของฉันที่ฉันไม่ได้คิดเรื่องนี้ผ่านและทุกการเรียกดูฟอรั่มของฉันและการอ่านรายละเอียด Oauth และ openid เป็นเพียงทำให้ฉันสับสนมากขึ้น เคล็ดลับใด ๆ สำหรับวิธีแก้ไขปัญหานี้

6
TDD และการควบคุมเวอร์ชัน
ฉันกำลังเรียนรู้เกี่ยวกับ TDD และพยายามนำไปใช้ในโครงการส่วนตัวของฉัน ฉันยังใช้การควบคุมเวอร์ชันอย่างกว้างขวางในหลายโครงการเหล่านี้ ฉันสนใจในการทำงานร่วมกันของเครื่องมือทั้งสองนี้ในกระบวนการทำงานทั่วไปโดยเฉพาะอย่างยิ่งเมื่อมันมาถึงจุดสูงสุดเพื่อให้ความมุ่งมั่นเล็ก ๆ นี่คือตัวอย่างบางส่วนที่นึกถึง: ฉันเริ่มต้นโครงการใหม่และเขียนการทดสอบอย่างง่ายเพื่อสร้างคลาสแบบ as-yet-nonexistent ฉันควรจะทำแบบทดสอบก่อนเขียนชั้นแม้ว่าการทดสอบจะไม่ได้รวบรวม หรือฉันควรเริ่มต้นจำนวนขั้นต่ำของรหัสที่จำเป็นสำหรับการทดสอบเพื่อคอมไพล์ก่อนที่จะคอมมิท? ฉันพบข้อบกพร่องและเขียนการทดสอบเพื่อสร้างใหม่ ฉันควรคอมมิชชันทดสอบที่ล้มเหลวหรือใช้การแก้ไขข้อบกพร่องแล้วคอมมิท? เหล่านี้เป็นสองตัวอย่างที่มาถึงใจทันที อย่าลังเลที่จะให้ตัวอย่างเพิ่มเติมในคำตอบของคุณ แก้ไข: ฉันตั้งสมมติฐานในทั้งสองตัวอย่างว่าทันทีหลังจากเขียนการทดสอบฉันจะเขียนโค้ดเพื่อทำการทดสอบ สถานการณ์อื่นอาจเกิดขึ้น: ฉันทำงานในโครงการที่ใช้ TDD เป็นเวลาหลายชั่วโมงโดยไม่ต้องทำอะไร ในที่สุดเมื่อฉันลงมือทำฉันต้องการที่จะเลิกงานของฉันเป็นชิ้นเล็ก ๆ (Git ทำให้สิ่งนี้ค่อนข้างง่ายแม้ว่าคุณต้องการจะยอมรับการเปลี่ยนแปลงบางอย่างในไฟล์เดียว) ซึ่งหมายความว่าคำถามของฉันเป็นเรื่องเกี่ยวกับสิ่งที่จะกระทำตามที่เป็นอยู่เมื่อใดที่จะกระทำ

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

2
ทำไม Haskell มี built-in“ if / then / else” แทนที่จะกำหนดเป็นฟังก์ชั่นไลบรารีแบบง่าย ๆ ?
เหตุใด Haskell จึงมี built-in if/then/elseซึ่งขึ้นอยู่กับBoolชนิดแทนที่จะมีฟังก์ชันไลบรารีอย่างง่าย เช่น if :: Bool -> a -> a -> a if True x _ = x if False _ y = y
25 haskell 

7
ซอฟต์แวร์นำมาใช้ซ้ำขัดขวางกระบวนการทำซ้ำได้หรือไม่
การใช้รหัสซ้ำเป็นปัญหา ฉันคิดเกี่ยวกับคำถามนี้ในการส่งมอบซอฟต์แวร์และผมเก็บไว้กลับไปที่ปัญหาของการเข้ามาทำซ้ำและ / หรือการทำซ้ำ มันสำคัญเพราะถ้าคุณไม่ทำซ้ำโครงการมันจะยากขึ้นในการปรับปรุงกระบวนการที่คุณใช้ในการสร้างโครงการ วิศวกรรมเกี่ยวข้องกับการปรับปรุงกระบวนการที่เกี่ยวข้องกับการออกแบบและการก่อสร้างอย่างต่อเนื่องเพื่อผลิตโครงการที่มีคุณภาพสูงขึ้น ซอฟต์แวร์สามารถพึ่งพาอย่างหนักเมื่อนำมาใช้ใหม่เนื่องจากรูปแบบดิจิทัล แทนที่จะเขียนโมดูลเราเพียงเรียกมันอีกครั้งหรือคัดลอกไปยังระบบอื่น ตัวอย่างบางส่วนคือการรับรองความถูกต้อง / เข้าสู่ระบบหรืออาจเป็นฟังก์ชั่นการบันทึก มีตัวอย่างมากมายที่เป็นที่รู้จักกันดีสำหรับประเภทเหล่านั้นและภูมิปัญญาดั้งเดิมคือการนำสิ่งที่มีอยู่กลับมาใช้ใหม่ การเปรียบเทียบบางสาขากับสาขาอื่น การก่อสร้าง ในทางตรงกันข้ามการก่อสร้างระบบทางกายภาพ (อาคารสะพาน) ไม่ได้อยู่ใกล้แค่นำมาใช้ซ้ำ เป็นความจริงที่ว่าพิมพ์เขียวของบ้านสามารถนำกลับมาใช้ซ้ำได้หลายครั้งเพื่อสร้างสำเนาบ้านเดียวกัน แต่การก่อสร้างจะต้องดำเนินการทุกครั้ง ตัดและวางไม่ทำงานอย่างนั้นในโลกอะนาล็อก พิมพ์เขียว Bridge เป็นการนำกลับมาใช้ใหม่ได้น้อยกว่าเนื่องจากสภาพของไซต์จะแตกต่างกันไป ผู้สร้างต้นแบบเป็นผู้เชี่ยวชาญที่ได้รับการยอมรับว่ามีการออกแบบและ / หรือสร้างสิ่งของหลายสิบหลายร้อยหรือหลายพันรายการ ยกตัวอย่างเช่นFrank Lloyd Wrightdesigned more than 1,000 structures and completed 532 worksโลกสถาปนิกที่มีชื่อเสียงและนักออกแบบ เปรียบเทียบกับAnders Hejlsbergผู้ออกแบบ“ just” ห้าภาษา (Turbo Pascal; Delphi; J ++; C #; Typescript) เป็นการเปรียบเทียบที่ไม่ยุติธรรมเนื่องจากหลายโดเมนแตกต่างกัน …

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

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

4
ทำไมไม่คอมไพล์บรรทัดที่อยู่ติดกันโดยไม่มีความขัดแย้ง
ฉันเพิ่งเรียนรู้ว่าเมื่อรวมสองสาขาในคอมไพล์ถ้ามีการเปลี่ยนแปลงในสองบรรทัดที่อยู่ติดกันคอมไพล์ประกาศความขัดแย้งนี้ ตัวอย่างเช่นหากไฟล์test.txtมีเนื้อหานี้: Line 1: A Line 2: B Line 3: C Line 4: D และในสาขาmasterเราเปลี่ยนสิ่งนี้เป็น Line 1: A Line 2: B1 Line 3: C Line 4: D ในขณะที่สาขาtestingเราเปลี่ยนสิ่งนี้เป็น Line 1: A Line 2: B Line 3: C1 Line 4: D และจากนั้นพยายามที่จะรวมtestingเข้าไปในmasterคอมไพล์ประกาศความขัดแย้งผสาน ความคาดหวังที่ไร้เดียงสาของฉันคือการรวมจะเกิดขึ้นโดยไม่มีความขัดแย้งและให้สิ่งนี้: Line 1: A Line 2: B1 Line 3: …
25 git  merging 

7
ข้อดีและข้อเสียของ HTML5 แนวทางแอพมือถือแบบเนทีฟและไฮบริดคืออะไร
ฉันต้องการพัฒนาแอปพลิเคชั่นมือถือ ฉันเพิ่งอ่านบทความในTelerik Forumซึ่งเปรียบเทียบกับแอปพลิเคชั่นมือถือสามประเภทและฉันไม่รู้ว่าควรเริ่มต้นจากที่ใด นี่คือรูปภาพที่อธิบายข้อดีข้อเสียของตัวเลือกการออกแบบมือถือที่แตกต่างกัน ในการตัดสินใจระหว่างตัวเลือกการออกแบบเหล่านี้ฉันต้องการทำความเข้าใจข้อดีข้อเสียของตัวเลือกสถาปัตยกรรมแต่ละตัวที่ระบุไว้ในแผนภาพ ข้อดีและข้อเสียของสถาปัตยกรรมแต่ละวิธีมีอะไรบ้าง

2
การเปิดเผยรหัส C ++ ต่อสาธารณะเป็น C API หมายความว่าอย่างไรและข้อดีของการทำคืออะไร
ฉันมักจะได้ยินคนพูดว่าโปรแกรมเมอร์ C ++ ควรเปิดเผย API สาธารณะของห้องสมุด / ผลิตภัณฑ์เป็น C API นั่นหมายถึงอะไรและข้อดีของมันคืออะไร?
25 c++  c  api 

4
เมื่อสร้าง api ฉันควรติดกับฟังก์ชั่นขนาดเล็กและการโทรจำนวนมากหรือไม่กี่สายและฟังก์ชั่นขนาดใหญ่?
ฉันมีแพลตฟอร์มรางที่ฉันบำรุงรักษา มันมีเว็บแอปพลิเคชั่นที่แตกต่างกันมากมาย อย่างไรก็ตามตอนนี้ลูกค้ากำลังขอ API เพื่อให้พวกเขาสามารถเก็บผู้ใช้ในเว็บไซต์ของพวกเขา แต่ใช้ประโยชน์จากงานอัตโนมัติบางอย่างที่เรามี แพลตฟอร์มดังกล่าวใช้เพื่อสร้างแอปพลิเคชั่นประกันภัยและอนุญาตให้ซื้อสินค้าทางออนไลน์รวมถึงวิธีการดาวน์โหลดเอกสารที่เกี่ยวข้องกับนโยบายของคุณ ดังนั้นคำถามของฉันเมื่อสร้าง API คือ: เมื่อฉันต้องทำสิ่งต่างๆมากมายเช่นการvalidateสร้างuser, user profileและpolicyสวยมากในเวลาเดียวกัน ฉันควรทำการโทรแบบแยก 4 ครั้งและให้ลูกค้าสร้างการโทร 4 ครั้งที่ด้านข้าง หรือฉันควรจะมีหนึ่งสายที่ยกเว้นพารามิเตอร์จำนวนมากที่ตรวจสอบลูกค้าและสร้างทั้ง 3 สิ่งในเวลาเดียวกันทำให้สิ่งต่าง ๆ ง่ายขึ้นสำหรับลูกค้า? ในกรณีนี้ลูกค้าจะได้รับข้อมูลที่จำเป็นทั้งหมดในเวลาเดียวกันดังนั้นจึงไม่เหมือนกับว่ามีการไหลตามธรรมชาติในแอปพลิเคชันของพวกเขาที่หยุดชั่วคราวและพวกเขาสามารถเรียก API ไปยังแพลตฟอร์มของฉันได้ ก่อนหน้านี้ลูกค้าเคยใช้ API หลายตัวมาแล้วความกล้าของฉันคือทำให้มันง่ายสำหรับลูกค้าเท่าที่จะทำได้และให้พวกเขาทำการโทรเพียงครั้งเดียว อย่างไรก็ตามสิ่งนี้นำไปสู่ค่อนข้างใหญ่functionsใน API ซึ่งฉันไม่ได้เป็นแฟนของทั้ง คุณจะแนะนำให้ฉันแก้ไขปัญหานี้ได้อย่างไร ตามที่ทราบมาฉันไม่มั่นใจในความสามารถของลูกค้าในการนำ API ที่ซับซ้อนมาใช้

4
อัลกอริทึมการแลกเปลี่ยนค่า XOR นี้ยังใช้งานอยู่หรือมีประโยชน์
เมื่อฉันเริ่มทำงานกับโปรแกรมเมอร์แอสเซมเบลอร์เมนเฟรมแสดงให้ฉันเห็นว่าพวกเขาสลับไปยังค่าโดยไม่ต้องใช้อัลกอริทึมแบบดั้งเดิมของ: a = 0xBABE b = 0xFADE temp = a a = b b = temp สิ่งที่พวกเขาใช้ในการสลับสองค่า - จากบิตเป็นบัฟเฟอร์ขนาดใหญ่ - คือ: a = 0xBABE b = 0xFADE a = a XOR b b = b XOR a a = a XOR b ตอนนี้ b == 0xBABE a == 0xFADE ซึ่งสลับเนื้อหาของวัตถุ …
25 algorithms 

1
การจัดส่งแอปเดสก์ท็อป Clojure เป็นจริงหรือไม่
ฉันกำลังจัดส่งแอปพลิเคชัน Java บนเดสก์ท็อป มันเป็นแอพ Java 5 Java / Swing แบบธรรมดาและทุกอย่างทำงานได้ดี มีการกำหนดเป้าหมาย Java 5 เนื่องจากผู้ใช้บางรายอยู่ในรุ่น OS X / คอมพิวเตอร์ซึ่งจะไม่มี Java 6 (เราอาจยกเลิกข้อ จำกัด นี้ในไม่ช้าและสลับไปใช้ Java รุ่นใหม่และทิ้งผู้ใช้ของฉันที่ติดอยู่กับ Java 5) ฉันกำลังเร่งความเร็วอย่างรวดเร็วด้วย Clojure แต่ฉันยังไม่ได้ทำ Clojure-to-Java และ Java-to-Clojure จำนวนมากจริงๆและฉันสงสัยว่ามันเป็นเรื่องจริงหรือไม่ที่จะจัดส่งแอปพลิเคชัน Clojure เดสก์ท็อปแทนแอพพลิเคชัน Java ? แอปพลิเคชันที่ฉันกำลังจัดส่งอยู่ในขณะนี้ประมาณ 12 MB พร้อมด้วย. jarทั้งหมดดังนั้นการเพิ่ม Clojure ไม่พบปัญหามากเกินไป แผนของฉันคือการมี Clojure เรียก Java APIs: …

1
C ++. Net ใช้อย่างกว้างขวางหรือไม่?
ฉันเป็นคนทำรหัส C ++ ตามธรรมเนียม ในช่วง 12 เดือนที่ผ่านมาฉันใช้รหัส C # มากและรู้สึกประหลาดใจอย่างมากกับวิธีการปฏิบัติของ C # (เมื่อฉันหยุดพยายามที่จะโค้ดมันราวกับว่ามันเป็น "C ++ พร้อมการเก็บขยะ") เมื่อไม่นานมานี้เรามีผู้สำเร็จการศึกษาบางคนและเมื่อช่วยเหลือหนึ่งในนั้นฉันก็รู้ว่าเธอกำลังใช้. Net ใน C ++ หลังจากถามเธอว่าทำไมเธอบอกว่าเธอถูก "บอกให้ใช้ C ++ โดยผู้จัดการของเธอ" ปัญหาการสื่อสารที่เห็นได้ชัดฉันคิดว่าเธอใช้. Net เพราะนั่นเป็นเพียงกรอบการทำงานที่เธอได้สัมผัส จากนั้นฉันเจอโครงการเก่าโดยนักพัฒนาอาวุโสที่ใช้ C ++ เพื่อขับเคลื่อนส่วนหน้าของแบบฟอร์ม ตอนนี้มันจะถูกเขียนขึ้นในช่วงเวลา. Net ปรากฏตัวครั้งแรกดังนั้นฉันจึงคิดว่ามันเป็นการออกกำลังกายการเรียนรู้ในส่วนของเขาที่จะเล่นกับ. Net มันเป็นเพียงแอพยูทิลิตี้ขนาดเล็ก ฉันต้องใช้การดัดแปลงเล็กน้อยในแอพนี้ฉันคิดว่าการใช้ C ++ เพื่อขับเคลื่อน. Net ช่วยให้คุณแย่ที่สุดในโลกทั้งสอง ไม่มีการรวบรวมขยะหรือความปลอดภัยของหน่วยความจำ แต่ไม่มีโอกาสในการเพิ่มประสิทธิภาพ / การเพิ่มประสิทธิภาพที่คล้ายกันเนื่องจากคุณกำลังจัดการกับกรอบงานที่มีการจัดการ ดังนั้นคำถามของฉันคือว่าคนใช้ C …
25 c++  .net 


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