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

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

7
ฉันควรใช้กริยา HTTP ใดเพื่อกระตุ้นการดำเนินการในบริการเว็บ REST
reloadฉันกำลังดำเนินการบริการเว็บสงบและเป็นหนึ่งในการกระทำที่มีอยู่จะเป็น มันจะใช้ในการโหลดการกำหนดค่าแคช ฯลฯ เราเริ่มต้นด้วยGETURI แบบง่าย ๆดังนี้: ${path}/cache/reload(ไม่มีการส่งพารามิเตอร์ใด ๆ เท่านั้นที่เรียกว่า URI) ฉันทราบว่าไม่ควรแก้ไขข้อมูลด้วยคำขอ GET กริยาที่ถูกต้องที่จะใช้เพื่อเรียกใช้การกระทำ / คำสั่งในบริการเว็บสงบคืออะไร? การโหลดซ้ำเป็นคำสั่งของเว็บเซอร์วิส REST ที่โหลดแคช / การกำหนดค่า / etc ของตัวเองอีกครั้ง ไม่ใช่วิธีการส่งคืนข้อมูลไปยังไคลเอนต์ อาจเป็นสิ่งที่ฉันพยายามทำไม่ใช่ REST แต่ก็ยังเป็นสิ่งที่ต้องทำด้วยวิธีนี้ reloadวิธีเป็นเพียงตัวอย่างจริงที่ทำให้ความรู้สึกที่อยู่ในขอบเขตของการประยุกต์ใช้และคำตอบส่วนใหญ่มุ่งเน้นไปที่มัน แต่ในความเป็นจริงผมเพียงแค่ต้องการที่จะทราบว่าคำกริยาที่จะเรียกการกระทำที่ไม่ได้ทำ CRUD แต่ยังคงมีการเปลี่ยนแปลงข้อมูล / สถานะ. ฉันพบรายละเอียดนี้เป็น asnwer บน Stack Overflow abot หัวเรื่อง: https://stackoverflow.com/questions/16877968/
80 rest  rpc 

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

5
การจัดเตรียมสภาวะแวดล้อม vs สภาวะแวดล้อมการใช้งานจริง
ฉันทำงานให้กับ บริษัท ที่เราสร้างแอพพลิเคชั่นระดับองค์กรและเรารักษาสภาพแวดล้อมสามประการ: การพัฒนา (หรือdev ) การจัดเตรียม (หรือขั้นตอน ) และการผลิต (หรือแยง ) ความหมายของdevนั้นใช้งานง่าย: เป็นสภาพแวดล้อมที่ใช้ระหว่างการพัฒนาแอปพลิเคชัน ความแตกต่างระหว่างสภาพแวดล้อมการจัดเตรียมและการผลิตคืออะไร

8
วิธีการทดสอบหน่วยควรจะเขียนโดยไม่เยาะเย้ยอย่างกว้างขวาง?
ตามที่ผมเข้าใจจุดของการทดสอบหน่วยคือการทดสอบหน่วยของรหัสในการแยก หมายความว่า: พวกเขาไม่ควรทำลายโดยการเปลี่ยนแปลงรหัสที่ไม่เกี่ยวข้องใดๆ ใน codebase การทดสอบหน่วยเดียวควรทำลายข้อบกพร่องในหน่วยการทดสอบซึ่งตรงข้ามกับการทดสอบการรวม (ซึ่งอาจแบ่งเป็นฮีป) ทั้งหมดนี้แสดงถึงว่าควรมีการเยาะเย้ยจากภายนอกหน่วยทดสอบ และฉันหมายถึงการพึ่งพาภายนอกทั้งหมดไม่เพียง แต่ "เลเยอร์นอก" เช่นระบบเครือข่ายระบบไฟล์ฐานข้อมูล ฯลฯ นี้นำไปสู่ข้อสรุปเชิงตรรกะที่แทบทุกหน่วยทดสอบความต้องการที่จะเยาะเย้ย ในทางกลับกันการค้นหาอย่างรวดเร็วของ Google เกี่ยวกับการเยาะเย้ยเผยให้เห็นบทความมากมายที่อ้างว่า "การเยาะเย้ยเป็นกลิ่นรหัส" และส่วนใหญ่ควรหลีกเลี่ยง (แม้ว่าจะไม่สมบูรณ์) ตอนนี้สำหรับคำถาม การทดสอบหน่วยควรเขียนอย่างถูกต้องอย่างไร? เส้นแบ่งระหว่างพวกเขากับการทดสอบการรวมอยู่ตรงไหน? อัปเดต 1 โปรดพิจารณารหัสหลอกต่อไปนี้: class Person { constructor(calculator) {} calculate(a, b) { const sum = this.calculator.add(a, b); // do some other stuff with the `sum` } } การทดสอบที่ทดสอบPerson.calculateวิธีการโดยไม่มีการเยาะเย้ยการCalculatorพึ่งพา …

2
เหตุใดจึงไม่อนุญาตให้เขียนพร้อมกันในฐานข้อมูล SQLite
ฉันกำลังเขียนโปรแกรมฐานข้อมูลโดยใช้ Java กับ SQLite ฉันพบว่าการเชื่อมต่อครั้งเดียวเท่านั้นไปยังฐานข้อมูลมีความสามารถในการเขียนในขณะที่การเชื่อมต่อหลายครั้งพร้อมกันมีความสามารถในการอ่าน ทำไมสถาปัตยกรรมของ SQLite จึงถูกออกแบบมาเช่นนี้ ตราบใดที่ทั้งสองสิ่งที่กำลังเขียนไม่ได้ถูกเขียนไปยังที่เดียวกันในฐานข้อมูลเหตุใดจึงไม่สามารถเขียนสองรายการได้ในคราวเดียว

8
เหตุใดจึงต้องใช้การขึ้นบรรทัดใหม่แทนที่จะนำหน้าด้วย printf
printfผมได้ยินมาว่าคุณควรหลีกเลี่ยงการขึ้นบรรทัดใหม่ชั้นนำเมื่อใช้ ดังนั้นแทนที่จะprintf("\nHello World!")ใช้printf("Hello World!\n") ในตัวอย่างข้างต้นนี้ไม่สมเหตุสมผลเนื่องจากเอาต์พุตจะแตกต่างกัน แต่ให้พิจารณาสิ่งนี้: printf("Initializing"); init(); printf("\nProcessing"); process_data(); printf("\nExiting"); เปรียบเทียบกับ: printf("Initializing\n"); init(); printf("Processing\n"); process_data(); printf("Exiting"); ฉันไม่เห็นประโยชน์ใด ๆ จากการขึ้นบรรทัดใหม่ยกเว้นว่าจะดูดีขึ้น มีเหตุผลอื่นอีกไหม? แก้ไข: ฉันจะอยู่คะแนนปิดที่นี่และตอนนี้ ฉันไม่คิดว่านี่เป็นของล้นล้นเพราะคำถามนี้ส่วนใหญ่เกี่ยวกับการออกแบบ ฉันก็จะบอกว่าถึงแม้มันอาจเป็นความคิดเห็นต่อเรื่องนี้คำตอบของ Kilian Fothและคำตอบของอาจารย์ก็พิสูจน์ให้เห็นว่ามีประโยชน์อย่างแท้จริงกับวิธีการหนึ่ง
79 c 

7
เหตุใดบิตมาสก์จึงถูกเรียกว่า“ มาสก์” และมีจุดประสงค์อะไร
เหตุใดจึงเรียกว่า "มาสก์บิต" แบบนี้ ฉันรู้ว่าส่วนใหญ่จะใช้สำหรับการดำเนินงานระดับบิตและการใช้บิตมาสก์นั้นมีประสิทธิภาพมากกว่าการใช้ตัวแปรแยกต่างหาก อย่างไรก็ตามคำถามของฉันคือทำไมและเมื่อมาสก์บิตถูกคิดค้นขึ้นมาเมื่อใด พวกเขาใช้งานตั้งแต่คำนวณครั้งแรกหรือไม่ มี "หน้ากาก" ประเภทอื่นนอกเหนือจากมาสก์บิตในโดเมนไอทีหรือไม่

6
การรวบรวมขยะทำงานในภาษาที่เรียบเรียงอย่างไร
หลังจากการเรียกดูคำตอบหลายกองมากเกินก็เป็นที่ชัดเจนว่าบางภาษาเรียบเรียงโดยกำเนิดมีการเก็บขยะ แต่มันก็ไม่ชัดเจนสำหรับฉันว่ามันจะทำงานอย่างไร ฉันเข้าใจว่าการรวบรวมขยะสามารถทำงานกับภาษาที่ตีความได้อย่างไร ตัวรวบรวมขยะจะทำงานพร้อมกับล่ามและลบวัตถุที่ไม่ได้ใช้และไม่สามารถเข้าถึงได้ออกจากหน่วยความจำของโปรแกรม พวกเขาทั้งสองทำงานร่วมกัน สิ่งนี้จะทำงานกับภาษาที่คอมไพล์ได้อย่างไร? ความเข้าใจของฉันคือเมื่อคอมไพเลอร์ได้รวบรวมซอร์สโค้ดไปยังรหัสเป้าหมาย - โดยเฉพาะรหัสเครื่องดั้งเดิม - ก็เสร็จแล้ว งานเสร็จสิ้นแล้ว ดังนั้นโปรแกรมที่คอมไพล์แล้วจะเก็บขยะได้อย่างไร? คอมไพเลอร์ทำงานร่วมกับ CPU ในบางวิธีในขณะที่โปรแกรมทำงานเพื่อลบวัตถุ "ขยะ" หรือไม่ หรือคอมไพเลอร์มีตัวรวบรวมขยะน้อยที่สุดในการปฏิบัติการของโปรแกรมที่คอมไพล์แล้วหรือไม่ ฉันเชื่อว่าคำสั่งหลังของฉันจะมีความถูกต้องมากกว่าเดิมเนื่องจากข้อความที่ตัดตอนมาจากคำตอบนี้ใน Stack Overflow : ภาษาโปรแกรมหนึ่งนั้นคือไอเฟล คอมไพเลอร์ไอเฟลส่วนใหญ่สร้างรหัส C สำหรับเหตุผลในการพกพา รหัส C นี้ใช้เพื่อสร้างรหัสเครื่องโดยคอมไพเลอร์ C มาตรฐาน Eiffel implementations ให้ GC (และบางครั้งก็แม่นยำ GC) สำหรับโค้ดที่คอมไพล์นี้และไม่จำเป็นสำหรับ VM โดยเฉพาะอย่างยิ่ง VisualEiffel คอมไพเลอร์สร้างรหัสเครื่อง x86 พื้นเมืองโดยตรงกับการสนับสนุน คำสั่งสุดท้ายดูเหมือนจะบ่งบอกว่าคอมไพเลอร์มีบางโปรแกรมในปฏิบัติการสุดท้ายซึ่งทำหน้าที่เป็นตัวเก็บรวบรวมขยะในขณะที่โปรแกรมกำลังทำงาน หน้าบนเว็บไซต์D ภาษาเกี่ยวกับการรวบรวมขยะ - ซึ่งถูกรวบรวมไว้อย่างเป็นธรรมชาติและมีที่เก็บขยะทางเลือก …

3
ฉันจะย้ายออกจากโรงเรียนแห่งความคิด“ for-loop” ได้อย่างไร?
นี่เป็นคำถามที่ค่อนข้างเป็นแนวคิด แต่ฉันหวังว่าฉันจะได้รับคำแนะนำที่ดีเกี่ยวกับเรื่องนี้ การเขียนโปรแกรมจำนวนมากที่ฉันทำคือกับอาร์เรย์( NumPy ); ฉันมักจะต้องจับคู่รายการในสองอาร์เรย์ขึ้นไปที่มีขนาดแตกต่างกันและสิ่งแรกที่ฉันไปคือ for-loop หรือแย่กว่านั้นเป็นซ้อนสำหรับ for-loop ฉันต้องการหลีกเลี่ยงการวนซ้ำมากที่สุดเพราะมันช้า (อย่างน้อยใน Python) ฉันรู้ว่าสิ่งต่าง ๆ มากมายกับ NumPy มีคำสั่งที่กำหนดไว้ล่วงหน้าที่ฉันเพียงแค่ต้องทำการวิจัย แต่คุณ (เป็นโปรแกรมเมอร์ที่มีประสบการณ์มากกว่า) มีกระบวนการคิดทั่วไปที่อยู่ในใจเมื่อคุณต้องทำอะไรบางอย่าง? ดังนั้นฉันมักจะมีสิ่งนี้ซึ่งน่ากลัวและฉันต้องการหลีกเลี่ยง: small_array = np.array(["one", "two"]) big_array = np.array(["one", "two", "three", "one"]) for i in range(len(small_array)): for p in range(len(big_array)): if small_array[i] == big_array[p]: print "This item is matched: ", small_array[i] …
79 python  array  loops 

6
คำพูดเดี่ยวเทียบกับเครื่องหมายคำพูดคู่ [ปิด]
ฉันเพิ่งเริ่มงานที่ฉันเขียน Python หลังจากมาจากพื้นหลัง Java และฉันสังเกตเห็นว่านักพัฒนารายอื่นมักจะพูดสตริงโดยใช้เครื่องหมายคำพูดเดี่ยว ( '') แทนที่จะเป็นเครื่องหมายคำพูดคู่ ( "") ตัวอย่างเช่น: line1 = 'This is how strings typically look.' line2 = "Not like this." มีเหตุผลใดที่นอกเหนือไปจากความชอบส่วนตัวหรือไม่? นี่เป็นวิธีที่เหมาะสมในการอ้างอิงสตริงหรือไม่ โดยเฉพาะสิ่งที่ฉันต้องการทราบคือหากมีมาตรฐานบางประเภทหรือวิธีปฏิบัติที่ดีที่สุดที่ยอมรับได้ซึ่งผลักดันรูปแบบการเข้ารหัสนี้


12
ทำไมการเปลี่ยนแปลงล่าสุดเพื่อลบ / ไม่ใช้เครื่องหมายอัฒภาคจาก Javascript
ดูเหมือนว่าเมื่อเร็ว ๆ นี้จะนิยมตัดเครื่องหมายอัฒภาคออกจาก Javascript มีการโพสต์บล็อกเมื่อไม่กี่ปีที่ผ่านมาโดยเน้นว่าใน Javascript เซมิโคลอนจะเป็นตัวเลือกและส่วนสำคัญของโพสต์นั้นดูเหมือนว่าคุณไม่ควรกังวลเพราะมันไม่จำเป็น โพสต์อ้างอย่างกว้างขวางไม่ได้ให้เหตุผลที่น่าสนใจที่จะไม่ใช้พวกเขาเพียงแค่ที่ปล่อยให้พวกเขาออกมีผลข้างเคียงน้อย แม้แต่GitHub ก็กระโดดขึ้นไปบน bandwagon ที่ไม่มีเครื่องหมายอัฒภาคต้องการการละเว้นในโค้ดที่พัฒนาขึ้นภายในใด ๆ และความมุ่งมั่นล่าสุดในโครงการ zepto.js โดยผู้ดูแลมันได้ลบเครื่องหมายอัฒภาคทั้งหมดจาก codebase เหตุผลหลักของเขาคือ: มันเป็นเรื่องของการตั้งค่าสำหรับทีมของเขา; พิมพ์น้อย มีเหตุผลที่ดีอื่นที่จะปล่อยพวกเขาออกมา? ตรงไปตรงมาฉันไม่เห็นเหตุผลที่จะละเว้นพวกเขาและแน่นอนไม่มีเหตุผลที่จะกลับไปที่รหัสเพื่อลบพวกเขา มันยังขัดกับแนวทางปฏิบัติที่แนะนำ ( หลายปี ) ซึ่งฉันไม่ได้ซื้ออาร์กิวเมนต์ "ลัทธิการขนส่งสินค้า" สำหรับ ดังนั้นทำไมเซมิโคลอนที่เกลียดชังล่าสุดทั้งหมด มีปัญหาการขาดแคลนปรากฏหรือไม่ หรือนี่เป็นเพียง Javascript ล่าสุดเท่านั้น

8
เหตุใดจึงต้องลองใช้ ... ในที่สุดโดยไม่มีข้อห้าม?
try ... catchวิธีที่คลาสสิกในการเขียนโปรแกรมอยู่กับ เมื่อไรที่มันจะเหมาะสมที่จะใช้tryโดยไม่catch? ใน Python ข้อมูลต่อไปนี้ถูกกฎหมายและสมเหตุสมผล: try: #do work finally: #do something unconditional อย่างไรก็ตามรหัสไม่ได้catchอะไรเลย ในทำนองเดียวกันหนึ่งสามารถคิดใน Java มันจะเป็นดังนี้: try { //for example try to get a database connection } finally { //closeConnection(connection) } มันดูดีและทันใดนั้นฉันก็ไม่ต้องกังวลกับข้อยกเว้นประเภทอื่น ๆ ถ้านี่เป็นการฝึกฝนที่ดีการฝึกฝนที่ดีเมื่อไหร่? อีกวิธีหนึ่งคือเหตุผลว่าทำไมนี่ไม่ใช่การปฏิบัติที่ดีหรือไม่ถูกกฎหมาย? (ฉันไม่ได้รวบรวมซอร์สฉันถามเกี่ยวกับมันเนื่องจากอาจเป็นข้อผิดพลาดทางไวยากรณ์สำหรับ Java ฉันตรวจสอบว่า Python รวบรวมแน่นอน) ปัญหาที่เกี่ยวข้องที่ฉันพบคือ: ฉันยังคงเขียนฟังก์ชั่น / วิธีในตอนท้ายของมันจะต้องกลับบางสิ่งบางอย่าง อย่างไรก็ตามอาจอยู่ในสถานที่ที่ไม่ควรไปถึงและต้องเป็นจุดกลับ ดังนั้นแม้ว่าฉันจะจัดการกับข้อยกเว้นข้างต้นฉันยังคงกลับมาNULLหรือสตริงที่ว่างในบางจุดในรหัสที่ไม่สามารถเข้าถึงได้มักจะสิ้นสุดของวิธีการ / ฟังก์ชั่น …

2
มีหลักการ OO ใดบ้างที่ใช้ได้กับ Javascript จริงหรือไม่
Javascript เป็นภาษาเชิงวัตถุต้นแบบ แต่สามารถเป็นคลาสได้หลายวิธีโดย: การเขียนฟังก์ชั่นที่จะใช้เป็นคลาสด้วยตัวเอง ใช้ระบบระดับดีในกรอบ (เช่นmootools Class.Class ) สร้างจาก Coffeescript ในตอนแรกฉันมักจะเขียนโค้ดตามคลาสใน Javascript และพึ่งพามันอย่างมาก อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันได้ใช้กรอบงาน Javascript และNodeJSที่หายไปจากความคิดในชั้นเรียนนี้และพึ่งพาเพิ่มเติมเกี่ยวกับลักษณะแบบไดนามิกของรหัสเช่น: การเขียนโปรแกรม Async การใช้และการเขียนโค้ดที่ใช้ callbacks / events การโหลดโมดูลด้วย RequireJS (เพื่อไม่ให้รั่วไหลไปยัง namespace ทั่วโลก) แนวคิดการเขียนโปรแกรมเชิงหน้าที่เช่นรายการความเข้าใจ (แผนที่ตัวกรองและอื่น ๆ ) เหนือสิ่งอื่นใด สิ่งที่ฉันรวบรวมได้คือหลักการและรูปแบบ OO ส่วนใหญ่ที่ฉันอ่าน (เช่นรูปแบบ SOLID และ GoF) ถูกเขียนขึ้นสำหรับภาษา OO ที่อ้างอิงกับคลาสในใจเช่น Smalltalk และ C ++ แต่มีผู้ใดบ้างที่สามารถใช้งานได้กับภาษาต้นแบบเช่น Javascript …

12
คุณใช้เวลาทำงานกับการเรียนรู้หรือไม่? [ปิด]
คุณใช้เวลาทำงานกับการเรียนรู้สิ่งใหม่การอ่านบล็อกเทคโนโลยีหนังสือเกี่ยวกับการเขียนโปรแกรม ฯลฯ หรือไม่? ความคิดเห็นของคุณเกี่ยวกับมันคืออะไร? นายจ้างสามารถมีสิทธิประโยชน์ที่ช่วยให้นักพัฒนาสามารถใช้เวลาในการเรียนรู้ได้ประมาณ 1-1.5 ชั่วโมงต่อวัน มันจะได้รับการชำระคืนในอนาคต (พร้อมผลผลิตที่ดีขึ้น ฯลฯ ) หรือไม่

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